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 false
in 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]