如何在Rails中拯救特定的验证

时间:2016-06-07 09:10:31

标签: ruby-on-rails validation

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

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')
        }

验证邮件已本地化,因此我不知道它们将包含哪些确切文本。在控制器逻辑中,我需要挽救验证异常,并为格式验证提供一些特定的逻辑。

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

2 个答案:

答案 0 :(得分:1)

我找到的唯一方法是以下一种方式生成我自己的例外

  1. 创建自定义例外

    class CustomException < Exception
    end
    
  2. 通过添加严格属性,让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
    

答案 1 :(得分:0)

获得所需内容的一种方法是new您的对象,使用详细信息启动它,然后检查对象errors

例如,在您的情况下:

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