我的应用中的用户可以是普通用户或管理员。这只是数据库中的一列。
管理员拥有更多权限,例如可以通过“管理”面板更新其他用户数据。普通用户只能通过他们的个人资料页面更新自己的数据。
管理面板和用户个人资料页面使用不同的rails控制器(他们自己的)。 可以通过管理控制器更改任何用户数据。
这是我对模型用户的更新方法的验证:
validate on: :update do
validate_name
validate_age
validate_blood_type
end
让我们说当管理员通过管理面板更新用户时,我想跳过validate_age:
if update(age: new_age)
render json: {message: "Age updated"}, status: :ok
end
这样做的最佳方式是什么?
答案 0 :(得分:1)
验证被认为是检查数据(格式,边界,依赖关系),而不是权限。 AFAIK,validate语句不允许您传递更多参数(如当前活动用户)。
围绕这个的不同方式:
将"更新"用户作为模型中的自己的字段(如" updated_by"引用您的用户表)并创建一个自定义验证器,用于检查updated_by用户是否具有管理员权限。您应该仔细考虑影响:updated_by用户必须始终设置正确,您有更多参考,更多管理开销等。
在模型中定义单独的检查功能,例如
model.rb:
def valid_age?(current_user)
self.age < min_age ? (current_user == admin_user) : true
end
每次更新数据时都会从控制器调用此检查
答案 1 :(得分:0)
您可以通过向用户添加role
列来完成此操作,角色可以是admin
,developer
,'company_user'或其他任何内容。
然后你可以在调用验证之前检查角色,请检查下面的代码。
validate on: :update do
validate_name
validate_age unless self.role == 'admin'
validate_blood_type
end
答案 2 :(得分:0)
尝试:
validate on: :update do
validate_name
validate_age unless admin_update
validate_blood_type
end
def admin_update
updated_by == User::getAdminId()
end
更新: 为什么?:当检查条件发生变化时,只需更改admin_update函数即可。 并且,admin_update是分开的,因此很容易测试(单位或功能......)。