我正在学习Rails(已安装4.2)并正在使用社交网络模拟应用程序。 我已经在用户和帖子之间设置了一对多的关系,现在我正在尝试将评论添加到帖子中。经过多次尝试并在documentation on rubyonrails.org之后,我最终得到了以下设置:
用户模型
has_many :posts, dependent: :destroy
has_many :comments, through: :posts
发布模型
belongs_to :user
has_many :comments
评论模型
belongs_to :user
评论是从帖子显示页面开始的,所以 帖子控制器有:
def show
@comment = Comment.new
end
现在的问题是:在评论控制器中,创建新记录的正确方法是什么。 我尝试了下面和其他许多,但没有成功。
def create
@comment = current_user.posts.comment.new(comment_params)
@comment.save
redirect_to users_path
end
(current_user来自Devise)
此外,之后,如何选择与评论相对应的帖子?
谢谢
答案 0 :(得分:0)
您需要在Post
上创建关系,让每个Comment
知道“它与Post
相关联”。在您的情况下,您可能希望在Comment
上为post_id
创建外键,然后每个Comment
将belong_to
为特定Post
。因此,您需要在belongs_to :post
型号上添加Comment
。
所以,你的模型变成了:
class User < ActiveRecord::Base
has_many :posts, dependent: :destroy
has_many :comments, through: :posts
end
class Post < ActiveRecord::Base
belongs_to :user
has_many :comments
end
class Comments < ActiveRecord::Base
belongs_to :user
belongs_to :post
end
然后,要创建Comment
,您需要在控制器中执行以下两项操作之一:
通过URI加载与您正在创建的Post
对应的Comment
作为参数。
在Post
上调用create
方法的表单中传递Comment
ID。
我个人更喜欢从URI中的参数加载Post
,因为只要授权可以将Comment
添加到{{1 - 例如想到有人黑客攻击表单并更改表单最初设置的Post
的ID。
然后,Post
中的create
方法看起来像这样:
CommentsController
答案 1 :(得分:0)
将您的Comment
模型更改为:
class Comment < ActiveRecord::Base
belongs_to :post
belongs_to :user, through: :post
end
从视图模板中传递post_id
:
<%= hidden_field_tag 'post_id', @post.id %>
然后更改您的create
操作:
def create
@post = Post.find(params[:post_id])
@comment = @post.comments.build(comment_params)
@comment.user = current_user
redirect_to post_path(@post)
end