Mengapa semua pembantu Rails tersedia untuk semua tampilan, sepanjang waktu? Apakah ada cara untuk menonaktifkan ini?

89

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?

Nate Smith
sumber
3
Ada jawaban baru yang lebih relevan. Lihat jawaban Craig Walkers
EE33

Jawaban:

106

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 .)

Craig Walker
sumber
Saya di 3.2. Apakah application.config di sini berarti config / application.rb?
Brandon Henry
Apakah ApplicationHelper akan disertakan juga jika saya menonaktifkan include_all_helpers atau saya perlu memasukkannya secara manual?
Robert Audi
@AzizLight Saya tidak yakin, karena saya belum menguji, itu. Namun, saya berharap demikian, karena ApplicationHelper dimaksudkan untuk selalu tersedia dalam tampilan sebagai pembantu "root". Ini adalah pembantu dari pengontrol yang tidak terkait yang menjadi masalah utama di sini.
Craig Walker
3
Saya pikir ini harus menjadi perilaku default.
Nafaa Boutefer
98

Jawabannya tergantung pada versi Rails.

Rel> = 3.1

Ubah include_all_helperskonfigurasinya menjadi falsedi 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 .

Rel <3.1

Hapus baris berikut dari ApplicationController

helper :all

Dengan cara ini setiap pengontrol akan memuat pembantu masing-masing.

Simone Carletti
sumber
2
Baris ini tidak ada untuk saya di Rails 3.2, jadi solusi ini sepertinya tidak lagi berlaku untuk versi Rails yang lebih baru.
Tyler Collier
Apa yang dikatakan @TylerCollier!
EE33
Saya tertarik mengapa ini berubah begitu signifikan dari Rails up versi 3.1? Tidak masuk akal bagiku.
Joshua Muheim
6
CATATAN: Komentar di atas tidak lagi valid, sekarang jawabannya telah diperbarui untuk menyertakan Rails> 3.1
Kyle Heironimus
3
Catatan: ApplicationHelper Anda akan tetap dimuat. Jika Anda ingin menyertakan pembantu tertentu setiap saat, Anda dapat menambahkan include HelperNameke bagian atas ApplicationHelper Anda.
van
27

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
George Schreiber
sumber
10
Pada saat Anda memanggil clear_helperskerusakan (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.rbcuplikannya; selalu menyenangkan melihat kode dan menghilangkan beberapa misterinya.
George Anderson
clear_helpersmasih berguna untuk rel 3.0 - config.action_controller.include_all_helpers = falsehanya rel 3.1 ke atas.
robd
5

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:

  • Menambahkan bahwa ActionController :: Base sekarang melakukan helper: all alih-alih mengandalkan ApplicationController default di Rails untuk melakukannya [DHH]
databyte
sumber
1
jadi apakah itu berarti di Rails 3, semua pembantu secara default dimuat sepanjang waktu?
Nik Jadi
@Nik pasti ya, setidaknya untuk 3,2
Nithin