Ruby on Railsを使ってみることにした

2013年3月8日

前の記事でCygwinにRailsの環境を作り,"project"という名前のプロジェクトを作成した.
インストールの方法などは前の記事を参考に.

Railsには,WEBrickという環境があり,ローカルでのテスト環境を作ってくれるみたい.
$ cd project
$ rails server

デフォルトではポート3000で動作するので,http://localhost:3000/にアクセスするとWelcome aboardと画面が出てくる.

RailsはMVCモデルを採用している.
MVCモデルとは,データベースの処理や操作画面をモデル・ビュー・コントローラという3つの部品に役割分担させる構成のこと.PHPのフレームワークやDjangoなどと基本は同じ様子.

Railsでこれらを作成するには"rails generate"コマンドを利用する.

$ rails generate controller hoge
$ rails generate view fuga
$ rails generate model piyo

“rails generate …"は"rails g …"と短縮して書くこともできる.

手始めにhogeコントローラを作成してみると,
$ rails g controller hoge
create app/controllers/hoge_controller.rb
invoke erb
create app/views/hoge
invoke test_unit
create test/functional/hoge_controller_test.rb
invoke helper
create app/helpers/hoge_helper.rb
invoke test_unit
create test/unit/helpers/hoge_helper_test.rb
invoke assets
invoke coffee
create app/assets/javascripts/hoge.js.coffee
invoke scss
create app/assets/stylesheets/hoge.css.scss
こんなかんじでcontroller本体と,viewやテスト用のコードなども生成される.
controller本体はapp/controllers/以下に生成されるので,これを編集する.

 class HogeController < ApplicationController
 end

最初はこれだけしか書いてないので,ここにメソッドを追加する.文字列を返すだけのhello関数を追加した.MVCではこの関数をアクションと呼ぶ.

class HogeController < ApplicationController
  def hello
    render :text => "Hello, Rails world!
  end
end

コントローラを作成しただけでは,アクションに接続できないのでルーティング設定をする必要がある.
ルーティング設定はconfig/routes.rbに記述する.match 'url' => 'controller#action'でurlとアクションが接続される.

/hogeにアクセスしたときにhogeコントローラのhelloアクションを呼び出したいときは,

 Project::Application.routes.draw do
   match 'hoge' => 'hoge#hello'
 end

と書けばよい.
"rake routes"コマンドでルーティング設定を一覧表示できるので,設定できているかどうか確認.

$ rake routes
hello /hello(.:format) hoge#hello

あとはWEBrickを起動し,localhost:3000/helloにアクセスすると"Hello, Rails world!"と一言表示される.

viewはひとまず置いておいて,次はモデルを作る.モデルはデータベースに入れるデータそのものを表すモノ.はじめにデータベースを作成する.
$ rake db:create
デフォルトの設定だとsqlite3のファイルがdbフォルダに生成される.

つづいて"rails g model piyo"と実行すると
invoke active_record
create db/migrate/20130202152004_create_piyos.rb
create app/models/piyo.rb
invoke test_unit
create test/unit/piyo_test.rb
create test/fixtures/piyos.yml
という感じでapp/modelsディレクトリ以下にpiyo.rbや単体テスト関係のもの,さらにdb/migrate以下にマイグレーション用のスクリプトが生成される.
マイグレーション用スクリプトに作成したいテーブルのカラムを記述していき,rakeを実行してデータベースにテーブルを作成する.
作成してすぐのマイグレーション用スクリプトは

 class CreatePiyos < ActiveRecord::Migration
   def change
     create_table :piyos do |t|
 
       t.timestamps
     end
   end
 end

のような感じ.これに文字列型のnameと日付型のcreate_dateというカラムを作成してみる.データの種類には,string,text,integer,float,decimal,datetime,timestamp,time,date,binary,booleanが扱える.

 class CreatePiyos < ActiveRecord::Migration
   def change
     create_table :piyos do |t|
       t.string :name
       t.date :create_date
       t.timestamps
     end
   end
 end

とスクリプトに追記した.データの種類には,string,text,integer,float,decimal,datetime,timestamp,time,date,binary,booleanが扱える.また,:limitや:null,:defaultなどのオプションを指定することも可能.プライマリキーとなるIDが自動生成される.

スクリプトを書きなおしたら"rake db:migrate"を実行.
$ rake db:migrate
== CreatePiyos: migrating ====================================================
-- create_table(:piyos)
-> 0.0040s
== CreatePiyos: migrated (0.0040s) ===========================================
これでテーブルが完成."rails dbconsole"を実行してコンソールからテーブルを確認してみると
sqlite> .tables
piyos schema_migrations
sqlite> .schema piyos
CREATE TABLE "piyos" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar(255), "create_date" date, "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL);
のようにテーブルを確認することができる.どうやらcreated_atとupdate_atも同時に自動生成されるらしい.

さきほどのモデルを生成したときにできたpiyo.rbは
class Piyo < ActiveRecord::Base end と何も記述されていない状態だが,ActiveRecord::Baseが継承されていることで,モデルに対するCRUDのようなたくさんの機能が何も書かずにできる. Rails3.2.3以降では,データへのアクセスができるようにするため

class Piyo < ActiveRecord::Base
  attr_accessible :name, :create_date
end

とアクセスできるようにしておく.逆にアクセスされないようにするにはattr_protectedをつけておくとよい.

dbディレクトリの中にあるseeds.rbに

  Piyo.create(:name=>"foo",:create_date=>"2012-02-01")
  Piyo.create(:name=>"bar",:create_date=>"2012-02-02")

みたいな感じで書いて"rake db:seed"を実行するとpiyosテーブルに2つのレコードが登録される.
$sqlite> select * from piyos;
$1|foo|2012-02-01|2013-02-05 14:19:20.891345|2013-02-05 14:19:20.891345
$2|bar|2012-02-02|2013-02-05 14:19:21.094146|2013-02-05 14:19:21.094146

コントローラの中でデータを取得して,ビューに渡すことで中身を表示することもできる.localhost:3000/helloから呼び出すためにapp/viewの変更.

Hello

<% @piyos.each do |piyo| %> [名前] <%= piyo.name %>, [作成日] <%= piyo.create_date %>
<% end %>

$