【问题标题】:Rails Fields_for nested in form changes Put to PostRails Fields_for 嵌套在表单更改中
【发布时间】:2018-06-15 20:48:32
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 它在里面,还有其他的表单域。
      猜你喜欢
      • 2013-06-15
      • 1970-01-01
      • 1970-01-01
      • 2018-04-23
      • 1970-01-01
      • 1970-01-01
      • 2012-07-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多