接受带有表单的多个模型

Pau*_*ane 5 forms ruby-on-rails nested-forms strong-parameters

我有一个供应商名称和电子邮件的基本表单设置.我想将我的地址属性嵌套到这个表单中,但我一直得到以下错误

未允许的参数:地址

class Supplier < ActiveRecord::Base
  has_many :addresses, dependent: :destroy, as: :addressable    
  accepts_nested_attributes_for :addresses
end

class Address < ActiveRecord::Base
  belongs_to :addressable, polymorphic: true
  belongs_to  :supplier
end

class SuppliersController < ApplicationController

  def allowed_params
    params.require(:supplier).permit(:name, :email, {:address_attributes => [:first_name, :last_name, :address1, :address2, :city, :zip_code, :country_id]})
  end
end
Run Code Online (Sandbox Code Playgroud)

供应商表格

%fieldset#admin-supplier-names.span-12
  %label Name
  = form.text_field :name
  %label Email
  = form.text_field :email

= form.fields_for :address do |address_fields|
  %li= address_fields.text_field :first_name, placeholder: :first_name.upcase, value: current_user.first_name
  %li= address_fields.text_field :last_name, placeholder: :last_name, value: current_user.last_name
  %li= address_fields.text_field :address1, placeholder: :address_1
  %li= address_fields.text_field :address2, placeholder: :address_2
  %li= address_fields.text_field :city, placeholder: :city
  %li= address_fields.text_field :zip_code, placeholder: :post_code
  %li=address_fields.select   :country_id, select_countries, :include_blank => true
Run Code Online (Sandbox Code Playgroud)

Dha*_*udi 1

supplier您的和以及表单代码之间的关联声明address不同步。

如果您supplier只能拥有一个address,请使用以下内容更新您的代码(如果适用):

class Supplier < ActiveRecord::Base
  has_one :address, as: :addressable, dependent: :destroy
  accepts_nested_attributes_for :address
end

class Address < ActiveRecord::Base
  belongs_to :addressable, polymorphic: true
end

class SuppliersController < ApplicationController

  def new
    @supplier = Supplier.new
    @supplier.build_address
  end

  def edit
     @supplier = Supplier.find(params[:id])
     @supplier.build_address if @supplier.address.nil?
  end

  def allowed_params
    params.require(:supplier).permit(:name, :email, address_attributes: [:first_name, :last_name, :address1, :address2, :city, :zip_code, :country_id])
  end
end

%fieldset#admin-supplier-names.span-12
  %label Name
  = form.text_field :name
  %label Email
  = form.text_field :email

= form.fields_for :address do |address_fields|
  %li= address_fields.text_field :first_name, placeholder: :first_name.upcase, value: current_user.first_name
  %li= address_fields.text_field :last_name, placeholder: :last_name, value: current_user.last_name
  %li= address_fields.text_field :address1, placeholder: :address_1
  %li= address_fields.text_field :address2, placeholder: :address_2
  %li= address_fields.text_field :city, placeholder: :city
  %li= address_fields.text_field :zip_code, placeholder: :post_code
  %li=address_fields.select   :country_id, select_countries, :include_blank => true
Run Code Online (Sandbox Code Playgroud)

但如果您supplier可以有很多addresses,请在适用的情况下使用以下内容更新您的代码:

class Supplier < ActiveRecord::Base
  have_many :addresses, as: :addressable, dependent: :destroy
  accepts_nested_attributes_for :addresses
end

class Address < ActiveRecord::Base
  belongs_to :addressable, polymorphic: true
end

class SuppliersController < ApplicationController

  def new
    @supplier = Supplier.new
    3.times { @supplier.addresses.build } #setup as many as you want
  end

  def edit
     @supplier = Supplier.find(params[:id])
     addresses_count = (3 - @supplier.addresses.count) 
     addresses_count.times { @supplier.addresses.build }
  end

  def allowed_params
    params.require(:supplier).permit(:name, :email, addresses_attributes: [:first_name, :last_name, :address1, :address2, :city, :zip_code, :country_id])
  end
end

%fieldset#admin-supplier-names.span-12
  %label Name
  = form.text_field :name
  %label Email
  = form.text_field :email

= form.fields_for :addresses do |address_fields|
  %li= address_fields.text_field :first_name, placeholder: :first_name.upcase, value: current_user.first_name
  %li= address_fields.text_field :last_name, placeholder: :last_name, value: current_user.last_name
  %li= address_fields.text_field :address1, placeholder: :address_1
  %li= address_fields.text_field :address2, placeholder: :address_2
  %li= address_fields.text_field :city, placeholder: :city
  %li= address_fields.text_field :zip_code, placeholder: :post_code
  %li=address_fields.select   :country_id, select_countries, :include_blank => true
Run Code Online (Sandbox Code Playgroud)

请参阅StrongParametersFormBuilder了解更多信息。