Rails: Как параметризовать доступ к ресурсу RESTful? - PullRequest
2 голосов
/ 02 февраля 2010

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

map.resources :devices, :member => [:historical]

Таким образом, я могу получить свое устройство с /devices/:id, а я могу получить исторические данные с /devices/:id/historical

Я бы хотел добавить параметр в исторический URL, который задает диапазон, поэтому, когда я запрашиваю исторические данные, я могу получить их по часам, дням, неделям, месяцам. Что-то вроде /devices/:id/historical/:range

Есть ли способ изменить мои настройки маршрута выше, чтобы приспособиться к этому? Или мне просто нужно передать его как / devices /: id / исторический? Range = hourly

Я бы предпочел первое, но я не уверен, нарушает ли это Соглашения Restful или как лучше всего это сделать.

Ответы [ 3 ]

1 голос
/ 02 февраля 2010

Я думаю, что на самом деле ваш вопрос сводится к тому, как узнать, когда уместно представлять что-то как ресурс, а когда параметризировать его с помощью строки запроса.

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

Кое-что еще нужно учесть, это кэширование, потому что если вы хотите кэшировать страницы каждого диапазона в отдельности, вам придется использовать сегменты пути в маршруте, т.е. :range. Таким образом, Rails создаст уникальный файл HTML на диске для представления этого диапазона. Если вы используете строку запроса, она будет эффективно проигнорирована, и один и тот же HTML-файл будет возвращен для разных диапазонов.

1 голос
/ 02 февраля 2010

Наличие диапазона в качестве сегмента пути или параметра запроса является потенциально RESTful.

Вопрос действительно является проблемой дизайна. Вы хотите смоделировать исторические данные как один ресурс с параметром, или вы хотите смоделировать несколько ресурсов? Это то же самое решение, которое мы принимаем при проектировании ОО. Вы хотите один класс со свойством типа или набор подклассов? Или проект базы данных, мы храним данные в нескольких таблицах или одной таблице со столбцом дискриминатора?

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

0 голосов
/ 13 января 2012

Мне кажется, что-то вроде:

match 'devices/:id/historical/:range' => 'devices#historical_filter'

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

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