带有devise的Rails role_model给出错误“undefined method`beces_mask ='”

时间:2013-01-25 20:24:17

标签: ruby-on-rails devise cancan object-role-modeling

我有一个设计应用程序。我安装了role_model和cancan宝石。我将user.rb更新为:

require 'rubygems'
require 'role_model'

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  attr_accessible :email, :password, :password_confirmation, :remember_me, :roles, :roles_mask

  include RoleModel

  roles_attribute :roles_mask

  roles :admin, :contributor, :guest
end

然后,在rails控制台中我尝试

> u = User.find(:first)
  User Load (1.2ms)  SELECT "users".* FROM "users" LIMIT 1
 => #<User id: ...
> u.roles = [:admin]
NoMethodError: undefined method `roles_mask=' for #<User:0x00000002b57500>
    from /home/xxx/.rvm/gems/ruby-1.9.3-p194@rails-3.2.11/gems/activemodel-3.2.11/lib/active_model/attribute_methods.rb:407:in `method_missing'

roles_mask来自哪里?我需要包含其他内容吗?

2 个答案:

答案 0 :(得分:7)

除了安装宝石之外,还必须将roles_mask列添加到users表中,如此迁移

class AddRolesMaskToUser < ActiveRecord::Migration
  def change
    add_column :users, :roles_mask, :integer
  end
end

这解决了这个问题。

答案 1 :(得分:0)

这个问题与对象角色建模(建模语言)无关。它是关于如何建模对象的角色,这是一个完全不同的主题(角色这个词在这里有完全不同的含义)。

另一方面,如果要将对象角色建模与Rails结合使用,则星座查询语言(CQL)是ORM的纯文本再现,并且还包含以Rails为目标的生成器。