当我定义一个方法时,我将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()
方法。
我不是在寻找修复,而是要解释这个魔法:)
由于
答案 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