Por que todos os helpers Rails estão disponíveis para todas as visualizações, o tempo todo? Existe uma maneira de desativar isto?

89

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?

Nate Smith
fonte
3
Existe uma resposta nova e mais relevante. Confira a resposta de Craig Walkers
EE33,

Respostas:

106

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

Craig Walker
fonte
Estou no 3.2. O application.config aqui significa config / application.rb?
Brandon Henry
O ApplicationHelper será incluído também se eu desativar include_all_helpers ou precisar incluí-lo manualmente?
Robert Audi
@AzizLight Não tenho certeza, já que não testei isso. No entanto, eu esperava que sim, já que o ApplicationHelper deve estar sempre disponível nas visualizações como o auxiliar "raiz". São os ajudantes de controladores não relacionados que são o principal problema aqui.
Craig Walker
3
Acho que esse deve ser o comportamento padrão.
Nafaa Boutefer
98

A resposta depende da versão do Rails.

Trilhos> = 3,1

Mude a include_all_helpersconfiguração para falsequalquer 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 .

Rails <3.1

Exclua a seguinte linha de ApplicationController

helper :all

Desta forma, cada controlador carregará seus próprios auxiliares.

Simone Carletti
fonte
2
Esta linha não existe para mim no Rails 3.2, então esta solução provavelmente não se aplica mais às versões posteriores do Rails.
Tyler Collier
O que @TylerCollier disse!
EE33 de
Eu estaria interessado em saber por que isso mudou tão significativamente do Rails até a versão 3.1? Não faz muito sentido para mim.
Joshua Muheim
6
NOTA: Os comentários acima não são mais válidos, agora que a resposta foi atualizada para incluir Rails> 3.1
Kyle Heironimus 12/12/12
3
Nota: Seu ApplicationHelper ainda será carregado. Se desejar incluir ajudantes específicos o tempo todo, você pode adicioná-los include HelperNameao topo de seu ApplicationHelper.
vansan de
27

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
George Schreiber
fonte
10
No momento em que você chama, clear_helperso 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.rbsnippet; é sempre bom ver o código e remover um pouco do mistério.
George Anderson
clear_helpersainda é útil para o rails 3.0 - config.action_controller.include_all_helpers = falseé apenas o rails 3.1 e superior.
robd
5

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:

  • Adicionado que ActionController :: Base agora faz helper: all em vez de depender do ApplicationController padrão em Rails para fazer isso [DHH]
databyte
fonte
1
então isso significa que no Rails 3, todos os helpers são carregados por padrão o tempo todo?
Nik So,
@Nik com certeza sim, pelo menos para 3.2
Nithin