Что делать, если вы попробовали промежуточное программное обеспечение для стойки? Вопросы here, here и here, похоже, имеют ответы, которые используют этот подход. С Rails 4.5 я нашел, что body
из Rack::Response
является неизменным, поэтому этот 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
). Во всяком случае, я не хочу санировать эти файлы. Мы также только сбросили headers['Content-Length']
, если он уже был определен, что маловероятно, если Transfer-Encoding
разрывается. 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'
наверху и 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.x), вы можете сделать это с помощью after_filter - не знаете, работает ли он (мы используем для рендеринга xml из приложения rails и используем фильтр after, чтобы переписать ответ как html с xslt) –