Что это
по умолчанию, R предполагает контроллер с 7 действиями:
- index - просмотр списка объектов
- new - форма для новой записи
- create - обработчик создания
- edit - форма редактирования
- update - обработчик редактирования
- show - просмотр одного элемента
- 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 контроллер
- базовые вьюшки
- роут
Кому-то может показаться что делать каждой модели по 7 действий это немного негибко, однако никто не мешает иметь там только create, который будет вызываться вообще из левого места, а остальное просто удалить. Ошибку это само по себе не даст. Дополнительные же методы можно задать в файле роутов, например:
Это позволит спокойно заходить на /items/search. вместо (или вместе с) collection можно использовать member, тогда будет ожидаться и параметр id.resources :items docollection :search, :еще_метод, :третий_методend
Позже я напишу короткий пост о Nested роутах и неймспейсах.
Какие плюсы
Поначалу мне смотреть на R как новичку было страшновато - уж больно много всего сгенерировалось. И при переходе с PHP на Ruby часто люди продолжают писать в стиле PHP (то есть куча нужных методов, сваленных в кучу), потому как другого никогда не видели. Однако когда потребовали, чтоб писал именно в таком виде, пришлось изучить, и не пожалел.
Здесь мы имеем четкую структуру приложения, и можем вслепую залезть в код другого программиста и найти там метод редактирования какой-то вещи в абсолютно точно известном нам месте - items_controller#edit(или update).
так как оно стандартизировано, то можно уже не писать каждый раз всё по-новой, а использовать генератор. Написание приложения с одной моделью сводится теперь к трем строчкам - генерация всего, миграция, запуск сервера. Клиент после такого упадет со стула %). Но чтобы радоваться как я, нужно попробовать, поэтому - вперед.
Комментариев нет:
Отправить комментарий