Ruby on Rails
入門(第
1
回)
コンピュータ系実験
IV
資料
担当:冨永
この資料は授業での説明を前提として書かれているため、必ずしも正確でない。より正確には、参考文献とし て示した図書や、次に示すRuby on Railsのサイトなどを参照すること。なおこの資料はRails 3.1.0について書
かれている。
1
Ruby on Rails
についてのウェブサイト
本家のサイトは以下である。
• Ruby on Rails本家:http://rubyonrails.org/
• APIマニュアル:http://api.rubyonrails.org/
他にも数多くのサイトがある。
2
用語と概念の概要
Ruby on Railsの重要な要素は以下のものである。
モデルmodel データを保持するクラス。app/models/に定義ファイルが置かれる。
ビューview ウェブブラウザに返される表示。XHTML/ERb(埋め込みRuby)で記述される。以下の2つから
成る。
テンブレート。モデルのデータが流し込まれる。app/views/∗/の下に置かれる。
レイアウト。テンプレートに共通の見た目を指定する。app/views/layouts/の下に置かれる。
コントローラcontroller ウェブブラウザからの要求を処理するクラス。app/controllers/に定義ファイルが置か
れる。
データベース O/Rマッピングによって、モデルと対応したデータを保持する。データベースの実体はdb/development.sqlite3
である。テーブルの作成や属性の追加などはマイグレーションmigration(移行)によって行なう。
• マイグレーションはRubyのスクリプトとして書く。
• マイグレーションの置き場はdb/migrate/である。
• マイグレーションはコマンドrake db:migrateで実行する。このコマンドはマイグレーションを実行 し、データベースを作る。
• データベースは現在のバージョン(最後に実行したマイグレーションファイル名の数字)を保持して いる。rake db:migrateはそのバージョン情報を見て、必要なマイグレーションだけを実行する。
• データベースをマイグレーションひとつ前の状態に戻すにはrake db:rollbackを実行する。
ルータrouter ブラウザが指定したURLに従って、特定のコントローラとそのアクション(publicメソッド)を
呼び出す。config/routes.rbにその対応を記述する。標準的には以下のようなURLにする。
http://localhost:3000/テーブル名/ (一覧、生成)
http://localhost:3000/テーブル名/new (新規)
http://localhost:3000/テーブル名/インスタンスのID (表示、更新、削除)
http://localhost:3000/テーブル名/インスタンスのID/edit (編集)
rake routesコマンドで現在の設定を見ることができる。
3
Rails
における
O/R
マッピング
Object-Relational Mapping(O/Rマッピング)とは、以下の対応によって、オブジェクト指向言語で関係デー
タベースを扱う方法である。
• クラス↔テーブル
• インスタンス↔レコード
• インスタンス変数(属性)↔フィールド
Railsでは名前づけの約束によって、例えばクラスMyModelがテーブルmy modelsに対応する。SQLによる
操作とRubyによるコードの対応は以下のようになる。
• create table my models (name text, age int)
マイグレーションで行なう。そのレコードを一意に示す、「id」という名のフィールドが自動的に加えら
れる。
• select * from my models where id = n
x = MyModel.find(n)
• select * from my models where name = ’tominaga’
x = MyModel.where(name: ’tominaga’)
• select * from my models
a = MyModel.all
• insert into my models values (’kazuto’, 27)
x = MyModel.new
x.name = ’kazuto’
x.age = 27
x.save # ここでデータベースに書き込まれる。要エラー処理。
• update my models set age = age + 1 where name = ’tominaga’
• delete from my models where name = ’tominaga’
x = MyModel.where(name: ’tominaga’)
x.destroy # 要エラー処理
あるいはもしtominagaという値をnameフィールドに持つ複数のレコードがあるなら
a = MyModel.where(name : ’tominaga’)
a.each do |x|
x.destroy # 要エラー処理
end
• drop table my models マイグレーションで行なう。
4
サイトを作る
ネット商店のサイトを作る。次のコマンドを入力すると、サイトのディレクトリ構造ができる。今後はその中 で作業することになる。
work$ rails new shop
(shop という名のディレクトリができ、その下に Rails の初期ファイルが準備される) work$ cd shop
もし何かうまく行かなくて全部なしにしたい場合にはshopディレクトリを消せば全て消えるが、いきなり消
すのは危ないので別の名前にしておくといい。
work$ mv shop oldshop # どんな名前にしてもよい
5
モデルのための足場の生成
ネット商店で売る商品productのためのファイルなどを、Ruby on Railsの足場生成機能を使って生成する。
shop$ rails generate scaffold product name:string description:text
(Product モデルのためのファイルが足場として用意される。rails g ... でもよい) shop$ rake db:migrate
(products テーブルが作られる) shop$ rails server
(動作状態が表示されるのでこのコマンドは別窓で動かした方がよい。rails s でもよい)
そしてウェブブラウザでhttp://localhost:3000/productsにアクセスしていくつか品物を追加する。
app/views/products/の下にある.html.erbファイル(テンプレート)をいじって、表示を自分好みにしてみるの
足場の生成で間違った場合 rails destroyを使うと間違って作った足場を消せる。
shop$ rails g scaffold purodact name:string description:text
(間違って Purodact モデルを作ってしまった) shop$ rails destroy scaffold purodact
(間違って作った Purodact モデルを消した)
rails destroyは足場だけでなく、rails generateで作った他のものも消せる。
6
足場生成機能について
コマンド「rails generate scaffold my model name:string age:integer」は、モデルMyModel
のためのディレクトリやファイルなどを生成する。これを足場scaffoldと呼ぶ。足場には以下のものが含まれる。
• モデルMyModelのためのファイルapp/models/my model.rb このモデルは属性string(文字列)とage(整数)を持つ。
• データベースのためのファイルdb/migrate/日時create my models.rb
コマンドrake db:migrateを実行すると、このファイルによってmy modelsテーブルが作られる。
• ビューのためのファイル
テンプレートapp/views/my models/∗
レイアウトapp/views/layouts/my models.html.erb
• コントローラMyModelControllerのためのファイルapp/controllers/my models controller.rb
これらによって、モデルMyModelを直接扱うための簡単な仕組みができる。
指定できる属性の型には以下のようなものがある::string, :text, :integer, :float, :decimal, :datetime, :timestamp, :time, :date, :binary, :boolean。
注意 足場については以下に注意すること。
• ひとつのモデルに対して足場は一度しか作れない。一度足場を作った後で属性を追加したりする時には、 基本的には手でファイルなどを作成/変更する必要がある(次節参照)。
• 足場はその場しのぎのものであり、実際にウェブアプリケーションを動かすまでにはその全てがきちんと したものに置き換えられなくてはならない。
演習1 Userモデルを作る
このshopアプリケーションに利用者情報を登録するテーブルを持たせる。そのために、足場生成機能(rails generate scaffold)を使ってUserモデルを作ってみよう。Userモデルには以下の属性を持たせる。
• 文字列型のname。ユーザIDを格納する。(例:johndoe)
• 文字列型のpassword。パスワードを格納する。
Userモデルを作ったら、rake db:migrateコマンドでuserテーブルを作ってから、ウェブブラウザを使ってユー
ザIDが「root」、パスワードが「himitsu」というユーザを作ってみよう。
7
属性の追加
Productモデルに、価格のための属性price(整数)を追加しよう。すでにあるモデルへの追加(変更)なので
足場生成機能は使えない。そこで、データベース、モデル、コントローラ、ビューを以下のようにする。
データベース productsテーブルに属性priceを追加するためには以下の2段階を行なう。
1. マイグレーションを作る
shop$ rails generate migration add_price_to_products price:integer
テーブルに属性を追加するマイグレーションをrails generateで生成するときには、名前を「add_XXX_to_
テーブル名」とする。XXXは何でもよいが、属性名にすると分かりやすい。
2. そのマイグレーションをrake db:migrateで実行する
モデル モデルの属性はデータベースにあるproductsテーブルの定義から自動的に行なわれるので、モデルを
定義しているファイルapp/models/product.rbを変更する必要はない。
コントローラ app/controllers/products controller.rbでは、モデルをひとつのオブジェクトとして扱っているの
で、属性を追加することによる変更は必要ない。
ビュー app/views/products/の下にある.html.erbファイルには、モデルが持つ各属性のための欄がある。他の
欄と同じようにprice属性のための欄を与えよう。new.html.erbとedit.html.erbは form.html.erbを共用していて
(render ’form’というコードで)、そこに属性のための欄があるので、form.html.erbの方を変えればよい。
ブラウザを使ってページにアクセスし、price属性がうまく追加されたか試してみよう。
演習2 Userモデルにメールアドレスを追加する
Userモデルに、メールアドレス属性(名前はmail、型は文字列とする)を追加してみよう。うまく行ったか
ブラウザで確認しよう。
8
データベースにデータを播く
(seed)
データを手でいちいち入れるのは大変なので、テーブルに初期データを与えるコードを書く。そのためのファ イルがdb/seeds.rbである。以下のように書く。
# coding: utf-8
$KCODE = ’utf-8’ if RUBY_VERSION < ’1.9’ Product.delete_all
Product.create(name: ’鯖の味噌煮’, description: ’とてもうまい’, price: 100)
そしてコマンドrake db:seedを実行するとデータが入る。Product.createの呼出しをたくさん書けば、その分
だけデータを追加できる。なお、最初にProduct.delete allで全データを消しているので、元のデータは消えてし
演習3 Userモデルのための初期データ
Userモデルに管理者アカウントを初期データとして設定する行をseeds.rbに追加してみよう。まずusersテー
ブルを空にしてから、ユーザID「root」、パスワード「naisho」、メールアドレス「[email protected]」という
データを入れるようにする。書いたらrake db:seedを実行して、データが正しく設定されるか確認しよう。
Productモデルの場合と同様に書けば、最初の.delete allで既に登録されているデータが消えて、指定された
データだけが入ったusersテーブルができるはずである。
9
params
ハッシュ
paramsはコントローラが持つ局所変数であり、ブラウザから送られてきたデータ(利用者の入力)を保持す
るハッシュ1を指す。内容は例えば以下のようである。(サーバを動かす窓に表示される。)
Parameters: {"utf8"=>"X", "commit"=>"Create", "authenticity_token"=>"略",
"product"=>{
"price"=>"120", "name"=>"My New Product",
"description"=>"This is my new product."
}
}
この例は、商品を新しく登録した時のparamsの内容である。このハッシュから、params[:price], params[:name]
などとしてユーザの入力を得られる。
ブラウザとアプリケーションの間でデータのやりとり ブラウザとRailアプリケーションの間でのデータのや
りとりは、典型的には以下のように行なわれる。
• ブラウザが送るフォームデータなど⇒paramsハッシュ⇒コントローラ
• コントローラ⇒コントローラのインスタンス変数⇒ビュー(ERb)
• ビュー⇒XHTML⇒ブラウザ
演習4 足場のコードを読もう
Productモデルのために生成された足場のコードを読んでみよう。
参考文献
Railsは2から3になって機能が大きく変わった。文献や情報などを探すときにはRails 3対応かどうか必ず確
認した方がいい。
• Sam Ruby et al.: Agile Web Development with Rails, 4th edition, Pragmatic Bookshelf, 2011. (多分そのうち 「RailsによるアジャイルWebアプリケーション開発 第4版」として出版される。第4版がRails 3対応。)