我遵循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
型
不知道哪里出了问题。今天是星期五,我的脑子快炸了
3条答案
按热度按时间yiytaume1#
也有同样的问题。通过使用each_with_index并为记录集分配一个索引来绕过它:
换句话说,与其这样做:
字符串
这样做:
型
pkwftd7m2#
不要忘记在
onboarding_checkbox_attributes:[]
中包含id
dgtucam13#
今天我遇到了一个类似的问题,花了几个小时。我认为你的问题在于:
第一个月
由于Rails处理PUT和PATCH请求的方式,这个错误消息以及由此产生的问题标题非常容易引起误解。它说:
字符串
关键在第一行:“POST参数无效或不完整”。因为大多数浏览器不支持PUT或PATCH请求,Rails用一个post请求和一个隐藏的“_method”输入标记来蒙混过关。我敢打赌,如果你进入你的HTML,_method标记仍然会出现在你的表单中。问题是你正在传递“Invalid or Incomplete POST params”,这会导致rails抛出POST错误,即使你正在“正确地”尝试PATCH。
现在,为什么你的POST参数无效或不完整?当我查看HTML表单输出时,我注意到每个“onboarding_step”的fields_都将正确地使用ID进行编码,例如:
型
其中“203”是该对象的ID。BUT,如果查看嵌套对象
:onboarding_checkbox
的字段,您会注意到它是用型
ID不见了!!最后,我通过查看this Question实际上弄明白了,我意识到Rails期望的是一个复数选项,即使有一个belongs_to(即单数)关联!
在我的例子中,当我在嵌套的fields_for中对对象进行复数化时,它工作了!值得注意的是,HTML开始正确地将对象id Package 在标记中。所以我建议你试试:
f.fields_for :onboarding_checkboxes
而不是单数。PS:我知道这个问题很陈腐-只是把这个答案贴在这里,供将来任何在这个问题上绊倒的人参考。
PS:这可能并不能完全解决你的问题。尝试通过belongs_to关系和at one point it wasn't possible at all(该帖子包含一些变通方法)来做到这一点有细微差别!但是,it should be fixed with some adaptations as of Rails 4 and 5。