2011-08-11 12 views
1

ネストされたフォームで問題が増えています。今回は、多型Addressモデルを使用しました。どんな助けでも大歓迎です。多相関連のネストされたモデルフォーム

<%= form_for @account do |f| %> 

<%= f.label :account_type %><br /> 
<%= f.text_field :account_type %><br /> 

    <%= f.fields_for :organizations do |builder| %> 
     <%= builder.label :name %><br /> 
     <%= builder.text_field :name %><br /> 
     <%= builder.label :website %><br /> 
     <%= builder.text_field :website %><br /> 

     <%= builder.fields_for :locations do |lb| %> 
      <%= lb.label :phone %><br /> 
      <%= lb.text_field :phone %><br /> 
      <%= lb.label :toll_free_phone %><br /> 
      <%= lb.text_field :toll_free_phone %><br /> 
      <%= lb.label :fax %><br /> 
      <%= lb.text_field :fax %><br /> 

      <%= lb.fields_for :address do |ab| %> 
       <%= ab.label :address1 %><br /> 
       <%= ab.text_field :address1 %><br /> 
       <%= ab.label :address2 %><br /> 
       <%= ab.text_field :address2 %><br /> 
       <%= ab.label :city %><br /> 
       <%= ab.text_field :city %><br /> 
       <%= ab.label :state %><br /> 
       <%= ab.text_field :state %><br /> 
       <%= ab.label :zip %><br /> 
       <%= ab.text_field :zip %><br /> 
      <% end %> 
     <% end %> 
    <% end %> 

<%= f.submit "Add account" %> 
<% end %> 

class Account < ActiveRecord::Base 

    has_many :organizations 

    accepts_nested_attributes_for :organizations 
end 

class Organization < ActiveRecord::Base 

    belongs_to :account 

    has_many :locations 

    accepts_nested_attributes_for :locations 
end 

class Location < ActiveRecord::Base 

    belongs_to :organization 

    has_one :address, :as => :addressable 

end 

class Address < ActiveRecord::Base 

    belongs_to :addressable, :polymorphic => true 
end 

class AccountsController < ApplicationController 

def new 
    @account = Account.new 
    organization = account.organizations.build 
    location = organization.locations.build 
    location.addresses.build 

    @header = "Create account" 
end 

def create 
    @account = Account.new(params[:account]) 
    if @account.save 
     #handle success 
    else 
     render 'new' 
    end 
end 
end 

/アカウント経由でフォームを表示しようとすると/ Iは、次のエラーメッセージを取得しています新しい:

あなたはアドレスの関連付けを定義したとき location.addresses.buildをやっているため、問題がある
NoMethodError in AccountsController#new 

undefined method `addresses' for #<Location:0x18d7718> 
Rails.root: C:/Documents and Settings/Corey Quillen/My  
Documents/rails_projects/shop_manager 

Application Trace | Framework Trace | Full Trace 
app/controllers/accounts_controller.rb:7:in `new' 
Request 

Parameters: 

None 
+0

質問を投稿する際には、コードの個々の懸念事項を別々のタイトルブロックに分けてください。これにより、潜在的な回答者が質問を簡単に解釈できるようになります:) –

答えて

1

このモデルの場合はhas_oneとなります。したがって、あなたはlocation.build_addressをする必要があります。 belongs_toのアソシエーションを構築しようと考えていた場合も同じことが起こります。

address方法は、関連するオブジェクトをロードし、それができない場合nilを返すようにしようと試みる、とnilbuildを呼び出すことがちょうど許可されていないとしてそれは、address協会自体で呼び出されるbuild方法が可能ではありません。したがって、build_addressを実行する必要があります。

+0

それはうまくいきました!ライアンに感謝します。 –

+0

@Corey:いいえ心配、ありがとう:) –

関連する問題