我已经将Rails 3.2应用程序从Ruby 1.9.3-p448升级到2.0.0-p451。
所有的自动化测试都通过了,除了一个,错误:
NameError: undefined local variable or method 'subject_path' for #...'<Administration::EntityAssociationsController::EntityAssociationsResponder:0x007fe007338d78>
这里的代码有点复杂,但本质上提供了subject_path
方法,因为EntityAssociationsResponder
继承自SimpleDelegator
,并使用当前的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
$@.delete_if {|t| %r"A#{Regexp.quote(__FILE__)}:#{__LINE__-2}:"o =~ t} if $@
end
end
end
是的,有一个变化,目前有一个关于这个的开放问题。