这就是我的模型为简单博客定义的方式
def User
has_many :comments, :dependent => :destroy
has_many :posts
end
def Post
belongs_to :user
has_many :comments
end
def Comment
belongs_to :user
belongs_to :post
end
在我的Post Controller中,我有这个代码,以便我可以在视图中创建注释
def show
@post = Post.find(params[:id])
@comment = Comment.new
respond_to do |format|
format.html # show.html.erb
format.xml { render :xml => @post }
end
end
然后在我的评论#create中我有了这个
def create
@comment = current_user.comments.create(params[:comment])
if @comment.save
redirect_to home_show_path
else
render 'new'
end
end
我该怎样做才能让我的评论模型能够收到post_id?我在Post show视图中做了这个作为修复,但还有另一种更好的方法吗?
<%= f.hidden_field :post_id, :value => @post.id %>
答案 0 :(得分:6)
通过表单中的隐藏字段设置post_id
并不一定有任何问题 - 但这确实意味着人们可能会将他们的评论与任意随机帖子相关联。
更好的方法可能是使用嵌套资源来发布帖子的评论。为此,请在routes.rb
文件中设置以下内容:
resources :posts, :shallow => true do
resources :comments
end
然后你的表格应该是这样的:
<%= form_for @comment, :url => post_comments_path(@post) do %>
...
<% end %>
这意味着表单POST到路径/post/[:post_id]/comments
- 这意味着post_id可以作为参数提供给控制器:
def create
@comment = current_user.comments.new(params[:comment])
@comment.post = Post.find(params[:post_id])
if @comment.save
...
end
end
这样做的好处是可以使用帖子ID对帖子进行选择,如果找不到帖子,则会引发错误。
稍微重写一下这个控制器方法也是值得的,所以Post.find首先出现:
def create
@post = Post.find(params[:post_id])
@comment = @post.comments.new(params[:comment])
@comment.user = current_user
if @comment.save
...
end
end
希望有所帮助。
答案 1 :(得分:2)
是的,还有更好的方法。使用official Routing guide或Getting Started指南中所述的嵌套资源。入门指南甚至涵盖了帖子和评论的确切示例!
答案 2 :(得分:1)
<%= form_for :comment, :url => post_comments_path(@post) do |f| %>
<%= f.text_field :content %>
<%= f.submit%>
<% end %>
在你的评论中创建动作
def create
@post = Post.find(params[:post_id])
@comment = @post.comments.build(params[:comment])
@comment.user = current_user #if you are using devise or any authentication plugin or you define a current_user helper method
if @comment.save
......
end
如果您使用rails 3,请在config / routes.rb中执行
resources :posts do
resources :comments
end
代码的第一部分应该在你的帖子/ show.html.erb
中