Метод виден везде в Rails - PullRequest
4 голосов
/ 03 июня 2011

Как я могу сделать этот метод, который выводит желтую строку в файле журнала, доступным из любого места (модели, контроллеры, представления) в моем приложении Rails?

def my_log(text, file = "", line = "")
  text.to_s.chomp.gsub!(/%/, "%%")
  Rails.logger.debug(sprintf("\033[32m#{file}#{line}\033[0m\033[1m\033[33m#{text}\033[0m"))
end

Ответы [ 4 ]

9 голосов
/ 03 июня 2011

Вы можете определить его в Kernel (НЕ рекомендуется):

module Kernel
  def my_log(..)
    ..
  end
end

... если вы действительно хотите, чтобы он был доступен везде.

Или поместите что-то вроде этого в lib/util.rb:

module Util
  def self.my_log(..)
    ..
  end
end

... и убедитесь, что require 'util' в вашем config/application.rb, и тогда вы можете позвонить куда угодно:

Util.my_log(..)
7 голосов
/ 03 июня 2011

почему бы не создать инициализатор и записать этот метод в модуль rails?

# config/initializers.rb
module Rails

  def self.log_with_colour(message, level = :debug)
    text.to_s.chomp.gsub!(/%/, "%%")
    logger.send(level, sprintf("\033[32m#{__FILE__}#{__LINE__}\033[0m\033[1m\033[33m#{message}\033[0m"))
  end

end

в вашем коде вы можете позвонить Rails.log_with_colour("hello") или Rails.log_with_colour("Hello again", :info)

3 голосов
/ 03 июня 2011

Я положил подобные вещи в config/initializers/app_methods.rb.Они не должны быть ограничены внутри класса или модуля.Чувствую себя немного хаки, но у меня никогда не было проблем.

2 голосов
/ 03 июня 2011

Добавьте его как метод экземпляра и класса в Object

class Object
  def self.my_log(...)
    ...
  end

  def my_log(...)
    Object.my_log(...)
  end
end
...