Rails:将模型的验证器序列化为json

时间:2014-07-26 23:50:08

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

我一直在使用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附加到模型的属性。

是否有人遇到类似情况和/或有解决方法?谢谢你的帮助!

库尔特

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

Rails为名为Object的{​​{1}}添加了一种方法。正如您所见here,它会检查相关对象是否响应as_json(默认情况下to_hash不响应)。

回调它调用ActiveModel::Validator,这就是你获得默认JSON的方式。

我会在instance_values.as_json(options)上实施to_hash方法,您可以将任何信息放在您想要的位置。

<强>初始化/ active_model_validator.rb

ActiveModel::Validator

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

的操作

<强>初始化/ active_model_validator.rb

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