向用户显示CanCan能力的要求

时间:2012-04-06 20:20:57

标签: ruby-on-rails authorization cancan

在Rap Genius上,你需要一定数量的Rap IQ才能获得一定的权限(就像Stack Overflow一样)。我通过在我的ability.rb中添加这样的行来实现这一点:

can :create, Annotation do |a|
  user.rap_iq >= 500
end

但是,我需要能够将这一事实传达给用户。例如,在我的注释视图中,我可能会有类似的内容:

<% unless can? :create, @annotation %>
  You need at least <%= CanCan::Ability.iq_required_to(:create, Annotation) %> Rap IQ to create annotations
<% end %>

(显然API是由lol组成的)

我的问题是如何最好地做到这一点 - 我确信此问题之前已经解决过(例如,在Stack Overflow的情况下!)

1 个答案:

答案 0 :(得分:2)

您可以通过某种方式对此需求信息进行建模,并将其显示给用户。

我不知道是否已经有了使用cancan的方法(我还没有在文档中看到过),但你可以扩展CanCan::Ability类以响应iq_required_to,类似的东西(它只是一个概念验证):

REQUIREMENTS[:annotation][:create] = 500

def iq_required_to(action, subject)
  REQUIREMENTS[subject][action]
end

然后你可以拨打iq_required_to(:create, :annotation)

当然您应该更改initialize以使用此信息:

can :create, Annotation do |a|
  user.rap_iq >= iq_required_to(:create, :annotation)
end