7

私はこの問題に数日間立ち往生しています。

Railscastsエピソード#198である程度の成功を収めましたが、これはRails 2用です。Rails3にいくつかの変更が加えられたため、エピソード#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 %>

新しいコードでは、各レコードは独自のフォーム内に配置され、すべて1つのフォーム(私が必要とするもの)内に配置されます。

私の質問は、Railscastsエピソード#198で提供されているコードをRails3で機能させるにはどうすればよいですか?

これが私が言及したRailscastへのリンクです:http: //railscasts.com/episodes/198-edit-multiple-individually

ありがとう、c.allen.rosario

4

2 に答える 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

于 2010-12-09T00:13:00.063 に答える
4

Rails 3の<%fields_forから<%= fields_forへの変更は、form_for、form_tagなどがhtmlコードを出力しているにもかかわらず<%form ...%>を使用していることを混乱させていたためです。Rails 3では、htmlコードを出力するため、<%=を使用します。

最初の行は非推奨であることに注意してください。

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

する必要があります

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

すべてのフォームタグで同じです。

于 2011-03-17T06:52:19.030 に答える