В последняя статья Я еще не много писал о маршрутах, но Искин Я заметил, что ничего не написал про 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
-
Homo Multitaskingus: Многозадачный Человек.
19 Oct, 24 -
Проблемы Со Скриптами Хостинга Изображений
19 Oct, 24 -
Простой И Удобный Irc-Клиент
19 Oct, 24 -
Ход «Вороного». Часть 2. Бинарное Дерево
19 Oct, 24 -
Стартап - Образование 2.1
19 Oct, 24 -
Интервью С Разработчиком Croogo
19 Oct, 24 -
Nvidia Не Производит Процессоры X86
19 Oct, 24 -
Aws Amazon – Как Оптимизировать Ресурсы
19 Oct, 24