ruby-on-rails – Ruby 2.0改变了SimpleDelegator的行为吗?

我已将Rails 3.2应用程序从 Ruby 1.9.3-p448升级到2.0.0-p451.

所有的自动化测试都通过,第一个,错误

NameError:未定义的局部变量或方法’subject_path’用于#…’< 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,&block)
      else
        super(m,&block)
      end
    ensure
      $@.delete_if {|t| %r"\A#{Regexp.quote(__FILE__)}:#{__LINE__-2}:"o =~ t} if $@
    end
  end

end

解决方法

是的,有一个变化,目前有一个 opened issue左右.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...