Обработка логики, отличной от REST, в Rails API

Например, предположим, что у меня есть ресурс Post. С помощью GET /posts я получаю все сообщения (действие index). Что делать, если я хочу получить популярные сообщения (сообщения с большим количеством лайков за последние 24 часа)? Должен ли я реализовать логику в действии index (через параметр) или реализовать новое действие trending, которое отвечает на новую конечную точку GET /trending, делая API не-REST?

Примечание. Я прочитал эта статья, и я понимаю, как работает параметр, но не могу понять, как работает добавление дополнительной конечной точки...


person Riccardo G.    schedule 30.06.2018    source источник


Ответы (2)


вы можете сделать и то, и другое. Я бы выбрал новую акцию. Но вы также можете передать дополнительный параметр в ссылке:

link_to posts_path(trending: true)

Затем в вашем контроллере вы можете проверить, есть ли params[:trending].present?, а затем передать в переменную сообщений @posts только популярные сообщения.

Вы также можете назначить индикатор тенденций переменной, которая будет передана в представление индекса, чтобы вы могли адаптировать макет (изменить заголовок с «постов» на «популярные сообщения») с помощью if params[:trending].present? then @trending = true end

Создание нового действия делает контроллеры и представления менее загроможденными условиями (if ...)

Кстати, создание нового действия по-прежнему является логикой REST, если вы сделаете его запросом GET. Если ваше новое действие было связано с обновлением поста, это должен быть PATCHquery

person Maxence    schedule 30.06.2018
comment
Спасибо, я думал, что добавление действия с другим именем будет не REST. Почему это RESTful? - person Riccardo G.; 30.06.2018
comment
Это Restful, потому что Post используется для создания экземпляра модели, исправления для его обновления и т. д. Это больше касается вашего http-запроса. CRUD состоит только из 4 действий (создать, прочитать, обновить, удалить), но добавить больше действий не проблема. На самом деле речь идет о дизайне и обслуживании вашего приложения. Для создания нового действия нужен новый вид, но он понятнее. - person Maxence; 30.06.2018

Вероятно, у вас есть resource :posts внутри вашего routes.rb. Это место, где вы должны добавить новую конечную точку. В рельсах маршрут к новому действию.

У тебя есть

resources :posts

Вы должны иметь

resources :posts do
  get 'trending', on: :collection
end

Теперь вы можете видеть все маршруты, которые рельсы генерируют для вас line, index, show, create, update... и еще один trending

/posts/trending

Вы можете посмотреть здесь: Руководства по Rails добавляют отдых

person Danilo Cândido    schedule 30.06.2018