Cosa fanno helper e helper_method?


201

helper_method è semplice: rende alcuni o tutti i metodi del controller disponibili per la vista.

Che cosa è helper? È il contrario, ovvero importa i metodi di supporto in un file o in un modulo? (Forse il nome helpere helper_methodsi assomigliano. Potrebbero invece preferire essere share_methods_with_viewe import_methods_from_view)

riferimento

Risposte:


295

Il metodo helper_methodconsiste nel condividere esplicitamente alcuni metodi definiti nel controller per renderli disponibili per la vista. Viene utilizzato per qualsiasi metodo a cui è necessario accedere sia dai controller sia dagli helper / viste (i metodi helper standard non sono disponibili nei controller). ad esempio caso d'uso comune:

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

il helpermetodo, d'altra parte, è per importare un intero helper nelle viste fornite dal controller (e dai controller ereditati). Ciò significa che sta facendo

# application_controller.rb
helper :all

Per binari> 3.1

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

rende tutti i moduli helper disponibili per tutte le viste (almeno per tutti i controller che ereditano da application_controller.

# home_controller.rb
helper UserHelper

rende i metodi UserHelper disponibili per le visualizzazioni per le azioni del controller domestico. Ciò equivale a fare:

# HomeHelper
include UserHelper

20
In Rails> = 3.1, 'helper: all' nel controller dell'applicazione è sostituito dall'impostazione di configurazione 'include_all_helpers' in application.rb. Vedi stackoverflow.com/questions/1179865 .
Jan Hettich,

@Jeremy So che questo post è vecchio, ma ben detto. Mi ha aiutato!
Ryan Rebo

3
C'è una differenza tra l'uso di "helper" e "include" oltre ad un semplice zucchero sintattico. "helper" rende il modulo denominato disponibile per le viste e solo per le viste. "include" rende il modulo denominato disponibile per le visualizzazioni e per i controller. Entrambi incidono sui controller ereditati e sulle loro opinioni.
Richard_G,

@R_G Hai notato che l'ultimo frammento si include UserHelpertrova nel HomeHelpermodulo anziché nel controller? AFAIK, semplicemente includendo il modulo helper nel controller non condividerà i metodi con le viste.
Franklin Yu,

@FranklinYu incluso il modulo helper nel controller condividerà effettivamente i metodi con le viste, quindi R_G è corretto.
Magne,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.