如何更简洁地针对特定属性调用指定的自定义EachValidator验证器?
更简洁的自定义验证器调用方式
你可以通过以下几种方式简化WhitespaceValidator的调用,无需手动实例化验证器并调用validate_each:
方案1:利用验证上下文(推荐)
在模型中给这个验证器指定一个专属的上下文,之后就能像调用valid?一样触发它:
模型代码:
validates :name, whitespace: true, on: :whitespace_check
控制器调用:
# 触发指定上下文的验证,仅运行标记为on: :whitespace_check的验证 user.valid?(:whitespace_check) # 如果不需要完整的valid?流程,也可以用validate方法 user.validate(:whitespace_check)
验证后,错误信息会自动存入user.errors[:name],直接用于表单反馈即可。
方案2:在模型中封装验证方法
在模型里写一个实例方法封装验证逻辑,控制器直接调用这个方法:
模型代码:
def check_name_whitespace validator = Validators::WhitespaceValidator.new(attributes: :name) validator.validate_each(self, :name, name) errors[:name].present? # 返回是否存在首尾空格错误 end
控制器调用:
# 检查name的空格问题 user.check_name_whitespace # 查看错误信息 user.errors[:name]
方案3:动态筛选并运行验证器
如果不想修改模型,可以直接从对象的验证器列表中筛选出WhitespaceValidator并运行:
控制器代码:
# 筛选name属性上的WhitespaceValidator并执行验证 user.validators_on(:name).select { |v| v.is_a?(Validators::WhitespaceValidator) }.each do |validator| validator.validate_each(user, :name, user.name) end # 之后同样可以通过user.errors[:name]获取错误
内容的提问来源于stack exchange,提问作者Ashbury
相关产品推荐
相关产品推荐

