2012-11-06 71 views
1

我試圖創建一個表單,我可以在單個視圖中單獨編輯集合中的所有項目。我使用Railscast#198(http://railscasts.com/episodes/198-edit-multiple-individually)作爲一般指南,但沒有包括複選框,因爲我想一次編輯集合中的每個項目(而不是選擇要編輯的項目)。用什麼我現在有,該表單顯示正確,但我得到在這種類型的錯誤提交:通過Rails中的1表單編輯嵌套集合

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,但後來我得到這個錯誤:未知的行爲,無法找到操作'show'的程序控制器。

感謝您的幫助。

回答

1

UPDATE:

其實,這種解決方案我只是想出了要好得多。我只是改變了形式到這個(除了到控制器下面列出的變化):

<%= 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.添加一個隱藏字段,增加了程序ID的散列, 2.增加了‘補償’對象開始的散列,以及 3.將「程序」更改爲「程序屬性」(以便生成的^ h長相酷似通過的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 %> 

然後在我的程序控制器,而非更新程序對象時,它更新使用嵌套屬性來更新底層程序比較對象的屬性:

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 

這似乎是工作,但如果實現這個更簡單的方法,請讓我(和其他人誰讀取這個)知道。謝謝。

0

我知道我有六旬,但它看起來就像是你的#update_procedures方法裏面簡單的拼寫錯誤:

# this... 
@procedures = @comp.procedures.update.(params[:procedures].keys,  
     params[:procedures].values).reject { |p| p.errors.empty? } 

# should be this... 
@procedures = @comp.procedures.update(params[:procedures].keys,  
     params[:procedures].values).reject { |p| p.errors.empty? } 

(除去調用#update後點)

我m確定你已經失去了睡眠,對於年,不再哭了,你的英雄已經到了。