Rails跳过个人验证

时间:2016-05-10 09:38:42

标签: ruby-on-rails validation ruby-on-rails-4 activerecord

我的应用中的用户可以是普通用户或管理员。这只是数据库中的一列。

管理员拥有更多权限,例如可以通过“管理”面板更新其他用户数据。普通用户只能通过他们的个人资料页面更新自己的数据。

管理面板和用户个人资料页面使用不同的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

这样做的最佳方式是什么?

3 个答案:

答案 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列来完成此操作,角色可以是admindeveloper,'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是分开的,因此很容易测试(单位或功能......)。