Что делают helper и helper_method?

201

helper_method прост: он делает некоторые или все методы контроллера доступными для представления.

Что такое helper? Это наоборот, то есть импортирует вспомогательные методы в файл или модуль? (Может быть, имя helperи helper_methodпохожи. Вместо этого они могут быть share_methods_with_viewи import_methods_from_view)

ссылка

nonopolarity
источник

Ответы:

295

Метод helper_methodзаключается в явном совместном использовании некоторых методов, определенных в контроллере, чтобы сделать их доступными для представления. Это используется для любого метода, к которому вам нужен доступ как из контроллеров, так и из помощников / представлений (стандартные вспомогательные методы недоступны в контроллерах). например, общий случай использования:

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

helperметод с другой стороны, для импорта всей помощницы взглядов , предоставляемых контроллером (и это наследуется контроллеры). Что это значит, делает

# application_controller.rb
helper :all

Для Rails> 3.1

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

делает все вспомогательные модули доступными для всех представлений (по крайней мере для всех контроллеров, унаследованных от application_controller.

# home_controller.rb
helper UserHelper

делает методы UserHelper доступными для представлений действий домашнего контроллера. Это эквивалентно выполнению:

# HomeHelper
include UserHelper
Джереми
источник
20
В Rails> = 3.1 «helper: all» в контроллере приложения заменяется параметром конфигурации «include_all_helpers» в application.rb. См. Stackoverflow.com/questions/1179865 .
Ян Хеттих
@ Джереми, я знаю, что этот пост старый, но хорошо сказано. Помог мне!
Райан Ребо
3
Существует разница между использованием «helper» и «include» за исключением простого синтаксического сахара. «helper» делает указанный модуль доступным для представлений и только представлений. «include» делает указанный модуль доступным для представлений и контроллеров. Оба влияют на унаследованные контроллеры и их взгляды.
Richard_G
@R_G Вы заметили, что последний фрагмент include UserHelperнаходится в HomeHelperмодуле, а не в контроллере? AFAIK, просто включив вспомогательный модуль в контроллер, не поделится методами с представлениями.
Франклин Ю
@FranklinYu, включая вспомогательный модуль в контроллере, на самом деле разделяет методы с представлениями, поэтому R_G верен.
Магне