Was machen helper und helper_method?

201

helper_method ist unkompliziert: Es stellt einige oder alle Methoden des Controllers für die Ansicht zur Verfügung.

Was ist helper? Ist es umgekehrt, dh es importiert Hilfsmethoden in eine Datei oder ein Modul? (Vielleicht der Name helperund helper_methodsind gleich. Sie können lieber stattdessen sein share_methods_with_viewund import_methods_from_view)

Referenz

Unpolarität
quelle

Antworten:

295

Die Methode helper_methodbesteht darin, einige im Controller definierte Methoden explizit freizugeben, um sie für die Ansicht verfügbar zu machen. Dies wird für alle Methoden verwendet, auf die Sie sowohl von Controllern als auch von Helfern / Ansichten aus zugreifen müssen (Standard-Hilfsmethoden sind in Controllern nicht verfügbar). zB häufiger Anwendungsfall:

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

Die helperMethode hingegen besteht darin, einen gesamten Helfer in die vom Controller bereitgestellten Ansichten (und die geerbten Controller) zu importieren. Was dies bedeutet, ist zu tun

# application_controller.rb
helper :all

Für Schienen> 3.1

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

stellt alle Hilfsmodule allen Ansichten zur Verfügung (zumindest für alle Controller, die von application_controller erben.

# home_controller.rb
helper UserHelper

stellt die UserHelper-Methoden Ansichten für Aktionen des Home-Controllers zur Verfügung. Dies ist gleichbedeutend mit:

# HomeHelper
include UserHelper
Jeremy
quelle
20
In Rails> = 3.1 wird 'helper: all' im Anwendungscontroller durch die Konfigurationseinstellung 'include_all_helpers' in application.rb ersetzt. Siehe stackoverflow.com/questions/1179865 .
Jan Hettich
@ Jeremy Ich weiß, dieser Beitrag ist alt, aber gut gesagt. Half mir!
Ryan Rebo
3
Es gibt einen Unterschied zwischen der Verwendung von "Helfer" und "Einschließen" über einen einfachen syntaktischen Zucker hinaus. "helper" stellt das benannte Modul Ansichten und nur Ansichten zur Verfügung. "include" stellt das genannte Modul Ansichten und Controllern zur Verfügung. Beide wirken sich auf geerbte Controller und deren Ansichten aus.
Richard_G
@R_G Haben Sie bemerkt, dass sich das letzte Snippet include UserHelperim HomeHelperModul befindet und nicht im Controller? AFAIK, das einfach das Hilfsmodul in die Steuerung einbezieht, teilt die Methoden nicht mit Ansichten.
Franklin Yu
@FranklinYu einschließlich des Hilfsmoduls in der Steuerung teilt die Methoden tatsächlich mit Ansichten, sodass R_G korrekt ist.
Magne