MVCとRailsの基本構成を学ぼう:Ruby on Rails3で学ぶWeb開発のキホン(1)(3/3 ページ)
Web開発フレームワークとして人気の高いRuby on Railsの最新版、バージョン3を使ってWebアプリ開発の基本を学びます。
RailsコマンドとRake
最後に、Railsアプリケーション開発でよく利用するrailsコマンドとrakeについて紹介します。
railsコマンドには、new以外にもいろいろなサブコマンドが用意されています。よく使用するサブコマンドには以下のようなものがあります。
rails generate(または“rails g”)
コードの生成(後で詳述)を行う
rails console(または“rails c”)
Railsコンソールを起動
rails server(または“rails s”)
Railsサーバーを起動
Railsコンソールとは、Railsの環境をロードした状態で対話的にRubyコードを実行できるツールです。また、Railsサーバーを起動すると、アプリケーションが立ち上がり、ブラウザから利用することができるようになります。
その他のサブコマンドについては「rails -h」で確認することができます。また、各サブコマンドの引数に-hを指定して実行することでヘルプを表示させることができます(例:rails g -h)。
ここでは、上記のサブコマンドの中でも特に頻繁に使用するrails generateコマンドについて、さらに詳しく見ていきます。
rails generateの詳しい使い方
rails generateコマンドを使ってさまざまなコードを生成することができます。実行する際には引数にジェネレータを指定します。よく使用するジェネレータには以下のようなものがあります。
> rails g model item name:string price:integer
上記を実行すると、モデル(app/models/item.rb)と後述するマイグレーション(db/migrate/20110211XXXXXX_create_items.rb)が作られます。この例では文字列型の name というカラムと 数値型の price というカラムを持った Item という名前のモデルが作られます。
> rails g controller items recent
この例では、 ItemsControllerというコントローラー(app/controllers/items_controller.rb)が作られ、さらにそのアクションとして、recentメソッドが定義されます。また、アクションに対応するビュー(app/views/items/recent.html.erb)が作られ、config/routes.rbにルーティング(これは後で説明します)の情報(get "items/recent")が追加されます。
> rails g migration add_description_to_items description:string
Railsのマイグレーションとは、データベースのスキーマに対する個々の変更をそれぞれ対応するファイルにRubyコードとして記述するもので、複数の開発者の間でスキーマの変更を共有し、効果的に管理するのに役立ちます。
上の例では、itemsテーブルにdescriptionという名前の文字列型のカラムを追加するマイグレーションが作られます。マイグレーションファイルの中身やコマンドの使い方については後で詳しく説明します。
Rakeについて
RakeとはRuby製のビルドツールです。ちょうどMakeのRuby版ということでこの名前が付いています。“タスク”という単位で処理を記述し、それらの依存関係を定義することができます。rakeコマンドを使ってそれらのタスクを実行します。
rakeコマンドは、カレントディレクトリにあるRakefileという名前のファイルを読み込んで処理を行います。Railsアプリケーションの開発では、このRakeを使用してさまざまな処理を行います。独自にrakeタスクを定義したい場合は、lib/tasks以下に.rakeという拡張子を付けたファイルを配置し、そこにタスクを記述します。
タスクの一覧は rake --tasks(または rake -T)を実行することで確認できます。また、タスク名を指定して絞り込むこともできます(例:rake -T db)。
データベース関連のrakeタスク
データベース関連のrakeタスクには“db:”というネームスペースが付けられています。データベースのマイグレーションを行うには、以下を実行します。
> rake db:migrate
マイグレーションの現在の状態を確認するには次のようにします。
> rake db:migrate:status
出力例: rake db:migrate:status database: db/development.sqlite3 Status Migration ID Migration Name -------------------------------------------------- up 20110211161409 Create items up 20110211162505 Add description to items
一度実行したマイグレーションを取り消してデータベースを1世代前の状態に戻すには次のようにします。
> rake db:rollback
引数に「STEP=n」を付けることで何世代戻すかを指定することができます。
> rake db:rollback STEP=2
URLをアクションに結びつける“ルーティング”
Railsでは、ユーザーからのリクエストのインターフェイス部分、すなわち、URLやHTTPメソッドをどのコントローラーのどのアクションに結びつけるかを、config/routes.rbで定義します。このマッピングのことをルーティングと呼びます。
routes.rbでの記述は、複数のマッピングを1行で記述するなど、プログラムとしての側面が強く、最終的にどのようなマッピングが定義できているかを網羅的に把握することができません。この点を支援してくれるのがrake routesです。
rake routesを実行するとconfig/routes.rbに定義されているルーティングの情報が整形されて出力されます。
> rake routes users GET /users(.:format) {:action=>"index", :controller=>"users"} POST /users(.:format) {:action=>"create", :controller=>"users"} new_user GET /users/new(.:format) {:action=>"new", :controller=>"users"} edit_user GET /users/:id/edit(.:format) {:action=>"edit", :controller=>"users"} user GET /users/:id(.:format) {:action=>"show", :controller=>"users"} PUT /users/:id(.:format) {:action=>"update", :controller=>"users"} DELETE /users/:id(.:format) {:action=>"destroy", :controller=>"users"} items_recent GET /items/recent(.:format) {:controller=>"items", :action=>"recent"}
引数に“CONTROLLER=コントローラー名”を付けることで絞り込むことができます。
> rake routes CONTROLLER=items
ツールをより快適に使う
以上のように、railsコマンドやrakeはRailsアプリケーションを実装する上で欠かせない便利なツール群です。しかし、コマンドの実行のたびにRailsアプリケーションをロードするので、毎回少し時間がかかってしまいます。それを解消するために本記事の筆者の1人である@jugyoが作ったツールが「rails-sh」です。rails-shは、あらかじめRailsアプリケーションをロードした状態で起動するコマンドラインシェルのようなものです。
rails-shを使うと、Railsの各種コマンドをすばやく実行することができます。筆者の環境では、10秒ほどかかっていたrake routesの実行が、rails-shで1秒ほどに短縮できました。rails-shの詳細については以下を参照してください(なお、rails-shのWindowsでの動作は未確認です)
今回のまとめ
本記事では、Railsの概要を理解するために、RailsにおけるMVC、Railsアプリケーションの構造、開発に頻繁に利用するrailsコマンド、rakeコマンドを解説しました。
また、これらに関連して、マイグレーションやルーティングといった概念についても簡単に触れました。本記事を通じて、Railsアプリケーションがどのような構造になっているのか、どんなツールを使いながら開発していくのかのイメージを持っていただけたなら幸いです。次回は、Railsを構成するコンポーネントを概観し、その中で汎用的に利用されるActiveSupportについて詳しく見ていきます。
Copyright © ITmedia, Inc. All Rights Reserved.