我有几个经常通过 Rake 运行的 Cron 作业,并且这些作业的输出通过电子邮件发送(通过 MAILTO)。由于这些任务加载 Rails 环境(包括 Erubis),它们总是在启动时打印出“** Erubis 2.6.5”。这意味着自从 Cron 收到输出后,始终会生成一封电子邮件。有什么方法可以配置 Erubis 停止将这个启动消息打印到控制台?
4 回答
使用此处的答案以及@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 的标注,并显示可能发生的任何其他事情(不要错过任何我们没有预料到的事情!)。
更新:下面的解决方案来自几年前,适用于 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 前端保持沉默的惯例(正是出于这个原因) . 上面的解决方案是我想出的,它对我有用。
您需要在 erubis 中重新定义 rails_helper.rb - 这些是违规行:
## finish
ActionController::Base.new.logger.info "** Erubis #{::Erubis::VERSION}"
$stdout.puts "** Erubis #{::Erubis::VERSION}" if rails22
我建议将该文件的内容复制到新文件中,删除日志记录行并要求使用 better_rails_helper 而不是 erubis 提供的内容。. `
支持这些拉取请求,您无需任何猴子补丁即可获得它
https://github.com/rails/rails_xss/pull/14(rails_xss官方插件)
https://github.com/joloudov/rails_xss/pull/1(用于 rails_xss gem)