2012-03-20 13 views
0

私は、私の製品のショービューでjoin modelを通じて私のProducttracklisting has_many用のフォームをネストしようとしています。これを行う正しい方法は何ですか?私は様々な失敗した試みに対してさまざまなエラーを出しています。次のように モデルは以下のとおりです。結合モデルのフォームを入れ子にする正しい方法ですか?

class Product < ActiveRecord::Base 
    has_many :producttracklistings 
    has_many :tracks, :through => :producttracklistings 
end 

class Track < ActiveRecord::Base 
    has_many :producttracklistings 
    has_many :products, :through => :producttracklistings 
end 

class Producttracklisting < ActiveRecord::Base 
    belongs_to :product 
    belongs_to :track 
end 

次のような形式は次のとおりです。

<%= form_for(@producttracklisting) do |f| %> 
    <%= f.label :track_id %> 
    <%= f.text_field :track_id %> 
    <%= f.label :product_id %> 
    <%= f.text_field :product_id %> 
    <%= f.submit %> 
<% end %> 

と私が使用して製品/ショーにこれを持参しようとしています:

すべてで
<%= render 'producttracklistings/form' %> 

上記の私はNilClassのための "未定義のメソッド` model_name 'を得る:クラス "

ありがとうございました。

答えて

3

あなたが探しているのはaccepts_nested_attributesfields_forの組み合わせです。 詳しいチュートリアルについては、RailsCast Part 1part 2を参照してください。

PS: ProductTrackListingという名前のモデルを指定すると、product_track_listingsという名前のテーブルが作成されます。これははるかに読みやすく "レールの道"

+0

ありがとう! – Raoot

+0

実際、私はそれが私の後ろであるかどうかわからないし、私は「入れ子になった」という言葉を誤解しているかもしれないと思う。私がやってみたいのは、Producttracklistingフォームを製品ショービューに持ち込んで、その製品にトラックを関連付けることだけです。私は基本的に、それぞれのトラックを '製品に追加'ボタンで表示するループを実行することを計画しています。これは、製品トラックリスト/新しいビュー内で完全に機能します。 – Raoot

+0

ああ...そうだ。確かに、 "NilClass:Class"の定義されていないメソッド 'model_name'のエラーは、form_for呼び出しでモデル名を解決できないことを意味します(ergo @producttracklistingは設定されていません)。したがって、同じフォームを使用するには、コントローラでこの変数を設定する必要があります。つまり、 '@producttracklisting = @ product.producttracklistings.build'などです。 – Vapire

関連する問題