Frage

Ich habe eine Rails 3.1 -App, die das verwendet Codebrew/Backbone-Rails. In a .jst.ejs Vorlage möchte ich ein Bild wie SO einfügen:

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

Aber natürlich sind die Asset -Helfer in JavaScript nicht verfügbar.

Die Verkettung von Erb (.jst.ejs.erb) funktioniert nicht, da die EJS -Syntax mit ERB in Konflikt steht.

Hier ist was ich weiß:

  • Die Asset -Helpers sind im Browser nicht verfügbar, daher muss ich sie auf der Serverseite ausführen.
  • Ich kann das Problem umgehen, indem ich den Server verschiedene Asset -Pfade in die HTML abwerfen lassen (durch Datenattribute oder <script> und Json) und sie in JS zurückzulesen, aber das scheint eher kludgy.

Gibt es eine Möglichkeit, die Asset -Helfer in EJS -Dateien irgendwie zu verwenden?

War es hilfreich?

Lösung

Eigentlich gibt es eine Möglichkeit, eine .jst.ejs.ERB -Datei zu ketten, obwohl sie ziemlich undokumentiert ist, und ich habe sie nur durch Betrachtung der EJS -Testfälle gefunden. Sie können EJS sagen, dass sie {{}} (oder [ %] oder was auch immer Sie sonst wollen) anstelle von < %> verwenden sollen, und dann wird ERB nicht versuchen, Ihre EJS -Anrufe zu bewerten.

Stellen Sie sicher, dass Sie irgendwo in Ihrem Code EJs benötigen (ich habe gerade eingeschlossen gem 'ejs' In meiner GemFile) und dann einen Initialisierer (ich nannte ihn ejs.rb), der Folgendes enthält:

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

Stellen Sie dann einfach sicher, dass Sie Ihre Vorlagen in .jst.ejs.erb umbenennen und Ihren vorhandenen < %> eJS-interpretierten Code durch {{}} ersetzen. Wenn Sie etwas anderes als {{}} verwenden möchten, ändern Sie die regulären Ausdrücke im Initialisierer.

Ich wünschte, es gäbe eine Option in Kettenrädern, um dies über die Konfiguration zu erledigen, anstatt explizit EJs einzuschließen, aber ab dem Moment gibt es keine Möglichkeit, dies zu tun, von denen ich weiß.

Andere Tipps

Ich kann zwei Möglichkeiten sehen. Auch ist auch nicht großartig.

Wenn du sagst <%%= variable %> dann wird dies von erb als <%= variable %>, Sie könnten also alles doppelt prozentig entkommen, um allem zu entkommen aber Der Asset_Tags und das würde die Reise durch einen Erb -Pass auf dem Weg zu EJs überleben.

Wenn Sie das zu eklig finden ...

Wie wäre es mit einer anderen JavaScript -Datei mit einer ERB -Erweiterung, die Ihre Asset -Pfade definiert? Und verwenden Sie dann die Asset -Pipeline, um dies zu verlangen.

Sozusagen assets.js.erb definiert so etwas wie:

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

Und benötigen dies dann irgendwo in der Nähe Ihres Manifestes. Und beziehen sich dann jedoch auf die Global, die in EJs funktionieren.

Für diejenigen, die bereit sind, Haml anstelle von EJs zu probieren: Verwenden Haml-Coffee durch haml_coffee_assets hat auch gut für mich funktioniert.

Sie können Folgendes in einer .hamlc.erb -Datei haben:

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

(Es gibt Ihnen jedoch immer noch keine Routing -Helfer, nur Asset -Helfer.)

Ryan Fitzgerald war so freundlich, einen Kern seiner JavaScript -Asset -Helfer zu veröffentlichen (die mit ERB vorkompiliert werden): https://gist.github.com/1406349

Sie können den entsprechenden JavaScript -Helfer über das folgende Juwelen verwenden:https://github.com/kavkaz/js_assets

Schließlich (nach der Installation und Konfiguration) können Sie es so verwenden:

<img src="<%= asset_path("foo.png") %>"/>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top