Когда создавать новый контроллер в рельсах - PullRequest
31 голосов
/ 08 ноября 2011

Мне интересно, когда вы узнаете, что вам нужно создать контроллер в приложении rails.

Например, я прохожу учебник по Agile Web Development с Rails, и приложение создает несколько моделей, все с отдельными представлениями и контроллерами.Тем не менее, мы также затем создаем контроллер Store, но никакой модели, связанной с ним.Зачем нам контроллер без модели?Разве контроллеры для моделей не могут обрабатывать все необходимые операции?

Это часто встречается?Если так, как вы определяете, когда что-то требует контроллера?

Спасибо!


Эти ответы помогают, спасибо.

Меня беспокоит то, что когда я что-то разрабатываю самостоятельно, я начну создавать бесполезные контроллеры или, наоборот, не создавать необходимые контроллеры.Но, я полагаю, мне нужно перестать думать о контроллерах и моделях как об отношении 1-1, верно?Если я правильно понимаю, может быть много контроллеров, обращающихся к модели, и много моделей, используемых в одном контроллере?

Ответы [ 4 ]

35 голосов
/ 08 ноября 2011

ОБНОВЛЕНИЕ: я настоятельно рекомендую прочитать Как DHH организует свои контроллеры Rails , что в значительной степени объясняет это намного лучше, чем мой первоначальный ответ.


Я думаювопрос был бы более уместным, если бы вы сформулировали это по-другому:

Зачем нам нужна модель (в данном случае AR) для каждого контроллера?

ИОтвет, конечно, нет.Когда вы думаете о контроллерах, лучше не думать о данных, а сделать небольшой шаг назад и подумать о ресурсах .Если вы ищете REST в Интернете, вы найдете много статей, и большинство из них будет содержать различные объяснения терминов ресурс и представление .Чтобы сделать эту историю короткой, давайте просто упростим и скажем, что resource - это все, что стоит упомянуть.Статьи - это (коллекционный) ресурс.Магазин является (единственным) членом ресурса.

Взять, например, вход в систему пользователей.Возможно, у вас уже есть UsersController, который (по умолчанию) позволит вам добавлять новых пользователей (создавать ресурсы), удалять их (удалять ресурсы), отображать одного пользователя, а также всех пользователей.Если вы просто думаете с точки зрения данных и контроллеров, вы, вероятно, начнете создавать дополнительные действия, такие как login_user в UserController, что является неприятным запахом.Если вы думаете о ресурсах, а это «все, о чем стоит упомянуть или о создании URI для него», вы можете подумать, что вам нужен другой ресурс, а именно: сеансов .Подумайте об этом: когда пользователь входит в систему, он на самом деле создает ресурс сеанса.И с выходом вы удаляете, удаляете ресурс.Это гораздо лучше объяснено в учебнике Rails , который я рекомендую: http://ruby.railstutorial.org/chapters/sign-in-sign-out#sec:sessions

Напомним, это может помочь вам выяснить, когда вам нужен новый контроллер:

  • Когда вы думаете о том, чтобы поместить в контроллер действия, не относящиеся к RESTful, такие как log_in, calculate_date и т. Д.
  • Когда есть что-то, что вы можете назвать, и это достаточно "интересно", чтобыбыть отдельным ресурсом.
  • Кроме того, когда вы разрабатываете в стиле "снаружи", такие ответы приходят более естественно: http://rubylearning.com/blog/2010/10/05/outside-in-development/

В целом, изучение REST и его философииочень поможет.

8 голосов
/ 08 ноября 2011

Очевидно, нет строгого правила;но я думаю, что полезно подумать о том, что представляют собой три различные части MVC (или «делают»):

  • Модели представляют данные и логику данных-логики
  • Контроллеры позволяют пользователю взаимодействовать с моделями
  • Представления - это то, что пользователь видит, когда пользователь взаимодействует через контроллер

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

Например, в книге AWD приложение Depot работает (в широком смысле)манипулирование и хранение продуктов - так что у него есть модель продукта.

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

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

1 голос
/ 14 декабря 2011

Я также новичок в RoR и делаю урок от Майкла Хартла.В своих исследованиях и разговорах с более опытным Rubyist я обнаружил, что когда вам нужна помощь вашей Модели (базы данных), вы должны создать Контроллер.Например, если вы создаете сеанс, а метод, который вы создаете, будет нуждаться во взаимодействии с моделью (базой данных), используя, сохраняя, обновляя, добавляя (иначе говоря, поведение RESTful), тогда вам понадобится контроллер.

Почему?Как уже говорилось ранее: для работы с MVC требуется, чтобы контроллеры были единственным элементом, который может взаимодействовать с моделями (вроде как вышибала на VIP-секции ночного клуба, заполненного горячими женщинами!) !!

0 голосов
/ 08 ноября 2011

Контроллер может использоваться для создания страниц без границ с моделью.Примером этого может быть официальное уведомление или что-то в этом роде.как это.Статические вещи, ...

A Controller контролирует данные.В большинстве случаев эти данные поступают из Model, но это не обязательно, что его самая распространенная комбинация.

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