仅当执行保存的用户具有特定角色时才验证字段?

时间:2017-04-21 04:37:50

标签: ruby-on-rails validation authorization

在我的Rails应用程序中,我有一个模型属性,只允许管理员编辑。对于管理员,该字段必须存在且有效。

但是,在使用非管理员用户进行测试时,保存模型失败,因为它表示该字段的值无效。

我不想删除状态验证或allow_blank,因为这对管理员用户来说实际上无效。

如何进行仅适用于某个用户角色的验证?

更新

Section 5.4 of the Rails Guide for Active Record Validations中描述了我所寻找的必要性,但是第5.3和5.4节假设我保存在User模型上,对吧?

我实际上是在尝试允许用户在我的应用中编辑任何模型,但只有一些字段可以由管理员保存。

添加更多上下文。为了防止非管理员保存他们不允许的属性,我根据用户的角色类型设置了不同的strong parameters ..所以我关注的字段不是&#39甚至打到模型,这就是为什么验证现在在抱怨。

从概念上讲,我正在寻找的是指导用户编辑他们的用户记录的第5.4节中显示的内容,而不是以下内容:

class User < ApplicationRecord
  with_options if: :is_admin? do |admin|
    admin.validates :password, length: { minimum: 10 }
    admin.validates :email, presence: true
  end
end

我需要的是

class Appointment < ApplicationRecord
  with_options if: current_user.is_admin? do |admin|
    admin.validates :color, presence: true
  end
end

在此示例中,只有管理员可以编辑约会的颜色,但如果用户 是管理员,则必须存在且有效。

2 个答案:

答案 0 :(得分:1)

我已经决定将这些模型与控制器分开,保持其责任不同。

我选择的实现选项是:如果模型需要了解用户的某些信息,控制器应该告诉它。

  1. 对于我添加了attr_accessor :modifier_is_admin
  2. 的模型
  3. 在相应的模型验证中,我添加了if: lambda { obj.modifier_is_admin }
  4. 在呼叫createupdate的所有控制器中,他们合并属性modifier_is_admin: current_user.admin?

答案 1 :(得分:0)

您可以将validateif: Proc.new { }

一起使用

这样的事情应该做 -

validate :validation_method, if: Proc.new { |user| user.has_role?(admin) }