2012-01-21 5 views
0

私は自分のレールアプリに問題があります。私はcancanを使用して、特定のユーザーからのリンクを隠すことができます。 エラーが発生せず、ユーザーの役割が正しく認識されています。しかし、私が何をしようと、私のリンクは決して表示されません。 can?-Methodは常にtrueを返します。 これは私の能力クラスです:Rails 3.1:できますか?メソッドは常にfalseを返します

class Ability 
include CanCan::Ability 

def initialize(user) 

    current_user ||= User.new # guest user (not logged in) 
    puts "Debug" 
    if current_user.role?(:Admin) 
    can :manage, Prof 
    else 
    if current_user.role?(:Proff) 
     can :manage, [Exam, Note, Student,Break,Appointment] 
    else 
     if current_user.role?(:Student) 
     can :update, Appointment 
     can :show, Exam 
     end 
    end 
    end 
    end 
end 

これが私の見解からである:@examは間違いなくnilでありません。私も試験に合格しました:試験、何も動作しません。これは重要ですが、私のコントローラの頭のthats場合

<% if can? :edit, @exam%> 
    <%= link_to 'Bearbeiten', edit_exam_path(@exam) %> | 
    <%= link_to 'Alle Prüfungen', exams_path %> 
<% end%> 

私は、知っているドント:

class ExamsController < ApplicationController 
    before_filter :login_required 
    skip_authorization_check 
    ... 

は私の試験のモデル:コンソールで

class Exam < ActiveRecord::Base 

    belongs_to :prof 

    validates_presence_of :prof_id,:title,:deadline 
    has_many :examdates, :dependent => :destroy 
    accepts_nested_attributes_for :examdates, 
     :allow_destroy => true#, :reject_if => proc {| a| a[:date].blank? } 
end 

私は

を試してみました
Exam.accessible_by(ability) 

となっています。 私はcancan 1.6.7、rails 3.1.0とruby 1.8.7を使用しています。

本当に、私が間違っていることを誰かが理解できることを願っています。

ありがとうございます!

+0

' current_user.role場合を見て? – tommasop

+0

いいえ、私はちょうどモデルProfを持っているので、2つのffsを使ってロールに名前を付けました。もしそれが必ずしも確実ではない。 –

+0

はこの 'skip_authorization_check'では認証チェックをスキップしていませんか?コンソールの – tommasop

答えて

0

私はわからないんだけど、それはコントローラで

load_and_authorize_resource 

を追加することにより、すべての良いことがあります。
@examは既にコントローラのすべてのアクションでロードされ、許可されています。
インスタンスの代わりにクラスを渡すこともできますので、Examは動作するはずですが、私の解決策を試してください。 `(::Proff)?current_user.role場合` `それはすべきではない?(教授)

はまたDebugging-Abilities-Cancan

+0

答えをありがとう。 load_and_authorizeリソースを試してみると、エラーが表示されます。http://127.0.0.1:3000/のWebページでリダイレクトが多すぎます。私はそれの後ろに試験を入れても。これは、追加のskip_authorization_checkの有無になります。私はリンクに記載されているように能力をデバッグしようとしましたが、私はちょうどそれを得ました、ユーザーは私が彼と一緒に許したことをすることは許されていません。 –

+0

さて、私はリダイレクト問題を取り除きました。それは私のコントローラにあったので、私はインデックスアクションの承認をスキップしました。とにかく私はショービューにアクセスできず、カンカンからアクセス拒否メッセージを受け取ることができません。私は問題はまだ同じだと思う、なぜ私はユーザーに与える能力は認識されていないのですか? –

+0

コントローラーコードとCancan Abilityクラス、およびそれを使用している他のヘルパー関数を見てみることができます。それらの要点をアップロードし、ここにリンクを投稿してください。 –

関連する問題