«Маршрутизация» Rails на основе свойств модели

Я пытаюсь делать разные вещи на домашней странице моего приложения на основе свойств текущего аутентифицированного пользователя. Например:

location, user,  state, -> destination 
/, no user                               -> a home page
/, user authenticated, state: unverified -> user profile page
/, user authenticated, state: verified   -> a content listing

Это выглядит так, что я пытаюсь «направить» на основе текущего состояния пользователя (представленного конечным автоматом). Эти 3 действия уже существуют в 3 разных контроллерах (я называю их «страницы», «пользователи» и «сообщения»), но хотя можно вызвать представление другого контроллера, нельзя вызвать действие другого контроллера, что немного усложняет задачу. чтобы не повторяться. Есть несколько способов справиться с этим, но я не уверен, что для этого предназначен The Rails Way, поэтому я решил спросить. Я вижу свои варианты:

  • Используйте redirect_to в гипотетическом «контроллере перенаправления», но я хочу, чтобы страница отображалась под /, так что это не то, что я хочу.
  • Пофантазируйте с ограничением маршрутизации (не уверен, что это возможно; нужны сеансы/файлы cookie, доступные в маршрутизации, и я не уверен, что это так)
  • Вытащите логику для конкретных действий из соответствующих контроллеров, перенесите их в ApplicationController и используйте их напрямую, основываясь на состоянии пользователя в гипотетическом контроллере (или просто разместив его на страницах).
  • Многозначительно повторяюсь, либо в контроллере, либо в представлениях, либо в обоих.
  • Пока неизвестные варианты, я открыт для предложений.

Я склоняюсь к третьему варианту с очевидным недостатком, заключающимся в том, что какая-то часть этих контроллеров теперь более или менее необъяснимым образом будет жить в ApplicationController (если только, помоги мне Бог, я не использую какое-то Лавкрафтовское включение при расширении). Наличие этого кода в двух местах кажется мне грязным.

Я упускаю что-то очевидное?


person bhuga    schedule 21.09.2011    source источник
comment
Лично меня бы волновали URL-адреса (если у меня нет веской причины, я обнаружил, что практически никого не волнует, как выглядят ваши URL-адреса), но это только мое мнение :-)   -  person Benoit Garret    schedule 22.09.2011
comment
Если бы я не был придирчив в этом вопросе, я бы, наверное, вообще ничего не спрашивал! Может, мне просто расслабиться. :)   -  person bhuga    schedule 22.09.2011
comment
Что Лавкрафтовского в миксинах? Если у вас такой же код, просто включите примесь. Если вы используете 3.1, кажется, что наследование шаблонов сделает такие вещи еще проще.   -  person Dave Newton    schedule 22.09.2011
comment
@bhuga я должен добавить это в качестве ответа? ;-)   -  person Benoit Garret    schedule 22.09.2011
comment
Я не видел наследование шаблонов, спасибо. Я посмотрю и посмотрю, имеет ли смысл иерархия наследования для этого варианта использования...   -  person bhuga    schedule 22.09.2011


Ответы (1)


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

Кроме того, взгляните на использование ActiveSupport::Concern вместо того, чтобы получать все Лавкрафтовское включение при расширении. http://api.rubyonrails.org/classes/ActiveSupport/Concern.html

person Jon M.    schedule 21.09.2011
comment
Я думаю, что он страдает от той же проблемы, что и мой третий вариант, но, возможно, он немного чище. Спасибо за идею. - person bhuga; 22.09.2011