【问题标题】:Get the names of the validators with errors in Rails获取 Rails 中存在错误的验证器的名称
【发布时间】:2014-01-27 00:20:54
【问题描述】:

我正在使用 Rails 构建 JSON API。因为客户端负责呈现错误消息,所以我想将默认错误消息替换为验证器的名称。例如,而不是 contact.errors.to_hash 返回这个:

{
  :name=>["can't be blank"], 
  :email=>["can't be blank", "is invalid"], 
  :message=>["can't be blank"]
}

我希望它返回这个:

{
  :name=>["presence"], 
  :email=>["presence", "format"], 
  :message=>["presence"]
}

在 Rails 中有简单的方法吗?

编辑:

我发现错误消息具有预定义类型,这些类型记录在 Rails Internationalization (I18n) API 中。例如,presence 映射到 blank。我不介意是否使用这些映射值。

【问题讨论】:

    标签: ruby-on-rails ruby validation ruby-on-rails-4


    【解决方案1】:

    Custom Validators

    除了将:message 属性更改为问题的名称之外,您可能希望使用Custom Validator 手动构建错误哈希:

    #app/models/model.rb
    Class Model < ActiveRecord::Base
        include ActiveModel::Validations
        validates_with MyValidator
    end
    
    class MyValidator < ActiveModel::Validator
        def validate(record)
            unless your_logic_here
               record.errors[:name] << ['Need a name starting with X please!', 'presence']
            end
        end
    end
    

    【讨论】:

    • 感谢您的回复,但我真的只是想使用内置的验证器。
    • 好的! errors hash 看起来不像是错误的实际格式。我可能是错的,但我觉得自定义验证器将允许您以自己的方式添加到错误哈希
    • 是的,不幸的是它没有。 ActiveModel::Errors 使用了一个内部错误类,该类具有 type 属性,但未公开。自定义验证器可以让我添加自己的消息,但感觉工作量大于价值。我发布了我对这个问题的丑陋解决方案。
    • 恭喜你取得了成功!我会再考虑一下你可以做些什么来改进它
    • 谢谢!如果您有任何想法,请告诉我。
    【解决方案2】:

    我快速而肮脏的解决方案是用类型名称覆盖 i18n en.yml 文件中的错误消息。

    en:
      errors:
        messages:
          blank: "blank"
          invalid: "invalid"
    

    这可行,但感觉很脏且没有必要。我希望其他人能提出更好的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-25
      • 1970-01-01
      • 2023-02-26
      • 2020-01-17
      • 2022-10-14
      • 2019-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多