I have a basic form setup of a supplier name and email. I would like to nest my attributes for address into this form, but I keep getting the below error
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
Supplier Form
%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
With your associations, you need to change address to addresses in fields_for and allowed_params.
= form.fields_for :addresses do |address_fields|
And in the controller's 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
Your association declaration between supplier and address and the form code are out of sync.
If your supplier can have only one address, then update your code where applicable with the following:
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
But if your supplier can have many addresses, then update your code where applicable with the following:
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
Refer to StrongParameters, FormBuilder for more info.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With