2012-01-21 8 views
0

난 내 rails-App에 문제가 있습니다. 나는 cancan을 사용하여 특정 사용자의 링크를 숨 깁니다. 오류가 발생하지 않으며 사용자의 역할이 올바르게 인식됩니다. 그러나 내가 시도한 것은 무엇이든 내 링크는 결코 보여지지 않습니다. can? - Method는 항상 true를 반환합니다.레일 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이 definitly nil이 아닌 이 내 능력 클래스입니다. 나는 또한 시험을 시도하고 : 시험, 아무것도 작동하지 않습니다. 이 중요하지만, 내 컨트롤러의 머리를 먹으 렴 경우

<% 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, 레일 3.1.0 및 루비 1.8.7을 사용하고 있습니다.

나는 누군가가 알아낼 수 있기를 정말로 바란다. 나는 틀린 일을하고있다.

미리 감사드립니다.

+0

보면'? (: PROFF)? (: 교수)''는'경우를 current_user.role 안? – tommasop

+0

아니요, 저는 두 개의 ffs를 사용하여 역할을 명명했습니다. 모델 교수가 있었고 충돌이 필요하지 않았기 때문입니다. 그것이 nessecary인지 확실하지 않습니다. –

+0

이 'skip_authorization_check' 권한 부여 검사를 건너 뛰지 않습니다 ??? 콘솔에 – tommasop

답변

0

는 잘 모르겠어요,하지만 컨트롤러에

load_and_authorize_resource 

을 추가하여 모두 잘되어야합니다.
@exam은 이미 컨트롤러의 모든 작업에서로드되고 권한이 부여됩니다.
인스턴스 대신 클래스를 전달할 수도 있다는 것을 알고 있으므로 Exam이 작동해야하지만 여전히 내 솔루션을 사용해보십시오. 경우 current_user.role

는 또한 Debugging-Abilities-Cancan

+0

답해 주셔서 감사합니다. load_and_authorize 리소스를 시도 할 때 오류가 발생합니다. http://127.0.0.1:3000/의 웹 페이지에서 너무 많은 리디렉션이 발생했습니다. 비록 내가 뒤에 : 시험 뒤에 넣어. 이는 skip_authorization_check을 추가하거나 추가하지 않아도 발생합니다. 나는 링크에 설명 된대로 능력을 디버깅하려고했지만, 방금 그걸 가지고, 사용자가 허용 할 수있는 일을 할 수 없습니다. –

+0

좋아요, 나는 리다이렉트 문제를 없앴습니다. 그것은 내 컨트롤러에 있었고 색인 작업의 승인을 건너 뛰었습니다. 어쨌든 지금은 쇼보기로 이동하여 cancan에서 액세스 거부 메시지를 얻을 수 없습니다. 문제가 여전히 동일하다고 생각합니다. 왜 사용자에게 알려준 능력이 인정되지 않습니까? –

+0

Controller 코드와 Cancan Ability 클래스 및 이와 관련된 다른 도우미 함수를 게시하여 살펴볼 수 있습니까? 그것의 요지를 업로드하고 여기에 대한 링크를 게시하십시오. –

관련 문제