【发布时间】:2014-10-23 22:59:38
【问题描述】:
我正在尝试使用 CanCan 来限制 cmets 在我的网站上的可见性。 在我的评论模型中定义了一个枚举:
enum access_right: {nobody: 0, somebody: 1, everyone: 2}
这是我当前的能力.rb 文件的摘录:
class Ability
include CanCan::Ability
def initialize(user, session={})
user ||= User.new # guest user (not logged in)
# Comments
can [:create, :read, :update, :destroy], Comment, person_id: person.id
can [:read], Comment, access_right: [:everyone, Comment.access_rights[:everyone]]
...
end
end
一开始我只是在使用:
can [:read], Comment, access_right: 2
但即使这在获取记录时有效:
Comment.accessible_by(...)
当检查这样一个对象的权限时它不起作用:
can? :read, @a_comment
因为那时 @a_comment.access_right == "everyone" (而不是 2)
所以我上网查了一下,发现这个:CanCanCommunity issue 102。 建议的解决方案对我不起作用,因为像这样直接使用“每个人”:
can [:read], Comment, access_right: ["everyone", Comment.access_rights[:everyone]]
会给出不正确的结果。获取记录时,其背后的 sql 查询如下所示:
SELECT `comments`.* FROM `comments` WHERE `comments`.`access_right` IN (0,2))
在这种情况下,"everyone" 似乎被转换为整数 (0)。
然后我找到了一个解决方法,我当前的能力文件,这要归功于符号 (:everyone)。 但是当使用罐头时,事情将不再起作用? :read, @a_comment (使用accessible_by时sql正确)
有人知道如何解决这个问题吗?
如何定义基于枚举的能力,既可以在获取记录时进行验证,也可以通过 can 进行验证?
谢谢!
编辑:它可能与此 CanCanCommunity issue 65 有关,但我无法使其工作。
【问题讨论】:
标签: ruby-on-rails ruby enums cancan cancancan