我一直在使用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
附加到模型的属性。
是否有人遇到类似情况和/或有解决方法?谢谢你的帮助!
库尔特
答案 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