Neden tüm Rails yardımcıları tüm görünümler için her zaman kullanılabilir? Bunu devre dışı bırakmanın bir yolu var mı?


89

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ı?


3
Yeni, daha alakalı bir cevap var. Craig Walkers cevabına göz atın
EE33

Yanıtlar:


106

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


3.2'deyim. Burada application.config, config / application.rb anlamına mı geliyor?
Brandon Henry

İnclude_all_helpers'ı devre dışı bırakırsam veya manuel olarak eklemem gerekirse ApplicationHelper da dahil edilecek mi?
Robert Audi

@AzizLight Bunu test etmediğim için emin değilim. Ancak, ApplicationHelper'ın görünümlerde her zaman "kök" yardımcı olarak kullanılabilir olması amaçlandığından, bunu bekliyorum. Burada birincil sorun, ilgisiz kontrolörlerin yardımcılarıdır.
Craig Walker

3
Bunun varsayılan davranış olması gerektiğini düşünüyorum.
Nafaa Boutefer

98

Cevap, Rails sürümüne bağlıdır.

Raylar> = 3.1

Değişim include_all_helpersiçin yapılandırma falseyapı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 .

Raylar <3.1

Aşağıdaki satırı sil ApplicationController

helper :all

Bu şekilde her kontrolör kendi yardımcılarını yükleyecektir.


2
Bu satır Rails 3.2'de benim için mevcut değil, bu nedenle bu çözüm muhtemelen artık Rails'in sonraki sürümleri için geçerli değil.
Tyler Collier

@TylerCollier ne dedi!
EE33

Bunun neden Rails up sürüm 3.1'den bu kadar önemli bir şekilde değiştiğini merak ediyorum? Bana pek mantıklı gelmiyor.
Joshua Muheim

6
NOT: Yanıt Rails> 3.1'i içerecek şekilde güncellendiğinden, yukarıdaki yorumlar artık geçerli değildir
Kyle Heironimus

3
Not: ApplicationHelper'ınız yine de yüklenecek. Her zaman belirli bir yardımcı eklemek isterseniz, include HelperNameApplicationHelper'ınızın en üstüne ekleyebilirsiniz .
vansan

27

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

10
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.rbSnippet'i eklediğiniz için teşekkürler ; Kodu görmek ve gizemin bir kısmını ortadan kaldırmak her zaman güzeldir.
George Anderson

clear_helpershala 3.0 rayları için kullanışlıdır - config.action_controller.include_all_helpers = falsesadece 3.1 ve üzeri raylar içindir.
2014 16

5

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:

  • ActionController :: Base'in artık yardımcı olduğu eklendi: bunu yapmak için Rails'teki varsayılan ApplicationController'a güvenmek yerine hepsi [DHH]

1
yani bu, Rails 3'te tüm yardımcıların varsayılan olarak her zaman yüklü olduğu anlamına mı geliyor?
Nik So

@Nik mutlaka evet en az 3.2 için
Nithin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.