2017-08-15 12 views
0

Middlemanが構築したWebサイトでは、すべてのページ(テンプレート)の内容に対して特定のRubyコードを実行する必要があります。例えばMiddlemanのページ全体でRubyメソッドを実行

、私は私のconfig.rbヘルパー以下だった場合:

def myexample(text) 
    text.gsub("dog","cat") 
end 

との私のtest.html.haml

私のプレビューと読んでいました/test.htmlを生成:

Some text about a cat. 

しかし、私はいくつかの異なる方法を使用していますsを変更する必要があるテキストを出力するには、特にHAMLの:markdownフィルタを使用する必要があります。そのため、= myexample("Text")ヘルパーのすべてをラップしないことをお勧めします。

私は、すべてのページの内容(好ましくは)を取得するRubyコードを実行したり、そのようなヘルパーに渡される引数としてHTML出力(最初のオプションが不可能な場合)を生成したいと考えています。

理想的には、このコードは開発環境とビルド環境の両方で実行されますが、それが不可能な場合はビルドで十分です。

これは可能ですか?

PS。私の具体的なケースでは、他のページを参照するために簡略表記を使用し、次にregular expression and eval() in order to replace them with relative links from data filesを使用します。

+0

HAMLがあなたが探している最終的なHTMLを生成することを保証できない理由はありますか?あなたがやっていることは間違いなく慣習的で、あなたはそれが必要以上に複雑になっているかもしれません。しかし、私はあなたの実際のコードがこれよりずっと複雑であることも知っています。 –

+0

ここでの主な問題は、 '':markdown'' HAMLフィルタを100回以上使用していることです。ブロックマーカダウン(複数段落)を処理するために使用され、20%に '' ref.pageA''参照が含まれています。私は部分集合を変更することができたので、今度はあなたのコードによって他の質問から処理されますが、 '':markdown''のHAMLフィルタにはまだ評価が必要ないくつかのリンクがあります。私は、すべてのHAMLフィルタを "mymarkdown()"ヘルパーに変更したくないのは、可読性を破壊し、ヘルパーがブロック入力(複数の段落)を受け入れることができないように思われるからです。 – Rafal

+0

ページ全体でコードを実行することができない場合、私の唯一の解決策は、 '':markdown'' HAMLフィルタの下のすべてのブロックをデータファイルに移動し、 '' mymarkdown''を付けてテンプレートに入れることです。そして、 'mymarkdown'ヘルパーとのリンクも含む、残りの1段落のテキストをすべて囲む必要があります。 – Rafal

答えて

0

ActionController :: Baseには、部分的またはページのレンダリングからの通常のHTML出力が文字列形式で表示されるrender_to_stringメソッドがあります。これにより、レンダリングされたHTMLをつかみ、最終的にインラインテンプレートとして実際にレンダリングする前に変更することができます。お使いのコントローラで

rendered_html = render_to_string 'your_template_or_partial' 
# do stuff to rendered_html 
render inline: rendered_html.html_safe, layout: 'layouts/application' 

html_safe方法は、RailsはそれがHTMLとしてこれをレンダリングしても安全です知っているを確認します。ユーザーの入力がレンダリングされていて、それをサニタイズしていない場合は、この処理を実行したくはありません。

レンダリング時にレイアウトを使用したくない場合は、:layout引数を削除してください。

+0

私は、あなたのコードでこのアプローチを早く使用することを実際にお勧めします。あなたはレンダリングシステムをかなりシンプルにすることができるかもしれませんので、このテクニックを使用することでとてもハッキリに見えません。おそらく次のようなものでしょう: 'render_to_string'あなたのHAMLテンプレート。 [置換](https://stackoverflow.com/a/45638542/1226389)を実行します。傾きでマークダウンをレンダリングします。次に、(今すぐインラインの)テンプレートをレンダリングします。 –

関連する問題