Restful Маршрутизация

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

Это очень важная часть железнодорожного маршрута.

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

Поэтому я решил отнестись к этому более серьезно.

Литературы много, но она, наверное, не переведена.

И есть пара скринкастов, которые я посмотрел: Скринкаст №35 «Пользовательские действия REST», Райан Бейтс Скринкаст №93 «RESTful Rails», Бал Паранджа - оно более основательное и представляет собой часовую лекцию в университете.

Он также говорит на индийском английском =).

Отличный перевод статей про REST ' /> ОТДЫХ Представительская государственная передача ресурсов Для простоты сформулирую так: это система организации ссылок.

А ссылки — это клиент-серверные запросы.

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

Раньше мне в голову не приходило указывать в ссылке метод запроса (в форме — это другое дело, и дело ограничивалось GET и POST).

Теперь в помощь нам есть (конечно, они существовали и раньше) четыре HTTP-метода: GET, POST, PUT, DELETE. Теперь основными являются не методы контроллера, а методы HTTP. Еще одна новость: для нас больше нет URL-адресов.

Теперь мы используем URI — Uniform Resource Identifier — ссылку на ресурс.

Путь RESTful — указание URI и метода HTTP. Например, у нас есть ресурс – книги.

Каждая книга имеет уникальный идентификатор.

Ссылка на удаление, просмотр и обновление данных некоторого экземпляра (скажем, с ID=1) будет выглядеть так:

 
 # HTTP    path_var           path            action
   GET     books_path         /books          index
   GET     book_path(id)      /books/id       show
   GET     new_book_path      /books/new      new
   POST    books_path         /books          create
   GET     edit_book_path(id) /books/id/edit  edit
   PUT     book_path(id)      /books/id       update
   DELETE  book_path(id)      /books/id       destroy
Но как программа поймет, какое из трех действий мы хотим выполнить? Вот тут-то и пригодится метод URI: GET mysite/books/1 — показать нам информацию о книге с ID = 1 POST mysite/books/1 — обновит информацию о книге DELETE mysite/books/1 - удаляет книгу Железнодорожное сообщение будет выглядеть (скажем, после удаления) следующим образом:
 
 # HTTP    path_var            path            action
   GET     antique_books_path  /books/antique  antique
Магия Такие маршруты не берутся из воздуха, а прописываются в файле конфигурации routers.rb. #routes.rb
 
 # HTTP    path_var            path            action
   GET     antique_books_path  /books/antique  antique
   DELETE  fire_books_path     /books          fire
   PUT     book_path(id)       /books/id       republish
Эта короткая линия создаст для нас семь стандартных маршрутов:

mysite/books/1

Бала Парандж предлагает понимать маршруты RESTful как предложения: Покажите мне список книг: GET book_path = GET /books. Покажите мне форму редактирования книги с ID=1: GET edit_book_path(1) = GET /books/1/edit Удалить книгу 1: DELETE book_path(1) = DELETE /books/1 Обновите данные для книги 1: PUT book_path(1) = PUT /books/1. и т. д. Что делать, если мы хотим создать другой метод. Например, античный метод, который дает нам список старинных фолиантов из нашего каталога.

В результате мы хотим получить ссылку вида

<%= link_to 'Delete book', book_url(ID), :method => :delete %>

Существует два варианта ресурсов: :member и :collection. В данном случае наш метод работает (возвращает) коллекцию — список книг (то есть множество книг, хотя он может и не возвращать ни одной), поэтому мы используем опцию :collection. Кроме того, поскольку antik _возвращает_ нам список, мы должны использовать метод HTTP GET. Если это сложно понять, то можно действовать по аналогии: наш метод по сути делает то же самое, что и индексный метод — а значит, их HTTP-методы должны быть одинаковыми.



map.resources :books

Теперь создадим еще два метода: огонь - сжечь все фолианты republish — переиздать книгу Тогда маршруты будут выглядеть так:

#routes.rb map.resources :books, :collection => { :antique => :get }



#routes.rb map.resorces :books, :collection => { :antique => :get, :fire => :delete}, :member => { :republish => :put }

Почему при повторной публикации используется метод PUT? Потому что он обновляет данные (аналогично обновлению) Почему fire_books_path использует метод DELETE? Потому что он удаляет (аналогично уничтожению) Разогревать Теперь давайте посмотрим на следующие ссылки и подумаем, почему они не RESTful и как их сделать RESTful.

1. GET /books/edit 2. DELETE /books/1/update 3. DELETE /books/1/destroy

1. Если мы что-то редактируем, то обязательно указываем ID (не забываем, что всё это ссылка на ресурс! URI!).

Поэтому правильно было бы написать ПОЛУЧИТЬ /books/1/edit 2. Для обновления данных мы используем метод PUT, а не метод DELETE. Кроме того, достаточно указать метод HTTP, поэтому указание метода обновления является излишним.

ПОСТАВИТЬ /книги/1 3. Опять же, указание метода контроллера не является необходимым.

УДАЛИТЬ /books/1 Теперь давайте обсудим, чего здесь не хватает =) Теги: #маршруты #ruby #rails #ruby onrails #restful #ruby

Вместе с данным постом часто просматривают: