6

Rails 3.0.9、cancan 1.6.7、およびdevise 1.4.8を使用しています

異なるログインと登録プロセスに 2 つのデバイス モデル (ユーザーと管理者) を使用しています。

したがって、70 を超えるモデルがあり、両方のタイプのユーザーに共通するのは 10 のモデルのみであるため、ログインしているユーザー (リソース) に応じて機能を分割したいと考えています (ここでは、50 を超えるモデルとビューは管理者ユーザーのみが使用します)。 )

2 つの Ability クラス (UserAbility と AdminAbility) を実装したいので、devise ヘルパー メソッド current_user/current_admin を UserAbility/AdminAbility に渡す必要があります。

例:

ApplicationController.rb ファイル内

    def current_ability
        if current_user
            @current_ability = UserAbility.new(current_user)
        elsif current_admin
            @current_ability = AdminAbility.new(current_admin)
        end
    end

上記の私の質問から、

  1. cancanで複数のアビリティクラスは可能ですか、可能であれば作成方法を試したので試してみました

    rails g cancan:user_ability

    しかし、 Could not find generator cancan:user_ability というエラーが発生しました。

  2. ログインしたユーザー/管理者に適切な能力クラスを選択する方法。

  3. ユーザーと管理者の両方がコントローラーにアクセスする場合、現在ログインしているユーザー/管理者のオブジェクトを取得するにはどうすればよいですか

これに対する他の解決策はありますか?

誰でもこれを解決するのを手伝ってください

4

4 に答える 4

13

...とはいえ、必要に応じて、複数の能力モデルを直接使用できます。

class UserAbility
  include CanCan::Ability

  def initialize(user)
    can :read, :all
  end
end

class AdminAbility
  include CanCan::Ability

  def initialize(admin)
    can :manage, :all
  end
end

class ApplicationController < ActionController::Base
  # overriding CanCan::ControllerAdditions
  def current_ability
    if current_account.kind_of?(AdminUser)
      @current_ability ||= AdminAbility.new(current_account)
    else
      @current_ability ||= UserAbility.new(current_account)
    end
  end
end
于 2012-10-05T14:36:15.393 に答える
7

そのために複数の能力クラスは必要ありません。

class Ability
  include CanCan::Ability

  def initialize(user_or_admin)
    user_or_admin ||= User.new

    common_rules(user_or_admin)

    if user_or_admin.kind_of? Admin
      admin_rules(user_or_admin)
    else
      user_rules(user_or_admin)
    end
  end

  def common_rules(user_or_admin)
    # can :verb, :noun
  end

  def admin_rules(admin)
    can :manage, :all
  end

  def user_rules(user)
    can :read, :all
  end
end

CanCan は最終的にAbility.new()どちらのモデルでも呼び出すことになりますが、受け取ったオブジェクトの種類を確認できるので、まったく問題ありません。もちろん、必要に応じて他のオブジェクトに委任することもできます。それはすべてただのRubyです。

于 2012-10-05T14:29:23.310 に答える