我按照Railscast在一个表单中同时编辑多个记录。链接到这里:http://railscasts.com/episodes/165-edit-multiple-revised
这对于在同一表单模式上编辑多个onboarding_steps非常有用。基本上我们标记每个步骤的完成日期并点击保存。
但是现在,其中一个步骤有一个要完成的事项清单,他们希望将清单放在同一个表格上。一旦我在<%= f.fields_for :onboarding_checkbox, onboarding_step.onboarding_checkbox do |checkboxes_form| %>
部分添加了表单,就会打破并No route matches [POST]
,因为表单应该使用PUT。由于某种原因,添加嵌套属性使得它想要执行POST而不是PUT。
这是在添加嵌套属性之前正常工作:
Started PUT "/onboarding_steps/update_multiple" for ::1 at 2018-06-15 15:25:25 -0500
Processing by OnboardingStepsController#update_multiple as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"",
"onboarding_steps"=>{"531"=>{"completed_date"=>""}, "280"=>{"completed_date"=>"02/09/2018"}}}, "commit"=>"Update"}
这就是它对嵌套部分的作用:
Invalid or incomplete POST params
Started POST "/onboarding_steps/update_multiple" for ::1 at 2018-06-15 15:47:08 -0500
ActionController::RoutingError (No route matches [POST] "/onboarding_steps/update_multiple"):
_edit_multiple.html.erb
<%= form_for :onboarding_steps, :url => update_multiple_onboarding_steps_path, :html => {:method => :put} do |form| %>
...
<% @onboarding_steps.each do |onboarding_step| %>
<%= fields_for "onboarding_steps[]", onboarding_step do |f| %>
... this is where it breaks the form ...
<% if onboarding_step.onboarding_checkbox.present? %>
<%= f.fields_for :onboarding_checkbox, onboarding_step.onboarding_checkbox do |checkboxes_form| %>
<%= submit_tag "Update", :class=>"btn btn-small btn-primary" %>
onboarding_steps_controller.rb
def edit_multiple
onboarding_step = OnboardingStep.find(params[:onboarding_step_id])
@onboarding_steps = OnboardingStep.includes(:onboarding_step_type).find(onboarding_step.group_steps.ids)
end
def update_multiple
logger.debug params
params.permit!
@onboarding_steps = OnboardingStep.update(params[:onboarding_steps].keys, params[:onboarding_steps].values)
@onboarding_steps.reject! { |s| s.errors.empty? }
if @onboarding_steps.empty?
redirect_to :back, notice: 'Update Successful'
else
render "edit_multiple"
end
end
底部包含onboarding_checkbox_attributes:[]
onboarding_step.rb有accepts_nested_attributes_for :onboarding_checkbox
的routes.rb
resources :onboarding_steps do
resources :onboarding_checkboxes
member do
get "delete"
end
collection do
get :edit_multiple
put :update_multiple
end
end
不确定哪里出错了。这是星期五,我的大脑是油炸的
答案 0 :(得分:0)
不要忘记在id
onboarding_checkbox_attributes:[]
答案 1 :(得分:0)
发生了同样的问题。通过使用each_with_index对其进行处理,并为记录集分配一个索引:
换句话说,不要这样做:
<% @onboarding_steps.each do |onboarding_step| %>
<%= fields_for "onboarding_steps[]", onboarding_step do |f| %>
执行此操作:
<% @onboarding_steps.each_with_index do |onboarding_step, index| %>
<%= fields_for "onboarding_steps[#{index}]", onboarding_step do |f| %>