我正在开发一个使用CanCanCan宝石的应用程序,这是Ryan Bates'的更新。 CanCan,用于授权。 CanCan使用:role
属性来指定能力。我的用户模型还使用STI,包含管理员和另一个名为"代理的角色。"为避免冗余,并保持干燥,我也将:role
属性用作inheritance_column
。
class User < ActiveRecord::Base
has_secure_password
attr_reader :role
scope :profile, -> { includes(:address, :city, :state, :zip, :phone, :email)}
scope :office_use, -> { includes(:username, :role, :type, :last_name, :first_name, :password_digest)}
self.inheritance_column = :role
def self.roles
%w[Admin Agent]
end
在Rails控制台中,我创建了一个新用户。我删除了从输入表单中分配角色的选择,计算我手动创建管理员,因为不会很多,所以它输入默认值,&#34;代理&#34;:
(63.4ms) COMMIT
=> #<User id: 2, username: "ff001", role: "Agent", password_digest: "$2a$10$osm9oEB51GKilUkX64sV7eMlt6pEfuzEfKIf3gRo/az...", last_name: "Flintstone", first_name: "Fred", address: nil, city: nil, state: nil, zip: nil, phone: nil, email: nil, created_at: "2015-01-01 19:01:11", updated_at: "2015-01-01 19:01:11"> 2.1.4 :019 >
检索行:
> User.last
User Load (0.6ms) SELECT `users`.* FROM `users` ORDER BY `users`.`id` DESC LIMIT 1
=> #<Agent id: 2, username: "ff001", role: "Agent", password_digest: "$2a$10$osm9oEB51GKilUkX64sV7eMlt6pEfuzEfKIf3gRo/az...", last_name: "Flintstone", first_name: "Fred", address: nil, city: nil, state: nil, zip: nil, phone: nil, email: nil, created_at: "2015-01-01 19:01:11", updated_at: "2015-01-01 19:01:11"> 2.1.4 :020 >
现在查询:role
属性:
> User.last.role
User Load (0.4ms) SELECT `users`.* FROM `users` ORDER BY `users`.`id` DESC LIMIT 1
=> nil
只有在role属性的情况下才会发生这种情况 - 查询时所有其他列都返回正确的值。该角色不仅用于应用程序中的授权,还用于为管理员路由到不同的资源。由于ActiveRecord在控制器中返回nil,因此我的路由也无法正常工作。我甚至没有达到授权发挥作用的程度。在路线正常工作之前,授权有点没有实际意义。
为什么会这样? :role
属性是唯一一个以这种方式运行的属性。
答案 0 :(得分:1)
删除attr_reader :role
- 这应该已在您的架构中列出。然后在您的控制台中执行User.last.role
,然后您就可以获得已分配的内容。