簡潔にするために質問を編集し、行ったことを更新します。
会社の複数の住所を持つモデルを作成し、単一の住所を連絡先に割り当て、連絡先の作成または編集時にそれらを割り当てるにはどうすればよいですか?
新しい連絡先の作成時にアドレスを追加できるように、ネストされた属性を使用したいと考えています。最初から入力するのではなく、既存のアドレスからドロップダウンするオプションが必要な場合があるため、そのアドレスは独自のモデルとして存在します。
私はそれを機能させることができないようです。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 にフィールドを作成して、誰かが新しい 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
エラー コンソールのスニペットを 次に示します。属性を投稿していますが、アドレス テーブルで作成していません。
ContactsController#create の処理 (2010-05-12 21:16:17 の 127.0.0.1 の場合)
[POST] パラメータ: {"commit"=>"Submit", "authenticity_token"=>"d8/gx0zy0Vgg6ghfcbAYL0YtGjYIUC2b1aG+dDKjuSs=", "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"}}
Company Load (0.0ms)[0m [0mSELECT * FROM "companys" WHERE ("companys"."name" = 'Allyforce') LIMIT 1[0m
Address Create (16.0ms)[0m
[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連絡先の作成 (0.0ms)[0m
[0mINSERT INTO "contacts" ("company", "created_at", "title", "updated_at", "campaign_id", "address_id", "last_name", "phone", "fax" , "company_id", "date_entered", "first_name", "email") VALUES(NULL, '2010-05-13 04:16:18', '', '2010-05-13 04:16:18', 2, 2, '', '', '', 5, '2010-05-12', 'abc', '')[0m