Por que posso acessar métodos auxiliares para um controlador nas visualizações de um controlador diferente? Existe uma maneira de desabilitar isso sem hackear / corrigir o Rails?
Por que posso acessar métodos auxiliares para um controlador nas visualizações de um controlador diferente? Existe uma maneira de desabilitar isso sem hackear / corrigir o Rails?
Respostas:
O método de @George Schreiber não funciona a partir do Rails 3.1; o código mudou significativamente.
Porém, agora existe uma maneira ainda melhor de desabilitar este recurso no Rails 3.1 (e esperançosamente mais tarde). Em seu config / application.rb, adicione esta linha:
config.action_controller.include_all_helpers = false
Isso impedirá que o ApplicationController carregue todos os auxiliares .
(Para qualquer pessoa interessada, aqui está a solicitação pull em que o recurso foi criado .)
A resposta depende da versão do Rails.
Mude a include_all_helpers
configuração para false
qualquer ambiente onde você deseja aplicar a configuração. Se você deseja que a configuração se aplique a todos os ambientes, altere-a em application.rb
.
config.action_controller.include_all_helpers = false
Quando falso, ele ignorará a inclusão .
Exclua a seguinte linha de ApplicationController
helper :all
Desta forma, cada controlador carregará seus próprios auxiliares.
include HelperName
ao topo de seu ApplicationHelper.
No Rails 3, actioncontroller/base.rb
(em torno da linha 224):
def self.inherited(klass)
super
klass.helper :all if klass.superclass == ActionController::Base
end
Então, sim, se você derivar sua classe de ActionController::Base
, todos os ajudantes serão incluídos.
Para contornar isso, chame clear_helpers
( AbstractClass::Helpers
; incluído em ActionController::Base
) no início do código de seu controlador. Comentário do código fonte para clear_helpers:
# Clears up all existing helpers in this class, only keeping the helper
# with the same name as this class.
Por exemplo:
class ApplicationController < ActionController::Base
clear_helpers
...
end
clear_helpers
o dano (desempenho) já foi feito, uma vez que todos os ajudantes foram carregados. Você realmente deseja usar config.action_controller.include_all_helpers = false
(como @Craig Walker afirma, acima), pois evita que os helpers sejam carregados em primeiro lugar, ganhando assim algum desempenho (talvez mais significativamente no modo de desenvolvimento). Obrigado por incluir o actioncontroller/base.rb
snippet; é sempre bom ver o código e remover um pouco do mistério.
clear_helpers
ainda é útil para o rails 3.0 - config.action_controller.include_all_helpers = false
é apenas o rails 3.1 e superior.
Na verdade, no Rails 2 , a funcionalidade padrão do ActionController :: Base era incluir todos os helpers.
Conjunto de alterações 6222 em 24/02/07 20:33:47 (3 anos atrás) por dhh : Faça uma suposição padrão de que você quer todos os ajudantes, o tempo todo (sim, sim)
mudança:
class ApplicationController < ActionController::Base
helper :all # include all helpers, all the time
end
A partir do Rails 3 beta 1, esse não é mais o caso, conforme observado no CHANGELOG: