Подтвердить что ты не робот

Зачем мне больше работать, чтобы приложение Rails вписывалось в архитектуру RESTful?

Недавно я начал проект Rails и решил использовать контроллеры RESTful. Я создал контроллеры для своих ключевых объектов (например, Country) и добавил index, new, edit, create, show, update и delete. Я добавил свой map.resources :country в свой файл маршрутов, и жизнь была хорошей.

После небольшого развития, я начал сталкиваться с проблемами. Мне иногда требовались дополнительные действия в моем контроллере. Сначала появилось действие search, которое вернуло опции для моего окна поиска автозаполнения. Затем появилась необходимость отображать страны по-разному в разных местах приложения (отображаемые данные были разными, поэтому это были не только два представления). Я добавил действие index_full. Затем я хотел показать страну по имени в URL, а не по id, поэтому я добавил действие show_by_name.

Что вы делаете, когда вам нужны действия за пределами стандартных index, new, edit, create, show, update, delete в контроллере RESTful в Rails? Нужно ли добавлять (и поддерживать) ручные маршруты в файле routes.rb(что является болью), они идут в другом контроллере, я становлюсь unRESTful или мне не хватает чего-то фундаментального?

Думаю, я спрашиваю, мне нужно больше работать и добавлять действия в файл routes.rb для привилегии быть RESTful? Если бы я не использовал map.resources для добавления свойств REST, стандартные маршруты :controller/:action, :controller/:action/:id обрабатывали бы почти все автоматически.

4b9b3361

Ответ 1

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

map.resources :events, :collection => { :search => :get }

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

Ответ 2

Я рассматривал бы search как частный случай index. Оба действия возвращают коллекцию ресурсов. Параметры запроса должны указывать такие объекты, как страница, лимит, порядок сортировки и поисковый запрос.

Например:

/resources/index # normal index
/resources/index?query=foo # search for 'foo'

И в resource_controller:

before_filter :do_some_preprocessing_on_parameters

def index
  @resources = Resource.find_by_param(@preprocessed_params)
end

Что касается index_full и search_by_name, вы можете посмотреть на разделение вашего текущего контроллера на два. Там запах того, что вы описали.

Сказав это, вы абсолютно правы, что вам не нужно форсировать приложение для спокойных маршрутов пользователя, когда оно не передает ничего через /:controller/:action/:id. Чтобы принять решение, посмотрите, как часто вы используете вспомогательные помощники маршрута ресурса в формах и ссылках. Если вы не используете их, я бы не стал с этим беспокоиться.

Ответ 3

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

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

Что касается того, должны ли они быть ручными маршрутами или новым контроллером, это зависит от того, насколько отличается деятельность. Ваш альтернативный вид, если он предоставляет полный набор операций CRUD (создавать, читать, обновлять, удалять), будет хорошо находиться в новом контроллере. Если у вас есть только альтернативный вид данных, я бы просто добавил альтернативное действие вида.

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

Ответ 4

По-моему, они, возможно, немного отошли от рельсов. Что случилось с DRY?

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

Ответ 5

Я больше не буду больше объяснять REST, так как я думаю, что на этот вопрос был дан ответ, однако я немного расскажу о маршруте по умолчанию.

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

Например, могут быть контроллеры, которые вы не хотите, чтобы люди могли видеть в одном приложении:

http://example1.somesite.com/example_2/foo/bar/1

сравните это с

/:controller/:action/:id

Это пойдет на контроллер example_2/foo, панель действий и id 1

Я считаю это основным недостатком маршрута по умолчанию Rails, и это может быть исправлено с помощью маршрутов RESTful (с расширениями поддоменов) или только с именами маршрутов (map.connect 'foo'...).

Ответ 6

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

В вашем примере действие show для контроллера поиска (ресурс поиска) - это направление, чтобы оставаться спокойным.

В моем случае у меня есть контроллер (show) панели управления и контроллеры для отдельных полей локальных ecditors (show and update)