중첩 된 폼과 has_many 관계에 문제가 있습니다. 사례 : 실험실과 그 공급자가 있습니다. 공급자는 실험실간에 공유 할 수 있습니다.레일 4 네스트 된 폼 has_many, through 및 multiple select
모델
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
결과 R 제출 양식 :
매개 변수 : 양식을 제출
{"utf8"=>"✓",
"authenticity_token"=>"...",
"lab"=>{"code"=>"L01",
"name"=>"xxx"},
"lab_suppliers"=>{"supplier_id"=>["",
"1",
"3"]},
"commit"=>"Create Lab"}
동안 내가 ActiveModel :: ForbiddenAttributesError 가 줄에 나타납니다
내가 예상대로 작동하도록 실종 무엇@lab_supplier = @lab.lab_suppliers.new(params[:lab_suppliers])
?
params.require(:lab).permit(:code, :name, lab_suppliers_attributes: [:supplier_id])
이 그것을 시도하고 알려 : 당신이 명시 적으로 같은 통과해야 lab_suppliers
에서 속성 lab_params
말할 필요 같은
아니요, 시도했지만 여전히 동일한 오류가 발생합니다. 문제는 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