如何在rails中获取帖子ID?

时间:2011-06-25 21:40:45

标签: ruby-on-rails ruby-on-rails-3

这就是我的模型为简单博客定义的方式

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 %>

3 个答案:

答案 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 guideGetting 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