编辑我为简洁的问题,更新自己的所作所为:如何使用accep_nested_attributes_for?
如何建模具有对公司多个地址,并分配一个地址到联系人,并能创建时为它们分配或编辑联系人?
我想要使用嵌套的属性,以便能够在创建新联系人时添加地址。该地址作为自己的模型存在,因为我可能希望从现有地址下拉选项,而不是从头开始输入。
我似乎无法得到它的工作。我得到了零一个未定义的方法`编译”: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, :phone, :addresses
has_many :contacts
has_many :addresses, :through => :contacts
end
这里是我正在尝试在信息查看_form的联系创造一个字段,这样,当有人创建了一个新的联系,他们通过地址到地址模型并将该地址与联系人关联:
<% 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
这里是一个片段我错误控制台: 我张贴的属性,但它不能在地址表制作....
处理ContactsController#CR eate (为127.0.0.1在2010-05-12 21点16分十七秒)
[POST]参数: { “提交”=> “提交”, “authenticity_token”=>“D8/gx0zy0Vgg6ghfcbAYL0YtGjYIUC2b1aG + “=”, “contact”=> {“company_name”=>“Allyforce”, “title”=>“”,“campaign_id”=>“2”, “address_attributes”=> {“street1”=> “abc”}, “fax”=>“”,“phone”=>“”, “last_name”=>“”, “date_entered”=>“2010-05-12”, “email”=“ >“”,“first_name”=>“abc”}}
公司负载(0.0ms)[0m [0mSELECT * FROM“companies”WHERE(“companies”。“name”='Allyforce') LIMIT 1 [0m
Address Create(16。0ms)[0; 0; 0; 0; 0)[0; 0; 0; 0; 0)[0; 1mINSERT INTO“addresses” VALUES(NULL, NULL,'2010-05-13 04:16:18',NULL,'2010-05-13 04:16:18',NULL,NULL)[0m
Contact Create(0.0ms)[0m
[0mINSERT INTO “联系人”( “公司”, “created_at”, “标题”, “的updated_at”, “CAMPAIGN_ID”, “ADDRESS_ID”, “姓氏”, “手机”, “传真”, “ company_id“,”date_entered“, ”first_name“,”email“)VALUES(NULL, '2010-05-13 04:16:18','','2010-05-13 04:16:18',2,'','','',5, '2010- 05-12' , 'ABC', '')[0米
嗯我觉得在地址表中创建insers值,这里是 地址创建(16.0ms)[0; 1mINSERT INTO“addresses”(“city”,“zip”,“created_at”,“street1 “,”updated_at“,”street2“,”state“)VALUES(NULL,NULL,'2010-05-13 04:16:18',NULL,'2010-05-13 04:16:18',NULL, NULL)[0m – dombesz 2010-05-13 07:02:04
更新我的帖子,包含视图中的代码。 – dombesz 2010-05-13 07:30:48
你可以看到,在地址创建street1的值是空白的...不是“ABC”.... – Angela 2010-05-14 00:13:14