我正在开发一个使用 CanCanCan gem 的应用程序,它是 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 控制台中,我创建了一个新用户。我从输入表单中删除了分配角色的选项,我想我会手动创建管理员,因为不会有很多,所以它输入默认值,“代理”:
(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
这只发生在角色属性的情况下——所有其他列在查询时返回它们的正确值。该角色不仅用于应用程序中的授权,还用于为管理员路由到不同的资源。由于 ActiveRecord 在 Controller 中返回 nil,因此我的路由也无法正常工作。我什至还没有达到授权发挥作用的地步。在路由正常工作之前,授权还没有实际意义。
为什么会这样? :role
属性是唯一以这种方式表现的属性。
最佳答案
删除 attr_reader :role
- 这应该已经在您的模式中进行了概述。然后在您的控制台中执行 User.last.role
,您将取回您分配的内容。
关于ruby-on-rails - Rails 控制台为包含值的列返回 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27733799/