Tortoise-like pace

toshibohjp

[RailsGuides] #03 Scaffold で素早く立ち上げる

| Comments

前回 では、”Hello, Rails” を表示するために、Controller と View を作成し、アプリケーションのルートにルーティングするようにしました。今回は Scaffold でアプリケーションの雛形を作成してみます。

5 Scaffolding で立ち上げ素早く実行する

Rails の Scaffolding アプリケーションの主要な部分を生成する手っ取り早い方法です。単一の操作だけの新しい Resource のための Model、View、Controller を作成したいと考えている場合は、Scaffolding は役に立つツールになります。

ちなみに Scaffolding は「足場を組む」という意味だそうです。

6 Resource を作成する

blog アプリケーションのケースでは、Post リソースのための Scaffold を生成するところから始める事ができます。(これは単一の blog への投稿を表現しています。)

これを行うために、次のコマンドをターミナルで実行します。

Postのリソースを作成する
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
$ rails generate scaffold Post name:string title:string content:text
      invoke  active_record
      create    db/migrate/20130505013444_create_posts.rb
      create    app/models/post.rb
      invoke    test_unit
      create      test/unit/post_test.rb
      create      test/fixtures/posts.yml
      invoke  resource_route
       route    resources :posts
      invoke  scaffold_controller
      create    app/controllers/posts_controller.rb
      invoke    erb
      create      app/views/posts
      create      app/views/posts/index.html.erb
      create      app/views/posts/edit.html.erb
      create      app/views/posts/show.html.erb
      create      app/views/posts/new.html.erb
      create      app/views/posts/_form.html.erb
      invoke    test_unit
      create      test/functional/posts_controller_test.rb
      invoke    helper
      create      app/helpers/posts_helper.rb
      invoke      test_unit
      create        test/unit/helpers/posts_helper_test.rb
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/posts.js.coffee
      invoke    scss
      create      app/assets/stylesheets/posts.css.scss
      invoke  scss
      create    app/assets/stylesheets/scaffolds.css.scss

Scaffold ジェネレータはいくつかのフォルダに沿って、アプリケーションの中に数個(上の実行結果では 16)のファイルを生成し、config/routs.rb を編集します。

以下は Scaffold で何が生成されるかを早見表にまとめたものです。実行結果を見ると Rails ではオブジェクトをひとまとめにしたものを複数形として扱っている事に気づくでしょう。今回の場合では、Post が Posts になっています。

ファイル名目的
db/migrate/20130505013444_create_posts.rbデータベースに Post を作成するためのマイグレーション(実行した環境でタイムスタンプが異なります)
app/models/post.rbPost の Model
test/unit/post_test.rbPost の Model のための単体テストハーネス
test/fixtures/posts.ymlテストで使用するサンプルの Post
config/routs.rbPost へのルーティング情報を含むように編集された
app/controllers/posts_controller.rbPosts Controller
app/views/posts/index.html.erbすべての Post の一覧を表示するための View
app/views/posts/edit.html.erbすでにある Post を編集するための View
app/views/posts/show.html.erbひとつの Post を表示するための View
app/views/posts/new.html.erbPost を新規作成するための View
app/views/posts/_form.html.erb編集と新規作成で使用されるフォームのルック&フィール全体を制御するための部品
test/functional/posts_controller_test.rbPost Controller のための機能テストハーネス
app/helpers/posts_helper.rbPost View で使用されるヘルパー機能を集めたもの
test/unit/helpers/posts_helper_test.rbposts_helper のための単体テストハーネス
app/assets/javascripts/posts.js.coffeePost Controller のための CoffeScript
app/assets/stylesheets/posts.css.scssPost Controller で使用する CSS
app/assets/stylesheets/scaffolds.css.scssScaffold の View の見た目を浴するための CSS

Scaffold はアプリケーションを素早く立ち上げ、実行することができますが、生成されたコードはご自分のアプリケーションには完全にはそぐわないでしょう。ほとんどは、生成されたコードをカスタマイズすることになります。

多くの経験をつんだ Rails 開発者は完全に Scaffold を避けて、全部もしくは大部分のコードをスクラッチから書き上げます。しかしながら、Rails は生成された Model、Controller、View やその他のソースのテンプレートをシンプルにカスタマイズさせてくれます。

より詳しい情報に関しては、Creating and Customizing Rails Generators & Templates を参照すると良いでしょう。

6.1 マイグレーションを実行する

rails generate scaffold コマンドで生成されたもののひとつに、データベース・マイグレーション が含まれます。マイグレーションは Ruby のクラスで、データベーステーブルを作成したり変更するのをシンプルにするために設計されたものです。Rails はマイグレーションを実行するのに rake コマンドを使用し、データベースにマイグレーションを実行した後にも取り消せるようになっています。マイグレーションのファイル名はタイムスタンプが含まれ、生成された順番に実行することを保証します。

先程生成された db/migrate/20130505013444_create_posts.rb を見てみましょう。

db/migrate/20130505013444_create_posts.rb
1
2
3
4
5
6
7
8
9
10
11
class CreatePosts < ActiveRecord::Migration
  def change
    create_table :posts do |t|
      t.string :name
      t.string :title
      t.text :content

      t.timestamps
    end
  end
end

上記のマイグレーションは、change と名づけられたこのマイグレーションを実行する時に呼ばれるメソッドを定義しています。change メソッドは元に戻せる動作も定義しています。つまり、Rails は-後になって変更を元に戻したい場合に-このマイグレーションによってなされた変更を、逆の順番で実行する方法を把握していることを意味しています。

Rails のマイグレーションについてのより詳しい情報は Migrations を参照してください。

現時点で、マイグレーションを実行するための rake コマンドを使用する事ができます。コマンドを実行してみましょう。

マイグレーションの実行
1
2
3
4
5
$ rake db:migrate
==  CreatePosts: migrating ====================================================
-- create_table(:posts)
   -> 0.0020s
==  CreatePosts: migrated (0.0021s) ===========================================

Posts テーブルが作成されました。

デフォルトでは、development 環境で作業しているので、先程のコマンドは config/database.yml の development section で定義されているデータベースに適用されます。他の環境でマイグレーションを実行したい場合には、例えば production 環境では rake db:migrate RAILS_ENV=production と明示的に環境を指定する必要があります。

6.2 リンクを追加する

既に作成したホームページに Posts を連携するために、ホームページにリンクを追加してみましょう。app/views/home/index.html.erb を開き、以下のように修正します。

app/views/home/index.html.erb
1
2
<h1>Hello, Rails!</h1>
<%= link_to "My Blog", posts_path %>

蛇足ですが、前のサンプルでは Rails の後ろに “!” がついていなかったように記憶しているのですが、気のせいでしょうか。

link_to メソッドは Rails の組み込み View ヘルパーの一つです、表示するためのテキストと行き先に基づいてハイパーリンクを生成-この場合は Posts へのパス-sします。

6.3 ブラウザでの Posts の動作

さて、Postsの動作確認ができる準備が整いました。ブラウザでアクセスして、”My Blog” へのリンクをクリックしてみましょう。WEBrick を起動してない場合は rails server で WEBrick を起動します。

Hello, Rails

Listing posts

これまでの一連の流れをまとめると、

  • rails generate scaffold Post name:string title:string content:text を実行して、Scaffolding で雛形を作成した
  • rake db:migrate で Posts テーブルを作成した
  • app/view/home/index.html.erb を編集して、Posts へのリンクを作成した
  • ブラウザを起動して動作確認を行った

ということになります。

切りがいいので 次回 に続きます。

Comments