Ruby 2.0是否改变了SimpleDelegator的行为?



我已经将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

是的,有一个变化,目前有一个关于这个的开放问题。

相关内容

  • 没有找到相关文章

最新更新