【问题标题】:Rails: serializing a model's validators into jsonRails:将模型的验证器序列化为 json
【发布时间】:2014-07-26 23:50:08
【问题描述】:

我一直在使用 Rails 和许多前端 js 框架和库,包括 Ember、Angular 和 React。虽然这三个库在它们自己方面都很强大,但一个痛点(至少对我而言)一直是表单验证。我一直讨厌让我的模型验证(在 Rails 中)与我的表单验证(在 Ember/Angular/React 中)保持同步。

最近,我一直在尝试将模型的验证器序列化为 json。然而,虽然在记录上调用 as_json 会给我一个 json 哈希,但它不会给我特定属性的验证器类型。

例如,假设我有一个名为Assignment 的模型。当我创建一个新的Assignment 记录并在其上调用_validators 时,这就是我得到的。

pry(main)> Assignment.new._validators
=> 
{
  :title=>[#<ActiveRecord::Validations::PresenceValidator:0x0000010e123900 @attributes=  [:title], @options={}>],
  :full_prompt=>[#<ActiveRecord::Validations::PresenceValidator:0x0000010e122e60 @attributes=[:full_prompt], @options={}>],
  :submission_window=>[#<ActiveRecord::Validations::PresenceValidator:0x0000010e1223c0 @attributes=[:submission_window], @options={}>]
}

现在,当我添加 as_json 调用时,我得到了以下结果:

pry(main)> Assignment.new._validators.as_json
=> 
{
  "title"=>[{"attributes"=>["title"], "options"=>{}}],
  "full_prompt"=>[{"attributes"=>["full_prompt"], "options"=>{}}],
  "submission_window"=>[{"attributes"=>["submission_window"], "options"=>{}}]
}

如您所见,调用 as_json 会删除附加到模型属性的 validators 类型。

有没有人遇到过类似的情况和/或有解决方法?感谢您的帮助!

库尔特

【问题讨论】:

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


    【解决方案1】:

    这应该会更好......属性和选项哈希将是一个子哈希,它将是一个哈希的值,其中键是验证器类..当然,它们本身都是属性下的子哈希

    hash = {}
    Assignment._validators.each { |k, v| v.each {|val| hash[k] ||= {}; hash[k][val.class.to_s] = val }}
    hash.as_json
    

    【讨论】:

      【解决方案2】:

      Rails 向Object 添加了一个名为as_json 的方法。如您所见,here 它会检查相关对象是否响应to_hash(默认情况下ActiveModel::Validator 不会响应)。

      调用 instance_values.as_json(options) 的后备方法是您获取默认 JSON 的方式。

      我会在ActiveModel::Validator 上实现to_hash 方法,您可以在其中放入任何您想要的信息。

      initializers/active_model_validator.rb

      class ActiveModel::Validator
        def to_hash
          {} # custom implementation here...
        end
      end
      

      如果您想维护默认 JSON 并简单地向其附加其他信息,您可以执行类似的操作

      initializers/active_model_validator.rb

      class ActiveModel::Validator
        def to_hash
          instance_values.tap do |hash|
            # custom implementation here...
          end        
        end
      end
      

      【讨论】:

        猜你喜欢
        • 2018-11-18
        • 2011-09-06
        • 1970-01-01
        • 1970-01-01
        • 2012-06-04
        • 2017-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多