2011-12-15 13 views
0

2つのオブジェクトを一度に保存して作成し、互いに関連付けるときに問題があります。現在、私は、ネストされたフォームを使用せず、両方のオブジェクトのパラメータを別々に(ビューから)渡すことで、「ハックな」方法でそれをやっています。次に、コントローラでそれらを接続します:Rails3アソシエーションとネストされたアトリビュート

モデル

class Post < ActiveRecord::Base 
    belongs_to :user 
    has_one :product 
    accepts_nested_attributes_for :product, :allow_destroy => true 
end 

class Product < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :post 
end 

ビュー

<%= form_for(@post) do |f| %> 
     <div id="post_field"> 
      <%= f.text_area :content %> 
     </div> 
     <div id="post_link_previewer" class="clearfix"> 
     <%= fields_for :product do |prod| %> 
      <%= prod.text_field :name %><br /> 
      <%= prod.text_area :description, :rows => 2 %><br /> 
      <%= prod.text_field :image_url %><br /> 
      <%= prod.text_field :original_url %> 
     <% end %> 
     </div> 
     <div id="submit" class="clearfix"> 
      <%= f.submit "Post" %> 
     </div> 
     <% end %> 

PostsControllerの

def create 
    @user = current_user 
    @post = @user.posts.create(params[:post]) 
    @product = Product.create(params[:product]) 
    @post.product_id = @product.id 

    respond_to do |format| 
     if @post.save 
     format.html { redirect_to(root_path, :notice => 'Post was successfully created.') } 
     format.xml { render :xml => @post, :status => :created, :location => @post } 
     else 
     format.html { render :action => "new" } 
     format.xml { render :xml => @post.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 

ユーザーが投稿をしたときに、ユーザーはその投稿に「製品」を添付することができます。私がそれをやっている現在の方法は、多くの意味があります。入れ子になったフォームのチュートリアルを見て、ビルドメソッドを使ってそれらを見ると、何が起こっているのか少し混乱し始めます。作成時にこれらの2つのオブジェクトをリンクする最善の方法を理解できますか?ネストされたフォームフィールドを使用するのが最善でしょうか?私は現在のやり方が効率的ではないと感じています。

答えて

0

はい、ネストされたフォームを使用する必要があります。彼らがなぜ建てられたのかという理由があります。それらは、関連付けを管理し、ネストされたオブジェクトを一度に作成するプロセスを容易にします。

buildメソッドはオブジェクトを作成します(オブジェクトの.new()メソッドを呼び出します)。次に、それを使用できます。

ネストされたフォームの簡単な例から始め、1時間か2時間それを使いましょう。このようにして、何が起こっているのかをより深く理解することができます。

私は、このケースでは、プレイによって自己学習することは、ネストされたフォームが優れている理由を伝えるだけでなく、多くの人に役立つと思います。

開始するには、nested-attributes-in-railsを参照してください。

+0

ありがとう!もう一度やり直し、build_associationメソッドを使って私の重大な間違いを見つけ出したので、間違ったテーブルに外来キーがありました。 – yoshyosh

関連する問題