ruby-on-rails – 如何使用accepts_nested_attributes_for?
编辑我的问题以简明扼要并更新我所做的事情:
如何为公司建立多个地址并为联系人分配单个地址,并在创建或编辑联系人时分配这些地址? 我想使用嵌套属性来创建新联系人时添加地址.该地址作为自己的模型存在,因为我可能希望选项从现有地址下拉而不是从头开始. 我似乎无法让它发挥作用.我得到一个未定义的方法`build’为nil:NilClass错误 这是我的联系人模型: class Contact < ActiveRecord::Base attr_accessible :first_name,:last_name,:title,:phone,:fax,:email,:company,:date_entered,:campaign_id,:company_name,:address_id,:address_attributes belongs_to :company belongs_to :address accepts_nested_attributes_for :address end 这是我的地址模型: class Address < ActiveRecord::Base attr_accessible :street1,:street2,:city,:state,:zip has_many :contacts end 我想在创建新联系人时,访问属于公司其他联系人的所有地址.以下是我代表公司的方式: class Company < ActiveRecord::Base attr_accessible :name,:addresses has_many :contacts has_many :addresses,:through => :contacts end 以下是我在View for _form for Contact中创建字段的方法,以便当有人创建新的Contact时,他们将地址传递给Address模型并将该地址与Contact联系起来: <% f.fields_for :address,@contact.address do |builder| %> <p> <%= builder.label :street1,"Street 1" %> </br> <%= builder.text_field :street1 %> <p> <% end %> 当我尝试编辑时,Street 1的字段为空白.我不知道如何显示show.html.erb中的值. 在底部是我的错误控制台 – 似乎无法在地址表中创建值: 我的联系人控制器如下: def new @contact = Contact.new @contact.address.build # Iundefined method `build' for nil:NilClass @contact.date_entered = Date.today @campaigns = Campaign.find(:all,:order => "name") if params[:campaign_id].blank? else @campaign = Campaign.find(params[:campaign_id]) @contact.campaign_id = @campaign.id end if params[:company_id].blank? else @company = Company.find(params[:company_id]) @contact.company_name = @company.name end end def create @contact = Contact.new(params[:contact]) if @contact.save flash[:notice] = "Successfully created contact." redirect_to @contact else render :action => 'new' end end def edit @contact = Contact.find(params[:id]) @campaigns = Campaign.find(:all,:order => "name") end 这是我的错误控制台的片段:
解决方法
只是一个平庸的问题,如果你在联系表格中使用这个问题,不应该单独说明吗?
<% f.fields_for :address,@contact.address do |builder| %> <p> <%= builder.label :street1,"Street 1" %> </br> <%= builder.text_field :street1 %> <p> <% end %> 在你的行动中你也必须这样做 @ycontact.build_address 如果您查看源代码,您的输入字段应该是这样的.
如果您将address_id存储在联系人中,我认为您的关联也存在问题 class Contact < ActiveRecord::Base belongs_to :address accepts_nested_attributes_for :address end class Address < ActiveRecord::Base attr_accessible :street1 has_many :contacts end 我认为这是你的情况,因为你想为多个联系人分配一个地址. 如果将contact_id存储在地址模型中,也可以反向执行: class Contact < ActiveRecord::Base has_one :address accepts_nested_attributes_for :address end class Address < ActiveRecord::Base attr_accessible :street1 belongs_to :contact end 在这种情况下,您不能拥有相同地址的用户. 更新 在您的用户show.html.eb中,您可以使用 <%= @contact.address.street1 %> 在您公司的show.html.erb中,您可以显示以下地址: <% @company.addresses.each do |address| %> <%= address.street1 %> ... <% end %> 在您的用户编辑页面上,表单字段应与new.html.erb中的相同,只是表单标记应如下所示: <% form_for @contact do |form| %> <%=render :partial=>'fields' %> <% end %> 字段部分包含所有你的fieds togheter与: <% f.fields_for :address,"Street 1" %> </br> <%= builder.text_field :street1 %> <p> <% end %> 这应该工作. 更新2 您可以访问属于公司的所有地址: @company.addresses 如果你有 class Company<Activerecord::Base has_many :contacts has_many :addresses,:through=>:contacts end 关于草稿或默认地址.您可以根据需要选择不同的选项.我想要一个联系人可以从数据库中选择一个现有地址的选项.您可以在联系表单中选择一个选择框,如: <%= form.select :address_id,options_from_collection_for_select(@company.addresses,'id','street1')%> 此外,您可以使用一些花哨的JavaScript来添加或删除地址表单,在这种情况下,如果用户选择一个现有地址.在这种情况下,您必须从表单中删除address_attributes.我建议用javascript代码创建一个链接,添加address_attributes并删除(切换样式). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |