gpt4 book ai didi

ruby-on-rails - ActiveRecord 如何在验证中实现 `:if => ...`

转载 作者:行者123 更新时间:2023-12-04 19:59:12 24 4
gpt4 key购买 nike

我一直在查看 ActiveRecord 源以了解 :if => proc_or_method_name适用于 ActiveRecord 验证,但 :if 的唯一实例在源代码中的注释中解释了如何调用该功能。

例如,您可以在模型中有如下一行:

validates_presence_of :name, :if => :nameable?

并且仅在 nameable? 时才检查验证方法返回给定模型的真值。

这个功能实际定义在哪里,因为我在(Rails2)源中的任何地方都找不到这种行为?

最佳答案

:if在文件 activesupport\lib\active_support\callbacks.rb 中检查选项.

方法should_run_callback被调用来检查回调是否应该被执行。

还要看看回调链是如何处理的,从 run_callbacks 开始。方法在同一个文件中。

该文件的 v2.3.8 中的一些代码是:

def should_run_callback?(*args)
[options[:if]].flatten.compact.all? { |a| evaluate_method(a, *args) } &&
![options[:unless]].flatten.compact.any? { |a| evaluate_method(a, *args) }
end

这是我发现的(以防有人感兴趣):
  • 从 github 下载 Rails v2.3.8 并解压。
  • grepp'ed :if在所有 .rb 文件中
  • activerecord/CHANGELOG ,找到一条评论,其中提到:
    为所有验证添加了 :if 选项,这些验证可以使用 block 或方法指针来确定是否应该运行验证。 #1324 [杜安·约翰逊/jhosteny]。
  • 谷歌的评论。在 google cache 中找到它.
  • 发现评论/添加是 david
  • 于 05/21/05 10:57:18 发表的
  • 位于日期 2005-05-21 上 rails github history on page 546 :
  • :if 的方式有所了解作品
  • 发现commit引用的代码在v2.3.8中已经不存在了。必须找到该代码的最新位置
  • grepp'ed :if再次检查每个感觉“好”的文件。来到activesupport/lib/active_support/callbacks.rb
  • 搜索 :if在文件中,它只在一个位置找到,在方法 should_run_callback 中.
  • 已发布答案
  • 交叉手指,等待赏金。 :D

  • 那很有趣!

    关于ruby-on-rails - ActiveRecord 如何在验证中实现 `:if => ...`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4508732/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com