【问题标题】:Add Comment to User and Post models (Ruby on Rails)为用户和帖子模型添加评论(Ruby on Rails)
【发布时间】:2014-08-19 16:32:57
【问题描述】:

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

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 中正确定义创建操作? 谢谢。

更新:
路线.rb

resources :posts do
  resources :comments
end

cmets_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 字符串时才有效

有什么建议吗?

【问题讨论】:

  • 首先,您实际上并不需要直接将 cmets 与用户关联。您可以通过帖子将它们间接关联到用户。然后,评论绑定到@post...所以@post.cmets.create(comment_params)...
  • @RubyRacer 那么如何定义@post?我尝试过这样的@post = Post.find(params[:id]) @comment = @post.comments.create(comment_params),但收到错误“找不到没有 ID 的帖子”
  • 您应该阅读一些有关路由和嵌套资源的信息。这样做,到处玩(因为你正在学习),当你自己做不到的时候回到这里。

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


【解决方案1】:

你应该这样写:

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 作为强参数。 希望这会对你有所帮助。

【讨论】:

    【解决方案2】:

    协会

    为了给您定义这里发生的事情,您必须记住,每当您创建记录时,您基本上是在填充数据库。你的关联是用foreign_keys定义的

    当您询问如何“将 cmets 添加到 UserPost 模型”时 - 底线是您没有;您向Comment 模型添加评论,并可以将其与UserPost 关联:

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

    这会提示 Rails 默认在 Comment 模型中查找 user_idpost_id

    这意味着如果您想要直接创建评论,您可以通过简单地根据需要填充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 对象来处理它(正如接受的答案所指定的那样)

    【讨论】:

      【解决方案3】:
      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
      

      【讨论】:

      • Code only 和“try this”的答案通常是不鼓励的,请添加一些解释。
      • User has_many posts 和 Post has-many cmets 所以首先你并不需要与 cmets 直接关联。您可以通过::posts 使用用户 has_many :cmets。所以@post.cmets.create(comment_params) 会起作用。
      • 谢谢。您应该将此添加到您的答案中 - 这听起来像是有用的信息。 (提示 - 重音“`”允许您格式化代码的各个部分)
      猜你喜欢
      • 2022-11-09
      • 2019-02-20
      • 2016-04-17
      • 2011-04-29
      • 1970-01-01
      • 1970-01-01
      • 2020-10-11
      • 2011-01-04
      • 1970-01-01
      相关资源
      最近更新 更多