Tuyên bố liên kết của bạn giữa supplier
và address
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.
Liên kết trong mô hình nhà cung cấp là 'has_many: addresses'? – Pavan
@Pavan tôi có 'has_many: địa chỉ, phụ thuộc:: phá hủy, như:: addressable' –
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? –