gpt4 book ai didi

ruby-on-rails - 如何找出拦截 'method_missing' 的内容

转载 作者:数据小太阳 更新时间:2023-10-29 07:11:41 25 4
gpt4 key购买 nike

使用 Ruby 1.8.6/Rails 2.3.2

我注意到在我的任何 ActiveRecord 模型类上调用的任何方法都返回 nil 而不是 NoMethodError。除了烦人之外,这还破坏了动态查找器(find_by_namefind_by_id 等),因为即使存在记录,它们也总是返回 nil。不从 ActiveRecord::Base 派生的标准类不受影响。

有没有办法追踪在 ActiveRecord::Base 之前拦截 method_missing 的是什么?

更新:

切换到 1.8.7 后,我发现(感谢@MichaelKohl)will_paginate 插件首先处理 method_missing。但是 will_paginate 已经在我们的系统中(未更改)存在了很长一段时间,而罪魁祸首一定是链条后面的东西。关于如何查看此链中接下来会发生什么的任何想法?

更新:

事实证明,有一个 gem (annotate-2.4.0) 正在猴子修补 ActiveRecord::Base#method_missing 作为空白方法。卸载 gem 解决了我的问题。虽然给出的答案都没有真正找到问题,但@Yanhao 的答案最接近,因为它只需要一个小的调整就可以发现有问题的别名方法

最佳答案

我认为@Sebi 的回答很有帮助,但我想像这样改进它:

set_trace_func proc { |event, file, line, id, binding, classname|
printf "%8s %s:%-2d %10s %8s\n", event, file, line, id, classname if id.to_s == 'method_missing'
}

结果是这样的:

ruby-1.8.7-p334 :036 > SomeModel.some_missing_method
call /Users/.../.rvm/gems/ruby-1.8.7-p334/gems/activerecord-2.3.12/lib/active_record/base.rb:1873 method_missing ActiveRecord::Base
line /Users/.../.rvm/gems/ruby-1.8.7-p334/gems/activerecord-2.3.12/lib/active_record/base.rb:1874 method_missing ActiveRecord::Base
line /Users/.../.rvm/gems/ruby-1.8.7-p334/gems/activerecord-2.3.12/lib/active_record/base.rb:1874 method_missing ActiveRecord::Base
line /Users/.../.rvm/gems/ruby-1.8.7-p334/gems/activerecord-2.3.12/lib/active_record/base.rb:1981 method_missing ActiveRecord::Base
line /Users/.../.rvm/gems/ruby-1.8.7-p334/gems/activerecord-2.3.12/lib/active_record/base.rb:1998 method_missing ActiveRecord::Base
c-call /Users/.../.rvm/gems/ruby-1.8.7-p334/gems/activerecord-2.3.12/lib/active_record/base.rb:1998 method_missing Kernel
raise /Users/.../.rvm/gems/ruby-1.8.7-p334/gems/activerecord-2.3.12/lib/active_record/base.rb:1998 method_missing ActiveRecord::Base
c-return /Users/.../.rvm/gems/ruby-1.8.7-p334/gems/activerecord-2.3.12/lib/active_record/base.rb:1998 method_missing Kernel
return /Users/.../.rvm/gems/ruby-1.8.7-p334/gems/activerecord-2.3.12/lib/active_record/base.rb:1998 method_missing ActiveRecord::Base

关于ruby-on-rails - 如何找出拦截 'method_missing' 的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9364684/

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