Ich habe application.html.erb
geändert, um Controller-spezifische Assets zu verwenden:
application.html.erb
:
Das Problem ist, dass ich Turbolinks installiert habe. Wenn ich durch denselben Controller navigiere, funktioniert Turbolinks. Aber wenn ich zu einem anderen Controller umschalte, werden die Turbolinks einen vollständigen Nachladevorgang durchführen. Gibt es eine Möglichkeit, das zu beheben?
Turbolinks
Turbolinks nimmt die <body>
Ihrer HTML-Seite und ändert sie mit Ajax, wobei der Bereich <head>
intakt bleibt.
Dieses only funktioniert nur, wenn Ihr <head>
gleich bleibt - sonst wie kann es konstant gehalten werden? In dem Sinne, dass Sie Ihre Controller-Seite / Assets ändern, werden Sie haben , um ein vollständiges Seiten-Update ohne Turbolinks zu durchlaufen (zumindest wenn Sie Turbolinks verwenden, ohne es zu hacken)
Ich würde empfehlen, das Problem zu beheben, indem Sie Ihre Controller-spezifische Asset-Struktur ändern, um so wenige Änderungen am <head>
-Bereich wie möglich vorzunehmen.
-
Turbolinks Tracking
Wenn Sie die Turbolinks documentation
gelesen haben, können Sie möglicherweise davon profitieren, die turbolinks-data-track
zu entfernen. Option aus Ihren Controller-spezifischen Assets:
Sie können bestimmte Assets wie application.js und application.css verfolgen. das du sicherstellen willst, sind immer von der neuesten Version innerhalb eines Turbolinks Sitzung. Dies geschieht durch Markieren dieser Asset-Links mit Daten-Turbolinks-Track, so:
<link href="/assets/application-9bd64a86adb3cd9ab3b16e9dca67a33a.css" rel="stylesheet" type="text/css" data-turbolinks-track>
Wenn diese Assets URLs ändern (betten Sie einen MD5-Stempel ein, um dies zu gewährleisten), wird die Seite vollständig ausgeführt Nachladen statt Turbolinks. Dies gewährleistet, dass alle Bei Turbolinks-Sitzungen wird immer das neueste JavaScript ausgeführt und CSS.
-
Etwas, von dem Sie profitieren werden, ist die Verwendung des Helpers controller_name
(anstelle von params[:controller]
):
Setzen Sie Ihren Controller spezifische js in das body-Tag. Da Turbolinks den HTML-Text nicht berühren, laden Sie diesen js-Code bei jedem Aufruf der Seite neu.
In Ihrem Fall
%Vor%Aber wenn Sie viel Code in Ihrem Controller js haben, stellen Sie vielleicht fest, dass die obige Lösung ziemlich zeitaufwendig ist. Denn wenn Sie die Seite besuchen, wird dieser große Teil des Codes neu geladen. So, wie man damit umgeht?
■ Die folgende Methode kann dazu führen, dass einige der jquery-Ereignisse mehrfach gebunden werden. Dies ist ein Problem der Turbolinks. Lesen Sie diesen Artikel Ссылка
Wenn der Benutzer zum ersten Mal Ihre Site besucht, lädt er den gesamten js-Code, stellt sicher, dass Controller-spezifische nicht ausgeführt werden (umbrechen sie sie in Funktionen) und speichert sie in einer globalen Variable, zB Site
. Dann triggern Sie Ihre contollerspezifische js, indem Sie etwas wie
im body-Tag.
Auf diese Weise wird der eigentliche contollerspezifische js-Code nur einmal geladen und bei Bedarf getriggert.
app/assets/javascripts/site.js
Wickeln Sie Ihren Controller js in Funktionen und speichern Sie sie in Site
. Zum Beispiel users.js
app/assets/javascripts/site.js
in Ihrer application.js laden Sie alle.
app/assets/javascripts/site.js
Dann triggern Sie in Ihrem Layout die Controller spezifische js.
app/views/layouts/application.html.erb
Ändere einfach die site.js
und das Layout. Und ich beende es mit dem folgenden Ausschnitt.
app/views/layouts/application.html.erb
Hier ist ein interessantes Video über das Laden von JavaScript, CSS und anderen Assets für einzelne Seite Apps, die Sie gerne sehen möchten.
OSCON 2014: Wie Instagram.com funktioniert; Pete Hunt
Tags und Links ruby-on-rails asset-pipeline turbolinks