我如何评论我的帖子?

时间:2017-02-17 21:08:07

标签: ruby-on-rails

我正在尝试添加用户为我的rails网站上的帖子添加评论的功能。

我的数据库中有一个Posts表和一个Users表。我正在使用资源丰富的路线在我的帖子控制器的'show'动作上显示各个帖子。我希望能够在帖子下面显示一个评论框,用户可以在其中输入评论,然后点击提交并让它创建评论。

我尝试制作评论模型,为用户和帖子提供belongs_to关系。我还将has_many关系添加到用户并发布模型。然后,我尝试让评论控制器使用“创建”操作,以便在每个帖子的“展示”操作上处理表单。

我遇到了无法让post_id注入新评论的问题。我可以通过从用户的会话中获取user_id来获取user_id,但是唯一传递给Comments Controller上的“create”操作的是通过表单注释的实际文本。

这是添加此功能的好方法吗?必须有更好的方法,或者我可能只是遗漏了一些东西。

我的帖子控制器'显示'动作:

#PostsController.rb

def show
  @post = Post.where(:id => params[:id]).first
  if @post.nil?
    flash[:error] = "Post does not exist"
    redirect_to(root_path)
  end
  @comment = Comment.new
end

PostsController上'show'操作的'show'视图中​​的表单:

#views/posts/show.html.erb

<%= form_for @comment do |f| %>
  <%= f.text_area(:content, :size => '20x10', :class => 'textarea') %>
  <%= f.submit('Create Post', class: 'button button-primary') %>
<% end %>

我的评论控制器'创建'动作:

#CommentsController.rb

def create
  @comment = Comment.new(params.require(:comment).permit(:content, :post_id, :user_id))
  @comment.user_id = session[:user_id]
  #Need to set post_id here somehow
  if @comment.valid?
    @comment.save
    flash[:success] = "Comment added successfully."
    redirect_to(post_path(@comment.post))
  else
    @error = @comment.errors.full_messages.to_s
    @error.delete! '[]'
    flash.now[:error] = @error
    render('posts/show')
  end
end

我的帖子模型:

class Post < ApplicationRecord
  belongs_to :subject
  belongs_to :user
  has_many :comments

  validates :title, :presence => true,
                    :length => {:within => 4..75}


  validates :content, :presence => true,
                      :length => {:within => 20..1000}
end

我的评论模型:

class Comment < ApplicationRecord
  belongs_to :user
  belongs_to :post

  validates :content, :presence => true,
                      :length => {:within => 6..200}

end

1 个答案:

答案 0 :(得分:1)

在您的帖子控制器显示操作中,使新评论属于帖子

def show
  @post = Post.where(:id => params[:id]).first
  if @post.nil?
    flash[:error] = "Post does not exist"
    redirect_to(root_path)
  end
  @comment = @post.comments.new # <--- here's the change
end

然后将post_id字段作为隐藏字段添加到表单

<%= form_for @comment do |f| %>
  <%= f.hidden_field :post_id %> 
  <%= f.text_area(:content, :size => '20x10', :class => 'textarea') %>
  <%= f.submit('Create Post', class: 'button button-primary') %>
<% end %>

如果不改变评论控制器创建动作,你应该不错。