Accept multiple models with shape

I have a basic form for setting a provider name and email. I would like to attach my address attributes to this form, but I keep getting the following error

Parameter not listed: 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 
+5
source share
3 answers

The association declaration between the supplier and address and the form code are not synchronized.

If your supplier can have only one address , then update your code, if 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, if 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 information.

+1
source

Parameter not listed: address

With your associations, you need to change the address to addresses in fields_for and allowed_params .

 = form.fields_for :addresses do |address_fields| 

And in the controller 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 
+4
source

Please review and update your code as shown below:

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

The rest of the code is fine, just make the above changes and you are good to go ... :)

0
source

All Articles