Rails 3 memiliki beberapa JavaScript yang tidak mencolok yang cukup keren.
Tapi saya bertanya-tanya apa cara terbaik untuk memasukkan JavaScript tambahan untuk halaman tertentu.
Misalnya, di mana saya sebelumnya mungkin telah melakukan:
<%= f.radio_button :rating, 'positive', :onclick => "$('some_div').show();" %>
Kita sekarang dapat membuatnya tidak mengganggu dengan sesuatu seperti
<%= f.radio_button :rating, 'positive' %>
# then in some other file
$('user_rating_positive').click(function() {
$('some_div').show();
}
Jadi saya kira pertanyaan saya adalah di mana / bagaimana cara memasukkan JavaScript itu? Saya tidak ingin mengisi application.js
file karena JavaScript ini hanya berlaku untuk tampilan yang satu ini. Haruskah saya menyertakan file JavaScript khusus untuk setiap halaman, atau menempelnya dalam variabel instan yang dicari oleh header?
javascript
ruby-on-rails
ruby-on-rails-3
Brian Armstrong
sumber
sumber
Jawaban:
Yang ingin saya lakukan adalah memasukkan Javascript per-view dalam sebuah
content_for :head
blok dan kemudianyield
ke blok itu dalam tata letak aplikasi Anda. Sebagai contohJika cukup pendek maka:
atau, jika lebih lama, maka:
Lalu, di file tata letak Anda
sumber
<%= javascript_include_tag "my_javascipt_file" %>
?Jika Anda ingin memasukkan javascript hanya pada satu halaman, Anda dapat memasukkannya di halaman inline tentu saja, namun jika Anda ingin mengelompokkan javascript Anda dan mengambil keuntungan dari pipeline aset, js yang diperkecil, dll., Dimungkinkan untuk melakukannya dan memiliki tambahan Aset js yang digabungkan dan hanya dimuat pada halaman tertentu dengan membagi js Anda menjadi grup yang hanya berlaku di bagian pengontrol / tampilan / tertentu dari situs.
Pindahkan aset js Anda ke folder, dengan file manifes terpisah untuk masing-masing, jadi jika Anda memiliki pustaka admin js yang hanya digunakan di backend, Anda dapat melakukan ini:
di application.js yang ada
dalam file manifes admin.js baru
Pastikan manifes js baru ini dimuat dengan mengedit config / production.rb
Kemudian sesuaikan tata letak halaman Anda sehingga Anda dapat memasukkan beberapa js tambahan untuk kepala halaman:
Kemudian dalam tampilan di mana Anda ingin memasukkan grup js spesifik ini (serta grup aplikasi normal) dan / atau js, css dll:
Anda tentu saja dapat melakukan hal yang sama dengan css dan mengelompokkannya dengan cara yang sama untuk menerapkan hanya pada area tertentu dari situs.
sumber
//= require_tree ./global
, tetapi tidak jika saya//= require_directory ./global
menggunakan Rails 3.2.12.Jawaban-jawaban ini membantu saya satu ton! Jika ada yang ingin lebih ...
application.js.coffee
semua javacsripts akan dimuat setiap kali Anda menavigasi ke halaman yang berbeda, dan tujuan melakukan javascripts spesifik halaman akan dikalahkan.Oleh karena itu, Anda perlu membuat file manifes Anda sendiri (mis.
speciifc.js
) Yang akan membutuhkan semua file javascript khusus halaman. Juga, modifikasirequire_tree
dariapplication.js
app / aset / javascripts / application.js
app / assets / javascripts / specific.js
Kemudian di
environments/production.rb
tambahkan manifes ini ke daftar yang dikompilasi dengan opsi konfigurasi,config.assets.precompile += %w( specific.js )
Selesai! Semua javascripts bersama yang harus selalu dimuat akan ditempatkan di
app/assets/javascripts/global
folder, dan javascripts halaman-spcific diapp/assets/javascripts/specific
. Anda dapat memanggil javascripts khusus halaman dari tampilan seperti<%= javascript_include_tag "specific/whatever.js" %>
//.js adalah opsional.Ini sudah cukup, tetapi saya ingin memanfaatkannya
javascript_include_tag params[:controller]
juga. Saat Anda membuat pengontrol, file naskah kopi terkait dibuatapp/assets/javascripts
seperti orang lain yang disebutkan. Ada benar-benar javascript skrip khusus , yang dimuat hanya ketika pengguna mencapai tampilan kontroler tertentu.Jadi saya membuat manifes lain
controller-specific.js
app / assets / javascripts / controller-specific.js
//= require_directory .
Ini akan mencakup semua skrip kopi yang dihasilkan secara otomatis yang terkait dengan pengontrol. Anda juga perlu menambahkannya ke daftar yang telah dikompilasi.
config.assets.precompile += %w( specific.js controller-specific.js )
sumber
javascript_include_tag params[:controller]
. Saat ini application.html.erb saya memiliki baris inijavascript_include_tag 'application'
. Haruskah saya mengganti ini dengan saluran lain?<%= javascript_include_tag "specific/whatever.js" %>
dicontent_for :header
blok?config.assets.precompile
. Bukankah semua yang ada diapp/assets/javascripts/*.js
pra-kompilasi secara otomatis?application.css
danapplication.js
. Yang lain harus dimasukkan dalam file lain, atau terdaftar menggunakanconfig.assets.precompile
. Baca lebih lanjut di siniconfig.assets.precompile
danconfig.assets.version
telah pindah ke config / initializers / assets.rbSaya lebih suka yang berikut ...
Dalam file application_helper.rb Anda
dan kemudian dalam tampilan khusus Anda (app / views / books / index.html.erb dalam contoh ini)
... sepertinya bekerja untukku.
sumber
Jika Anda tidak ingin menggunakan pipa aset atau pekerjaan kompleks untuk mendapatkan javascript khusus halaman yang diperlukan (saya bersimpati), cara paling sederhana dan paling kuat, yang mencapai hal yang sama dengan jawaban di atas tetapi dengan kode lebih sedikit hanya untuk menggunakan:
Catatan: ini memang membutuhkan satu lagi permintaan http per tag sertakan daripada jawaban yang digunakan
content_for :head
sumber
javascript_include_tag
persis apa yang saya cari, sorak-sorai AJP//= require .
di application.js?//= require .
akan membawa skrip itu ke halaman mana pun di situs Anda sehingga Anda harus melakukan sesuatu seperti Kenny Grant (gunakan//= require_tree ./global
) atau bjg yang disarankan.//= require_tree .
ke//= require_directory .
dalam application.js dan kemudian membuat sub-direktori dalam asset \ javascripts. Perhatikan bahwa Anda harus memasukkan direktori baru di config \ initializers \ assets.rb untuk mengkompilasi js Anda dengan menambahkan baris:Rails.application.config.assets.precompile += %w( new_dir/js_file.js )
Lihatlah permata pluggable_js . Anda mungkin menemukan solusi ini lebih mudah digunakan.
sumber
Pemahaman saya adalah bahwa pipa aset dimaksudkan untuk mengurangi waktu buka halaman dengan menggabungkan semua js Anda menjadi satu file (diperkecil). Meskipun ini mungkin tampak menjijikkan di permukaan, itu sebenarnya adalah fitur yang sudah ada dalam bahasa populer seperti C dan Ruby. Hal-hal seperti tag "sertakan" dimaksudkan untuk mencegah dimasukkannya banyak file, dan untuk membantu programmer mengatur kode mereka. Ketika Anda menulis dan mengkompilasi program dalam C, semua kode itu ada di setiap bagian dari program Anda yang sedang berjalan, tetapi metode hanya dimuat ke dalam memori ketika kode itu sedang digunakan. Dalam arti tertentu, program yang dikompilasi tidak termasuk apa pun untuk menjamin bahwa kode tersebut modular dengan baik. Kami membuat kode modular dengan menulis program kami seperti itu, dan sistem operasi hanya memuat ke dalam memori objek dan metode yang kami butuhkan untuk lokasi tertentu. Apakah ada yang namanya "penyertaan khusus metode"? Jika aplikasi rel Anda tenang, ini pada dasarnya adalah apa yang Anda minta.
Jika Anda menulis javascript Anda sehingga menambah perilaku elemen HTML pada halaman, maka fungsi-fungsi itu 'spesifik-halaman' menurut desain. Jika ada beberapa kode rumit yang Anda tulis sedemikian rupa sehingga akan dieksekusi terlepas dari konteksnya, mungkin pertimbangkan untuk mengikat kode itu ke elemen html (Anda dapat menggunakan tag tubuh, seperti yang dijelaskan dalam metode Garber-Irlandia ). Jika suatu fungsi dieksekusi secara kondisional, kinerja mungkin akan lebih kecil dari semua tag skrip tambahan itu.
Saya berpikir untuk menggunakan permata paloma , seperti yang dijelaskan dalam proyek aplikasi rel . Kemudian Anda dapat membuat javascript khusus halaman Anda dengan memasukkan fungsi spesifik halaman dalam paloma callback:
Anda menggunakan rel, jadi saya tahu Anda suka permata :)
sumber
Anda tidak boleh memuat file JS atau CSS Anda di luar pipa aset karena Anda kehilangan fitur penting yang membuat Rails begitu hebat. Dan Anda tidak perlu permata lain. Saya percaya menggunakan permata sesedikit mungkin, dan menggunakan permata tidak perlu di sini.
Apa yang Anda inginkan dikenal sebagai "Kontroler Javascript Khusus" ("Aksi Javascript Khusus termasuk di bagian bawah). Ini memungkinkan Anda untuk memuat file JavaScript spesifik untuk CONTROLLER tertentu. Mencoba menghubungkan Javascript Anda ke Tampilan adalah jenis .. .mundur dan tidak mengikuti pola desain MVC. Anda ingin mengaitkannya dengan Pengontrol Anda atau tindakan di dalam Pengontrol Anda.
Sayangnya, untuk alasan apa pun, Rails devs memutuskan bahwa secara default, setiap halaman akan memuat setiap file JS yang terletak di direktori aset Anda. Mengapa mereka memutuskan untuk melakukan ini alih-alih mengaktifkan "Controller Specific Javascript" secara default saya tidak akan pernah tahu. Ini dilakukan melalui file application.js, yang termasuk baris kode berikut secara default:
Ini dikenal sebagai arahan . Itulah yang digunakan sprocket untuk memuat setiap file JS di direktori assets / javascripts. Secara default, sprocket secara otomatis memuat application.js dan application.css, dan direktif_tree memuat setiap file JS dan Coffee di masing-masing direktori.
CATATAN: Ketika Anda perancah (jika Anda tidak perancah, sekarang adalah waktu yang tepat untuk memulai), Rails secara otomatis menghasilkan file kopi untuk Anda, untuk pengontrol perancah itu. Jika Anda menginginkannya untuk menghasilkan file JS standar alih-alih file kopi , maka hapus permata kopi yang diaktifkan secara default di Gemfile Anda , dan perancah Anda akan membuat file JS sebagai gantinya.
Oke, jadi langkah pertama untuk mengaktifkan "Kontroler Javascript Khusus" adalah menghapus kode require_tree dari file application.js Anda, ATAU ubah ke folder di dalam direktori aset / javascripts Anda jika Anda masih memerlukan file JS global. YAITU:
Langkah 2: Buka file config / initializers / assets.rb Anda, dan tambahkan yang berikut ini:
Masukkan nama Controller yang Anda inginkan.
Langkah 3: Ganti file javascript_include_tag di file application.html.erb Anda dengan ini (perhatikan bagian params [: controller]:
Mulai ulang server dan biola Anda! File JS yang dihasilkan dengan perancah Anda sekarang hanya akan memuat ketika kontroler itu dipanggil.
Perlu memuat file JS tertentu pada AKSI spesifik di controller Anda , IE / artikel / baru ? Lakukan ini sebagai gantinya:
application.html.erb :
config / initializers / assets.rb :
Kemudian tambahkan folder baru dengan nama yang sama seperti Anda controller di folder aset / javascripts Anda dan letakkan file js Anda dengan nama yang sama dengan tindakan Anda di dalamnya. Ini kemudian akan memuatnya pada tindakan spesifik itu.
sumber
Ok jadi mungkin ini seperti pekerjaan terburuk yang pernah ada tetapi saya membuat metode pengontrol yang baru saja membuat file .js
Pengendali
Melihat
jika karena alasan tertentu kami tidak ingin melakukan ini maka beri tahu saya.
sumber
Cara yang disukai untuk menambahkan JS ada di footer, jadi Anda bisa melakukan ini:
show.html.erb:
tata letak / application.html.erb
sumber