Rails Fields_for嵌套在表单更改中发布到帖子

时间:2018-06-15 20:48:32

标签: ruby-on-rails ruby forms post nested

我按照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

不确定哪里出错了。这是星期五,我的大脑是油炸的

2 个答案:

答案 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| %>