4

私は最初のポリモーフィック アソシエーション関係に取り組んでおり、form_for create コメントのリファクタリングに問題があります。

Polymorphic Association RailsCasts http://railscasts.com/episodes/154-polymorphic-association?view=asciicastを調べてみましたが、時代遅れのようです。

2 つの質問があります。

  1. コメント可能なものに対して機能するように、comment_form パーシャルを書き直すにはどうすればよいですか? 私が今持っている方法では、(:commentable_id => @traveldeal.id).

  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

コメント.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 %>

コメント_コントローラー.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
4

1 に答える 1

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
于 2012-04-12T02:23:06.790 に答える