我已经离开编程八个月了,我正在尝试重新学习我所知道的关于开发Rails应用程序的非常少的东西。
我重新做了Getting Started tutorial以帮助自己恢复速度(想象一只乌龟),然后再尝试制作原创作品。
我能够graft Devise成功进入测试应用以及the modification where it can take a username or an e-mail address。
现在我正在尝试实现帖子和评论的用户所有权。对于帖子,我运行了命令:
rails g migration AddUserToPosts user:references
类似于评论。简单。将当前用户添加到新帖子中很简单,只需在Posts控制器中添加一个新行,因为我可以在实例化和保存之间进行:
def create
@post = Post.new(post_params)
@post.user = current_user #new
if @post.save
redirect_to @post
else
render 'new'
end
end
但是对于评论,我很难过。以下是我在评论控制器中看到的内容:
def create
@post = Post.find(params[:post_id])
@comment = @post.comments.create(params[:comment].permit(:commenter, :body))
#@comment.user = current_user
redirect_to post_path(@post)
end
我想以某种方式将我的用户塞进评论创作中。已经注释掉的尝试没有搞砸了工作,但它也没有做任何事情,因为评论是在被调用的.create方法中保存到数据库中的。
所以是的,所有这一切都要问一个非常简单的问题。提前感谢您的耐心等待!
答案 0 :(得分:1)
问题在于,在您的第二个示例中,您正在调用create
而不是new
。
create
= new
+ save
您在分配current_user
之前保存了评论。
您可以先使用new
解决此问题,并仅在分配current_user
后保存:
@post = Post.find(params[:post_id])
@comment = @post.comments.new(params[:comment].permit(:commenter, :body))
@comment.user = current_user
@comment.save
此外,在您的第一个示例中,有一种更好的方法来创建帖子:
@post = current_user.posts.new(post_params)
if @post.save
...
答案 1 :(得分:0)
使用.new
代替.create
,然后使用@comment.save
手动保存对象。
我建议您切换到.new
的原因是它只会在内存中创建对象。它不会尝试访问数据库。如果您使用.create
然后使用.save
,那么您将使用两次数据库。这会有点低效。