4

私は最初の多型のアソシエーション関係に取り組んでおり、私のform_forのコメントをリファクタリングするのに問題があります。リファクタリングForm_for多態性のあるアソシエーションのコメントのメソッドの作成

多形性協会RailsCast http://railscasts.com/episodes/154-polymorphic-association?view=asciicastを試しましたが、日付が付いているようです。それはcommentable何のために働くだろうように

  1. どのように私は私のcomment_formは部分書き換えます:

    私は2つの質問がありますか?今のところ、それは(:commentable_id => @traveldeal.id)からtraveldealsのためだけに働くでしょう。

  2. コメントを作成するとき、commentable_typeは空です。 commentable_typeとは何ですか?フォームに渡す必要がありますか?

ありがとう!

user.rb

class User < ActiveRecord::Base 
    has_many :comments, :dependent => :destroy 
end 

traveldeal.rb

class Traveldeal < ActiveRecord::Base 
    has_many :comments, :as => :commentable, :dependent => :destroy 
end 

comment.rb

class Comment < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :commentable, :polymorphic => true 

    validates :user_id, :presence => true 
    validates :commentable_id, :presence => true 
    validates :content, :presence => true 
end 

traveldeal_show.html.erb

<%= render 'shared/comment_form' %> 

_comment_form.html.erb

<%= form_for current_user.comments.build(:commentable_id => @traveldeal.id) do |f| %> 
    <%= render 'shared/error_messages', :object => f.object %> 

<div> 
    <%= f.text_area :content %> 
</div> 

<%= f.hidden_field :user_id %> 
<%= f.hidden_field :commentable_id %> 

<div> 
    <%= f.submit "Add Comment" %> 
</div> 
<% end %> 

comments_controller.rb

class CommentsController < ApplicationController 
    before_filter :authenticate, :only => [:create, :destroy] 

    def create 
    @comment = Comment.new(params[:comment]) 
    @comment.save 
    redirect_to root_path 
    end 

end 

答えて

2

Railscastに日付である部分のみがルートです。

はあなたの最初の質問に答えるために:あなたのフォームを作成し、それがRailscastで行われるように:

<%= form_for [@commentable, Comment.new] do |f| %> 
    <p> 
    <%= f.label :content %><br /> 
    <%= f.text_area :content %> 
    </p> 
    <p><%= f.submit "Submit" %></p> 
<% end %> 

あなたはこのcommentable_typeのようにそれを行う場合は自動的に設定されます。コメントがどのモデルに属しているかを知るために型が必要です。コメントフォームを使用する方法で@commentableを設定する必要があることに注意してください。

など。

class TraveldealsController < ApplicationController 
    def show 
    @traveldeal = @commentable = Traveldeal.find(params[:id]) 
    end 
end 
+0

私はこのミスチャを手伝ってくれてありがとう。あなたの回答が示されているように、ショーページのための@commentableを設定することに失敗しました。 – Huy

+0

[@commentable、Comment.new]のパラメータは何ですか?この文脈で「コメント。新」が何を意味するのかよく分かりません。コントローラーで見るときと似た新しいレコードを作成するだけですか? – Huy

+2

あなたはネストされたルートを持っているので、あなたの 'form_for'には2つのオブジェクトが必要です。最初のものは、コメントが属するオブジェクト( '@ commentable')、2番目は新しいコメントオブジェクト(' Comment.new')です。そうです、コントローラーに新しいレコードを作成するのと同じです。コントローラーで '@comment = Comment.new'を実行することもできますが、コメントフォームがある場所ならどこでも実行する必要があります。ビュー内で 'Comment.new'を行うだけで、よりクリーンです。 – Mischa