В Rails есть способ использовать методы app/helpers/foo.rb в контроллере и в представлении?

Кажется, что эти помощники в app/helpers/foo.rb можно использовать в представлении, но нельзя использовать в контроллере?

В некоторых случаях разным контроллерам может потребоваться использовать один и тот же метод, но просто передать другой параметр, поэтому в этом случае не будет ли смысла использовать помощника в контроллере?


person nonopolarity    schedule 15.09.2010    source источник


Ответы (3)


Существует два основных способа повторного использования кода между контроллерами.

Вы можете создать подкласс ApplicationController, который имеет общий код, а затем ваши контроллеры, которые хотят совместно использовать код, наследуемый от нового класса контроллера. (Или просто добавьте код в ApplicationController, если он должен использоваться всеми контроллерами.)

В качестве альтернативы вы можете создавать свои собственные модули (по сути, это все помощники) и включать их в контроллеры, в которых вы хотите использовать код.

Поскольку помощники — это просто модули, вы можете включить помощника в свой контроллер, но помощники больше предназначены для уровня представления, чем для контроллера, поэтому редко бывает место для совместного использования кода между контроллерами.

person Shadwell    schedule 15.09.2010

Это может иметь смысл, но это не работает таким образом. (если кто знает как это сделать, отпишитесь)

Вы можете поместить общие помощники в ApplicationController, они будут доступны с любого контроллера в вашем приложении.

person Nikita Rybak    schedule 15.09.2010

Как упоминалось выше, вы можете поместить общие помощники в ApplicationController или в подкласс. Я бы добавил, чтобы сделать их доступными и для представлений, которые вы помещаете в верхнюю часть класса:

helper_method :foo
person coder_tim    schedule 15.09.2010
comment
Привет, Лин. Как сказал Тим, вы можете поместить их в контроллер и определить как вспомогательные методы. Пример: ApplicationController ‹ ActionController::Base helper_method :foo end - person sameera207; 16.09.2010