添加对用户和帖子模型的评论(Ruby on Rails)

时间:2014-06-28 20:56:57

标签: ruby-on-rails ruby ruby-on-rails-4

我是Rails的新手。我正在构建我的第一个应用程序 - 简单的博客。我有User和Post模型,每个用户可以写很多帖子。现在我想添加评论模型,每个帖子可以有很多评论,每个用户也可以评论任何其他用户创建的任何帖子。
在评论模型中我有

id \ body \ user_id \ post_id

列。
模型关联:
user.rb

has_many :posts,    dependent: :destroy
has_many :comments

post.rb

has_many :comments, dependent: :destroy
belongs_to :user

comment.rb

belongs_to :user
belongs_to :post

那么如何在CommentsController中正确定义创建动作? 谢谢。

更新:
的routes.rb

resources :posts do
  resources :comments
end

comments_controller.rb

  def create
    @post = Post.find(params[:post_id])
    @comment = @post.comments.create(comment_params)
    if @comment.save
      redirect_to @post
    else
      flash.now[:danger] = "error"
    end
  end

结果是

--- !ruby/hash:ActionController::Parameters
utf8: ✓
authenticity_token: rDjSn1FW3lSBlx9o/pf4yoxlg3s74SziayHdi3WAwMs=
comment: !ruby/hash:ActionController::Parameters
  body: test
action: create
controller: comments
post_id: '57'

我们可以看到它不会发送user_id,只有当我从comment.rb中删除validates :user_id, presence: true字符串时才有效

有什么建议吗?

3 个答案:

答案 0 :(得分:11)

以你的方式你应该把它:

def create
  @post = Post.find(params[:post_id])
  @comment = @post.comments.create(comment_params)
  @comment.user_id = current_user.id #or whatever is you session name
  if @comment.save
    redirect_to @post
  else
    flash.now[:danger] = "error"
  end
end

此外,您应该将comment_params中的user_id作为强参数删除。 希望这会对你有所帮助。

答案 1 :(得分:7)

<强>协会

为了让您了解此处发生的事情,您必须记住,无论何时创建记录,您基本上都会填充数据库。您的关联定义为foreign_keys

当您询问如何向UserPost模型&#34;添加评论时 - 底线是你不要;您向Comment模型添加评论,并可以将其与UserPost相关联:

#app/models/comment.rb
Class Comment < ActiveRecord::Base
    belongs_to :user
    belongs_to :post
end

默认情况下,这会提示Rails在user_id模型中查找post_idComment

这意味着如果您想要直接创建注释,您可以通过简单地填充foreign_keys(或使用Rails对象填充它们)将其关联到这些关联中的任何一个)

因此,当您想保存comment时,可以执行此操作:

#app/controllers/comments_controller.rb
Class CommentsController < ApplicationController
   def create
       @comment = Comment.new(comment_params)
   end

   private

   def comment_params
        params.require(:comment).permit(:user_id, :post_id, :etc)
   end
end

相反,您可以使用标准的Rails对象(已接受的答案指定)来处理它

答案 2 :(得分:0)

Class CommentsController < ApplicationController
  before_action :set_user
  before_action :set_post

  def create
    @comment = @post.comments.create(comment_params)

    if @comment.save
      redirect_to @post
    else
      flash.now[:danger] = "error"
    end
  end

  private

    set_post
      @post = User.posts.find(params[:post_id])
    end

   set_user
      @user = User.find(params[:user_id])
   end

   comment_params
     params[:comment].permit()
   end