2016-11-07 7 views
5

私は、宝石やエレガントな方法で、特定のHTMLコンテンツがどこから来たのかを確認できるシステムを探しています。私は大きなプロジェクトに取り組んでいます。多くの時間は、HTMLコンテンツの特定の部分がどこから来たのかを判断します。私はあなたがどのレイアウト、パーシャルがログのページをレンダリングするのに使われているのかを知ることができますが、もっと実用的なものを探しています。RailsはHTMLコンテンツソースを記述しています

この例があります。

<!-- ... app/views/layouts/main.html.slim --> 
<body> 
    <!-- ... app/views/people/index.html.slim --> 
    <div class="foo"> 
    <table clas="items"> 
     <!-- ... app/views/people/shared/_person.html.slim --> 
     <td> 
     <span>John Doe</span> 
     </td> 
    </table> 
    </div> 
</body> 

部分/ページ/レイアウトをレンダリングする前に、レンダリングエンジンは原点を記述するコメントを追加します。

+0

私がこれを理解しているかどうかを見てみましょう。レンダリングの呼び出しがあるたびに、レンダリングされたページのHTMLソースにコメントを追加して、レンダリングされたHTMLへのルートを追加したいとしますか?そして、これはあなたの開発環境だけにありますか? – mlabarca

+0

各レンダリングの前に、ファイルパスのコメントを追加するために必要な要件があれば –

+0

これは設定ベースではありませんが、app/views/*をループしてファイル名のコメントの前に[shell script](http ://stackoverflow.com/questions/10587615/unix-command-to-prepend-text-to-a-file)。 – anyarms

答えて

3

多分これrails_view_annotator宝石が良い出発点のようになります。

Railsのビューアノテータは、レンダリングされた部分のディスクの場所を示すHTMLコメントとRailsのパーシャルのレンダリングをラップします。プロジェクトのREADMEによると

、宝石は次のようにコンテンツを出力レンダリングされます:それは、最近のRailsのバージョンと互換性がない場合がありますので、積極的な開発でありますように

<!-- begin: app/views/user/_bio.html.haml (from app/views/user/show.html.haml:4) --> 
<div class='bio'>Ed's Bio</div> 
<!-- end: app/views/user/_bio.html.haml (from app/views/user/show.html.haml:4) --> 

しかし、それは見ていません、 YMMV。

+0

この宝石は部分的な部分を描画するためだけです。ビューをレンダリングするために使用されるテンプレートは表示されません。 – Aleks

+0

正解です。この宝石は質問に対する部分的な解決策に過ぎません(https://github.com/duncanbeevers/rails_view_annotator/issues/4を参照)。しかし、それはまだ良い出発点のように見えます。 – wjordan

+0

ありがとう、これは多くの助けになります。まあ、賞金に値する。 –

0

私はこのために宝石があるかどうかわかりませんが、あなたがにあるすべてのビューとパーシャルの出力をレンダリングするために設計されたクラスを上書きすることができます

.bundle/ruby/ruby-2.3.1/gems/action-view-4.2.5.1/lib/action_view/template.rb

(バージョン番号を交換してください)

def compile(mod) owerwriteというメソッドがあり、ビューに表示するカスタム文字列を追加できます。あなたのケースのために、あなたがこのような何かを行うことができます:

code.insert(63, "@output_buffer.safe_append='\n<!--#{self.inspect} start -->\n'.freeze\;") 
code.insert(code.size-19, "@output_buffer.safe_append='\n<!--#{self.inspect} end -->\n'.freeze\;") 

そしてそれは、ビューのすべてのパーシャルとすべてのビューでの出力は、彼らがレンダリングされますよう:

def compile(mod) #:nodoc: 
    encode! 
    method_name = self.method_name 
    code = @handler.call(self) 

    # This is the code I have added 
    code.insert(63, "@output_buffer.safe_append='\n<!--#{self.inspect} start -->\n'.freeze\;") 
    code.insert(code.size-19, "@output_buffer.safe_append='\n<!--#{self.inspect} end -->\n'.freeze\;") 

    # Make sure that the resulting String to be eval'd is in the 
    # encoding of the code 
    source = <<-end_src 
     def #{method_name}(local_assigns, output_buffer) 
     _old_virtual_path, @virtual_path = @virtual_path, #{@virtual_path.inspect};_old_output_buffer = @output_buffer;#{locals_code};#{code} 
     ensure 
     @virtual_path, @output_buffer = _old_virtual_path, _old_output_buffer 
     end 
    end_src 

    # Make sure the source is in the encoding of the returned code 
    source.force_encoding(code.encoding) 

    # In case we get back a String from a handler that is not in 
    # BINARY or the default_internal, encode it to the default_internal 
    source.encode! 

    # Now, validate that the source we got back from the template 
    # handler is valid in the default_internal. This is for handlers 
    # that handle encoding but screw up 
    unless source.valid_encoding? 
     raise WrongEncodingError.new(@source, Encoding.default_internal) 
    end 

    mod.module_eval(source, identifier, 0) 
    ObjectSpace.define_finalizer(self, Finalizer[method_name, mod]) 
    end 

を私が追加したコードです。あなたが例render_override.rb&ペーストコード何かのために、と呼ばれるあなたのRailsプロジェクトのconfig/initializers/ディレクトリに新しい初期化を作成し、別のクラスにそれを抽出したい場合

<!--app/views/profiles/_header.html.erb start --> 
Your text on the page 
<!--app/views/profiles/_header.html.erb end --> 

結果は次のようになりますこのような:

ActionView::Template.class_eval do 
    # @override 
    def compile(mod) 
    encode! 
    method_name = self.method_name 
    code = @handler.call(self) 

    # This is the code I have added 
    code.insert(63, "@output_buffer.safe_append='\n<!--#{self.inspect} start -->\n'.freeze\;") 
    code.insert(code.size-19, "@output_buffer.safe_append='\n<!--#{self.inspect} end -->\n'.freeze\;") 

    # Make sure that the resulting String to be eval'd is in the 
    # encoding of the code 
    source = <<-end_src 
     def #{method_name}(local_assigns, output_buffer) 
     _old_virtual_path, @virtual_path = @virtual_path, #{@virtual_path.inspect};_old_output_buffer = @output_buffer;#{locals_code};#{code} 
     ensure 
     @virtual_path, @output_buffer = _old_virtual_path, _old_output_buffer 
     end 
    end_src 

    # Make sure the source is in the encoding of the returned code 
    source.force_encoding(code.encoding) 

    # In case we get back a String from a handler that is not in 
    # BINARY or the default_internal, encode it to the default_internal 
    source.encode! 

    # Now, validate that the source we got back from the template 
    # handler is valid in the default_internal. This is for handlers 
    # that handle encoding but screw up 
    unless source.valid_encoding? 
     raise WrongEncodingError.new(@source, Encoding.default_internal) 
    end 

    mod.module_eval(source, identifier, 0) 
    ObjectSpace.define_finalizer(self, Finalizer[method_name, mod]) 
    end 
end 

再起動して、変更をピックアップすることができ、あなたの意見は、現在、これらの新しい設定でレンダリングされるようにサーバー。

あなたの評価クラスをチェックRAILS_ENV='dev'または同様のものに囲み、開発中に実行できるようにしたい場合は、すぐに実行できます。

関連する問題