¿Qué hacen helper y helper_method?

201

helper_method es sencillo: pone a disposición de la vista algunos o todos los métodos del controlador.

¿Qué es helper? ¿Es al revés, es decir, importa métodos auxiliares en un archivo o módulo? (Tal vez el nombre helpery helper_methodson similares. En lugar de eso, pueden ser share_methods_with_viewy import_methods_from_view)

referencia

nonopolaridad
fuente

Respuestas:

295

El método helper_methodconsiste en compartir explícitamente algunos métodos definidos en el controlador para que estén disponibles para la vista. Esto se utiliza para cualquier método al que necesite acceder tanto desde los controladores como desde los ayudantes / vistas (los métodos de ayuda estándar no están disponibles en los controladores). Por ejemplo, caso de uso común:

#application_controller.rb
def current_user
  @current_user ||= User.find_by_id!(session[:user_id])
end
helper_method :current_user

el helpermétodo, por otro lado, es importar un ayudante completo a las vistas proporcionadas por el controlador (y sus controladores heredados). Lo que esto significa es hacer

# application_controller.rb
helper :all

Para rieles> 3.1

# application.rb
config.action_controller.include_all_helpers = true
# This is the default anyway, but worth knowing how to turn it off

hace que todos los módulos auxiliares estén disponibles para todas las vistas (al menos para todos los controladores que heredan de application_controller.

# home_controller.rb
helper UserHelper

hace que los métodos UserHelper estén disponibles para las vistas de acciones del controlador de inicio. Esto es equivalente a hacer:

# HomeHelper
include UserHelper
Jeremy
fuente
20
En Rails> = 3.1, 'helper: all' en el controlador de la aplicación se reemplaza por la configuración de 'include_all_helpers' en application.rb. Ver stackoverflow.com/questions/1179865 .
Jan Hettich
@ Jeremy Sé que esta publicación es antigua, pero está bien dicho. ¡Me ayudó!
Ryan Rebo
3
Hay una diferencia entre usar "ayudante" e "incluir" más allá de un simple azúcar sintáctico. "helper" hace que el módulo con nombre esté disponible para las vistas, y solo para las vistas. "incluir" hace que el módulo con nombre esté disponible para las vistas y los controladores. Ambos afectan a los controladores heredados y sus puntos de vista.
Richard_G
@R_G ¿Notó que el último fragmento include UserHelperestá en el HomeHelpermódulo, en lugar de en el controlador? AFAIK, simplemente incluir el módulo auxiliar en el controlador no compartirá los métodos con las vistas.
Franklin Yu
@FranklinYu, incluido el módulo auxiliar en el controlador, realmente compartirá los métodos con las vistas, por lo que R_G es correcto.
Magne