接受带有表单的多个模型
accept multiple models with a form
我有一个供应商名称和电子邮件的基本表单设置。我想将我的地址属性嵌套到此表单中,但我不断收到以下错误
Unpermitted parameter: address
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
供应商表格
%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
Unpermitted parameter: address
根据您的协会,您需要将 address
更改为 fields_for
和 allowed_params
中的 addresses
。
= form.fields_for :addresses do |address_fields|
并且在控制器的 allowed_params
def allowed_params
params.require(:supplier).permit(:name, :email, :addresses_attributes => [:first_name, :last_name, :address1, :address2, :city, :zip_code, :country_id])
end
请查看并更新您的代码,如下所示 -:
#-----controller----
# GET /suppliers/new
def new
@supplier = Supplier.new
@supplier.addresses.new
end
def allowed_params
params.require(:supplier).permit(:name, :addresses_attributes=> [:city]) # you can pass all your fields inside this array, i have tested for only one field i.e city.
end
#-----update form field for nested attribute as shown below, append this inside your form(form_for(@suppier))
<%= f.fields_for :addresses do |addr| %>
<div>
<%= addr.label :city %>
<%= addr.text_field :city %>
</div>
<% end %>
您的其余代码没问题,只需进行上述更改即可...:)
您在 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
但是如果您的 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
有关详细信息,请参阅 StrongParameters, FormBuilder。
我有一个供应商名称和电子邮件的基本表单设置。我想将我的地址属性嵌套到此表单中,但我不断收到以下错误
Unpermitted parameter: address
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
供应商表格
%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
Unpermitted parameter: address
根据您的协会,您需要将 address
更改为 fields_for
和 allowed_params
中的 addresses
。
= form.fields_for :addresses do |address_fields|
并且在控制器的 allowed_params
def allowed_params
params.require(:supplier).permit(:name, :email, :addresses_attributes => [:first_name, :last_name, :address1, :address2, :city, :zip_code, :country_id])
end
请查看并更新您的代码,如下所示 -:
#-----controller----
# GET /suppliers/new
def new
@supplier = Supplier.new
@supplier.addresses.new
end
def allowed_params
params.require(:supplier).permit(:name, :addresses_attributes=> [:city]) # you can pass all your fields inside this array, i have tested for only one field i.e city.
end
#-----update form field for nested attribute as shown below, append this inside your form(form_for(@suppier))
<%= f.fields_for :addresses do |addr| %>
<div>
<%= addr.label :city %>
<%= addr.text_field :city %>
</div>
<% end %>
您的其余代码没问题,只需进行上述更改即可...:)
您在 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
但是如果您的 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
有关详细信息,请参阅 StrongParameters, FormBuilder。