2

私は、特定の権限の範囲内でいくつかのカスタムロールを与えようとしています。どこでもこの答えを見つけることができません

role_ability.rb

class RoleAbility
 include CanCan::Ability

 def initialize(user)

 user || User.new # for guest

 if user.has_role? "admin"
   can :manage, :all
 elsif user.has_role? "retailer"
   can :manage, Product
 else
   can :read, :all
 end


 end
end

これは、「マネージャー」の役割を持つユーザーに製品と他の特定のモデルのみを管理させるという一般的なアイデアかもしれないと思いました...

変えたら

 elsif user.has_role? "retailer"
can :manage, Product

 elsif user.has_role? "retailer"
can :manage, :all

期待どおりに動作します...すべての管理領域にアクセスできます

私は「小売業者」が製品を管理できるようにしたいだけです!;)

「admin」はユーザーに関連付けられた役割のみです。つまり、すべての役割はユーザーです。

あなたはおそらくこれがどこに向かっているのかを見ることができます、小売業者は彼ら自身のアイテムにサインアップして売ることができます..まあそれが目標です。

ポインタはありますか?

4

2 に答える 2

4

この問題を簡単に解決するには、Authorize_admin メソッドを Admin::ProductsController decorator.rb に追加します。

app/controllers/admin_products_controller_decorator.rb

Admin::ProductsController.class_eval do
    def authorize_admin
        authorize! :admin, Product
        authorize! params[:action].to_sym, Product
    end
end

注:これは auth/app/controllers/admin_orders_controller_decorator.rb で設定されたものをオーバーライドし、このコントローラーの ":admin, Object" 要件を削除します。

つまり、ロールは製品の :admin と :action の両方にアクセスできる必要があります。つまり:

app/models/retailer_ability.rb

class RetailerAbility
  include CanCan::Ability

  def initialize(user)
    user ||= User.new
    if user.has_role? "retailer"
      can :read, Product
      can :admin, Product
    end
  end
end

小売業者が管理画面で製品を読み取れるようにする必要があります。

また、これを初期化子に追加することを忘れないでください:

config/initializers/spree.rb

Ability.register_ability(RetailerAbility)
于 2011-07-05T00:56:21.327 に答える
2

spree_auth_devise にはこれを行うためのネイティブな方法があります。文書化されていませんでしたが、現在は文書化されています。

https://github.com/spree/spree_auth_devise セクション: 「既存の Rails アプリケーションで使用する」

于 2014-03-25T14:07:02.243 に答える