1

コレクション内のすべてのアイテムを 1 つのビューで個別に編集できるフォームを作成しようとしています。一般的なガイドとしてRailscast #198 ( http://railscasts.com/episodes/198-edit-multiple-individually ) を使用しましたが、コレクション内のすべてのアイテムを一度に編集したい (選択しない) ため、チェックボックスは含めませんでしたどちらを編集するか)。私が現在持っているものでは、フォームは正しく表示されますが、送信時にこのタイプのエラーが発生します:

ArgumentError in ProceduresController#update_procedures
wrong number of arguments (0 for 2). 

Parameters:

{"utf8"=>"✓",
 "_method"=>"put",
 "authenticity_token"=>"i9kB+uGlguerjxl0VHy1dRyMY5HrZQdILVuM79Df4Z4=",
 "procedures"=>{"1"=>{"description"=>"Example1"},
 "2"=>{"description"=>"Example2"}},
 "commit"=>"Submit",
 "comp_id"=>"1"} 

ここで何が欠けているか教えてください:

私のコントローラーで:

def edit_procedures
    @comp = Comp.find(params[:comp_id])
    @procedures = @comp.procedures.all    
end

def update_procedures  
    @comp = Comp.find(params[:comp_id])
    @procedures = @comp.procedures.update.(params[:procedures].keys,     
       params[:procedures].values).reject { |p| p.errors.empty? }
end

私のルートでは:

resources :comps do
    resources :procedures do
        collection do 
          get 'edit_procedures' 
          put 'update_procedures'
        end
    end
end

私からしてみれば:

<%= form_tag update_procedures_comp_procedures_path(@comp), :method => :put do %>
    <% for procedure in @procedures %>
        <%= fields_for "procedures[]", procedure do |f| %>
            <% if params[:field].blank? || params[:field] == "description" %>
            <%= f.label :description %>
                <%= f.text_field :description %>
        <% end %>
        <% end %>
    <% end %>   
    <p><%= submit_tag "Submit" %></p>
<% end %>

また、'edit_procedures' メソッドを GET から POST に変更しようとしましたが、次のエラーが発生しました。

助けてくれてありがとう。

4

2 に答える 2

1

アップデート:

実際、私が見つけたこのソリューションははるかに優れています。フォームをこれに変更しました(以下にリストされているコントローラーへの変更に加えて):

<%= form_for @comp, :url => 'update_procedures', :method => :put do |f| %>
    <%= f.fields_for :procedures do |g| %>
        <%= g.text_field :description %>
    <% end %>

    <%= f.submit "Update procedures" %>
<% end %> 

元の答え:

誰もこれに答えず、私は自分でそれを理解するのに1日苦労したので、どのように解決したかを共有します:

私の見解では、3 つのことを変更しました。生成されたハッシュは、入れ子になった属性を持つ form_for fields_for 入れ子になったフォームによって生成されたハッシュとまったく同じように見えます)

したがって、フォームは次のようになります。

<%= form_tag update_procedures_comp_procedures_path(@comp), :method => :put do %>
    <% for procedure in @procedures %>
        <%= fields_for 'comp[procedures_attributes]', procedure do |f| %>
            <% if params[:field].blank? || params[:field] == "description" %>
        <%= f.label :description %><br />
            <%= f.text_field :description %>
            <%= f.hidden_field :id, :value => procedure.id %>
            <% end %>
    <% end %>
     <% end %>  
<p><%= submit_tag "Submit" %></p>
<% end %>

次に、プロシージャ コントローラで、プロシージャ オブジェクトを更新するのではなく、ネストされた属性を使用して comp オブジェクトを更新し、基になるプロシージャ属性を更新します。

def update_procedures  
    @comp = Comp.find(params[:comp_id])
    if @comp.update_attributes(params[:comp]) 
        redirect_to(new_comp_procedure_path(@comp))
    else
        render 'edit_procedures'    
end 

これは機能しているようですが、これを達成するためのより簡単な方法がある場合は、私 (およびこれを読んでいる他の人) に知らせてください。ありがとう。

于 2012-11-07T23:23:07.977 に答える