寻找可能导致麻烦的 Ruby 猴子补丁的来源?

Posted

技术标签:

【中文标题】寻找可能导致麻烦的 Ruby 猴子补丁的来源?【英文标题】:Finding source of possible Ruby monkey patch causing troubles? 【发布时间】:2021-07-23 23:54:24 【问题描述】:

我正在处理一个我还无法调试的错误。我在 Rails 6.0 中有一个 100% 绿色测试的应用程序。我尝试将应用程序更新到 Rails 6.1,现在我看到以下行为:

include ActionView::Helpers::NumberHelper
number_to_currency 7
TypeError (no implicit conversion of String into Integer)

红宝石 2.7.3 导轨 6.1

有很多宝石,我想知道这是否与某人修补某些东西有关,但我不知道是否有办法追踪修补的资金来源?或者,如果您有任何想法,我将不胜感激。

这是回溯:

number_to_currency 7
NoMethodError: undefined method `nan?' for nil:NilClass

   5  module ActiveSupport
   6    module NumberHelper
   7      class NumberToRoundedConverter < NumberConverter # :nodoc:
  11        def convert
  24          if precision = options[:precision]
  31            formatted_string =
❯ 32              if rounded_number.nan? || rounded_number.infinite? || rounded_number == rounded_number.to_i
  34              else
  40              end
  41          else
  47        end
  62      end
  63    end
  64  end

【问题讨论】:

你能显示一些痕迹吗? 【参考方案1】:

通过使用pry-rails gem,您很可能通过将binding.pry 放在发生错误的上方,然后重新运行代码来找到源代码。当 Pry REPL 出现时,您可以运行命令 show-source number_to_currency。这将显示文件位置,例如:

[2] pry(main)> show-source number_to_currency

From: /Users/.../actionview-6.0.2.2/lib/action_view/helpers/number_helper.rb:70:
Owner: ActionView::Helpers::NumberHelper
Visibility: public
Signature: number_to_currency(number, options=?)
Number of lines: 3

def number_to_currency(number, options = )
  delegate_number_helper_method(:number_to_currency, number, options)
end

如果您随后需要向上定义链,您也可以多次使用--super 标志向上直到找到问题。例如,要上升 2 个超级,您可以使用 show-source --super --super number_to_currency

您可以通过show-source --help查看更多选项

【讨论】:

以上是关于寻找可能导致麻烦的 Ruby 猴子补丁的来源?的主要内容,如果未能解决你的问题,请参考以下文章

您如何检测到 Ruby 中发生了猴子补丁?

ruby 因为没人喜欢猴子补丁。

ruby 猴子补丁模式

ruby 猴子补丁模式

ruby 猴子补丁用keen.io保存查询

“猴子补丁”真的那么糟糕吗? [关闭]