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

Ruby on Rails - дифференцирование множественного числа против уникального ресурса в REST API

Я работаю над созданием URL-адресов для моего REST API, прежде чем начинать писать любой код. Rails магия REST является фантастической, но я немного обеспокоен форматированием URL-адреса, например:

http://myproject/projects/5

где Project - мой ресурс, а 5 - project_id. Я думаю, что если пользователь хочет получить все свои проекты, то соответствующий HTTP GET http://myproject/projects имеет смысл. Однако, если они ищут информацию об уникальном ресурсе, таком как проект, тогда имеет смысл иметь http://myproject/project/5 vs http://myproject/projects/5. Лучше ли избегать этой головной боли, или некоторые из вас разделяют аналогичную проблему, а еще лучше - имеют рабочее решение?

4b9b3361

Ответ 1

Rails (3) имеет множество соглашений, когда речь идет о сингулярном vs множественном числе. Например, классы моделей всегда сингулярны (Person), а соответствующие таблицы всегда множественны (people). (Например, Person.all отображается на select * from people.)

Для маршрутов существует понятие уникального ресурса, а также множественный ресурс. Итак, если вы сделали resource :account, тогда вы получили бы пути типа /account для пути по умолчанию или /account/edit для пути к форме для редактирования учетной записи. (Обратите внимание, что Rails использует /account с методом PUT для фактического обновления учетной записи. /account/edit - это форма для редактирования учетной записи, которая является отдельным ресурсом самой учетной записи.) Если вы сделали resources :people, однако, тогда вы получите пути, такие как /people, /people/1 и /people/1/edit. Сами пути указывают, может ли быть только один экземпляр данного типа ресурса, или могут быть несколько экземпляров, выделенных каким-то типом идентификатора.

Ответ 2

Я согласен, иди с потоком. Посмотрите, как URL-адрес формирует иерархию.

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

/projects/сужает его только к проектам, а не к чему-то еще. Из проектов вы можете делать много вещей, /list,/index/,/export и т.д. /Id ограничивает ситуацию даже дальше.

В каждом/объеме того, что становится более узким, и я думаю, что это имеет смысл.

Дальнейшее программирование - это все о произвольных правилах. Индексы начинаются с 1 против 0 и т.д. Любой, кто работает с вашими URL-адресами, будет сортировать вещи в короткие сроки.

Ответ 3

Бывают случаи, когда полезен особый путь к ресурсу. Если ваши идентификаторы ресурсов являются нечисловыми именами, определенными пользователем, возможны конфликты маршрутизации. Пример:

/applications/new → создать новое приложение или показать пользовательское приложение с именем new?

В этой ситуации вы можете ограничить ввод пользователя, чтобы избежать столкновения, или это можно обойти, перезаписав поведение Rails 3 по умолчанию:

class ActionDispatch::Routing::Mapper
  module Resources
    RESOURCE_OPTIONS  << :singular_resource
    class Resource
      def member_scope
        @options[:singular_resource] ? "#{singular}/:id" : "#{path}/:id"
      end

      def nested_scope
        @options[:singular_resource] ? "#{singular}/:#{singular}_id" : "#{path}/:#{singular}_id"
      end
    end
  end
end

Затем при указании нового маршрута ресурса:

resources :applications, :singular_resource => true

Что будет генерировать маршруты:

    GET     /applications
    GET     /applications/new
    POST    /applications
    GET     /application/:id
    GET     /application/:id/edit
    PUT     /application/:id
    DELETE  /application/:id