覆盖Controller中的基类方法

时间:2009-06-23 00:47:23

标签: ruby-on-rails ruby monkeypatching mixins

我试图欺骗一个非常复杂的黑盒子以不同的方式显示一些浮动(这是Gruff图形库,所以这被渲染成图像)。

在控制台中,我可以粘贴它:

  logger = RAILS_DEFAULT_LOGGER
  logger.debug "Here's a float #{455.67.to_s}"
    eval %{class Float
    def to_s_with_time
      h = (self / 60).to_i
      m = self.to_i % 60
      return h.to_s + ':' + m.to_s
    end
    alias_method_chain :to_s, :time
    end
    }
    logger.debug "Here's another #{455.67.to_s}"

我会看到

Here is a float 455.67
Here is another 7:35

但是如果我将相同的代码粘贴到控制器中,我会看到

Here is a float 455.67
Here is another 455.67

为什么我不能在控制器中替换Float.to_s?我也会接受这个问题的答案:“有什么更好的方法来实现这个目标?”

1 个答案:

答案 0 :(得分:1)

如果要替换Float#to_s的行为,可以尝试将monkeypatch添加到initializer中的Float类中。但是,这将在您的Rails应用程序中全局修补Float#to_s。

配置/初始化/ float_patch.rb:

class Float
  def to_s
    h = (self / 60).to_i
    m = self.to_i % 60
    h.to_s + ':' + m.to_s
  end
end

如果您不希望修补像Float这样的核心类,那么您也可以创建一个类似的初始化程序来修补gruff类/方法。