2014-03-13 43 views
4

我已將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>

這裏的代碼是有點棘手,但本質上提供,因爲從SimpleDelegatorEntityAssociationsResponder繼承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 

回答

3

是的,有一個變化,有一個目前約opened issue此。

+0

謝謝Marc-André,我現在會在子類中重寫'method_missing'。 – Leo

相關問題