2012-06-17 2 views
1

Rails 3.0.13, Devise, CanCan и ActiveScaffold; Ruby 1.9.3 194 на RVM (если это имеет значение)Добавление ролей и разрешений для пользователя-разработчика; NoMethodError: неопределенный метод

Я пытаюсь настроить родовые роли для разработчиков и конкретных разрешений (требования в том, что роли имеют разрешения по умолчанию, но разрешения могут быть перезаписаны у пользователя уровень). Ability.rb может использовать метод is_implementer? без проблем

Keep получаю эту ошибку для роли или user_permissions, если я иду в консоль, назначить пользователя в вар (@user), а затем сделать @user.role или @user.user_permissions:

NoMethodError: undefined method `role' for #<ActiveRecord::Relation:0x98173e8> 
    from /home/scott/.rvm/gems/[email protected]/gems/activerecord-3.0.13/lib/active_record/relation.rb:374:in `method_missing' 
    from (irb):7 
    from /home/scott/.rvm/gems/[email protected]/gems/railties-3.0.13/lib/rails/commands/console.rb:44:in `start' 
    from /home/scott/.rvm/gems/[email protected]/gems/railties-3.0.13/lib/rails/commands/console.rb:8:in `start' 
    from /home/scott/.rvm/gems/[email protected]/gems/railties-3.0.13/lib/rails/commands.rb:23:in `<top (required)>' 
    from script/rails:6:in `require' 
    from script/rails:6:in `<main>' 

Модели:

Класс пользователя

class User < ActiveRecord::Base 
    has_and_belongs_to_many :user_groups 
    has_many :user_permissions 

    belongs_to :role 

    # Include default devise modules. Others available are: 
    # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

    # Setup accessible (or protected) attributes for your model 
    attr_accessible :email, :password, :password_confirmation, :remember_me, :role_id 

    def is_implementer? 
    self.role.implementer? 
    end 
end 

Разрешение пользователя

class UserPermission < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :permission 
end 

Роль

class Role < ActiveRecord::Base 
    has_many :default_role_permission 
    has_many :users 

    def implementer? 
    self.name == "Implementer" 
    end 
end 

Позвольте мне знать, если вы хотите увидеть что-нибудь еще (например, Способность CanCan.rb).

+0

Запустили ли вы все миграции базы данных? – sczizzo

+0

Да, у меня есть (потребовалось мгновение, чтобы подтвердить, чтобы я не ответил вслепую). – ScottJShea

+0

Что вы делаете в консоли? –

ответ

2

Когда вы делаете @user = User.where(:id => 2), который не извлекает данные и не создает экземпляр пользователя. Это ссылка ActiveRecord :: Relation, как указывает ваша ошибка.

Это потому, что вы можете сделать что-то вроде User.where(:active => true).limit(5)

Так что для вашего дела вы можете сделать

@user = User.where(:id => 2).first 

или

@user = User.find(2) # this is more common 

И тогда вы можете вызвать #role или #user_permissions, потому что теперь @user действительно является экземпляром пользователя.

+0

ARG. Благодарю. – ScottJShea

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