12

codebrew/backbone-railsを使用するRails3.1アプリがあります。.jst.ejsテンプレートに、次のような画像を含めたいと思います。

<img src="<%= image_path("foo.png") %>"/>

ただし、もちろん、アセットヘルパーはJavaScriptでは使用できません。

EJS構文がERBと競合するため、ERBの連鎖(.jst.ejs.erb)は機能しません。

これが私が知っていることです:

  • アセットヘルパーはブラウザーで使用できないため、サーバー側で実行する必要があります。
  • サーバーにさまざまなアセットパスを(データ属性または<script>JSONを介して)HTMLにダンプさせ、それらをJSに読み戻すことで問題を回避できますが、これはかなり厄介なようです。

EJSファイルでアセットヘルパーを何らかの方法で使用する方法はありますか?

4

5 に答える 5

25

実際には、.jst.ejs.erbファイルをチェーンする方法がありますが、それはかなり文書化されておらず、私はEJSテストケースを調べただけでそれを見つけました。<%%>の代わりに{{}}(または[%%]またはその他の必要なもの)を使用するようにEJSに指示すると、ERBはEJS呼び出しを評価しようとしません。

コードのどこかにEJSが必要であることを確認してから(私gem 'ejs'はGemfileに含めました)、次のような初期化子(ejs.rbと呼びます)を作成します。

EJS.evaluation_pattern    = /\{\{([\s\S]+?)\}\}/
EJS.interpolation_pattern = /\{\{=([\s\S]+?)\}\}/

次に、テンプレートの名前を.jst.ejs.erbに変更し、既存の<%%>EJSで解釈されたコードを{{}}に置き換えてください。{{}}以外のものを使用する場合は、初期化子で正規表現を変更してください。

Sprocketsに、明示的にEJSを含めるのではなく、構成を介してこれを処理するオプションがあればいいのにと思いますが、現時点では、私が知っていることを行う方法はありません。

于 2012-02-14T19:12:16.647 に答える
16

私は2つの方法を見ることができます。どちらも素晴らしいことではありません。

あなたが言うとき<%%= variable %>、これはERBによってとしてレンダリングされる<%= variable %>ので、asset_tags以外のすべてを2倍エスケープすることができ、それEJSへの途中の1つのERBパスを通過する旅行を生き残るでしょう。

あなたがそれがあまりにも粗大だと思うなら...

アセットパスを定義する、ERB拡張子の付いた別のJavaScriptファイルを作成してみませんか?次に、アセットパイプラインを使用してそれを要求します。

つまりassets.js.erb、次のように定義します。

MyAssets = {
  'foo': <%= image_path("foo.png") %>,
  ...
}

そして、マニフェストの上部近くにこれを要求します。次に、EJSで機能するグローバルを参照します。

于 2011-11-29T20:26:56.813 に答える
5

EJSの代わりにHAMLを試してみたい人のために: haml_coffee_assetsを介してhaml -coffeeを使用することは私にとってもうまくいきました。

.hamlc.erbファイルには次のものを含めることができます。

%img(src="<%= image_path('foo.png') %>")

(ただし、ルーティングヘルパーは提供されませんが、アセットヘルパーのみが提供されます。)

于 2011-12-20T16:32:34.800 に答える
4

Ryan Fitzgeraldは親切にも、JavaScriptアセットヘルパー(ERBでプリコンパイルされています)の要点を投稿してくれました:https ://gist.github.com/1406349

于 2011-11-30T21:22:24.890 に答える
2

次のgemを介して対応するJavascriptヘルパーを使用できます: https ://github.com/kavkaz/js_assets

最後に(インストールして構成した後)、次のように使用できるようになります。

<img src="<%= asset_path("foo.png") %>"/>
于 2013-11-15T12:04:47.063 に答える