# coding: utf-8

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.

Листинг 2.7. Маршруты Rails, с новым правилом для ресурсов Microposts.

config/routes.rb
  DemoApp::Application.routes.draw do

    resources :microposts
    resources :users
    .
    .
    .
  end
HTTP запросURLДействиеЦель
GET/micropostsindexстраница, перечисляющая все микросообщения
GET/microposts/1showстраница, показывающая микросообщения с id 1
GET/microposts/newnewстраница, чтобы сделать новые микросообщения
POST/micropostscreateсоздание нового микросообщения
GET/microposts/1/editeditстраница редактирования микросообщения с id 1
PUT/microposts/1updateобновление микросообщения с id 1
DELETE/microposts/1destroyудаление микросообщения с id 1

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

Сам Microposts контроллер в схематичной форме представлен в Листинге 2.8. Отметьте, что, кроме наличия MicropostsController вместо UsersController, Листинг 2.8 идентичен коду в Листинге 2.3. Это отражение REST архитектуры, характерной для обоих ресурсов.

Листинг 2.8. Контроллер Microposts в схематичной форме.

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 страница микросообщений.

Рисунок 2.12: New страница микросообщений (/microposts/new)

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

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

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

# coding: utf-8