Рекомендации по вызову методов контроллера в вспомогательных модулях? - PullRequest
8 голосов
/ 26 мая 2010

Несколько вопросов:

  1. Можно ли вызвать метод контроллера в вспомогательном модуле (например, помощник приложения)?

  2. Если так, как помощник обрабатывает рендеринг представлений? Игнорировать это?

  3. В каких случаях вы хотите вызывать метод контроллера из помощника? Это плохая практика?

  4. У вас есть пример кода, где вы вызываете методы контроллера в помощнике?

Ответы [ 3 ]

13 голосов
/ 26 мая 2010

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

Однако вполне возможно сделать методы контроллера доступными в представлениях. Отличным примером является, например, метод current_user.

Чтобы сделать метод контроллера доступным в представлениях, в качестве вспомогательного метода просто выполните

private

def current_user
  # do something sensible here
  @current_user ||= session[:user] 
end
helper_method :current_user

Такой метод лучше всего определен в разделе private, или он может быть доступен как действие (если в маршрутизации используется подстановочный знак).

9 голосов
/ 06 ноября 2012

Объявите ваши методы на соответствующем контроллере

private
def method_name1
...
end

def method_name2
...
end

В заголовке контроллера заявляем

helper_method :method_name1, :method_name2

Возможно, вы захотите объявить эти методы в частном состоянии

И это все, теперь вы можете использовать свой метод на помощнике

0 голосов
/ 26 мая 2010

Вызов контроллера из помощника нарушает схему MVC. IMO, если вам нужно вызвать контроллер из помощника вида Rails (например, application_helper), то есть кое-что в дизайне, которое можно улучшить. Предполагается, что помощники «помогают» взглядам и, следовательно, общаются только с моделями.

Я не собираюсь защищать сам MVC здесь (в сети масса ссылок), но этот SO поток о вызове контроллера из представления должен помочь вам начать.

Вызов контроллера из поля зрения? (обратите внимание, это поток ASP.NET, поэтому важны только принципы высокого уровня).

...