Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Ruby On Rails > Правильно ли что один контроллер вызывает другой ?


Автор: sir_nuf_nuf 19.7.2010, 13:04
Товарищи, ответьте пожалуйста на такой архитерктурый вопрос:

Может ли (точнее правильно ли так делать, что)  в MVC приложениях один контроллер вызывает другой ?
Пример:
Есть контроллер для смены пароля, который
  1) проверяет наличие юзера
  2) проверяет ответ на секретный вопрос
  3) собственно меняет пароль
Есть другой контроллер который 
  1) осуществляет авторизацию (через внешнюю систему) по довольно хитрой логике
  2) выставляет сессию

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

P.S.
Я не программирую на Ruby и Rails, использую perl и некое унаследованное подобие MVC.
Вопрос задал в этот форум, т.к. у Rails очень активное коммьюнити и Rails считают образцово-показательной MVC.
Поэтому просьба - ответьте на архитектурый вопрос, стараясь не приводить "слишком альтернативных" решений =)

Автор: Vasay 19.7.2010, 20:33
sir_nuf_nuf, 

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


п.с. Если это не интроweb то было бы неплохо реализовать подтверждение е-маил при смене пароля.



Автор: source777 19.7.2010, 21:19
Цитата(sir_nuf_nuf @  19.7.2010,  13:04 Найти цитируемый пост)
Может ли (точнее правильно ли так делать, что)  в MVC приложениях один контроллер вызывает другой ?

Если напрямую, то неправильно в рамках MVC, а если через редирект, то пожалуйста. В общем, любой вызов контроллера должен происходить из вне, а не изнутри приложения.

Автор: sir_nuf_nuf 20.7.2010, 10:38
Цитата(source777 @  19.7.2010,  21:19 Найти цитируемый пост)

Если напрямую, то неправильно в рамках MVC, а если через редирект, то пожалуйста. В общем, любой вызов контроллера должен происходить из вне, а не изнутри приложения. 


Ясно.. а откуда такое правило появилось ? где - то описано ? 
Хотелось бы понять почему так делать не хорошо, а не тупо следовать правилу.


BTW... допустим у нас есть "сложный сценарий" - например добавление новости, он включает:
1) праверка прав пользователя
2) проверка источника новости
3) создание новости
4) обновление счетчиков пользователя
5) обновление счетчиков источника
6) рассылка уведомлений в различные внешние сисетмы
7) можно придумать еще..

Куда правильно поместить этот код ?   В модель ?  В контроллер ? В хелпер ?

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



Автор: fell 21.7.2010, 12:52
ну уж точно не в хелперы smile
Вы себе представляете для чего нужны модели smile?
модели описывают объект, его свойства.
Контроллеры взаимодествуют с объектом и с представлением,
а хелперы для представления в основном создаются. 

Цитата

создание новости

это точно через контроллер, с помощью модели "новости".
Рассылка уведомлений через класс, компонент mail вероятно делается.
Счетчик пользователей не очень понятно, что за счетчик. Кол-во пользователей системы ? Кол-во пользователей можно запрашивать из модели "пользователи" с помощью контроллера и выводить в представление, например в админку.  

Автор: source777 22.7.2010, 21:37
Цитата(sir_nuf_nuf @  20.7.2010,  10:38 Найти цитируемый пост)
Ясно.. а откуда такое правило появилось ? где - то описано ? 

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

Добавлено через 8 минут
Цитата(sir_nuf_nuf @  20.7.2010,  10:38 Найти цитируемый пост)
Другими словами - этот код описывает процесс, а не данные. 

И что смущает? Для процессов контроллеры как раз и предназначены, только если у нас есть процесс "создание новости", то он весь должен быть в NewsController#create, а оттуда уже можно рулить разными моделями и мейлерами, а проверять права лучше через before фильтры, которые тоже являются частью контроллера.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)