CANCAN неопределенный метод `user_type?' для администратора: строка

вот моя проблема:

Я использую камень канкан. Я думаю, что все настроено хорошо, за исключением одной вещи, которая производит undefined method 'user_type?' for "admin":String.

Вот моя способность.rb

class Ability
  include CanCan::Ability
  def initialize(user)
       user ||= User.new # guest user
       if user.user_type? :admin
         can :manage, :all
       # [code code code code commented to find more easily the problem]
        else
          can :read, :all
        end
  end
end

Мой пользователь.rb

require 'digest/sha2'

class User < ActiveRecord::Base
  #definisco i ruoli
  ROLES = %w[admin client banned]
  default_scope :order => 'user' [...]

Я не могу понять, что мне нужно изменить. Почему if user.user_type? :admin не проверяет текущий атрибут пользователя? Большое спасибо за внимание!

UP: Хорошо, я читал, что для cancan нужен метод "current_user", объявленный в контроллере приложения. Теперь я работаю над этим. Новости, скоро.


person Massimo Variolo    schedule 13.05.2011    source источник
comment
Где вы определили user_type? метод?   -  person Shreyas    schedule 13.05.2011
comment
Где вы проверяете авторизацию? Какой контроллер? (если это контроллер) Пожалуйста, вставьте и этот код. Это потому, что каким-то образом переменная user, передаваемая в CanCan, представляет собой строку со значением "admin" — вы хотите, чтобы user на самом деле было экземпляром User.   -  person Ramon Tayag    schedule 13.05.2011
comment
решено!!! в способность.rb, если user.user_type == admin В контроллере приложений я добавляю def current_user @current_user = User.find_by_id(session[:user_id]) end СПАСИБО!   -  person Massimo Variolo    schedule 13.05.2011


Ответы (1)


Вы должны сделать так. Я думаю, что это лучший подход.

Посеять роли в БД.

И в помощнике приложения вставьте этот код.

def is_admin?(user)
  admin_role = Role.find(:first, :conditions => ["name = ?", "admin"])
  return user.roles.include?(admin_role)
end

И затем в способности вызова, как

            class Ability
             include CanCan::Ability
             def initialize(user)
               user ||= User.new # guest user
                 if is_admin?(user)
                   can :manage, :all
                    # [code code code code commented to find more easily the problem]
                 else
                   can :read, :all
                 end
             end
           end

И будет нормально работать.......

person Kashiftufail    schedule 26.03.2012