Neden farklı bir denetleyicinin görünümlerinde bir denetleyici için yardımcı yöntemlere erişebilirim? Rails'i hacklemeden / yamalamadan bunu devre dışı bırakmanın bir yolu var mı?
Neden farklı bir denetleyicinin görünümlerinde bir denetleyici için yardımcı yöntemlere erişebilirim? Rails'i hacklemeden / yamalamadan bunu devre dışı bırakmanın bir yolu var mı?
Yanıtlar:
@George Schreiber'in yöntemi Rails 3.1'den itibaren çalışmıyor; kod önemli ölçüde değişti.
Ancak, artık bu özelliği Rails 3.1'de (ve umarım daha sonra) devre dışı bırakmanın daha iyi bir yolu var. Config / application.rb dosyanıza şu satırı ekleyin:
config.action_controller.include_all_helpers = false
Bu, ApplicationController'ın tüm yardımcıları yüklemesini engelleyecektir .
(İlgilenen herkes için özelliğin oluşturulduğu yerdeki çekme isteği burada verilmiştir .)
Cevap, Rails sürümüne bağlıdır.
Değişim include_all_helpers
için yapılandırma false
yapılandırmayı uygulamak istediğiniz ortamda. Yapılandırmanın tüm ortamlara uygulanmasını istiyorsanız, değiştirin application.rb
.
config.action_controller.include_all_helpers = false
Yanlış olduğunda , dahil etmeyi atlayacaktır .
Aşağıdaki satırı sil ApplicationController
helper :all
Bu şekilde her kontrolör kendi yardımcılarını yükleyecektir.
include HelperName
ApplicationHelper'ınızın en üstüne ekleyebilirsiniz .
Rails 3'te, actioncontroller/base.rb
(224. satır civarında):
def self.inherited(klass)
super
klass.helper :all if klass.superclass == ActionController::Base
end
Yani evet, sınıfınızı kendinizden alırsanız ActionController::Base
, tüm yardımcılar dahil edilecektir.
Bunu aşmak için, denetleyicinizin kodunun başında clear_helpers
( AbstractClass::Helpers
; dahil ActionController::Base
) arayın . Clear_helpers için kaynak kodu yorumu:
# Clears up all existing helpers in this class, only keeping the helper
# with the same name as this class.
Örneğin:
class ApplicationController < ActionController::Base
clear_helpers
...
end
clear_helpers
(Performans) olarak adlandırdığınız zaman , tüm yardımcılar yüklendiğinden beri hasar zaten verilmiş demektir. Gerçekten kullanmak istiyorsunuz config.action_controller.include_all_helpers = false
(yukarıda @Craig Walker'ın belirttiği gibi), bu, yardımcıların ilk etapta yüklenmesini önlediğinden, böylece size biraz performans kazandırır (belki de en önemlisi geliştirme modunda). actioncontroller/base.rb
Snippet'i eklediğiniz için teşekkürler ; Kodu görmek ve gizemin bir kısmını ortadan kaldırmak her zaman güzeldir.
clear_helpers
hala 3.0 rayları için kullanışlıdır - config.action_controller.include_all_helpers = false
sadece 3.1 ve üzeri raylar içindir.
Aslında Rails 2'de , ActionController :: Base'in varsayılan işlevi tüm yardımcıları içermekti.
Değişiklik seti 6222 02/24/07 20:33:47 (3 yıl önce) dhh tarafından : Her zaman tüm yardımcıları istediğinizi varsayılan bir varsayım yapın (evet, evet)
değişiklik:
class ApplicationController < ActionController::Base
helper :all # include all helpers, all the time
end
Rails 3 beta 1'den itibaren, CHANGELOG'da belirtildiği gibi artık durum böyle değildir: