1

OK、私は github の railsapps テンプレートの指示に従い、CanCan に ryanb の railscast を惜しみなくコピーしました (私の Event モデルの Comment 変数を交換しました)。新しいユーザーを作成し、管理者の役割に与えられた能力のサブセットを持つ「スポンサー」の役割を割り当てました。Railsにロードすると、

未定義のメソッド「ロール?」ユーザーの場合:0x08 ...

OK、コンソール内で逆方向に作業して、「スポンサー」ロールへの新しいユーザーの割り当てをやり直して、何かが壊れていないかどうかを確認しています。最後に見下ろすと、壊れているように見えますが、それを修正する方法がわからないものがあります. これが私の能力です.rb

class Ability
 include CanCan::Ability

 def initialize(user)
   user ||= Us  # guest user (not logged in)
   if user.has_role? :admin
     can :manage, :all
   else
     can :read, :all
   end

   if user.role? :sponsor
     can :create, Event
     can :read, Event
     can :update, Event do |event|
       event.try(:user) == user
     end
   else
     can :read, :all
   end

 end
end

私のevent.rb:

resourcify
  belongs_to :school

学校has_many eventshas_and_belongs_to_many_usersそしてbelongs_to :event。コンソールで、正しい名前、school_id、メールなどで new_user を作成しました。これは期待どおりに機能しました。そして私は・・・それから私は:

user.add_role "sponsor"

ユーザー ID がスポンサーのロール ID と並んでいることがわかるので、これはうまくいきました。次のステップは、私の問題が始まると思うところです。

ability = Ability.new(new_user)

これにより、次の結果が得られます。

SELECT COUNT(*) FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = 5 AND (((name = 'admin') AND (resource_type IS NULL)

user_id は正しいですが、「名前」は「admin」ではありません。「スポンサー」の名前を引っ張るべきだと思いますか?

これは簡単な質問かもしれませんが、この誤った割り当てが、上記の events#index エラーが発生する理由に関する私の問題の根源であると推測しています。Ability.new が「admin」でスタックしていると想定しているようです。私は何を見落としていますか、ありがとう、サム

4

1 に答える 1

2

間違ったコードでユーザーの役割を照会しています。

user.role? :sponsor # wrong

ローリファイでは、このようなものが必要です

user.has_role? :sponsor
user.has_role? :sponsor, School
user.has_role? :sponsor, School.first

cancanなしでコンソールで単純なrolifyコマンドを試してください

user.add_role :sponsor
user.has_role? :sponsor

これは非常に正常です。Ability.new は、管理者ロールを持つ選択クエリを生成します。

if user.has_role? :admin

あなたの能力イニシャライザで

于 2012-07-09T07:53:38.403 に答える