我已将 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 Controller 进行初始化,该 Controller 实现了 subject_path
作为一种 protected 方法。
该方法受到保护,因此它不会被 Rails 作为 Controller 操作获取。
这曾经工作得很好。 Ruby 2.0 是否已更改此行为以便仅委托(delegate)公共(public)方法?我在文档中找不到任何关于此类更改的引用。
更新:
为了修复这个错误,我将 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
最佳答案
是的,有变化,目前有一个 opened issue关于这个。
关于ruby-on-rails - Ruby 2.0 是否改变了 SimpleDelegator 的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22385796/