Wir können es jetzt unauffällig machen mit so etwas wie
<%= f.radio_button :rating, 'positive' %>
# then in some other file
$('user_rating_positive').click(function() {
$('some_div').show();
}
Also denke ich, meine Frage ist, wo/wie man dieses JavaScript einbindet? Ich möchte die nicht auffüllen application.js Datei, da dieses JavaScript nur auf diese eine Ansicht anwendbar ist. Soll ich irgendwie eine benutzerdefinierte JavaScript-Datei für jede Seite einfügen oder sie in eine Instanzvariable einfügen, nach der der Header sucht?
mögliches Duplikat von Using Rails 3.1, wo fügen Sie Ihren “seitenspezifischen” Javascript-Code ein?
– Kate Gregory
11. Januar 13 um 1:24 Uhr
Für diejenigen, die ein vollständiges Verständnis dafür haben möchten, wie dies funktioniert und was am besten ist, lesen Sie bitte railsapps.github.io/rails-javascript-include-external.html . Dies ist mit Abstand die beste Dokumentation, die ich zu diesem Thema gesehen habe. Es ist eine großartige Lektüre nicht nur für Rails, sondern für jeden, der sich mit Webentwicklung beschäftigt. Deshalb ist es am besten, die Dinge auf die Schiene zu bringen. Ich werde sicherlich Unholy Rails für meine zukünftigen Fragen verwenden. BEEINDRUCKEND.
– DutGRIFF
22. Januar 14 um 22:22 Uhr
@KateGregory, dass man neuer ist.
– Ciro Santilli 新疆再教育营六四事件法轮功郝海东
14. Juli 14 um 9:39 Uhr
bjg
Was ich gerne mache, ist das Per-View-JavaScript in a einzubinden content_for :head blockieren und dann yield zu diesem Block in Ihrem Anwendungslayout. Beispielsweise
Wenn es ziemlich kurz ist, dann:
<% content_for :head do %>
<script type="text/javascript">
$(function() {
$('user_rating_positve').click(function() {
$('some_div').show();
}
});
</script>
<% end %>
oder, wenn länger, dann:
<% content_for :head do %>
<script type="text/javascript">
<%= render :partial => "my_view_javascript"
</script>
<% end %>
Dann in Ihrer Layoutdatei
<head>
...
<%= yield :head %>
</head>
Warum nicht die verwenden <%= javascript_include_tag "my_javascipt_file" %> ?
– AJP
17. Dezember 11 um 18:09 Uhr
@AJP Ich denke, dann wird der Zweck der Asset-Pipeline zunichte gemacht
– lulala
6. März 12 um 6:36 Uhr
@lulalala, aber macht der Code in der Antwort das nicht trotzdem, aber auf unordentlichere Weise?
– AJP
6. März 12 um 10:07 Uhr
@AJP es ist unordentlicher, aber es muss eine HTTP-Anfrage weniger gestellt werden als Ihre Antwort.
Wenn Sie Javascript nur auf einer Seite einfügen möchten, können Sie es natürlich inline auf der Seite einfügen. Wenn Sie jedoch Ihr Javascript gruppieren und die Vorteile der Asset-Pipeline, des minimierten js usw. nutzen möchten, ist dies möglich und hat zusätzliche js-Assets, die kombiniert und nur auf bestimmten Seiten geladen werden, indem Sie Ihre js in Gruppen aufteilen, die nur in bestimmten Controllern/Ansichten/Abschnitten der Website gelten.
Verschieben Sie Ihre js in Assets in Ordner mit jeweils einer separaten Manifestdatei. Wenn Sie also eine Admin-js-Bibliothek haben, die nur im Backend verwendet wird, können Sie Folgendes tun:
Vermögenswerte
Javascripts
Administrator
…js
admin.js (Manifest für die Admin-Gruppe)
application.js (Manifest für globale App-Gruppe)
global
…js
in der bestehenden application.js
//= require jquery
//= require jquery_ujs
//= require_tree ./global // requires all js files in global folder
in einer neuen admin.js-Manifestdatei
//= require_tree ./admin // requires all js files in admin folder
Stellen Sie sicher, dass dieses neue js-Manifest geladen wird, indem Sie config/production.rb bearbeiten
config.assets.precompile += %w( admin.js )
Passen Sie dann Ihr Seitenlayout so an, dass Sie einige zusätzliche js für den Seitenkopf einfügen können:
<%= content_for :header %>
Dann in Ansichten, in denen Sie diese spezifische JS-Gruppe (sowie die normale Anwendungsgruppe) und/oder seitenspezifische JS, CSS usw. einschließen möchten:
<% content_for :header do %>
<%= javascript_include_tag 'admin' %>
<% end %>
Sie können natürlich dasselbe mit CSS machen und es auf ähnliche Weise gruppieren, um es nur auf bestimmte Bereiche der Site anzuwenden.
Wenn Sie alle Ihre Manifeste am selben Ort aufbewahren, können Sie Rails anweisen, alles in diesem Ordner vorzukompilieren. Auf diese Weise müssen Sie production.rb nur einmal bearbeiten und müssen nicht nachverfolgen, was Sie hinzugefügt haben.
– Undistraktion
13. November 12 um 22:51 Uhr
Wussten Sie nicht, dass Sie das tun können – also könnten Sie einen Ordner “Manifeste” haben, der Ihre Manifeste sowie die einzelnen js-Gruppen enthielt? Ich könnte das ausprobieren. Ich wünschte, sie hätten standardmäßig ein etwas vernünftigeres Setup, da sie anscheinend davon ausgehen, dass Sie einfach alle js in eine große Datei fassen, die überall importiert wird.
– Kenny Grant
22. Februar 13 um 10:53 Uhr
seltsam, ich erhalte einen Sprockets::FileNotFound-Fehler, wenn ich es verwende //= require_tree ./globalaber nicht, wenn ich benutze //= require_directory ./global Schienen verwenden 3.2.12.
– Qix
8. März 13 um 18:40 Uhr
Es sieht so aus, als würden Sie am Ende viele Skript-Tags haben. Ich dachte, das Ziel der Asset-Pipeline wäre, nur ein Skript-Tag zu haben? Ich würde die Javascripts einfach so schreiben, dass sie seitenspezifisch sind.
– Ziggy
29. März 13 um 20:54 Uhr
Ich denke ich verstehe. Das Vermeiden zusätzlicher Skript-Tags ist jedoch ziemlich wichtig für die Ladezeit der Seite.
– Ziggy
7. April 13 um 20:27 Uhr
Maximus S
Diese Antworten haben mir sehr geholfen! Falls jemand noch etwas mehr will…
Sie müssen Javascripts in Manifeste einfügen, wenn Sie möchten, dass sie vorkompiliert werden. Wenn Sie jedoch jede Javascript-Datei von benötigen application.js.coffee dann werden alle Javascripts jedes Mal geladen, wenn Sie zu einer anderen Seite navigieren, und der Zweck, seitenspezifische Javascripts auszuführen, wird zunichte gemacht.
Daher müssen Sie Ihre eigene Manifestdatei erstellen (z speciifc.js), für die alle seitenspezifischen Javascript-Dateien erforderlich sind. Auch modifizieren require_tree von application.js
Dann in deiner environments/production.rb fügen Sie dieses Manifest der vorkompilierten Liste mit der Option config hinzu,
config.assets.precompile += %w( specific.js )
Fertig! All die geteilt Javascripts, die immer geladen werden sollten, werden eingefügt app/assets/javascripts/global Ordner und die seitenspezifischen Javascripts darin app/assets/javascripts/specific. Sie können die seitenspezifischen Javascripts einfach aus der Ansicht wie aufrufen
<%= javascript_include_tag "specific/whatever.js" %> //.js ist optional.
Das ist ausreichend, aber ich wollte davon Gebrauch machen javascript_include_tag params[:controller] auch. Wenn Sie Controller erstellen, wird eine zugehörige Coffeescript-Datei generiert app/assets/javascripts wie andere Leute erwähnt haben. Es gibt wirklich Controller-spezifisch Javascripts, die nur geladen werden, wenn der Benutzer die spezifische Controller-Ansicht erreicht.
Also habe ich ein weiteres Manifest erstellt controller-specific.js
app/assets/javascripts/controller-specific.js
//= require_directory .
Dazu gehören alle automatisch generierten Coffeescripts, die mit Controllern verbunden sind. Außerdem müssen Sie es der vorkompilierten Liste hinzufügen.
Vielen Dank für die ausführliche Antwort. Wo soll ich diese Zeile einfügen javascript_include_tag params[:controller] . Derzeit hat meine application.html.erb diese Zeile javascript_include_tag 'application' . Soll ich diese durch die andere Zeile ersetzen?
– simha
22. Juli 13 um 19:18 Uhr
Auch sollte ich diese Zeile setzen <%= javascript_include_tag "specific/whatever.js" %> in einem content_for :header Block ?
– simha
22. Juli 13 um 19:19 Uhr
Es ist seltsam für mich, dass Sie sich damit anlegen müssen config.assets.precompile. Ist nicht alles drin app/assets/javascripts/*.js automatisch vorkompiliert?
– AlexChaffee
1. August 14 um 16:02 Uhr
@AlexChaffee Nur Dateien sind automatisch verfügbar application.css und application.js. Andere müssen entweder in andere Dateien eingebunden oder mit aufgelistet werden config.assets.precompile. Lesen Sie hier mehr
– Sung-Cho
20. November 14 um 3:21 Uhr
Die Manifest-Deklaration wurde verschoben. Ich verwende Rails 4.2.0. und diesen Kommentar in der Datei production.rb gefunden: # config.assets.precompile und config.assets.version sind nach config/initializers/assets.rb umgezogen
– knapp
9. Januar 15 um 3:55 Uhr
Ich bevorzuge folgendes…
In Ihrer Datei application_helper.rb
def include_javascript (file)
s = " <script type="text/javascript">" + render(:file => file) + "</script>"
content_for(:head, raw(s))
end
und dann in Ihrer speziellen Ansicht (app/views/books/index.html.erb in diesem Beispiel)
<% include_javascript 'books/index.js' %>
… scheint bei mir zu funktionieren.
AJP
Wenn Sie die Asset-Pipeline oder die komplexen Problemumgehungen nicht verwenden möchten, um das notwendige seitenspezifische Javascript zu erhalten (ich sympathisiere), ist der einfachste und robusteste Weg, der dasselbe wie die obigen Antworten erreicht, jedoch mit weniger Code, nur zu benutzen:
<%= javascript_include_tag "my_javascipt_file" %>
Hinweis: Dies erfordert eine weitere HTTP-Anfrage pro Include-Tag als die Antworten, die verwenden content_for :head
javascript_include_tag war genau das, wonach ich gesucht habe, prost AJP
– Tom McKenzie
31. August 12 um 7:12 Uhr
Wo fügen Sie “my_javascipt_file” ein? In Assets/Javascripts? Aber wenn ja, würde das nicht automatisch mit a abgeholt werden //= require . in der application.js?
– Qix
8. März 13 um 18:32 Uhr
@Linus ja, //= require . würde dieses Skript auf jede Seite Ihrer Website bringen, also müssten Sie so etwas wie Kenny Grant (use //= require_tree ./global ) oder bjg vorgeschlagen.
– AJP
9. März 13 um 16:52 Uhr
Dies war bei weitem die einfachste Methode für mich, ich habe geändert //= require_tree . zu //= require_directory . in application.js und erstellte dann ein Unterverzeichnis in assetsjavascripts. Beachten Sie, dass Sie das neue Verzeichnis in configinitializersassets.rb einfügen müssen, um Ihr js vorzukompilieren, indem Sie die Zeile hinzufügen: Rails.application.config.assets.precompile += %w( new_dir/js_file.js )
– Jonesy
11. Juni 16 um 08:07 Uhr
Peresleguine
Schauen Sie sich an Pluggable_js Juwel. Möglicherweise finden Sie diese Lösung einfacher zu verwenden.
javascript_include_tag war genau das, wonach ich gesucht habe, prost AJP
– Tom McKenzie
31. August 12 um 7:12 Uhr
Wo fügen Sie “my_javascipt_file” ein? In Assets/Javascripts? Aber wenn ja, würde das nicht automatisch mit a abgeholt werden //= require . in der application.js?
– Qix
8. März 13 um 18:32 Uhr
@Linus ja, //= require . würde dieses Skript auf jede Seite Ihrer Website bringen, also müssten Sie so etwas wie Kenny Grant (use //= require_tree ./global ) oder bjg vorgeschlagen.
– AJP
9. März 13 um 16:52 Uhr
Dies war bei weitem die einfachste Methode für mich, ich habe geändert //= require_tree . zu //= require_directory . in application.js und erstellte dann ein Unterverzeichnis in assetsjavascripts. Beachten Sie, dass Sie das neue Verzeichnis in configinitializersassets.rb einfügen müssen, um Ihr js vorzukompilieren, indem Sie die Zeile hinzufügen: Rails.application.config.assets.precompile += %w( new_dir/js_file.js )
– Jonesy
11. Juni 16 um 08:07 Uhr
Ziggy
Mein Verständnis ist, dass die Asset-Pipeline die Seitenladezeit verkürzen soll, indem sie alle Ihre js in einer (minifizierten) Datei zusammenfasst. Obwohl dies oberflächlich betrachtet abstoßend erscheinen mag, ist es tatsächlich ein Feature, das bereits in populären Sprachen wie C und Ruby vorhanden ist. Dinge wie “include”-Tags sollen verhindern, dass eine Datei mehrfach eingebunden wird, und Programmierern helfen, ihren Code zu organisieren. Wenn Sie ein Programm in C schreiben und kompilieren, ist der gesamte Code in jedem Teil Ihres laufenden Programms vorhanden, Methoden werden jedoch nur dann in den Speicher geladen, wenn dieser Code verwendet wird. In gewissem Sinne enthält ein kompiliertes Programm nichts, um zu garantieren, dass der Code schön modular ist. Wir machen den Code modular, indem wir unsere Programme auf diese Weise schreiben, und das Betriebssystem lädt nur die Objekte und Methoden in den Speicher, die wir für eine bestimmte Lokalität benötigen. Gibt es überhaupt so etwas wie „methodenspezifische Inklusion“? Wenn Ihre Rails-App ruhig ist, ist dies im Wesentlichen das, wonach Sie fragen.
Wenn Sie Ihr Javascript so schreiben, dass es das Verhalten von HTML-Elementen auf der Seite erweitert, dann sind diese Funktionen per Design „seitenspezifisch“. Wenn Sie komplizierten Code so geschrieben haben, dass er unabhängig von seinem Kontext ausgeführt wird, sollten Sie diesen Code vielleicht trotzdem an ein HTML-Element binden (Sie könnten das Body-Tag verwenden, wie in der Garber-Irish-Methode). Wenn eine Funktion bedingt ausgeführt wird, ist die Leistung wahrscheinlich geringer als all diese zusätzlichen Skript-Tags.
Ich denke darüber nach, die zu verwenden Paloma gem, wie in der beschrieben Rails-Apps-Projekt. Dann können Sie Ihr Javascript seitenspezifisch machen, indem Sie seitenspezifische Funktionen in einen Paloma-Callback einfügen:
Paloma.callbacks['users']['new'] = function(params){
// This will only run after executing users/new action
alert('Hello New Sexy User');
};
Du benutzt Schienen, also weiß ich, dass du Edelsteine liebst 🙂
.
7842000cookie-checkBeste Möglichkeit, seitenspezifisches JavaScript in einer Rails 3-App hinzuzufügen?yes
mögliches Duplikat von Using Rails 3.1, wo fügen Sie Ihren “seitenspezifischen” Javascript-Code ein?
– Kate Gregory
11. Januar 13 um 1:24 Uhr
Für diejenigen, die ein vollständiges Verständnis dafür haben möchten, wie dies funktioniert und was am besten ist, lesen Sie bitte railsapps.github.io/rails-javascript-include-external.html . Dies ist mit Abstand die beste Dokumentation, die ich zu diesem Thema gesehen habe. Es ist eine großartige Lektüre nicht nur für Rails, sondern für jeden, der sich mit Webentwicklung beschäftigt. Deshalb ist es am besten, die Dinge auf die Schiene zu bringen. Ich werde sicherlich Unholy Rails für meine zukünftigen Fragen verwenden. BEEINDRUCKEND.
– DutGRIFF
22. Januar 14 um 22:22 Uhr
@KateGregory, dass man neuer ist.
– Ciro Santilli 新疆再教育营六四事件法轮功郝海东
14. Juli 14 um 9:39 Uhr