2.3 Ресурс Microposts
Сгенерировав и исследовав ресурс Users, мы поворачиваемся теперь к связанному ресурсу Microposts. На протяжении этого раздела я рекомендую сравнивать элементы ресурса Microposts с аналогичными элементами User из Раздела 2.2; вы должны увидеть, что эти два ресурса во многом параллельны друг другу. RESTful структура приложений Rails лучше всего усваивается посредством наблюдения за подобными повторяющимися формами; действительно, наблюдение параллельной структуры Users и Microposts даже на этой ранней стадии является одной из причин написания этой главы. (Как мы увидим, написание приложения, более устойчивого, нежели игрушечный пример в этой главе, требует значительных усилий — мы не увидим ресурс Microposts до Главы 11 — и я не хотел так надолго откладывать его первое появление.)
2.3.1 Микрообзор микросообщений
Как и с ресурсом Users, мы генерируем код scaffold для ресурса Microposts, используя rails generate scaffold
, в этом случае реализуя модель данных из Рис. 2.3:11
$ rails generate scaffold Micropost content:string user_id:integer invoke active_record create db/migrate/20100615004429_create_microposts.rb create app/models/micropost.rb invoke test_unit create test/unit/micropost_test.rb create test/fixtures/microposts.yml route resources :microposts invoke scaffold_controller create app/controllers/microposts_controller.rb invoke erb create app/views/microposts create app/views/microposts/index.html.erb create app/views/microposts/edit.html.erb create app/views/microposts/show.html.erb create app/views/microposts/new.html.erb create app/views/microposts/_form.html.erb invoke test_unit create test/functional/microposts_controller_test.rb invoke helper create app/helpers/microposts_helper.rb invoke test_unit create test/unit/helpers/microposts_helper_test.rb invoke stylesheets identical public/stylesheets/scaffold.css
Чтобы обновить нашу базу данных с новой моделью данных, мы должны запустить миграцию как в Разделе 2.2:
$ rake db:migrate == CreateMicroposts: migrating =============================================== -- create_table(:microposts) -> 0.0023s == CreateMicroposts: migrated (0.0026s) ======================================
Теперь мы имеем возможность создавать микропосты тем же образом, каким мы создавали пользователей в Разделе 2.2.1. Как Вы могли бы предположить, генератор scaffold обновил файл маршрутов Rails с правилом для ресурса Microposts, как видно в Листинге 2.7.12 Как и с users, resources :microposts
маршрутное правило направляет URL микросообщений на действия в контроллере Microposts, как видно в Таблице 2.3.
config/routes.rb
DemoApp::Application.routes.draw do resources :microposts resources :users . . . end
HTTP запрос | URL | Действие | Цель |
---|---|---|---|
GET | /microposts | index | страница, перечисляющая все микросообщения |
GET | /microposts/1 | show | страница, показывающая микросообщения с id 1 |
GET | /microposts/new | new | страница, чтобы сделать новые микросообщения |
POST | /microposts | create | создание нового микросообщения |
GET | /microposts/1/edit | edit | страница редактирования микросообщения с id 1 |
PUT | /microposts/1 | update | обновление микросообщения с id 1 |
DELETE | /microposts/1 | destroy | удаление микросообщения с id 1 |
Сам Microposts контроллер в схематичной форме представлен в Листинге 2.8. Отметьте, что, кроме наличия MicropostsController
вместо UsersController
, Листинг 2.8 идентичен коду в Листинге 2.3. Это отражение REST архитектуры, характерной для обоих ресурсов.
app/controllers/microposts_controller.rb
class MicropostsController < ApplicationController def index . . . end def show . . . end def new . . . end def create . . . end def edit . . . end def update . . . end def destroy . . . end end
Чтобы сделать несколько актуальных микросообщений, мы вводим информацию в new страницу микросообщений, /microposts/new, как видно в Рис. 2.12.

Рисунок 2.12: New страница микросообщений (/microposts/new)
Создайте микросообщения или два, удостоверьтесь, чтобы по крайней мере у одного был user_id
= 1
для сопоставления с id первого пользователя, созданного в Разделе 2.2.1. Результат должен быть похож на Рис. 2.13.

Рисунок 2.13: Микропост index страница (/microposts).