Co robią helper i helper_method?

201

helper_method jest proste: udostępnia niektóre lub wszystkie metody kontrolera do widoku.

Co to jest helper? Czy jest na odwrót, tzn. Importuje metody pomocnicze do pliku lub modułu? (Może nazwa helperi helper_methodsą podobne. Mogą raczej być share_methods_with_viewi import_methods_from_view)

odniesienie

niepolarność
źródło

Odpowiedzi:

295

Metoda helper_methodpolega na jawnym udostępnieniu niektórych metod zdefiniowanych w kontrolerze, aby były dostępne dla widoku. Jest to używane w przypadku każdej metody, do której musisz uzyskać dostęp zarówno z kontrolerów, jak i pomocników / widoków (standardowe metody pomocnicze nie są dostępne w kontrolerach). np. typowy przypadek użycia:

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

z helperdrugiej strony metoda służy do importowania całego pomocnika do widoków udostępnianych przez kontroler (i jego odziedziczone kontrolery). Co to znaczy robić

# application_controller.rb
helper :all

Dla szyn> 3.1

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

udostępnia wszystkie moduły pomocnicze dla wszystkich widoków (przynajmniej dla wszystkich kontrolerów dziedziczących po application_controller.

# home_controller.rb
helper UserHelper

udostępnia metody UserHelper w widokach dla akcji kontrolera domowego. Jest to równoważne z robieniem:

# HomeHelper
include UserHelper
Jeremy
źródło
20
W Railsach> = 3.1 'helper: all' w kontrolerze aplikacji jest zastąpiony przez ustawienie konfiguracji 'include_all_helpers' w application.rb. Zobacz stackoverflow.com/questions/1179865 .
Jan Hettich
@Jeremy Wiem, że ten post jest stary, ale dobrze powiedziane. Pomogło mi!
Ryan Rebo
3
Istnieje różnica między używaniem „pomocnika” i „włączania” poza prostym cukrem syntaktycznym. „pomocnik” udostępnia wymieniony moduł widokom i tylko widokom. „Uwzględnij” udostępnia wymieniony moduł w widokach i kontrolerach. Zarówno wpływ dziedziczących kontrolerów, jak i ich widoki.
Richard_G
@R_G Czy zauważyłeś, że ostatni fragment kodu include UserHelperznajduje się w HomeHelpermodule, a nie w kontrolerze? AFAIK, po prostu dołączenie modułu pomocniczego do kontrolera nie będzie współużytkować metod z widokami.
Franklin Yu,
@FranklinYu wraz z modułem pomocniczym w kontrolerze faktycznie będzie współdzielić metody z widokami, więc R_G jest poprawny.
Magne