ruby Rails Fields_for嵌套在表单更改中提交

pkln4tw6  于 2023-08-04  发布在  Ruby
关注(0)|答案(3)|浏览(128)

我遵循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


不知道哪里出了问题。今天是星期五,我的脑子快炸了

yiytaume

yiytaume1#

也有同样的问题。通过使用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| %>

pkwftd7m

pkwftd7m2#

不要忘记在onboarding_checkbox_attributes:[]中包含id

dgtucam1

dgtucam13#

今天我遇到了一个类似的问题,花了几个小时。我认为你的问题在于:
第一个月
由于Rails处理PUT和PATCH请求的方式,这个错误消息以及由此产生的问题标题非常容易引起误解。它说:

Invalid or incomplete POST params
Started POST "/update_multiple_objects" for ::1 at 2023-06-26 02:53:35 -0700

ActionController::RoutingError (No route matches [POST] "/update_multiple_objects"):

字符串
关键在第一行:“POST参数无效或不完整”。因为大多数浏览器不支持PUT或PATCH请求,Rails用一个post请求和一个隐藏的“_method”输入标记来蒙混过关。我敢打赌,如果你进入你的HTML,_method标记仍然会出现在你的表单中。问题是你正在传递“Invalid or Incomplete POST params”,这会导致rails抛出POST错误,即使你正在“正确地”尝试PATCH。
现在,为什么你的POST参数无效或不完整?当我查看HTML表单输出时,我注意到每个“onboarding_step”的fields_都将正确地使用ID进行编码,例如:

<input ... name="onboarding_step[203][some_attribute]"


其中“203”是该对象的ID。BUT,如果查看嵌套对象:onboarding_checkbox的字段,您会注意到它是用

<input ... name="onboarding_step[][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

相关问题