Waarom zijn alle Rails-helpers altijd beschikbaar voor alle weergaven? Is er een manier om dit uit te schakelen?

Waarom heb ik toegang tot helpermethoden voor één controller in de weergaven voor een andere controller? Is er een manier om dit uit te schakelen zonder Rails te hacken/patchen?


Antwoord 1, autoriteit 100%

@George Schreiber’s methode werkt niet vanaf Rails 3.1; de code is aanzienlijk veranderd.

Er is nu echter een nog betere manier om deze functie in Rails 3.1 (en hopelijk later) uit te schakelen. Voeg in je config/application.rb deze regel toe:

config.action_controller.include_all_helpers = false

Dit zal voorkomen dat ApplicationController alle helpers laadt.

(Voor iedereen die geïnteresseerd is, hier is het pull-verzoek waar de functie is gemaakt.)


Antwoord 2, autoriteit 93%

Het antwoord hangt af van de Rails-versie.

Rails >= 3,1

Verander de include_all_helpers-configuratie in falsein elke omgeving waar u de configuratie wilt toepassen. Als u wilt dat de configuratie van toepassing is op alle omgevingen, wijzigt u deze in application.rb.

config.action_controller.include_all_helpers = false

Indien false, zal het de opname overslaan.

Rails < 3.1

Verwijder de volgende regel uit ApplicationController

helper :all

Op deze manier laadt elke controller zijn eigen helpers.


Antwoord 3, autoriteit 25%

In Rails 3, actioncontroller/base.rb(rond regel 224):

def self.inherited(klass)
  super
  klass.helper :all if klass.superclass == ActionController::Base
end

Dus ja, als je je klas afleidt van ActionController::Base, worden alle helpers opgenomen.

Om dit te omzeilen, belt u clear_helpers(AbstractClass::Helpers; opgenomen in ActionController::Base) aan het begin van uw controller’s code. Broncodecommentaar voor clear_helpers:

# Clears up all existing helpers in this class, only keeping the helper
# with the same name as this class.

Bijvoorbeeld:

class ApplicationController < ActionController::Base
  clear_helpers
  ...
end

Antwoord 4, autoriteit 5%

Eigenlijk was in Rails 2de standaardfunctionaliteit van ActionController::Base om alle helpers op te nemen.

Changeset 6222 op 24/02/07 20:33:47 (3 jaar geleden) door dhh:
Maak er een standaardaanname van dat je alle helpers wilt, altijd (ja, ja)

wijzig:

class ApplicationController < ActionController::Base 
  helper :all # include all helpers, all the time 
end 

Vanaf Rails 3 beta 1 is dat niet langer het geval zoals vermeld in de CHANGELOG:

  • Toegevoegd dat ActionController::Base nu helper :all doet in plaats van te vertrouwen op de standaard ApplicationController in Rails om het te doen [DHH]

Other episodes