Переопределение методов базового класса в контроллере - PullRequest
0 голосов
/ 23 июня 2009

Я пытаюсь обмануть очень сложный черный ящик, чтобы отображать некоторые плавающие объекты по-разному (это графическая библиотека 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 Ответ

1 голос
/ 23 июня 2009

Если вы хотите заменить поведение Float # to_s, вы можете попробовать добавить свой monkeypatch в класс Float в инициализаторе . Это, однако, исправит Float # to_s глобально в вашем приложении Rails.

конфиг / Инициализаторы / 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

Вы также можете создать аналогичный инициализатор для исправления классов / методов gruff, если вы не хотите быть настолько широкими, чтобы исправлять основной класс, такой как Float.

...