【问题标题】:How to Inspect Validations that exist on ActiveRecord::Base Objects如何检查 ActiveRecord::Base 对象上存在的验证
【发布时间】:2010-11-17 04:03:56
【问题描述】:

我想创建一个辅助方法来自动输出带有 :maxlength 属性的 text_fields。我希望根据字段属性 validates_length 验证中指定的 :max 设置此 maxlegth,以保持 DRY。

我的问题是:有没有一种好方法可以检查对象属性上存在的验证,然后从该验证中提取最大长度。

我还计划从 validates_format 中提取正则表达式等其他内容,以便我可以在 text_field 上设置一个属性,然后 js 可以使用该属性来运行客户端验证。

谢谢。

加分项:为什么 Rails 不自动为我们添加最大长度到文本字段?

【问题讨论】:

  • 这是另一个想法。您可以创建一个 rake 任务来扫描 Rails 模型的所有代码以寻找验证。然后您可以解析所有验证并将它们转换为 javascript。不过,这似乎需要做很多工作。
  • 谢谢monocle,我早就想到了这个,但它看起来很hacky!你是对的,这听起来确实需要做很多工作,这是我一开始就试图通过这样做来节省的东西。我将深入研究这个项目的代码,看看他们是如何解决的:github.com/holman/live-validations

标签: ruby-on-rails validation activerecord


【解决方案1】:

在 Rails 3 中,您可以在对象上调用 _validators 方法来获取将运行的验证器列表:

t = Ticket.new
t._validators

【讨论】:

  • 如果我使用的是 rails 3,这听起来很完美,但我使用的是 rails 2.3。所以不行:-(
  • 在 Rails 4 上也很好。
【解决方案2】:

好吧,我不知道这是否是一个“好”的方式,但你可以初始化一个新对象,调用#valid?然后调用#errors 来获取属性和错误消息的哈希值。然后你必须解析这些错误消息。

user = User.new
user.valid?
errors_hash = user.errors

【讨论】:

  • 好建议,谢谢。我玩过这个,但是在获得字段的最大长度时这似乎没有帮助。这可能是因为该字段为空,因此最大长度验证没有失败,导致错误哈希中没有出现错误。我希望这是一个通用的东西,所以我不想让字段的最大长度验证失败,这样我就可以访问错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多