【问题标题】:How to rescue specific validation in Rails如何拯救 Rails 中的特定验证
【发布时间】:2016-06-07 09:10:31
【问题描述】:

我有一个模型,对一个字段进行两次验证

class MyClass < ActiveRecord::Base
validates :address,
        uniqueness: {
            message: localized_message('uniqueness_key')
        },
        :format => {
            :with => /\A([a-zA-Z]\d{4}|)\z/,
            message: localized_message('format_key')
        }

验证消息是本地化的,因此我不知道它们将包含什么确切的文本。在控制器逻辑中,我需要挽救验证异常并有一些特定的格式验证逻辑。

如何准确检测“格式”验证异常?

【问题讨论】:

  • 哪种阵型?这取决于您要做什么,但您始终可以检查实例是否有效:@my_class.valid?,然后访问错误对象:@my_class.errors

标签: ruby-on-rails validation


【解决方案1】:

我发现的唯一方法是在下一个方法中生成我自己的异常

  1. 创建自定义异常

     class CustomException < Exception
     end
    
  2. 通过添加 strict 属性使 Rails 生成此异常而不是 ActiveRecordException

     class MyClass < ActiveRecord::Base
     validates :address,
         uniqueness: {
             message: localized_message('uniqueness_key')
         },
         :format => {
             :with => /\A([a-zA-Z]\d{4}|)\z/,
             message: localized_message('format_key'),
             strict: CustomException
         }
    
  3. 在我需要处理我的异常的地方

     rescue Exception => e
         if e.is_a?(CustomException)
             #Do my stuff here
         end
     end
    

更新

正如@TanguyP 在此特定实现中正确注意到的那样,其他不属于CustomException 类的异常将被忽略并“吞下”。它们也应该在 rescue Exception =&gt; e 块内处理或再次抛出以便在更高级别进行处理。

但是,更正确的做法是按如下方式实现第 3 点:

  1. 在我只需要处理我的异常的地方
    rescue CustomException => e
        #Do my stuff here
    end
    

【讨论】:

  • 为什么不rescue CustomException =&gt; e?您的代码默默地忽略了Exceptions,它们不是CustomExceptions。
  • 我认为这是一个跳过一些内容以强调特定实现的示例。但是,如果按原样执行它是对的,它将吞噬所有其他异常,我同意你的观点,仅拯救 CustomException 会更正确。我会更新我认为的答案。感谢@TanguyP 指出这个问题。
【解决方案2】:

获得你想要的东西的一种方法是newing你的对象,用细节初始化它,然后检查对象errors

例如,在你的情况下:

obj = MyClass.new(address: "incorrect_address")
obj.valid?
=> false
obj.errors.messages
=>  {:address=>["format_key", "is invalid"]}

【讨论】:

    猜你喜欢
    • 2010-12-15
    • 2019-09-22
    • 1970-01-01
    • 2013-11-27
    • 2010-10-07
    • 2017-01-17
    • 2014-03-06
    • 1970-01-01
    相关资源
    最近更新 更多