当我定义一个方法尝试使用bang时,为什么ActiveSupport try()被覆盖

时间:2018-01-11 10:13:31

标签: ruby-on-rails ruby activerecord enums activesupport

当我定义一个方法时,我将ActiveRecord用户属性currency_code设置为土耳其里拉(TRY),这真是一个惊喜。

所以User我定义了:

define_method("try!"){ update! currency_code: :try }

它显然使用相同的块定义了try()try!() 并且User.first.try的结果是更新我的用户实例。

我正在调查,但我不明白try()(阻止你调用方法引发的活动支持,如果它为零)被覆盖并现在执行更新。

确定我为USD定义了相同的

define_method("usd!"){ update! currency_code: :usd }这个正在以正确的方式运作。此处未定义usd()方法。

我不是在寻找修复,而是要解释这个魔法:)

由于

1 个答案:

答案 0 :(得分:2)

这是因为ActiveSupport的try方法在内部也使用try!,至少在Rails 5.1中是这样的:

# File 'lib/active_support/core_ext/object/try.rb', line 5

def try(*a, &b)
  try!(*a, &b) if a.empty? || respond_to?(a.first)
end