【发布时间】:2011-02-17 07:08:22
【问题描述】:
为了简洁而编辑我的问题并更新我所做的事情:
如何为一个公司建模拥有多个地址并将一个地址分配给一个联系人,并能够在创建或编辑联系人时分配它们?
我想使用嵌套属性在创建新联系人时添加地址。该地址作为其自己的模型存在,因为我可能希望选择从现有地址下拉而不是从头开始输入。
我似乎无法让它工作。我为 nil:NilClass 错误得到一个未定义的方法 `build'
这是我的联系人模型:
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, :phone, :addresses
has_many :contacts
has_many :addresses, :through => :contacts
end
以下是我尝试在 View for _form for Contact 中创建字段的方式,这样当有人创建新联系人时,他们会将地址传递给 Address 模型并将该地址与联系人相关联:
<% f.fields_for :address, @contact.address do |builder| %>
<p>
<%= builder.label :street1, "Street 1" %> </br>
<%= builder.text_field :street1 %>
<p>
<% end %>
当我尝试编辑时,街道 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
这是我的错误控制台的 sn-p: 我正在发布属性,但它不是在地址表中创建....
处理联系人控制器#create (127.0.0.1 2010-05-12 21:16:17)
[POST] 参数: {"提交"=>"提交", "authenticity_token"=>"d8/gx0zy0Vgg6ghfcbAYL0YtGjYIUC2b1aG+dDKjuSs=", "联系人"=>{"公司名称"=>"Allyforce", "title"=>"", "campaign_id"=>"2", "address_attributes"=>{"street1"=>"abc"}, "传真"=>"", "电话"=>"", "姓氏"=>"", "date_entered"=>"2010-05-12", "email"=>"", "first_name"=>"abc"}}
公司负载 (0.0ms)[0m [0mSELECT *来自“公司”WHERE(“公司”。“名称”='Allyforce') 限制 1[0m
地址创建 (16.0ms)[0m
[0;1mINSERT INTO "addresses" ("city", “zip”、“created_at”、“street1”、 “updated_at”、“street2”、“状态”) 值(空,空,'2010-05-13 04:16:18',空,'2010-05-13 04:16:18',空,空)[0m联系创建 (0.0ms)[0m
[0mINSERT INTO“联系人”(“公司”, “created_at”、“title”、“updated_at”、 “campaign_id”、“address_id”、 “姓氏”、“电话”、“传真”、 "company_id", "date_entered", "first_name", "email") 值(NULL, '2010-05-13 04:16:18', '', '2010-05-13 04:16:18', 2, 2, '', '', '', 5, '2010-05-12', 'abc', '')[0m
【问题讨论】:
-
嗯,我认为在地址表中创建插入值,这里是 Address Create (16.0ms)[0m [0;1mINSERT INTO "addresses" ("city", "zip", "created_at" ,“street1”,“updated_at”,“street2”,“state”)值(NULL,NULL,'2010-05-13 04:16:18',NULL,'2010-05-13 04:16:18' , NULL, NULL)[0m
-
更新了我的帖子,将代码包含在视图中。
-
您可以看到在 Address Create 下 street1 的值是空白的...不是 "abc" ....
-
更新了我的帖子,回复了您的问题。
标签: ruby-on-rails aggregation has-many-through