2016-05-18 26 views
5

Mam podstawową konfigurację formularza nazwy dostawcy i adresu e-mail. Chciałbym gniazdo moje atrybuty adres w tej formie, ale wciąż otrzymuję poniżej błądakceptuj wiele modeli z formularzem

niedozwolonej parametr: adres

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 

Formularz Dostawca

%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

Stowarzyszenie w modelu dostawcy to 'has_many: addresses'? – Pavan

+1

@Pavan Mam 'has_many: adresy, zależne:: destroy, as:: addressable' –

+2

Jeśli użyłeś" belongs_to: addressable,: polimymphic => true ", to dlaczego używasz" belongs_to: dostawca ", mam na myśli, dlaczego korzystać z nich obu, jeśli można spełnić swój cel? –

Odpowiedz

1

Twoja deklaracja stowarzyszenia między supplier i address, a kod formularza nie jest zsynchronizowany.

Jeśli supplier może mieć tylko jeden address, następnie zaktualizować swój kod w stosownych przypadkach, co następuje:

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 

Ale jeśli supplier może mieć wiele addresses, następnie zaktualizować swój kod w stosownych przypadkach, co następuje:

Aby uzyskać więcej informacji,
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 

Więcej informacji na ten temat można znaleźć pod adresem StrongParameters, .

+0

czy to zadziała przy edycji dostawcy, w którym adres nigdy nie został utworzony? –

+0

Powinno to, ponieważ adres/adresy są budowane zarówno w nowych, jak i edytowanych akcjach. – Dharam

+0

interesujące, ponieważ wydaje się, że działa tylko na nowy, kiedy idę i wybieram opcję edycji na istniejącym dostawcy bez adresu, pola formularza nie są prezentowane –

4

Nieprzepisany parametr: adres

Z listy skojarzeń, trzeba zmienić address do addresses w fields_for i allowed_params.

= form.fields_for :addresses do |address_fields| 

I 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

teraz pola adresu nie pojawiają się z tą zmianą –

+0

, co również zauważyłem, gdy parametry są przesyłane za pośrednictwem formularzy, które wciąż przychodzą jako adres nie address_atttributes –

+0

ktoś ma rozwiązanie tego? 50+ punktów w ofercie tutaj –

0

Proszę mieć wygląd i aktualizować swój kod jak pokazano poniżej regulatora -:

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

Reszta kodu jest w porządku, po prostu zrobić powyższych zmian i jesteś dobry, aby przejść ... :)