Rails 3在单个表单中编辑多条记录

7

我已经被这个问题卡了几天了。

我已经成功地使用了Railscasts第198集,但那是针对Rails 2的。在Rails 3中有一些变化,使得在第198集中提供的代码不起作用。

问题在于edit_individual.html.erb:

原始代码(由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 %>

修改后的代码(仅将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 %>

在新的代码中,每个记录都放置在自己的表单中,这些表单全部位于一个单一表单内(这正是我想要的)。
我的问题是,如何让Railscasts第198集提供的代码在Rails 3中运行?
以下是我提到的Railscast链接: http://railscasts.com/episodes/198-edit-multiple-individually 谢谢, c.allen.rosario

2
你不能在另一个 form_for 中使用 form_for,因为这意味着一个 <form> 标签内嵌另一个 <form> 标签。你需要使用 fields_for。当你在 Rails 3 中运行代码时会出现什么错误? - Zabba
没有显示任何错误。我只是得到一个带有提交按钮的空白页面。 - chris__allen
2个回答

19

我找到了解决方案。只需要修改Ryan @ Railscasts提供的代码中的以下行:

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

并将其更改为:

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

注意,<%已经被修改为<%=

最终解决方案:

<% 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 %>  

我想知道是否有人能够向我解释这个解决方案。据我所知,你只需要在fields_for前面加上一个<%

c.allen.rosario


2
是的,在Rails 3中需要使用那个=,尽管在早期版本的Rails中不需要。你在form_tag中没有使用它吗? - Zabba
form_tag不需要使用等号。 - chris__allen
我认为逗号丢失了,你的最终解决方案应该以此开始:<% form_tag update_individual_products_path, :method => :put do %>。 - Spone
澄清一下:在期望将输出写入 DOM(例如表单标记或输入字段等)的情况下,使用<%=。而对于不需要任何输出的情况(例如逻辑如<%if %>...<%end%>),则使用<%。这是自 Rails 3 以来的标准。 - randmin

4
Rails 3中从<% fields_for到<%= fields_for的变化是因为form_for、form_tag等使用<% form... %>,这会让人感到混乱,因为它们实际上输出HTML代码。在Rails 3中,由于它们输出HTML代码,所以使用<%=。

请注意,你的第一行已被弃用:

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

应该是

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

所有表单标签都适用相同的方式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接