# coding: utf-8

6.3.3 Ресурс Users

Наш метод для отображения страницы пользователя будет следовать соглашениям REST архитектуры, одобренной в приложениях Rails. Этот стиль основан на идеях передачи состояния представления определенный и названный ученым Roy Fielding в его докторской диссертации Architectural Styles and the Design of Network-based Software Architectures.24 REST стиль подчеркивает представление данных как ресурсов которые могут быть созданы, показаны, обновлены, или уничтожены—четыре действия, соответствующие четырем фундаментальным операциям POST, GET, PUT, и DELETE определенным стандартом HTTP (Блок 3.1).

Следуя принципам REST, на ресурсы обычно ссылаются, используя имя ресурса и уникальный идентификатор. Что это означает в контексте пользователей—о которых мы теперь думаем, как о ресурсе Users—то, что мы должны показать пользователя с id 1 выдав GET запрос к URL /users/1. Здесь show действие неявно в типе запроса—когда Rails’ функции REST активированы, GET запросы автоматически обрабатываются show действием.

user_show_exception_caught

Рисунок 6.9: Начальный эффект посещения /users/1(полный размер)

К сожалению, URL /users/1 еще не работает из-за ошибки маршрутизации (Рис. 6.9). Мы можем получить REST-style Users URL на работу, добавив пользователей в качестве ресурса для config/routes.rb, как видно в Листинге 6.26.

Листинг 6.26. Добавление ресурса Users в файл маршрутов.

config/routes.rb
SampleApp::Application.routes.draw do
  resources :users

  match '/signup',  :to => 'users#new'
  .
  .
  .
end

После добавления маршрутов для ресурса Users, URL /users/1 работает отлично (Рис. 6.10).

Страница, демонстрирующая пользователя в /users/1 после добавления ресурса Users.

Рисунок 6.10: Страница, демонстрирующая пользователя /users/1 после добавления ресурса Users. (полный размер)

Вы, возможно, заметили, что Листинг 6.26 удалил строку

get "users/new"

последний раз замеченную в Листинге 5.29. Это потому что одна дополнительная строка ресурса в Листинге 6.26 не просто добавляет работающий /users/1 URL; она обеспечивает наш пример приложения всеми действиями, необходимыми для RESTful (полностью REST) ресурса Users,25 наряду с большим количеством именованных маршрутов (Раздел 5.2.3) для того, чтобы генерировать URL пользователя. Получившееся соответствие URL, действий, и именованных маршрутов показано в Таблице 6.2. (сравните с Таблицей 2.2.) В течение следующих трех глав, мы охватим остальные записи в Таблице 6.2 поскольку мы заполним все действия, необходимые, чтобы сделать Users полностью RESTful ресурсом.

HTTP запрос URL Действие Именованный маршрут Назначение
GET /users index users_path страница, показывающая список пользователей
GET /users/1 show user_path(1) страница показывающая пользователя с id 1
GET /users/new new new_user_path страница для создания нового пользователя (signup)
POST /users create users_path создание нового пользователя
GET /users/1/edit edit edit_user_path(1) страница для редактирования пользователя с id 1
PUT /users/1 update user_path(1) обновление пользователя с id 1
DELETE /users/1 destroy user_path(1) удаление пользователя с id 1

Таблица 6.2: RESTful маршруты, обеспеченные ресурсом Users в Листинге 6.26.

params в debug

Прежде, чем оставить страницу, показывающую пользователя, мы займем одну минуту, чтобы исследовать отладочную информацию, произведенную Листингом 6.23. Если Вы присмотритесь к Рис. 6.10, то Вы увидите, что он включает полезную информацию об отображаемой странице:26

--- !map:ActiveSupport::HashWithIndifferentAccess
action: show
id: "1"
controller: users

Это YAML27 представление params, которое (как намекает название HashWithIndifferentAccess) в основном хэш. Мы видим, что его контроллер это users, его действие это show, и его id атрибут это "1". Хотя вы будете редко иметь возможность использовать params[:controller] или params[:action], использование params[:id] для вытаскивания id из URL является общепринятой идиомой Rails. В частности, мы использовали код

User.find(params[:id])

в Листинге 6.25 чтобы найти пользователя с id 1. (find метод знает, как преобразовать строку "1" в целое число 1.)

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

# coding: utf-8