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
属性来改变这一点,并相应地更改授权,以便它的功能如下:
- 如果用户未登录,允许评论
:create
如果 lock_comments
在它的父 post 上是 false
- 如果用户已登录,允许评论
:create
如果 lock_comments
在它的父级 post 上是假的,或者登录的用户是 post
基本上,作者应该能够禁用对其文章的评论,但他们仍然应该能够对自己的文章发表评论,即使其他人的评论被禁用。
我在这里有点不知所措,在文档中找不到任何内容。我必须如何定义我的 Ability
才能工作?
我认为您不能在 Ability 中执行此操作,因为在您尝试访问 create
时您不知道父级 post 是什么。如果 create_comment
是 PostsController
方法,你可以这样做...
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
我在 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
属性来改变这一点,并相应地更改授权,以便它的功能如下:
- 如果用户未登录,允许评论
:create
如果lock_comments
在它的父 post 上是 false - 如果用户已登录,允许评论
:create
如果lock_comments
在它的父级 post 上是假的,或者登录的用户是 post
基本上,作者应该能够禁用对其文章的评论,但他们仍然应该能够对自己的文章发表评论,即使其他人的评论被禁用。
我在这里有点不知所措,在文档中找不到任何内容。我必须如何定义我的 Ability
才能工作?
我认为您不能在 Ability 中执行此操作,因为在您尝试访问 create
时您不知道父级 post 是什么。如果 create_comment
是 PostsController
方法,你可以这样做...
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