2010-02-02 6 views
2

Я ищу спокойный способ прохождения через параметры сервиса. Сейчас у меня есть ресурс устройство доступен в стандартных рельсах образом с:Rails: как параметризовать доступ к ресурсу RESTful?

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

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

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

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

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

ответ

1

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

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

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

+0

так из интереса, тогда вы знаете, как я могу добавить это: диапазон до моего исторического URL-адреса, за исключением написания отдельного именованного маршрута. Есть ли возможность добавить параметры к маршруту в Rails?Я не нашел один – brad

+1

@brad, вы можете передать параметры для помощников URL. link_to history_reports_path (device,: range => 'daily') – Mereghost

+0

Ya Я знаю, что меня больше интересует настройка маршрута сам, так что это не строка запроса, а идентификатор ресурса так, not/devices /: id/history? range = daily, но/devices /: id/history /: range – brad

1

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

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

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

0

Казалось бы, мне что-то вроде:

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

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

Смежные вопросы