ruby-on-rails - Ruby 2.0 是否改变了 SimpleDelegator 的行为?

标签 ruby-on-rails ruby ruby-on-rails-3 delegation ruby-2.0

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

相关文章:

ruby-on-rails - 以非线程安全的方式“sass”

javascript - .live 不是 rails 3.2.11 中的函数错误

ruby-on-rails - 获取 Assets 管道路径中的 Gem 供应商文件

html - 更改从 f.label 生成的自动文本

ruby-on-rails - 如何从另一个目录中获取 ruby​​ 文件

ruby-on-rails - 记录数组的每个元素的 bool 值为真 - Rails 4

ruby-on-rails-3 - 无法将 Rails 日志发送到 graylog2

ruby-on-rails - 运行 "bin/rake assets:precompile"时未设置 I18n 加载路径!

ruby-on-rails - 您如何构造一个 Rails 模型,其中两个属性需要与另一个模型共享相同的关联?

ruby-on-rails - 通过 slug 和 id 查找