Поиск по этому блогу

29 сентября 2010 г.

RESTful дизайн

Не так давно начал писать в RESTful (R) виде, вкратце опишу, что же это, как пользоваться, и какие плюсы в итоге.


Что это

по умолчанию, R предполагает контроллер с 7 действиями:
  1. index - просмотр списка объектов
  2. new - форма для новой записи
  3. create - обработчик создания
  4. edit - форма редактирования
  5. update - обработчик редактирования
  6. show - просмотр одного элемента
  7. delete - удаление
Все они вызываются автоматически по мере работы с помощью специальных хелперов (о них - позже)
Попасть в эти действия можно согласно табличке:

Verb Path action used for
GET /photos index display a list of all photos
GET /photos/new new return an HTML form for creating a new photo
POST /photos create create a new photo
GET /photos/:id show display a specific photo
GET /photos/:id/edit edit return an HTML form for editing a photo
PUT /photos/:id update update a specific photo
DELETE /photos/:id destroy delete a specific photo
 (источник)
Обратите внимание на Verb: кроме привычных POST и GET имеются PUT и DELETE

Как пользоваться

Контроллер с методами могут создаваться автоматически с помощью scaffold:
rails g scaffold_controller items
И будет создан целностый контроллер и набор вьюшек для работы с моделью Item, притом во вьюшках будут именно поля этой модели.
Дабы всё это завелось, нужно добавить в config/routs.rb:
resources :items
Данный здесь пример предполагает уже наличие модели Item, равно как и её таблицы в базе. Если модели еще нет, можно воспользоваться генератором модели:
rails g model item name:string user_id:integer название:тип...
Так будет создан файл модели и файл миграции, содержащий уже все поля. Запустить миграцию можно набрав
rake db:migrate
Но можно поступить еще проще объединив генерацию модели, миграции и R-контроллера
rails g scaffold item name:string user_id:integer
Вот то, что он нам создаст (в примере сипользовано название модели City)
rails g scaffold city name:string user_id:integer
      invoke  active_record
      create    db/migrate/20100929035849_create_cities.rb
      create    app/models/city.rb
      invoke    test_unit
      create      test/unit/city_test.rb
      create      test/fixtures/cities.yml
       route  resources :cities
      invoke  scaffold_controller
      create    app/controllers/cities_controller.rb
      invoke    erb
      create      app/views/cities
      create      app/views/cities/index.html.erb
      create      app/views/cities/edit.html.erb
      create      app/views/cities/show.html.erb
      create      app/views/cities/new.html.erb
      create      app/views/cities/_form.html.erb
      invoke    test_unit
      create      test/functional/cities_controller_test.rb
      invoke    helper
      create      app/helpers/cities_helper.rb
      invoke      test_unit
      create        test/unit/helpers/cities_helper_test.rb
      invoke  stylesheets
      create    public/stylesheets/scaffold.css
делается то-же самое, что описано выше, и мы получаем (еще раз перечислю):
  • модель
  • миграцию
  • RESTful контроллер
  • базовые вьюшки
  • роут
+ бонусом идет стандартный пустой хелпер, тесты, и скаффолдовский css. Остается только запустить миграцию.
Кому-то может показаться что делать каждой модели по 7 действий это немного негибко, однако никто не мешает иметь там только create, который будет вызываться вообще из левого места, а остальное просто удалить. Ошибку это само по себе не даст. Дополнительные же методы можно задать в файле роутов, например:
resources :items do
  collection :search, :еще_метод, :третий_метод
end
Это позволит спокойно заходить на /items/search. вместо (или вместе с) collection можно использовать member, тогда будет ожидаться и параметр id.
Позже я напишу короткий пост о Nested роутах и неймспейсах.

Какие плюсы

Поначалу мне смотреть на R как новичку было страшновато - уж больно много всего сгенерировалось. И при переходе с PHP на Ruby часто люди продолжают писать в стиле PHP (то есть куча нужных методов, сваленных в кучу), потому как другого никогда не видели. Однако когда потребовали, чтоб писал именно в таком виде, пришлось изучить, и не пожалел.
Здесь мы имеем четкую структуру приложения, и можем вслепую залезть в код другого программиста и найти там метод редактирования какой-то вещи в абсолютно точно известном нам месте - items_controller#edit(или update).
так как оно стандартизировано, то можно уже не писать каждый раз всё по-новой, а использовать генератор. Написание приложения с одной моделью сводится теперь к трем строчкам - генерация всего, миграция, запуск сервера. Клиент после такого упадет со стула %). Но чтобы радоваться как я, нужно попробовать, поэтому - вперед.

Комментариев нет:

Отправить комментарий