1

構築しているアプリケーションの役割ベースの管理システムにCanCanを使用しています。これはWebショップの一種のテンプレートであるため、管理者はアクセスできるWebショップごとに異なる役割を持つことができます。例:ウェブショップ1では彼はモデレーターであり、ウェブショップ2では編集者です。

したがって、CanCanの能力クラスで行う必要があるのは、現在のユーザーが現在のショップ(current_shop)でどのような役割を果たしているかを確認することです。私はこれを書いた:

class Ability
 include CanCan::Ability

 def initialize(admin)

   if admin.supervise?(current_shop, controller_gsub)
     can :manage, :all
   elsif admin.manage?(current_shop, controller_gsub)
     can :manage, :all
   elsif admin.access?(current_shop, controller_gsub)
     can :read, :all
   end

 end
end

問題は、次のエラーが発生するため、アビリティクラスからcurrent_shopメソッドを呼び出せないように見えることです。

undefined local variable or method `current_shop' for #<Ability:0x104df38b0>

誰かがこれについて行く方法を知っていますか?よろしくお願いします!

4

1 に答える 1

2

実際には、どのコントローラー メソッドにもアクセスできず、Ability クラスにアクセスできません。ビジネスロジックとは?管理者が current_shop のスーパーバイザーである場合、管理者は本当にすべてのことを管理できますか? それとも、彼が店を経営している場所で、彼は物だけを管理できるのでしょうか?

次に、次のようなものがあると便利です。

class Ability
 include CanCan::Ability

 def initialize(admin)

   can :manage, :all do |obj|
     admin.supervise?(obj.shop) || admin.manage?(obj.shop)
   end
   can :read, :all do |obj|
     admin.access?(obj.shop)
   end

 end
end

PS ブロックが で動作するかどうかはよくわかりません。未知のクラス:allを呼び出すのはあまり論理的ではありませんが、それは方法を示すためのものであり、これが使用されるモデルをリストするのは簡単です.shop

于 2012-06-05T13:27:29.327 に答える