Rails:Shoehorn在当前Devise用户的评论创建中

时间:2014-02-28 20:17:41

标签: ruby-on-rails ruby parameters devise

我已经离开编程八个月了,我正在尝试重新学习我所知道的关于开发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方法中保存到数据库中的。

所以是的,所有这一切都要问一个非常简单的问题。提前感谢您的耐心等待!

2 个答案:

答案 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,那么您将使用两次数据库。这会有点低效。