использование cancan для получения неопределенной локальной переменной или метода `role ' - PullRequest
0 голосов
/ 11 августа 2011

Я разочаровался в попытке заблокировать все действия в приложении. В настоящее время я размещаю в каждом контроллере, кроме устройства / регистрации:

load_and_authorize_resource

в пользовательской модели:

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

в модели способности:

if user.role? :superadmin
  can :manage, :all
end

Однако я получаю следующую ошибку:

undefined local variable or method `roles'
app/models/user.rb:33:in `role?'
app/models/ability.rb:7:in `initialize'

Спасибо за вашу помощь.

ОБНОВЛЕНИЕ: Из-за ответа Богдана, приведенного ниже, я заглянул в документацию и обнаружил, что существуют разные методы настройки моделей канканов. В настоящее время у нас есть 6 различных ролей, в результате чего в базе данных есть 6 различных логических полей. Я думал об иерархическом подходе к определению ролей, когда у одного пользователя может быть много ролей, а у одной роли много пользователей. Есть два способа установить определения ролей. Первый . Второй . Для простоты использования я думаю, что я определю каждую роль исчерпывающе, поэтому для каждого человека есть только одна роль. Интересно, каковы недостатки этого.

ОБНОВЛЕНИЕ: Я прокомментировал все другие роли, кроме superadmin, как определено выше. Понял, что это не имеет никакого отношения ко многим проблемам. Итак ...

Ответы [ 2 ]

2 голосов
/ 11 августа 2011

В вашей модели должно быть has_and_belongs_to_many :roles или любое другое пользовательское определение для метода roles

Редактировать

после того, как вы добавили has_and_belongs_to_many :roles к вашей User модели, чтобы все работало, что вам нужно

определить новую модель с именем Role с хотя бы name атрибутом

изменение

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

до

def role?(role)
  roles.map(&:name).include? role.to_s
end

Редактировать

миграция

class CreateRolesUsers < ActiveRecord::Migration
  def self.up
    create_table :roles_users do |t|
      t.integer :user_id
      t.integer :role_id
    end
  end

  def self.down
    drop_table :roles_users
  end
end

просто добавьте эту миграцию и запустите rake db:migrate rails сделает все остальное

0 голосов
/ 11 сентября 2014

рельсы HBTM отношения упорядочивают имя таблицы в алфавитном порядке. Попробуйте изменить миграцию на

create_table :user_roles
...