在我的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
在此示例中,只有管理员可以编辑约会的颜色,但如果用户 是管理员,则必须存在且有效。
答案 0 :(得分:1)
我已经决定将这些模型与控制器分开,保持其责任不同。
我选择的实现选项是:如果模型需要了解用户的某些信息,控制器应该告诉它。
attr_accessor :modifier_is_admin
if: lambda { obj.modifier_is_admin }
create
或update
的所有控制器中,他们合并属性modifier_is_admin: current_user.admin?
答案 1 :(得分:0)
您可以将validate
与if: Proc.new { }
这样的事情应该做 -
validate :validation_method, if: Proc.new { |user| user.has_role?(admin) }