Одна роль на пользователя CanCan, неопределенная проблема метода "роль" - PullRequest
1 голос
/ 05 сентября 2011

Действительно запутался. Роли настроены и работают в соответствии с одной ролью для пользовательского метода . Моя модель пользователя ниже.

class User < ActiveRecord::Base

    ROLES = %w[admin landlord]

    def role?(role)
     roles.include? role.to_s
    end
 end

Когда я добавляю разрешения к своей модели способностей, я получаю следующую ошибку.

undefined method `role' for #<ActionDispatch::Session::AbstractStore::SessionHash:0x10433a5e0>

Моя модель способностей ниже.

class Ability
  include CanCan::Ability

  def initialize(user)
    if user.role == "admin"
      can :manage, :all
    else
     can :read, :all
    end
  end
end

А вот что я вижу в терминале.

NoMethodError (undefined method `role' for #<ActionDispatch::Session::AbstractStore::SessionHash:0x1044d46a8>):
  app/models/ability.rb:5:in `initialize'
  app/controllers/application_controller.rb:6:in `new'
  app/controllers/application_controller.rb:6:in `current_ability'

Как вы можете сказать, я только учусь! Даже толчок в правильном направлении был бы удивительным. Спасибо.

Ответы [ 2 ]

1 голос
/ 05 сентября 2011

проблема в том, что вы определили метод role?, но в ability.rb вы вызываете метод role, который, конечно, не определен

правильный способ сделать это будет

def initialize(user)
  if user.role? "admin"
    can :manage, :all
  else
    can :read, :all
  end
end
0 голосов
/ 05 сентября 2011

Вы передаете сеанс в CanCan. Вам нужно передать пользователя, который в данный момент вошел в систему. Я предполагаю, что в объяснении вашей книги по rails должен быть способ получить доступ к этому пользователю из переменной session. Передайте этого пользователя в качестве аргумента способности.

Если пользователь не вошел в систему, я бы отправил нового пользователя.

Вам необходимо изменить код, например:

def current_ability
  if session[:user_id]  # Replace with the method to get the user from your session
    user = User.find(session[:user_id])
  else
    user = User.new
  end

  @current_ability ||= Ability.new(user)
end
...