2012-03-17 9 views
0

ユーザーは同じスタジオ(user.studio_id)に属している場合、ユーザー#インデックスの他のユーザーのみを見ることができます。レール3.2.2、cancan 1.6.7。インデックスが失敗すると、各セッションで最初にセッションが許可され、次に適切に許可されます。

ほぼ完璧に動作します。唯一の問題は、ユーザー(管理者を含む)がユーザー/インデックスに初めてアクセスするときに、不正なメッセージが表示されることです。彼らがやり直すと、適切なレコードだけが表示されたインデックスが取得されます。彼らが最初にそこに行くときに、どうすればそれを認可で窒息するのを止めることができますか?

class Ability 
    include CanCan::Ability 


     def initialize(user) 
     user ||= User.new # guest user (not logged in) 

     can :read, User 

     if user.role? :Student 
      ... 
      cannot :read, User, ["studio_id <> ?", user.studio_id] do |u| 
      u.studio_id != user.studio_id 
      end 
      can :update, User, ["id = ?", user.id] do |u| 
      u.id == user.id 
      end 

     end 

     if user.role? :Teacher 
      ... 
      can :update, User, ["id = ?", user.id] do |u| 
      u.id == user.id 
      end 
     end 



     if user.role? :Director 
      ... 
      can :manage, User, ["studio_id = ?", user.studio_id] do |u| 
      u.studio_id == user.studio_id 
      end 
      can :create, User 
     end 

     cannot :delete, [Studio, Event] 
     cannot :change_studio, [User] 

     if user.role? :Admin 
      can :manage, :all 
      can :see_ids, :all 
      can :change_studio, User 
     end 

     end 


    end 
    end 

ability.rb

がUserController

class UsersController < ApplicationController 
     respond_to :html, :xml, :json 
     load_and_authorize_resource #:only => [:show,:new,:destroy,:edit,:update] 

     def index 
     end 
     ... 
    end 
+0

ダブル 'DEFによって許可初期化(ユーザ) 'abiltiyはコピーエラーですか? – tonymarschall

+0

はい..それはスタックオーバーフローでそれを入れてタイプミスでした。それをキャッチしていただきありがとうございます。 –

+0

Bah ...実際のコードをもう一度チェックした後、スタックフローのコピーエラーではありませんでした。私は実際に自分のコードでそのくそを持っていた。今、私はばかみたいですが、それを覚えてくれてありがとう。 –

答えて

1

たぶん、あなたは他の方法で回避、それを試すことができ、初期can :read, Userを削除しcan :read, User, :studio_id => user.studio_id

+0

これははるかにきれいに見える、ありがとう! –

関連する問題