2016-09-02 3 views
0

すべてのレンダリングされたビューに、すべてのサーバー応答から特定のキーワードを削除することを目標に、レールアプリケーションの集中ポイントからレンダリングステップを追加します。すべてのレンダリングされたビューの集中後処理

これまでに、ビューを文字列としてレンダリングする方法を示すRails : post-processing a rendered viewが見つかりました。 - ニース。

ベースコントローラーがあるので、私はレンダリングされた文字列を渡して、それを置き換えてレンダリングできるようにする、ある種のbefore_renderフィルターを追加することを考えていました。ここで私は立ち往生し、今これがすべて可能であるかどうか考えています。

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の実装を見つけましたが、私は単純に私がしたいことは、このから可能であれば理解するためにレールにenoughtておりません)

感謝:一部の高レベルのコードは次のようになりますすべての提案に対して

+0

after_filterでこれを行うことができるウェイ・バック(レール1.x) - まだ動作しているかどうかわからない(レール・アプリケーションからxmlをレンダリングし、afterフィルタを使用してレスポンスをxslt ) –

答えて

0

ラックミドルウェアを試してみましたか? herehere、およびhereの質問には、このアプローチを使用する回答があるようです。 Rails 4.5では、Rack::Responsebodyが不変であることが判明したので、この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])でもかまいませんが、同じようにresponseRack::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 

関連する問題