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?
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?
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 .)
Jawabannya tergantung pada versi Rails.
Ubah include_all_helpers
konfigurasinya menjadi false
di lingkungan mana pun tempat Anda ingin menerapkan konfigurasi. Jika Anda ingin konfigurasi diterapkan ke semua lingkungan, ubahlah application.rb
.
config.action_controller.include_all_helpers = false
Jika salah, penyertaan akan dilewati .
Hapus baris berikut dari ApplicationController
helper :all
Dengan cara ini setiap pengontrol akan memuat pembantu masing-masing.
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 dalam ActionController::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
clear_helpers
kerusakan (kinerja) telah dilakukan sejak semua pembantu telah dimuat. Anda benar-benar ingin menggunakan config.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 menyertakan actioncontroller/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: