Rails 3以单一形式编辑多个记录

chr*_*len 7 forms editing railscasts ruby-on-rails-3

我已经坚持了几天这个问题了.

我已经在Railscasts Episode#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 %>
Run Code Online (Sandbox Code Playgroud)

修改后的代码(只需将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 %>
Run Code Online (Sandbox Code Playgroud)

在新代码中,每个记录都放在一个自己的表单中,所有表单都在一个单独的表单中(这是我唯一想要的表单).

我的问题是,如何让Railscasts Episode#198提供的代码在Rails 3中运行?

这是我提到的Railscast的链接:http://railscasts.com/episodes/198-edit-multiple-individually

谢谢,c.allen.rosario

chr*_*len 18

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

<% fields_for "products[]", product do |f| %>
Run Code Online (Sandbox Code Playgroud)

并将其更改为:

<%= fields_for "products[]", product do |f| %>
Run Code Online (Sandbox Code Playgroud)

请注意,<%已被修改为<%=.

最终解决方案

<% 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 %>  
Run Code Online (Sandbox Code Playgroud)

我想知道是否有人能向我解释这个解决方案.从我的理解,你应该只需要<%在前面fields_for.

c.allen.rosario

  • 是的,在Rails 3中需要`=`,尽管在早期的Rails版本中不需要它.你不需要将它用于`form_tag`吗? (2认同)