ruby-on-rails - 为设计用户添加角色和权限;无方法错误 : undefined method

标签 ruby-on-rails ruby devise cancan activescaffold

Rails 3.0.13、Devise、CanCan 和 ActiveScaffold; RVM 上的 Ruby 1.9.3 194(如果有什么区别的话)

我正在尝试为设备用户设置通用角色和特定权限(要求角色具有默认权限,但可以在用户级别覆盖权限)。 ability.rb 能够毫无问题地使用 is_implementer? 方法

如果我进入控制台,将用户分配给 var (@user),然后执行 @user.role@user.user_permissions:

NoMethodError: undefined method `role' for #<ActiveRecord::Relation:0x98173e8>
    from /home/scott/.rvm/gems/ruby-1.9.3-p194@rails3/gems/activerecord-3.0.13/lib/active_record/relation.rb:374:in `method_missing'
    from (irb):7
    from /home/scott/.rvm/gems/ruby-1.9.3-p194@rails3/gems/railties-3.0.13/lib/rails/commands/console.rb:44:in `start'
    from /home/scott/.rvm/gems/ruby-1.9.3-p194@rails3/gems/railties-3.0.13/lib/rails/commands/console.rb:8:in `start'
    from /home/scott/.rvm/gems/ruby-1.9.3-p194@rails3/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),请告诉我。

最佳答案

当您执行 @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实际上是一个User实例。

关于ruby-on-rails - 为设计用户添加角色和权限;无方法错误 : undefined method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11073488/

相关文章:

mysql - mysql2 gem 在 OSX : "Symbol not found: _rb_prohibit_interrupt" 上加载 Rails env 时出错

ruby-on-rails - 从 Authlogic 迁移到 Devise

ruby-on-rails - 使用Devise和Rails Admin对特定路线进行身份验证

ruby-on-rails - 将已编辑的值 contenteditable 字段从 View 传递到 Rails 中的 Controller

ruby-on-rails - JBuilder 从 View 调用 to_builder

ruby-on-rails - 如何设置局部变量

ruby-on-rails - "authenticate_user!"方法的设计实现在哪里?

ruby-on-rails - 给定一个带句号的输入,如何让所有内容都跟在它后面?

ruby-on-rails - not_nil 有 Ruby 或 Ruby 主义吗?与零相反?方法?

ruby-on-rails - 如何为预写写不同的ID