Warum rails rails die .js.erb-Datei nicht rendern?

8

Ich habe eine Rails-Anwendung, in der ich versuche, jQuery mit einer HTML-Datei rendern zu lassen. Der springende Punkt ist, dass jQuery spezifisch für die Seite ist, also möchte ich nicht, dass sie für jede Seite geladen wird, indem sie in die Kopfzeile eingefügt wird. Hier ist, was ich mit den Dateien gemacht habe

messages_controller.rb

%Vor%

/messages/new.html.erb

%Vor%

/messages/new.js.erb

%Vor%

Gibt es etwas, das ich zu einer anderen Datei hinzufügen muss? Gibt es eine Anfrage, die ich machen muss, damit es sowohl HTML als auch .js lädt?

    
nwestfall 24.10.2013, 15:22
quelle

4 Antworten

8

Warum funktioniert das nicht?

Ich glaube nicht, dass Ihre Methode eine besonders standardmäßige Methode ist, um das zu erreichen, was Sie wollen. Der Grund, warum Ihre JS-Vorlage nicht geladen wird, liegt daran, dass Ihr Controller so eingerichtet ist, dass er mit einer HTML-Vorlage antwortet, wenn der Browser HTML anfordert, und einer JS-Vorlage, wenn der Browser JS anfordert. Es wird nie beides zurückgeben, da der Browser nur das eine oder das andere anfordern kann.

Mit anderen Worten, der Block "respond_to" in Ihrem Controller weist den Controller an, auf Anfragen nach verschiedenen Inhaltstypen zu reagieren und nicht alle Arten von Inhalten, die gesendet werden, bei jeder Anfrage aufzulisten.

Lösung 1: Laden Sie das JS auf jede Seite

Hier sind einige Dinge zu beachten. Erstens, nur weil JS nicht auf einer bestimmten Seite verwendet wird, ist es an sich kein guter Grund, es nicht zu laden. Rails, über Sprockets, verketten und minimieren alle Ihre JS in einer einzigen Datei. Solange sich diese Datei nicht ändert, wird sie vom Browser eines Benutzers zwischengespeichert. Dies führt zu einer schnelleren Antwort, wenn Ihr Benutzer eine Seite aufruft, die dieses JS benötigt, da es keine zusätzliche Anfrage stellen muss, um das neue JS zu erhalten.

Wenn Sie sich Sorgen darüber machen, dass Ihr JS auf Inhalten läuft, die nicht ausgeführt werden sollten, sollten Sie sich davor schützen, indem Sie der Seite oder den Seiten, auf denen sie ausgeführt werden soll, einen eindeutigen Bezeichner hinzufügen und diesen erkennen Identifikator in Ihrem JS. Zum Beispiel:

%Vor%

Lösung 2: Verwenden Sie content_for

Es gibt jedoch einige Umstände, unter denen JS separat geladen werden kann. Der beste Weg, um dies zu erreichen, ist meiner Meinung nach, einen Inhalt für Block zu haben, der Inhalt an deinen Kopf anhängt, wenn eine einzelne Ansicht es braucht.

Also in Ihrem Anwendungslayout:

%Vor%

messages_new.js wird dann nur in Sichten eingeschlossen und ausgeführt, in denen Sie diesen content_for-Block enthalten. Es sollte auf keiner anderen Seite erscheinen.

Lösung 3: Fügen Sie einfach das Javascript in Ihren HTML

ein

Alternativ, wenn es Ihnen egal ist, ob das JS zuletzt geladen ist, können Sie einfach den Include-Helfer am Ende von new.html.erb hinzufügen:

%Vor%     
Rupert Madden-Abbott 24.10.2013, 15:44
quelle
5

Soweit ich weiß, möchten Sie, dass new.html und new.js beim Anfordern von / messages / new bedient werden.

Es wird nicht funktionieren, der Rails-Controller wird js oder HTML verwenden und niemals beide. HTTP funktioniert nicht so. Sie haben nur eine Datei, die als Antwort auf eine HTTP-Anfrage gesendet wird, und Sie können nicht gleichzeitig 2 senden.

Der Zweck des response_to-Blocks der Aktion ist die Verwendung von html für HTML-Anfragen (klassisches Browsen) und js, wenn die Anfrage für js ist, und das ist es, was Sie für ajax verwenden.

Für was Sie wollen, müssen Sie eine js-Referenz in Ihrem erb hinzufügen, gibt es keinen anderen Weg.

    
Syl 24.10.2013 15:45
quelle
5

Tut mir leid, dass ich zu spät bin, aber Sie können das JavaScript in "/messages/new.js.erb" aufrufen, indem Sie Folgendes verwenden:

messages / new.html.erb

link_to "Link", "", remote: true

Jedes Mal, wenn Sie auf diesen Link klicken, wird "/messages/new.js.erb" ausgelöst.

    
kizziah 14.06.2016 19:21
quelle
2

JavaScript-Code wird von Ihrer html.erb-Datei ausgeführt, wenn Sie ihn in Skript-Tags einschließen. Wenn es nur für Testzwecke und nur vorübergehend ist, könnte dies eine schnelle und einfache Möglichkeit sein, Ihre jquery mit Ihrem html abzufeuern, anstatt eine neue, separate Datei zu erstellen.

    
PJL 20.04.2017 17:27
quelle