使用CanCanCan gem和ActiveAdmin

时间:2017-12-11 15:59:13

标签: ruby-on-rails activeadmin cancancan

我创建了一些规​​则,其中之一如下:

can :create, Ticket, { author_id: user.id }

这应该允许当前经过身份验证的用户仅在author_id等于用户的id时创建票证。

从rails控制台我可以测试我的规则是否正常工作:

my_user.can? :create, Ticket.new(author: my_user)      # returns true
my_user.can? :create, Ticket.new(author: another_user) # returns false

考虑到我正在使用ActiveAdmin,我现在需要使用ActiveAdmin::AuthorizationAdapter来使用我的授权规则。

我面临的一个问题是,每当我创建“新票证”时,我都会被拒绝访问。

我加倍检查了什么条件失败,似乎AA要求以下内容:

my_user.can? :create, Ticket.new # which returns false!

当我相信它应该要求以下内容时:

my_user.can? :create, Ticket # which returns true!

Ticket.new将所有参数设置为nil:

<Ticket author_id: nil, ..., created_at: nil, updated_at: nil>

这就是我的CanCanCan哈希条件失败的原因(author_id = nil无效,而应该是user_id)。

是否有可能解决这个问题?也许我正在以错误的方式设置我的CanCanCan规则?

ActiveAdmin也提供开箱即用的CanCanCan适配器,所以我想知道他们怎么会忽略这个。

1 个答案:

答案 0 :(得分:1)

基于对类似问题的回答:

ActiveAdmin.register Ticket do
  before_build do |ticket|
    ticket.author = current_user
  end
end

这将在创建新对象时设置作者,从而使它具有可以按照CanCanCan功能中的配置进行访问的条件。

@GoGoCarl对上面的相关问题进行了评论,但是我已经修改了此处提出的问题。原始答案:

https://stackoverflow.com/a/28738827/3353794