【问题标题】:Method visible everywhere in Rails在 Rails 中随处可见的方法
【发布时间】:2011-09-07 20:07:25
【问题描述】:

我怎样才能使这个方法在我的 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

【问题讨论】:

    标签: ruby-on-rails model-view-controller logging


    【解决方案1】:

    我把这样的东西放在config/initializers/app_methods.rb 中。它们不需要在类或模块内限定。感觉有点hacky,但我从来没有遇到过任何问题。

    【讨论】:

      【解决方案2】:

      为什么不创建一个初始化器并将这个方法写入 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)

      【讨论】:

      • 如果您在整个应用程序中使用它,这是更好的方法(初始化程序会自动加载,因此不需要)。
      • 听起来不错。 Rails 模块是强制性的吗?像module Logger [..] end 这样的东西不起作用?
      • 那行得通。但是,您必须在要使用记录器方法的每个地方都包含该模块。另外 - 已经有一个名为 Logger 的类,所以会有名称冲突
      【解决方案3】:

      您可以在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(..)
      

      【讨论】:

      • 我收到错误消息:application.rb:3:in 'require': no such file to load -- util (LoadError)。我也试过require 'lib/util',但没有运气。
      • @Luke - i) 您使用的是 Rails 2 还是 3; ii)您的 util.rb 文件到底在哪里; iii) 你把require 'util'这行放在哪里了?
      • i) Rails 3; ii) 在 my_app/lib 下; iii) 在文件顶部,在“require 'rails/all'”之后
      • 对于 iii),在 哪个 文件的顶部?
      • 好的,这可能就是它不起作用的原因。尝试将其添加到config/initializers 下的新文件中。
      【解决方案4】:

      将其作为实例和类方法添加到Object中

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-01-04
        • 2014-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多