【问题标题】:Overriding base class methods in a Controller重写控制器中的基类方法
【发布时间】:2009-06-23 00:47:23
【问题描述】:

我试图欺骗一个非常复杂的黑盒子以不同的方式显示一些浮点数(它是 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?我也将接受对“有什么更好的方法来完成此任务?”问题的回答

【问题讨论】:

  • 我最终将这个(加上一个 attr_accessor)添加到 Gruff 基础中的“标签”方法中,这完全有效:if @is_minutes return "#{sprintf('%02i',value.to_i / 60)}:#{sprintf('%02i',value.to_i % 60)}" end 但是,我仍然想要一个不涉及冻结然后自定义插件的解决方案。
  • 为什么不直接创建一个将浮点数传递给的方法 - 为什么需要重载浮点数本身?

标签: ruby-on-rails ruby monkeypatching mixins


【解决方案1】:

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

config/initializers/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 类/方法。

【讨论】:

  • 有趣,今天晚些时候将在 rails 4.2 中进行测试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-06
  • 1970-01-01
  • 2012-12-12
  • 1970-01-01
  • 2011-06-17
  • 1970-01-01
相关资源
最近更新 更多