2016-05-18 12 views
5

Tôi có thiết lập biểu mẫu cơ bản về tên và email của nhà cung cấp. Tôi muốn tổ thuộc tính của tôi cho địa chỉ vào biểu mẫu này, nhưng tôi vẫn gặp lỗi dưới đâychấp nhận nhiều mô hình có biểu mẫu

tham số Unpermitted: Địa chỉ

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 

Mẫu Nhà cung cấp

%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

Liên kết trong mô hình nhà cung cấp là 'has_many: addresses'? – Pavan

+1

@Pavan tôi có 'has_many: địa chỉ, phụ thuộc:: phá hủy, như:: addressable' –

+2

Nếu bạn đã sử dụng 'thuộc_to: addressable,: polymorphic => true' thì tại sao bạn sử dụng 'depends_to: supplier', ý tôi là tại sao sử dụng cả hai, nếu ai có thể phục vụ mục đích của bạn? –

Trả lời

1

Tuyên bố liên kết của bạn giữa supplieraddress và mã biểu mẫu không đồng bộ.

Nếu supplier của bạn có thể chỉ có một address, sau đó cập nhật mã của bạn khi áp dụng như sau:

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 

Nhưng nếu supplier của bạn có thể có nhiều addresses, sau đó cập nhật mã của bạn khi áp dụng như sau:

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 

Tham khảo StrongParameters, FormBuilder để biết thêm thông tin.

+0

điều này có hoạt động để chỉnh sửa nhà cung cấp nơi địa chỉ chưa bao giờ được tạo không? –

+0

Nên, vì địa chỉ/địa chỉ được xây dựng cả trong hành động mới và chỉnh sửa. – Dharam

+0

thú vị vì nó chỉ xuất hiện để được làm việc trên mới, khi tôi đi và chọn chỉnh sửa trên một nhà cung cấp hiện tại không có địa chỉ các lĩnh vực mẫu không được trình bày –

4

Thông số chưa được gửi: địa chỉ

Với các liên kết của bạn, bạn cần thay đổi address thành addresses trong fields_forallowed_params.

= form.fields_for :addresses do |address_fields| 

Và trong 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

bây giờ các trường địa chỉ không xuất hiện với thay đổi đó –

+0

những gì tôi cũng đã lưu ý là khi các tham số được truyền qua các biểu mẫu mà chúng vẫn đi qua như địa chỉ không address_atttributes –

+0

bất cứ ai có một giải pháp này? Hơn 50 điểm đại diện trên phiếu mua hàng tại đây –

0

Hãy có cái nhìn và cập nhật mã của bạn như hình dưới đây của bộ điều khiển -:

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

Phần còn lại của mã của bạn là tốt, chỉ cần thực hiện những thay đổi trên và bạn tốt để đi ... :)

Các vấn đề liên quan