【发布时间】:2014-04-18 14:39:27
【问题描述】:
我已将 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
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-3 delegation ruby-2.0