ruby-on-rails - Rails 4 嵌套表单,带有 has_many、through 和 multiple select

标签 ruby-on-rails nested-forms has-many-through has-many multiple-select

我对嵌套形式和 has_many 关系有疑问。商业案例:有实验室及其供应商。供应商可以在实验室之间共享。

模型

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

Controller

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

提交表单后检查参数的结果:

参数:

{"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])

我缺少什么才能让它按预期工作?

最佳答案

似乎您需要明确告诉 lab_params 您需要传递来自 lab_suppliers 的哪些属性,例如:

params.require(:lab).permit(:code, :name, lab_suppliers_attributes: [:supplier_id])

试试看,然后告诉我。

关于ruby-on-rails - Rails 4 嵌套表单,带有 has_many、through 和 multiple select,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38557320/

相关文章:

javascript - 计算表单中嵌套字段集的数量

ruby-on-rails - 如何测试渲染 :file => 'public/404.html' in Rspec 2?

ruby-on-rails - Rails 2.3 四级嵌套表单 Javascript 函数

ruby-on-rails - Rails 在 fields_for 内部构建 fields_for 一次

ruby-on-rails - 有很多通过: How to Add record and fill fields in join table

mysql - 加入 rails 中的表;多对多;尝试在实例上调用 join 方法

ruby-on-rails - rails : Why "has_many ..., :through => ..." association results in "NameError: uninitialized constant ..."

ruby-on-rails - 您如何知道 YAML 文件在哪里损坏?

ruby-on-rails - 哪个RoR模板引擎与Razor模板引擎相似?

ruby-on-rails - 测试是否有一个关系在 Rails 中发生了变化