我已將Ruby 1.9.3-p448的Rails 3.2應用程序升級到2.0.0-p451。Ruby 2.0是否改變了SimpleDelegator的行爲?
所有的自動化測試都通過,扎一個,出現錯誤:
NameError: undefined local variable or method 'subject_path' for #...'<Administration::EntityAssociationsController::EntityAssociationsResponder:0x007fe007338d78>
這裏的代碼是有點棘手,但本質上提供,因爲從SimpleDelegator
的EntityAssociationsResponder
繼承subject_path
法,使用當前的Rails控制器進行初始化,該控制器將subject_path
作爲受保護的方法執行。
該方法是受保護的,因此它不會被Rails作爲控制器操作獲取。
這用於正常工作。 Ruby 2.0是否改變了這種行爲,所以只有公共方法被委派?我無法在文檔中找到任何有關此類更改的參考。
更新:
要修正這個錯誤,我有子類SimpleDelegator
像這樣:
class Responder < SimpleDelegator
# Override method_missing so protected methods can also be called.
def method_missing(m, *args, &block)
target = self.__getobj__
begin
if target.respond_to?(m) || target.protected_methods.include?(m)
target.__send__(m, *args, &block)
else
super(m, *args, &block)
end
ensure
[email protected]_if {|t| %r"\A#{Regexp.quote(__FILE__)}:#{__LINE__-2}:"o =~ t} if [email protected]
end
end
end
謝謝Marc-André,我現在會在子類中重寫'method_missing'。 – Leo