我是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
字符串时才有效
有什么建议吗?
答案 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
当您询问如何向User
和Post
模型&#34;添加评论时 - 底线是你不要;您向Comment
模型添加评论,并可以将其与User
和Post
相关联:
#app/models/comment.rb
Class Comment < ActiveRecord::Base
belongs_to :user
belongs_to :post
end
默认情况下,这会提示Rails在user_id
模型中查找post_id
和Comment
。
这意味着如果您想要直接创建注释,您可以通过简单地填充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