Backbone-Railsを備えたRails:EJSファイルのAsset Helpers(Image_Path)
-
25-10-2019 - |
質問
使用するRails 3.1アプリがあります CodeBrew/Backbone-Rails. 。 .jst.ejsテンプレートでは、次のような画像を含めたいと思います。
<img src="<%= image_path("foo.png") %>"/>
しかし、もちろん、資産ヘルパーはJavaScriptでは利用できません。
EJS構文はERBと競合するため、ERBのチェーン(.jst.ejs.erb)は機能しません。
これが私が知っていることです:
- アセットヘルパーはブラウザでは利用できないため、サーバー側でそれらを実行する必要があります。
- サーバーにさまざまな資産パスをHTMLにダンプさせることで、問題を回避できます(データ属性を介して、または
<script>
そしてJSON)そしてJSでそれらを読んでいますが、これはかなりKludgyのようです。
EJSファイルでアセットヘルパーを何らかの形で使用する方法はありますか?
解決
実際には、.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に、EJを明示的に含める必要があるのではなく、構成を通じてこれを処理するオプションがあればいいのにと思いますが、現時点では、私が知っていることをする方法はありません。
他のヒント
私は2つの方法を見ることができます。どちらも素晴らしいことではありません。
あなたが言う時 <%%= variable %>
次に、これはERB ASによってレンダリングされます <%= variable %>
, 、そのため、すべてを2倍に逃れることができます しかし asset_tagsとそれは、EJSに向かう途中の1つのERBパスを介した旅行に耐えます。
あまりにもグロスだと思うなら...
あなたのアセットパスを定義するERB拡張機能を備えた別のJavaScriptファイルを作成してみませんか?そして、資産パイプラインを使用してそれを要求します。
だから、言って assets.js.erb
次のようなものを定義します:
MyAssets = {
'foo': <%= image_path("foo.png") %>,
...
}
そして、マニフェストの上部近くのどこかでこれを必要とします。ただし、EJSで機能するグローバルを参照してください。
ejsの代わりにハムルを試してみたい人のために: haml-coffee 終えた haml_coffee_assets 私にとってもうまく機能しています。
.hamlc.erbファイルで以下を入手できます。
%img(src="<%= image_path('foo.png') %>")
(それはまだあなたにルーティングヘルパーを提供しませんが、資産ヘルパーのみです。)
ライアン・フィッツジェラルドは、彼のJavaScriptアセットヘルパーの要点を投稿するのに十分親切でした(ERBで事前にコンパイルされます): https://gist.github.com/1406349
次の宝石を介して、対応するJavaScriptヘルパーを使用できます。https://github.com/kavkaz/js_assets
最後に(インストールと構成後)、次のように使用できます。
<img src="<%= asset_path("foo.png") %>"/>