Как узнать, когда и нужно ли иметь отдельный контроллер для фрагмента кода? - PullRequest
2 голосов
/ 12 мая 2009

Так что я нахожусь в ситуации, когда мне нужно решить, нужен ли отдельный контроллер для определенного фрагмента кода. У нас есть домашняя страница, которая действует как центр для остальной части сайта. Страница доступна всем пользователям (как вошедшим, так и не вошедшим). Я думал о том, чтобы иметь home в качестве отдельного контроллера и действие под названием index. Размышляя об этой ситуации, я начал задаваться вопросом, есть ли какие-либо правила или руководящие принципы на этом фронте.

Мое мнение таково, что если код вращается вокруг сущности, необходимо разделение. (Аналогично рекомендациям REST) ​​Если сущность является существительным, она должна быть контроллером. Если сущность является глаголом, она, вероятно, должна быть действием и должна находиться в контроллере, имя которого совпадает с именем существительного, на которое ссылается глагол. Некоторые коллеги предположили, что, поскольку это одно действие, оно должно находиться в существующем контроллере и иметь имя home. Однако я категорически не согласен, но не смог найти надежного источника, который бы меня поддержал.

Хотелось бы узнать ваши мысли.

Ответы [ 3 ]

1 голос
/ 12 мая 2009

В этом случае я должен согласиться с вашими коллегами.

REST - хороший подход к работе с ресурсами, как вы говорите. Это позволяет создавать согласованный интерфейс, особенно с целью создания веб-службы.

Однако REST на самом деле не слишком хорошо отображается в настройках веб-браузера. Например, вы заметите, что даже для ресурсов ваши действия / edit и / new - это просто запросы GET, возвращающие форму HTML, указывающую на соответствующее действие RESTful. 'edit' и 'new' совсем не RESTy.

Аналогично, домашняя страница, как правило, представляет собой удобное объединение различных данных, не подходящее для интерфейса RESTful. Так что либо просто вставьте дополнительный контроллер одним действием, либо используйте в качестве домашней страницы действие «list» существующего контроллера

0 голосов
/ 15 сентября 2010

Быстрый (и бесполезный) ответ в том, что в любом случае отлично работает.

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

Как вы уже, наверное, догадались, "дом" в некотором роде является глаголом, а также существительным, поэтому вам трудно понять, что делать.

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

если у вас очень мало времени для работы над этим ... тогда вставка действия "home" в другой контроллер часто считается целесообразным вариантом. Он работает, он позволяет вам переходить к другим (возможно, более продуктивным) задачам.

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

Итак, мы начнем с того, что в основном является философской дискуссией ... другими словами, ни один ответ не будет «более правильным», чем другой, это скорее вопрос вкуса и обстоятельств. В этом случае дебаты зависят от того, как сделать структуру более RESTful.

Чтобы быть верным архитектуре RESTful, вы бы действительно перенесли действие в его собственный контроллер ... но сначала вам нужно определить, что это за сущность. «Домашняя» страница часто не может быть легко идентифицирована как конкретная сущность БД ... это чаще всего страница портала.

Иногда вы можете выбрать сущность, например, в интернет-магазинах часто есть домашняя страница, которая на самом деле представляет собой вариант "products # index", или иногда "домашняя" страница представляет собой страницу UserAccount # show ... но чаще ваша Домашняя страница не будет простой и будет объединять информацию из нескольких объектов ... поэтому трудно определить, какой будет "правильная" архитектура.

Если вы не можете идентифицировать конкретную сущность, то существуют веские споры о том, следует ли перенести действие в конкретный контроллер.

однако вы всегда можете создать новую «сущность», которая будет сосредоточена вокруг архитектуры сайта. Это особенно вероятно, если вы собираетесь придумать другие не связанные с сущностью страницы для сайта (например, Условия и положения или страница "о нашей компании").

Обычный запасной вариант - это «PageController» (или похожее имя), который не связан с активной записью модель , а с более туманной сущностью, в данном случае с «страницей», которая распознаваема. пользователю веб-сайта (например, «домашняя страница» и «страница T & C» и «страница о проекте»). Каждое действие будет для определенной страницы ...

Итак, вам решать, будет ли это лучше соответствовать вашему взгляду на архитектуру вашей системы ... и стоит ли оно усилий ... но это мой взгляд на дебаты. :)

0 голосов
/ 12 мая 2009

Проблема начинается с фразы

Если сущность является глаголом

Если вы пытаетесь создать архитектуру RESTful, сущность не может быть глаголом. Если вы используете HTTP, допускаются только глаголы: GET, PUT, POST, DELETE, HEAD, OPTIONS. Все сущности должны быть сопоставлены с каким-либо существительным, и если вы пытаетесь получить эту сущность, вы должны использовать глагол GET. Лично я бы сопоставил это с методом Get () на моем контроллере, но я не знаю, позволяет ли Rails сделать это.

...