【问题标题】:Has Ruby 2.0 changed the behaviour of SimpleDelegator?Ruby 2.0 是否改变了 SimpleDelegator 的行为?
【发布时间】: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


    【解决方案1】:

    是的,发生了变化,目前有一个 opened issue 与此相关。

    【讨论】:

    • 感谢 Marc-André,我现在将在子类中覆盖 method_missing
    猜你喜欢
    • 2012-06-29
    • 2012-10-17
    • 2013-08-12
    • 2013-02-08
    • 2019-05-14
    • 2019-12-21
    • 2012-10-21
    • 2023-04-07
    • 1970-01-01
    相关资源
    最近更新 更多