16

我有几个班级,每个班级都有评论:

class Movie < ActiveRecord::Base
    has_many :comments, :as => :commentable
end

class Actor < ActiveRecord::Base
    has_many :comments, :as => :commentable
end

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

如何为新的电影评论创建表单?我添加了

resources :movies do
    resources :comments
end

到我的routes.rb,并尝试了new_movie_comment_path(@movie),但这给了我一个包含commentable_id和commentable_type的表单[我想自动填充,而不是由用户直接输入]。我也尝试自己创建表单:

form_for [@movie, Comment.new] do |f|
    f.text_field :text
    f.submit
end

(其中“文本”是评论表中的一个字段)但这也不起作用。

我实际上根本不确定如何将评论与电影相关联。例如,

c = Comment.create(:text => "This is a comment.", :commentable_id => 1, :commentable_type => "movie") 

似乎没有创建与 id 为 1 的电影关联的评论。(Movie.find(1).comments 返回一个空数组。)

4

2 回答 2

7

由于您已经在模型中创建了多态关联,因此您无需再担心视图中的这一点。您只需要在您的 Comments 控制器中执行此操作。

@movie = Movie.find(id) # Find the movie with which you want to associate the comment
@comment = @movie.comments.create(:text => "This is a comment") # you can also use build
# instead of create like @comment = @movie.comments.create(:text => "This is a comment")
# and then @comment.save
# The above line will build your new comment through the movie which you will be having in
# @movie.
# Also this line will automatically save fill the commentable_id as the id of movie and 
# the commentable_type as Movie.
于 2010-09-20T05:09:46.420 回答
3

您将不得不比“......但这也不起作用”更具描述性,但总体思路是:

@movie.comments.create( :text => params[:movie][:comment][:text] )

更典型的是:

@movie.comments.create( params[:comment] ) # or params[:movie][:comment]

重要的是您@movie首先找到并通过它创建关联的对象。这样您就不必担心Commentable或键入或任何东西。

于 2010-09-20T04:45:50.780 回答