我将如何定义几种设计模型的功能?

最佳答案

假设您的应用程序具有两个独立的,由Devise支持的用户模型,分别称为UserAdmin。这意味着您可以并排使用current_usercurrent_admin之类的方法。

让我们进一步假设您只有/想要一个Ability类,其中包含您所有的CanCan权限设置...

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new
    case user
    when User
      can :create, Comment
      can :read, :all
    when Admin
      can :manage, :all
    end
  end
end

这正是其他人提出的建议,但是您还需要采取其他步骤。

默认情况下,CanCan假定存在current_user方法,并将返回一个User对象与您的Ability设置进行比较。但是,可以使用current_admin找到我们的管理员用户。如果不告诉CanCan在哪里可以找到管理对象,它们就永远不会得到审查,因此也就永远不会获得权限。 ,我们必须在与管理员打交道时更改默认设置。

将以下内容添加到application_controller.rb ...

def current_ability
  if admin_signed_in?
    @current_ability ||= Ability.new(current_admin)
  else
    @current_ability ||= Ability.new(current_user)
  end
end

现在,我们的Ability类将查看Admin对象(如果有),而在没有对象时退回给普通用户。

进一步的发展使我们可以将Admin权限移到他们自己的单独的Ability类中。
def current_ability
  if admin_signed_in?
    @current_ability ||= AdminPowers.new(current_admin)
  else
    @current_ability ||= Ability.new(current_user)
  end
end

有关更多信息,请参见Wiki中的Changing Defaults。感谢Stefan将我指向适当的文章。

仅供引用- CanCan已死,CanCanCan万岁! 包含最新的错误修复和新功能。相同的 namespace ,因此它只是Gemfile中的一个替代gem。
gem 'cancancan', '~> 1.8'

10-06 04:49
查看更多