2012-01-21 3 views
0

У меня проблема с моим rails-App. Я использую cancan, чтобы скрыть некоторые ссылки от определенных пользователей. У меня нет ошибок, и роль пользователя правильно распознана. Но что бы я ни пытался, моя ссылка никогда не отображается. Может? -Method всегда возвращает true. Это моя способность Класс:Rails 3.1: can? Метод всегда возвращает 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 это определенно не равны нулю. Я также пробовал Экзамен и: экзамен, ничего не работает.

<% 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 и ruby ​​1.8.7.

Я действительно надеюсь, кто-то может понять, что я делаю неправильно.

Заранее благодарен!

+0

'если current_user.role? (: Proff)' не должно это быть 'если current_user.role? (: Prof)'? – tommasop

+0

Нет, я просто назвал Роль, с двумя ffs, потому что у меня есть модель Prof, а также не хотелось конфликтов. Не уверен, что это неудобно. –

+0

- это не пропустить проверку авторизации skip_authorization_check ??? – tommasop

ответ

0

Я не уверен, но это должно быть все хорошо, добавляя

load_and_authorize_resource 

в контроллере.
При этом @exam уже загружен и авторизирован в каждом действии контроллера.
Я знаю, что вы также можете передать класс вместо экземпляра, поэтому Exam должен работать, но при этом попробуйте мое решение.

Также обратите внимание на Debugging-Abilities-Cancan

+0

Спасибо за ответ. Когда я пытаюсь загрузить ресурс load_and_authorize, я получаю сообщение об ошибке: веб-страница в http://127.0.0.1:3000/ привела к слишком большому количеству перенаправлений. Даже если я поставлю: экзамен позади него. Это будет происходить с дополнительным skip_authorization_check и без него. Я попытался отладить способности, как описано в ссылке, но я только что получил это, пользователю не разрешено делать то, что я ему разрешил. –

+0

Хорошо, я избавился от проблемы с перенаправлением. Это было в моем контроллере, и я пропустил авторизацию действия индекса. Во всяком случае, теперь я не могу попасть в представление шоу и получить сообщение о запрете доступа из cancan. Я думаю, что проблема остается прежней, почему способности, которые я предоставляю пользователю, не распознаются? –

+0

Можете ли вы разместить свой код контроллера, свой класс Cancan Ability и любые другие вспомогательные функции, которые вы используете, связанные с ним, чтобы посмотреть. Загрузите их из них и разместите здесь ссылки. –

Смежные вопросы