comment form_for connaître la différence au moment de soumettre :nouveau :modifier
J'ai généré un échafaudage, nous allons l'appeler échafaudage de test.
Dans ce fil, j'ai un _form.html.erb c'est d'être le rendu de l'action :nouveau => :créer et :edit => :mise à jour
Rails fait beaucoup de magie, parfois, et je ne peux pas comprendre comment le form_for sait comment appeler le bon :action lorsque le bouton soumettre entre :de nouvelles :modifier
Échafaudée Forme
<%= form_for(@test) do |f| %>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
vs
Onu-échafaudée Forme
<% form_for @test :url => {:action => "new"}, :method => "post" do |f| %>
<%= f.submit %>
<% end %>
Modifier le modèle
<h1>Editing test</h1>
<%= render 'form' %>
Nouveau modèle
<h1>New test</h1>
<%= render 'form' %>
Comme vous pouvez le voir il y a pas de différence entre les formes
Comment les deux modèles rendu de la même forme, mais l'utilisation de différentes actions?
Vous devez vous connecter pour publier un commentaire.
Il vérifie
@test.persisté?
Si elle persiste, alors c'est un formulaire de modification. Si elle ne l'est pas, c'est une nouvelle forme.action
etmethod
sont en effet basés sur desobject.persisted?
vérifier: github.com/rails/rails/blob/4-0-stable/actionpack/lib/.... Donc, je ne sais pas pourquoi cette réponse a été downvoted. Probablement besoin d'un peu de reformuler en "Si elle persiste, alors c'est un formulaire de modification. Si elle ne l'est pas, c'est une nouvelle forme"Il vérifie si l'enregistrement est nouveau ou pas.
Si le
@test
variable d'instance est instancié par leTest.new
méthode de classe, puis l'create
exécution de la méthode. Si@test
est une instance deTest
qui existe dans la base de données, leupdate
méthode est exécutée.En d'autres termes:
<%= form_for(@test) |do| %>
les rendements d'un bloc qui est envoyé à lacreate
la méthode du contrôleur.Si, au lieu de:
<%= form_for(@test) |do| %>
les rendements d'un bloc qui est envoyé à laupdate
la méthode du contrôleur.Mise à JOUR:
La fonction précise que les Rails utilise pour reconnaître si oui ou non l'enregistrement est nouveau, c'est la
persisté?
méthode.create
etupdate
.