我编辑了设计RegistrationsController::create
方法来略微修改行为。我想要做的是,如果数据库中没有管理员用户,那么首先注册的用户将被分配管理员角色,否则它将成为普通用户。
但是,虽然该角色正确分配给了对象(已测试),但它并未持久存储到数据库中。
型号:
class User < ActiveRecord::Base
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
attr_accessor :role
Roles = [ :admin, :default ]
def is? requested_role
self.role == requested_role.to_s
end
def self.admin_role
return Roles[0]
end
def self.default_role
return Roles[1]
end
end
修改设计方法:
def create
build_resource(sign_up_params)
admin_user = User.find_by_role(User.admin_role)
if admin_user.nil?
resource.role = User.admin_role
else
resource.role = User.default_role
end
# here puts resource.role shows what's expected is indeed being assigned to the object
if resource.save
...
end
end
为什么role
不存储在数据库中?为什么是NULL
?
答案 0 :(得分:1)
如果您在桌面上将此列定为列,则不需要attr_accessor
:role
。只需在相关表格中定义相关列,ActiveRecord
即可为您提供数据库备份accessors
。
您的attr_accessor
将覆盖这些内容,并阻止他们将更改保留在数据库中。