ラックミドルウェアを試してみましたか? here、here、およびhereの質問には、このアプローチを使用する回答があるようです。 Rails 4.5では、Rack::Response
のbody
が不変であることが判明したので、このanswerが特に有用であることが判明しました。ここに私がなってしまったコードは次のとおりです。私の角度のアプリのファイルを超える送信中
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
は何funkinessを確保しないように定義されていることを確認します(彼らはSprockets::Asset
代わりのRack::Response
を使用)が発生します。とにかく、私はそれらのファイルを消毒したくありません。 Transfer-Encoding
がチャンクされているとは限りません。すでに定義されている場合は、headers['Content-Length']
をリセットするだけです。 new_response
は単に配列(例:[new_response_body]
)でもかまいませんが、同じようにresponse
をRack::Response
として送信する方が安全だとわかりました。このdocumentationは、call
の返品をどのように整えなければならないか(つまり配列として)を理解するのに役立ちます。
このミドルウェアが実際に使用されていることを確認するため、私はapp/middleware/after_render.rb
にある新しいファイルに置きました。 config/application.rb
では、先頭にrequire_relative '../app/middleware/after_render.rb'
を追加し、Application
クラスにはconfig.middleware.use AfterRender::SanitizeResponse
を追加しました。これは次のようになります。
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
after_filterでこれを行うことができるウェイ・バック(レール1.x) - まだ動作しているかどうかわからない(レール・アプリケーションからxmlをレンダリングし、afterフィルタを使用してレスポンスをxslt ) –