所有渲染视图的集中后处理

时间:2016-09-02 23:47:50

标签: ruby-on-rails

我想从rails应用程序的集中点向所有渲染视图添加一个后期渲染步骤,目标是从所有服务器响应中删除某些关键字。

到目前为止,我发现这个Rails : post-processing a rendered view显示了如何将视图呈现为字符串。 - 很好。

由于我有一个基本控制器,我正在考虑添加某种before_render过滤器,它会将render_string传递给我,以允许我替换它然后从那里渲染它。在这里,我陷入困境,现在正在考虑这是否可能。一些高级代码如下所示:

class BaseClass
  before_render :replace_some_key_words 

  def replace_some_key_words(rendered_string)
    render rendered_string.sub! 'foo', 'bar'
  end

(我在http://qiita.com/cryeo/items/d116192fb355411f9008找到了before_render的一个实现,但我只是不想进入轨道,以了解我想要的是否可以从中获取)

感谢所有建议。

1 个答案:

答案 0 :(得分:0)

如果你试过一些Rack Middleware怎么办?问题hereherehere似乎有使用此方法的答案。使用Rails 4.5,我发现body的{​​{1}}是不可变的,因此这个answer证明特别有用。这是我最终得到的代码:

Rack::Response

我检查module AfterRender require 'rack' CONTENT_LENGTH = 'Content-Length' class SanitizeResponse def initialize(app) @app=app end def call(env) status, headers, response = @app.call(env) if response.present? and response.respond_to? :body new_response_body = sanitize_body(response.body) headers[CONTENT_LENGTH] = new_response_body.length.to_s if headers[CONTENT_LENGTH].present? new_response = Rack::Response.new([new_response_body], status, headers) return [status, headers, new_response] end return [status, headers, response] end def sanitizeBody(body) to_ret = body.dup to_ret.gsub!('string_to_be_replaced', 'replacement_string') to_ret end end end 是否已定义,以确保在为我的角度应用程序发送文件时不会出现任何问题(他们使用response.body而不是Sprockets::Asset)。无论如何,我不想要对这些文件进行消毒。如果Rack::Response已经定义,我们也只会重置headers['Content-Length'],如果Transfer-Encoding被分块,则情况不太可能。 new_response可能只是一个数组(例如[new_response_body]),但我发现responseRack::Response的方式发送call更安全。这个documentation有助于理解app/middleware/after_render.rb的返回必须如何形成(即作为数组)。

为确保实际使用此中间件,我将其放在config/application.rb找到的新文件中。在我的require_relative '../app/middleware/after_render.rb'中,我在config.middleware.use AfterRender::SanitizeResponse类的顶部和Application添加了require File.expand_path('../boot', __FILE__) require_relative '../app/middleware/after_render.rb' require 'rails/all' module MyModule class Application < Rails::Application config.autoload_paths << "#{Rails.root}/app" config.middleware.use AfterRender::SanitizeResponse end end 。它看起来像这样:

{{1}}

希望这有帮助!