为什么 ActiveSupport try() 在我用 bang 定义方法 try 时被覆盖
Why ActiveSupport try() is override when I define a method try with a bang
当我定义一个方法将我的 ActiveRecord 用户属性 currency_code
设置为土耳其里拉 (TRY) 时,真是令人惊讶。
所以在User
中我定义了:
define_method("try!"){ update! currency_code: :try }
.
而且它显然用同一个块定义了 try()
和 try!()
User.first.try
的结果正在更新我的用户实例。
我进行了调查,但我不明白 try()
(如果它为 nil 则阻止您调用方法引发的主动支持)被覆盖并现在执行更新的位置。
为了确保我为美元定义了相同的
define_method("usd!"){ update! currency_code: :usd }
并且这个方法工作正常。此处未定义 usd()
方法。
我不是在寻找解决方法,而是在寻找对这个魔法的解释:)
谢谢
这是因为 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
当我定义一个方法将我的 ActiveRecord 用户属性 currency_code
设置为土耳其里拉 (TRY) 时,真是令人惊讶。
所以在User
中我定义了:
define_method("try!"){ update! currency_code: :try }
.
而且它显然用同一个块定义了 try()
和 try!()
User.first.try
的结果正在更新我的用户实例。
我进行了调查,但我不明白 try()
(如果它为 nil 则阻止您调用方法引发的主动支持)被覆盖并现在执行更新的位置。
为了确保我为美元定义了相同的
define_method("usd!"){ update! currency_code: :usd }
并且这个方法工作正常。此处未定义 usd()
方法。
我不是在寻找解决方法,而是在寻找对这个魔法的解释:)
谢谢
这是因为 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