2010-12-08 38 views
4

J'ai été bloqué sur ce problème pendant quelques jours maintenant. J'ai eu un certain succès avec Railscasts Episode # 198, mais celui-ci est pour Rails 2. Il y a eu quelques changements dans Rails 3 qui font que le code fourni dans l'épisode # 198 ne fonctionnera pas.Rails 3 Modifier plusieurs enregistrements dans un seul formulaire

Le problème se trouve dans le edit_individual.html.erb:

Code original (fourni par Ryan @ Railscasts):

<% form_tag update_individual_products_path, :method => :put do %> 
    <% for product in @products %> 
    <% fields_for "products[]", product do |f| %> 
     <h2><%=h product.name %></h2> 
     <%= render "fields", :f => f %> 
    <% end %> 
    <% end %> 
    <p><%= submit_tag "Submit" %></p> 
<% end %> 

Code modifié (tout simplement changé fields_for à form_for):

<% form_tag update_individual_products_path, :method => :put do %> 
    <% for product in @products %> 
    <% form_for "products[]", product do |f| %> 
     <h2><%=h product.name %></h2> 
     <%= render "fields", :f => f %> 
    <% end %> 
    <% end %> 
    <p><%= submit_tag "Submit" %></p> 
<% end %> 

Dans le nouveau code, chaque enregistrement est placé sous une forme qui lui est propre, le tout à l'intérieur d'une seule forme (qui est celle que je veux seulement).

Ma question est, comment puis-je obtenir le code fourni par Railscasts Episode # 198 pour fonctionner dans Rails 3?

Voici un lien vers la Railscast je l'ai mentionné: http://railscasts.com/episodes/198-edit-multiple-individually

Merci, c.allen.rosario

+2

Vous ne pouvez pas utiliser 'form_for' dans un autre' form_for' car cela signifierait une balise '

' dans une autre balise ''.Vous ** devez ** utiliser 'fields_for'. Quelles sont les erreurs lorsque vous exécutez le code dans Rails 3? – Zabba

+0

Aucune erreur ne s'affiche. Je viens d'obtenir une page blanche avec un bouton de soumission. –

Répondre

15

J'ai trouvé la solution. Juste besoin de modifier la ligne suivante dans le code fourni par Ryan @ Railscasts:

<% fields_for "products[]", product do |f| %> 

et changer à:

<%= fields_for "products[]", product do |f| %> 

avis que le <% a été modifié pour <%=.

solution finale:

<% form_tag update_individual_products_path :method => :put do %> 
    <% for product in @products %> 
    <%= fields_for "products[]", product do |f| %> 
     <h2><%= h product.name %></h2> 
    <% end %> 
    <% end %> 
    <p><%= submit_tag "Submit" %></p> 
<% end %> 

je me demandais si quelqu'un pouvait expliquer cette solution pour moi. D'après ce que je comprends, vous devriez seulement besoin d'un <% devant le fields_for.

c.allen.rosario

+2

Oui, que '=' est requis dans Rails 3, bien qu'il ne soit pas requis dans les versions antérieures de Rails. N'avez-vous pas besoin de l'utiliser pour le 'form_tag'? – Zabba

+0

Le = n'était pas requis pour le form_tag –

+0

Je pense qu'une virgule est manquante, votre solution finale devrait commencer par: '<% form_tag update_individual_products_path,: method =>: put do%>' – Spone

4

Le changement de Rails 3 de <% fields_for à <% = fields_for est parce qu'il est source de confusion qui form_for, form_tag, etc ... ont été en utilisant le formulaire <% de ...% >même si ils émettaient du code html. Avec Rails 3, puisqu'ils produisent un code html, ils utilisent <% =.

S'il vous plaît noter que votre première ligne est dépréciée:

<% form_tag update_individual_products_path, :method => :put do %> 

devrait être

<%= form_tag update_individual_products_path, :method => :put do %> 

même pour toutes les balises de formulaire.