我想从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的一个实现,但我只是不想进入轨道,以了解我想要的是否可以从中获取)
感谢所有建议。
答案 0 :(得分:0)
如果你试过一些Rack Middleware怎么办?问题here,here和here似乎有使用此方法的答案。使用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]
),但我发现response
以Rack::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}}
希望这有帮助!