読者です 読者をやめる 読者になる 読者になる

It’s now or never

IT系の技術ブログです。気になったこと、勉強したことを備忘録的にまとめて行きます。

初めてのRuby On Rails② (scaffoldジェネレータ)

Rubyには、コードを自動生成するジェネレータが用意されています。
今回は、データベースのCRUD
データの作成(Create)、読み出し(Read)、更新(Update)、削除(Delete)
の処理をを自動的に作成してくれる scaffoldジェネレータを使ってみました。

1.railsプロジェクトの作成

今回は、サンプルとして「bookshelf」というプロジェクトを作成します。

rails new bookshelf

2.scaffoldコマンドの実行

scaffoldジェネレータは、rails generateから始まるコマンドを使用します。

rails generate scaffold [モデル名] ([カラム名]:[データ型]…)

引数としてモデル名を渡して実行しますが、
ここでオプションとしてカラムを追加することも可能です。

カラムは、[カラム名]:[データ型] の書式で記載します。

今回は、「name」(string)と「description」(text)というカラムを持った「Book」というモデルを作成してみます。

rails generate scaffold Book name:string description:text

以下のように、
関連するモデル、ビュー、コントローラ、テストなどが、自動で生成されます。

invoke  active_record
      create    db/migrate/20140603151844_create_books.rb
      create    app/models/book.rb
      invoke    test_unit
      create      test/models/book_test.rb
      create      test/fixtures/books.yml
      invoke  resource_route
       route    resources :books
      invoke  scaffold_controller
      create    app/controllers/books_controller.rb
      invoke    erb
      create      app/views/books
      create      app/views/books/index.html.erb
      create      app/views/books/edit.html.erb
      create      app/views/books/show.html.erb
      create      app/views/books/new.html.erb
      create      app/views/books/_form.html.erb
      invoke    test_unit
      create      test/controllers/books_controller_test.rb
      invoke    helper
      create      app/helpers/books_helper.rb
      invoke      test_unit
      create        test/helpers/books_helper_test.rb
      invoke    jbuilder
      create      app/views/books/index.json.jbuilder
      create      app/views/books/show.json.jbuilder
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/books.js.coffee
      invoke    scss
      create      app/assets/stylesheets/books.css.scss
      invoke  scss
      create    app/assets/stylesheets/scaffolds.css.scss


まずは、確認のためにhttp://127.0.0.1:3000/booksへ接続してみます。

f:id:inon29:20140604214335p:plain

ActiveRecord::PendingMigrationErrorというエラーが表示されました。

これは、rails generate scaffoldコマンドによってプロジェクトの関連ファイルは生成されましたが、
実際のDBのテーブルは、生成されていないため発生するエラーです。

railsがデフォルトで生成されるsqliteDBのファイルを確認しても、テーブルが作成されていないことがわかります。

(dbファイルの場所)

[puroject_path]/db/development.sqlite3

3.DBへマイグレーションファイルを適用する

DBへテーブル情報を反映されるためには、
scaffoldコマンドは、が自動で作成してくれる「マイグレーションファイル」を使います。
マイグレーションファイル」は、モデルの変更内容をDBへと反映する為の情報が記載されているファイルです。

(マイグレーションファイルの場所)

[puroject_path]/db/migrate/[マイグレーションファイル]

今回は、bookというモデルを作成したので、

[puroject_path]/db/migrate/20140603151844_create_books.rb

というファイルが作成されています。

class CreateBooks < ActiveRecord::Migration
  def change
    create_table :books do |t|
      t.string :name
      t.text :description

      t.timestamps
    end
  end
end

ファイルの中身を見てみるとrails generate scaffoldコマンドで指定したテーブルの、
createメソッドが記述されています。

railsでは、モデル名に対して複数型の名称のDBテーブル名をつけるルールになっているため
 テーブル名はbooksとなっています。

この、マイグレーションファイルをDBへ反映されるためには、
以下のコマンドを実行します。

rake db:migrate

先ほど確認したsqliteDBファイルを再度確認すると
booksというテーブルができていることが確認できます。

sqlite> .tables
books              schema_migrations
sqlite>

もう一度http://127.0.0.1:3000/booksへ接続し表示を確認すると、
エラーが消え以下のような画面が表示されます。

f:id:inon29:20140604214403p:plain

画面から、New Bookのリンクをクリックすると以下のような画面へ遷移し、
booksテーブルにレコードを追加することができます。

f:id:inon29:20140604215853p:plain

その他、レコードの編集など、
基本的なデータ操作をscaffoldジェネレータを使うだけで簡単に実装することが可能です。