Mengapa saya dapat mengakses metode pembantu untuk satu pengontrol dalam tampilan untuk pengontrol yang berbeda? Apakah ada cara untuk menonaktifkan ini tanpa meretas / menambal Rails?
ruby-on-rails
ruby
helpers
Nate Smith
sumber
sumber
Jawaban:
Metode @George Schreiber tidak berfungsi pada Rails 3.1; kode telah berubah secara signifikan.
Namun, sekarang ada cara yang lebih baik untuk menonaktifkan fitur ini di Rails 3.1 (dan semoga nanti). Di config / application.rb Anda, tambahkan baris ini:
config.action_controller.include_all_helpers = false
Ini akan mencegah ApplicationController memuat semua pembantu .
(Bagi siapa saja yang tertarik, inilah pull request tempat fitur itu dibuat .)
sumber
Jawabannya tergantung pada versi Rails.
Rel> = 3.1
Ubah
include_all_helpers
konfigurasinya menjadifalse
di lingkungan mana pun tempat Anda ingin menerapkan konfigurasi. Jika Anda ingin konfigurasi diterapkan ke semua lingkungan, ubahlahapplication.rb
.config.action_controller.include_all_helpers = false
Jika salah, penyertaan akan dilewati .
Rel <3.1
Hapus baris berikut dari
ApplicationController
helper :all
Dengan cara ini setiap pengontrol akan memuat pembantu masing-masing.
sumber
include HelperName
ke bagian atas ApplicationHelper Anda.Di Rails 3,
actioncontroller/base.rb
(sekitar baris 224):def self.inherited(klass) super klass.helper :all if klass.superclass == ActionController::Base end
Jadi ya, jika Anda mendapatkan kelas Anda dari
ActionController::Base
, semua pembantu akan disertakan.Untuk menyiasatinya, panggil
clear_helpers
(AbstractClass::Helpers
; termasuk dalamActionController::Base
) di awal kode pengontrol Anda. Komentar kode sumber untuk clear_helpers:# Clears up all existing helpers in this class, only keeping the helper # with the same name as this class.
Misalnya:
class ApplicationController < ActionController::Base clear_helpers ... end
sumber
clear_helpers
kerusakan (kinerja) telah dilakukan sejak semua pembantu telah dimuat. Anda benar-benar ingin menggunakanconfig.action_controller.include_all_helpers = false
(seperti yang dinyatakan @Craig Walker, di atas), karena ini mencegah pembantu dimuat di tempat pertama, sehingga memberi Anda beberapa kinerja (mungkin yang paling signifikan dalam mode pengembangan). Terima kasih telah menyertakanactioncontroller/base.rb
cuplikannya; selalu menyenangkan melihat kode dan menghilangkan beberapa misterinya.clear_helpers
masih berguna untuk rel 3.0 -config.action_controller.include_all_helpers = false
hanya rel 3.1 ke atas.Sebenarnya di Rails 2 , fungsionalitas default dari ActionController :: Base adalah menyertakan semua pembantu.
Changeset 6222 pada 02/24/07 20:33:47 (3 tahun yang lalu) oleh dhh : Jadikan sebagai asumsi default bahwa Anda menginginkan semua pembantu, sepanjang waktu (ya, ya)
perubahan:
class ApplicationController < ActionController::Base helper :all # include all helpers, all the time end
Pada Rails 3 beta 1, tidak lagi seperti yang disebutkan di CHANGELOG:
sumber