4

我有几个经常通过 Rake 运行的 Cron 作业,并且这些作业的输出通过电子邮件发送(通过 MAILTO)。由于这些任务加载 Rails 环境(包括 Erubis),它们总是在启动时打印出“** Erubis 2.6.5”。这意味着自从 Cron 收到输出后,始终会生成一封电子邮件。有什么方法可以配置 Erubis 停止将这个启动消息打印到控制台?

4

4 回答 4

2

使用此处的答案以及@michael-andrews 链接的答案,我对我们的 Rails 2.3.14 项目进行了以下更改,不需要更改我们的 gem 源。打开config/boot.rb并找到Rails::Boot班级。您正在扩充该load_gems方法:

class Rails::Boot
  def run
    load_initializer

    Rails::Initializer.class_eval do
      def load_gems
        buffer = ""
        previous_stdout, $stdout = $stdout, StringIO.new(buffer)

        @bundler_loaded ||= Bundler.require :default, Rails.env
      ensure
        $stdout = previous_stdout

        output = buffer.gsub(/^\*\* Erubis (\d+\.?)+\s*/, '')
        puts output unless output.strip.empty?
      end
    end

    Rails::Initializer.run(:set_load_path)
  end
end

它的工作方式是我们在加载 gem 时重定向 $stdout,将流拉入本地缓冲区。然后我们在一切完成后检查缓冲区,去掉 Erubis 的标注,并显示可能发生的任何其他事情(不要错过任何我们没有预料到的事情!)。

于 2012-02-07T21:40:59.200 回答
2

更新:下面的解决方案来自几年前,适用于 Rail 2 是新的并且插件仍然很常见的时候。现在使用 gem 是更好的标准解决方案,以下答案不再适用于较新的应用程序;相反,@TALlama 发布的解决方案有效。不过,我将把这个答案留在这里,因为它是一个有效的解决方案,以防您的应用程序很旧并且仍然使用该插件。

您可以修改 rails_xss 插件以删除此消息。该插件的违规部分位于“/plugins/rails_xss/lib/rails_xss/erubis.rb”。在文件的最顶部是一个要求:

require 'erubis/helpers/rails_helper'

修改这个 require 以在 require 之前简单地将标准输出重定向到一个虚拟 IO,并在完成后恢复标准输出,如下所示:

stdout_original, $stdout = $stdout, StringIO.new
require 'erubis/helpers/rails_helper'
$stdout = stdout_original

它很丑陋,但它以一种相对非侵入性的方式解决了问题。我遇到了与 OP 类似的问题,需要将“脚本/运行”进程的输出通过管道传输到另一个进程,而 erubis 粗鲁地打破了关于 rails 组件/插件在 stdout 前端保持沉默的惯例(正是出于这个原因) . 上面的解决方案是我想出的,它对我有用。

于 2010-08-20T17:12:11.233 回答
1

您需要在 erubis 中重新定义 rails_helper.rb - 这些是违规行:

## finish
ActionController::Base.new.logger.info "** Erubis #{::Erubis::VERSION}"
$stdout.puts "** Erubis #{::Erubis::VERSION}" if rails22

我建议将该文件的内容复制到新文件中,删除日志记录行并要求使用 better_rails_helper 而不是 erubis 提供的内容。. `

于 2010-06-30T23:33:49.017 回答
1

支持这些拉取请求,您无需任何猴子补丁即可获得它

https://github.com/rails/rails_xss/pull/14(rails_xss官方插件)

https://github.com/joloudov/rails_xss/pull/1(用于 rails_xss gem)

于 2012-08-19T01:10:51.307 回答