Frage

Ich benutze Ruby auf Rails 3.1 und frage mich, wie ich in einem JavaScript -Vermögenswert teilweise machen könnte.

Was ich anstrebe:

# in /app/assets/javascript/cart.js.coffee.erb
$('a.add_sth').click -> $('.random_container').append('<%= render partial: 'way/to/partial' %>')

Dies führt zu einem Nomethoderror:

undefined method `render' for #<#<Class:0x007fc54584c6e8>:0x007fc5474cd470>

Wenn ich schreibe <%= 2+3 %> Stattdessen funktioniert es gut, übrigens.

Ich denke render() ist dort unbekannt. Gibt es eine Möglichkeit, den Inhalt dieses Teils zu machen?

War es hilfreich?

Lösung

Schlechte Nachrichten, Render ist kein verfügbarer Blick: Gleiche Frage zu GitHub

Andere Tipps

Denken Sie daran, dass Vermögenswerte für statische Daten wie CSS, JS oder Bilder bestimmt sind, die ihren Inhalt nicht dynamisch ändern, sodass sie besser zwischengespeichert und/oder in ein CDN exportiert werden können.

Da Sie Erb mit Ruby -Code ausführen dürfen, sollte es immer den gleichen Wert zurückgeben (da es nur beim Kompilieren des Vermögenswerts ausgeführt wird).

Deshalb denke ich machen ist in Vermögenswerten nicht verfügbar (obwohl es ordnungsgemäß verwendet werden kann, um statische Daten zu rendern).

Einfache Lösung hier: Verschieben Sie Ihre JS -Datei in eine Ansicht, Dort können Sie jede Ansichtshelfer verwenden.

Das hat für mich funktioniert. (für Haml)

= Haml::Engine.new(File.read(File.join(Rails.root, 'app/views/xxxxx','_form.html.haml'))).render(Object.new, :hello => "Hello World")

Und benötigt, um die Abhängigkeit zu Beginn der Datei hinzuzufügen, die so aktualisiert werden soll: In diesem Fall muss die abhängige Datei im Vermögenswert sein.

//= depend_on xxxxx/_form.html.haml

In Schienen 4.2

Ich habe diesen Beitrag gefunden https://github.com/sstephenson/sprockets/issues/90Dies deutet darauf hin, dass < % Request_asset 'Pfad/to/Datei' %>

Das hat für mich funktioniert.

Ich hatte ein ähnliches Problem, also habe ich das geschrieben render Methode, die innerhalb von Assets zum Rendern verwendet werden kann Erb Teilvorlage:

# in lib/my_app/erb_helpers.rb
module MyApp
  module ERBHelpers
    class << self

      def render(partial_path, binding)
        dir_name, _, partial_name = partial_path.rpartition(File::SEPARATOR)
        file_name = "_#{partial_name}.html.erb"
        Erubis::Eruby.new(File.read(File.join(Rails.root, 'app', 'views', dir_name, file_name)).gsub("'", %q(\\\'))).result(binding)
      end

    end
  end
end

Dann habe ich sie in der CoffeeScript -Datei wie folgt verwendet:

# in app/assets/javascripts/notifications.coffee
MyApp.notifications.templates =
  notice: '<%= ::MyApp::ERBHelpers.render 'application/notifications/notice', content: "%content%" %>'
  alert: '<%= ::MyApp::ERBHelpers.render 'application/notifications/alert', content: "%content%" %>'

MyApp.notifications.create_elem = (type, content) -> MyApp.notifications.templates[type].replace('%content%', content)

PS: Ich habe es auf Rails 5.0 App getestet

Tatsächlich funktioniert es für mich. Sie müssen tun:

= render 'way/to/partial'

wobei 'Way/to/partial' relativer Pfad im Ordner vorhandenen Vermögenswerten ist. Kabel ist, dass Sie auf dem Pfad den Ordner der ersten Ebene unter Vermögenswerten weglassen müssen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top