Cancancan - 定义:创建关联

Cancancan - define :create with association

我在 Ruby 申请 Rails 时遇到以下情况:

我有一个博客 posts。每个 post 可以有 1 到 n 个作者,每个 post 与几个评论相关联:

class Post < ApplicationRecord
    has_many :comments, dependent: :destroy
    has_many :authors

class Comment < ApplicationRecord
    belongs_to :post

我正在使用 CanCanCan 进行授权。目前每个人都可以在 post 上发表评论。我想通过在我的 post 模型上引入一个 lock_comments 属性来改变这一点,并相应地更改授权,以便它的功能如下:

基本上,作者应该能够禁用对其文章的评论,但他们仍然应该能够对自己的文章发表评论,即使其他人的评论被禁用。

我在这里有点不知所措,在文档中找不到任何内容。我必须如何定义我的 Ability 才能工作?

我认为您不能在 Ability 中执行此操作,因为在您尝试访问 create 时您不知道父级 post 是什么。如果 create_commentPostsController 方法,你可以这样做...

can :create_comment, Post do |post|
  !post.lock_comments || user.in?(post.authors)
end

但是如果它是 CommentsController 中的 create 你需要用 before_action

class CommentsController < ApplicationController

  before_action :create_allowed, only: [:create]

  private

  def create_allowed
    post = Post.find(params[:comment][:post_id])
    return if post && (!post.lock_comments || current_user.in?(post.authors))
    flash[:error] = 'You are not allowed to do this'
    redirect_to root_path
  end
end