¿Por qué todos los ayudantes de Rails están disponibles para todas las vistas, todo el tiempo? ¿Hay alguna forma de desactivar esto?

¿Por qué puedo acceder a los métodos de ayuda para un controlador en las vistas de un controlador diferente? ¿Hay alguna manera de desactivar esto sin hackear / reparar Rails?

El método de @George Schreiber no funciona a partir de Rails 3.1; el código ha cambiado significativamente.

Sin embargo, ahora hay una forma aún mejor de desactivar esta función en Rails 3.1 (y con suerte más adelante). En su config / application.rb, agregue esta línea:

config.action_controller.include_all_helpers = false 

Esto evitará que ApplicationController cargue todos los helpers .

(Para cualquiera que esté interesado, aquí está la solicitud de extracción donde se creó la función ).

La respuesta depende de la versión de Rails.

Rieles> = 3.1

Cambia la configuración de include_all_helpers a false en cualquier entorno donde quieras aplicar la configuración. Si desea que la configuración se aplique a todos los entornos, cámbiela en application.rb .

 config.action_controller.include_all_helpers = false 

Cuando es falso, omitirá la inclusión .

Rieles <3.1

Elimine la siguiente línea de ApplicationController

 helper :all 

De esta forma, cada controlador cargará sus propios ayudantes.

En Rails 3, actioncontroller/base.rb (alrededor de la línea 224):

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

Entonces sí, si deriva su clase de ActionController::Base , se incluirán todos los ayudantes.

Para clear_helpers esto, llame a clear_helpers ( AbstractClass::Helpers ; incluido en ActionController::Base ) al comienzo del código de su controlador. Comentario del código fuente para clear_helpers:

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

P.ej:

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

De hecho, en Rails 2 , la funcionalidad predeterminada de ActionController :: Base era incluir todos los ayudantes.

Changeset 6222 el 24/02/07 20:33:47 (hace 3 años) por dhh : Hacer una suposición predeterminada de que quieres todos los ayudantes, todo el tiempo (sí, sí)

cambio:

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

A partir de Rails 3 beta 1, ese ya no es el caso como se indica en CHANGELOG:

  • Agregó que ActionController :: Base ahora hace helper: all en lugar de depender del ApplicationController predeterminado en Rails para hacerlo [DHH]