2016-05-18 3 views
5

У меня есть базовая форма настройки имени поставщика и электронной почты. Я хотел бы, чтобы гнездиться свои атрибуты адреса в этой форме, но я получаю ошибку нижепринимаем несколько моделей с формой

Самовольная параметр: адрес

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 
+1

Ассоциация в модели поставщика 'has_many: addresses'? – Pavan

+1

@Pavan У меня есть 'has_many: адреса, зависимые:: destroy, as:: addressable' –

+2

Если вы использовали 'belongs_to: addressable,: polymorphic => true', то почему вы используете 'belongs_to: поставщик', я имею в виду, почему использовать оба из них, если вы можете служить своей цели? –

ответ

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 

Но если ваш 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 для получения дополнительной информации.

+0

будет ли это работать для редактирования поставщика, где адрес никогда не был создан? –

+0

Он должен, поскольку адреса/адреса создаются как в новых, так и в редактируемых действиях. – Dharam

+0

Интересно, как только кажется, что работает над новым, когда я иду и выбираю редактирование на существующем поставщике без адреса, где представлены поля формы arent –

4

Неотправленный параметр: адрес

С вашими ассоциациями вам необходимо изменить address на addresses в fields_for и allowed_params.

= 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 
+0

теперь поля адреса не появляются с этим изменением –

+0

, что я также отметил, когда параметры передаются через формы, которые они все еще проходят, как адрес, а не адрес_татрибуты –

+0

Кто-нибудь получил решение? Здесь можно указать 50+ точек репликации –

0

Пожалуйста, посмотрите и обновить свой код, как показано ниже контроллера -:

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

Остальной код хорошо, просто сделать выше изменения и вам хорошо идти ... :)