ネストされたフォームとhas_manyの関係に問題があります。ビジネスケース:研究室とそのサプライヤがあります。サプライヤはラボ間で共有することができます。Rails 4つのネストされたフォームで、has_many、throughとmultipleを選択します。
モデル
class Lab < ActiveRecord::Base
has_many :lab_suppliers
has_many :suppliers, through: :lab_suppliers
accepts_nested_attributes_for :lab_suppliers
end
class Supplier < ActiveRecord::Base
has_many :lab_suppliers
has_many :labs, through: :lab_suppliers
accepts_nested_attributes_for :lab_suppliers
end
class LabSupplier < ActiveRecord::Base
belongs_to :lab
belongs_to :supplier
accepts_nested_attributes_for :lab
accepts_nested_attributes_for :supplier
end
フォーム
<%= form_for(@lab) do |f| %>
<div class="field">
<%= f.label :code %><br>
<%= f.text_field :code %>
</div>
<div class="field">
<%= f.label :name %><br>
<%= f.text_field :name %>
</div>
<div class"field">
<%= fields_for :lab_suppliers do |ff| %>
<%= ff.label :supplier_id %><br>
<%= ff.collection_select :supplier_id, Supplier.all, :id, :name, {include_blank: true}, {:multiple => true, :class=>""} %>
<% end %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
コントローラAFTEのparamsに検査の
class LabsController < ApplicationController
before_action :set_lab, only: [:show, :edit, :update, :destroy]
# GET /labs/new
def new
@lab = Lab.new
@lab.lab_suppliers.build
end
# POST /labs
# POST /labs.json
def create
#raise params.inspect
@lab = Lab.new(lab_params)
@lab_supplier = @lab.lab_suppliers.new(params[:lab_suppliers])
@lab_supplier.save
@lab.save
private
def lab_params
params.require(:lab).permit(:code, :name, lab_suppliers_attributes: [])
end
end
結果私は期待通りに動作させるために何をしないのです
@lab_supplier = @lab.lab_suppliers.new(params[:lab_suppliers])
:私はActiveModelを受け取る:: ForbiddenAttributesError 行にフォームを送信しながら
{"utf8"=>"✓",
"authenticity_token"=>"...",
"lab"=>{"code"=>"L01",
"name"=>"xxx"},
"lab_suppliers"=>{"supplier_id"=>["",
"1",
"3"]},
"commit"=>"Create Lab"}
:
パラメータ:rのフォームを提出しますか?
いいえ、私はそれを試しても、同じエラーが表示されます。私は問題がlab_suppliersのparamsがlab_paramsにネストされていないと思っています。 – Michal
:<%= fields_for:lab_suppliers do | ff | %>しようとする<%= f.fields_for:lab_suppliers do | ff | %>そう、fを置く – loloso
あなたは正しいです。 f.fields_forに変更すると、lab_suppliersフォームの値がlab_params内にネストされるようになりました – Michal