ruby-on-rails Ruby on Rails上帖子、用户和评论之间的关联

carvr3hs  于 2022-11-19  发布在  Ruby
关注(0)|答案(2)|浏览(169)

我正在学习Ruby on Rails,我有点被关联所困。我的项目是创建一个简单的博客,有三个表。用户,帖子和评论。
在我的理解中,在将几个表与外键关联之后,rails会自动找到user_id和post_id。但是每次我试图构建注解时,user_id都是空的。
下面是我的模型:
第一个
下面是我尝试创建评论时的屏幕截图:

正如您所看到的,post_id不是nil,但user_id是nil。
我试着手动输入user_id,它按预期工作。但我找不到如何用自动user_id和post_id创建评论。

oxcyiej7

oxcyiej71#

在我的理解中,在将几个表与外键关联之后,rails会自动找到user_id和post_id。但是每次我试图构建注解时,user_id都是空的。
这个假设是不正确的。Rails不会自动分配你的关联--它怎么知道你想把评论关联到哪个用户/帖子呢?
通常情况下,构建此路由的方法是使用嵌套路由:

resources :posts do
  resources :comments, 
   only: [:create]
   shallow: true
end

这将创建路径/posts/:post_id/comments,这样我们就知道用户想要评论哪个帖子--然后您可以调整表单,使其发布到嵌套的路径:
第一次
获取发表评论的用户通常是通过您的身份验证系统从会话中获取的--在本例中,来自Devise的authenticate_user!回调将对用户进行身份验证,如果没有用户登录,则重定向到登录。
然后,您只需从请求正文(从表单)和会话中的用户分配白名单参数:

class CommentsController
  before_action :authenticate_user!
  
  # POST /posts/1/comments
  def create
    # This gets the post from our nested route
    @post = Post.find(params[:post_id])
    @comment = @post.comments.new(comment_params) do |c| 
      c.user = current_user
    end

    if @comment.save
      redirect_to @post, 
        status: :created
        notice: 'Comment created'
    else
      render 'comments/show', 
        status: :unprocessable_entity,
        notice: 'Could not create comment'
    end
  end

  private

  def comment_params
    params.require(:comment)
          .permit(:foo, :bar, :baz)
  end
end

这通常是Rails初学者在“Blaugh”教程中最纠结的部分,因为它介绍了一个“嵌入”在另一个资源中的资源及其视图和几个高级概念。如果你还没有读过,我真的会推荐Rails入门指南。

jum4pzuy

jum4pzuy2#

您可以按如下方式创建备注:

user = User.find 2
post = user.posts.where(id: 2).first
comment = post.comments.build({comment_params}.merge(user_id: user.id))

希望这对你有帮助。

相关问题