コマンド1つでデータ管理機能のscaffoldを生成できました。「rails generate scaffold」コマンドはデータを管理するために必要なソースを生成しています。その中に含まれるMVCの各種コンポーネントについて見ていきましょう。
ビューのソースコードは「app/views」ディレクトリに置かれます。早速、一覧ページを表示するための「app/views/books/index.html.erb」を見てみましょう。
<h1>Listing books</h1>
<table>
<thead>
<tr>
<th>Title</th>
<th>Outline</th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<% @books.each do |book| %>
<tr>
<td><%= book.title %></td>
<td><%= book.outline %></td>
<td><%= link_to 'Show', book %></td>
<td><%= link_to 'Edit', edit_book_path(book) %></td>
<td><%= link_to 'Destroy', book, method: :delete, data: { confirm: 'Are you sure?' } %></td>
</tr>
<% end %>
</tbody>
</table>
<br>
<%= link_to 'New Book', new_book_path %>
標準のERBテンプレートエンジンを使った場合、このようにRubyのコードと思しきものが含まれるHTMLのソースコードになります。Rubyのコードが使われている個所は「<%」〜「%>」か「<%=」〜「%>」で囲まれた部分です。
「<%」〜「%>」と「<%=」〜「%>」の違いは、サーバーを立ち上げてブラウザーから見たとき、タグ中のRubyの戻り値が「<%」〜「%>」の場合表示されず、「<%=」〜「%>」の場合表示されます。
そのため、「<%」〜「%>」はコンテナーのイテレーターメソッド(each)や変数の代入時に使い、「<%=」〜「%>」は表示したいオブジェクトのプロパティやアンカータグを出力する「link_to」メソッドなどで使います。
以上が主なビューの使い方ですが、今後の連載でより詳しく掘り下げていきます。
コントローラーは「app/controllers」ディレクトリ以下に置かれます。「app/controllers/books_controller.rb」を見てみましょう。
class BooksController < ApplicationController
before_action :set_book, only: [:show, :edit, :update, :destroy]
# GET /books
# GET /books.json
def index
@books = Book.all
end
# GET /books/1
# GET /books/1.json
def show
end
# GET /books/new
def new
@book = Book.new
end
# GET /books/1/edit
def edit
end
# POST /books
# POST /books.json
def create
@book = Book.new(book_params)
respond_to do |format|
if @book.save
format.html { redirect_to @book, notice: 'Book was successfully created.' }
format.json { render action: 'show', status: :created, location: @book }
else
format.html { render action: 'new' }
format.json { render json: @book.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /books/1
# PATCH/PUT /books/1.json
def update
respond_to do |format|
if @book.update(book_params)
format.html { redirect_to @book, notice: 'Book was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: 'edit' }
format.json { render json: @book.errors, status: :unprocessable_entity }
end
end
end
# DELETE /books/1
# DELETE /books/1.json
def destroy
@book.destroy
respond_to do |format|
format.html { redirect_to books_url }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_book
@book = Book.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def book_params
params.require(:book).permit(:title, :author, :outline)
end
end
コントローラーは「ApplicationController」クラスを継承しており、ApplicationControllerは「app/controllers/application_controller.rb」で定義されています。ApplicationControllerで定義したメソッドは全てのコントローラーで使うことができるので、共通的に定義したいリクエストの前処理などを定義したりすることができます。有効に使いましょう。
コントローラーはアクセスがあった際、そのURLに割り当てられている公開メソッドを実行します。そして実行の結果、別のURLにリダイレクトしたり、定められたビューをインスタンス変数を渡してレンダリングしてアクセス元に返したりします。
「BooksController」の「index」メソッドは「/books」にアクセスがあった際に実行されるようになっており、そのURLとメソッドの割り当ては「config/routes.rb」に定義されています。「config/routes.rb」の説明は次回にしますが、定義されているURLとコントローラーのメソッド(アクション)の割り当てを確認するには、次のコマンドを使います。
rake routes
これにより、現在アプリケーションで定義されているアクションを確認できます。
また、Rails 4からはdevelopment環境で「http://localhost:3000/rails/info/routes」にアクセスするとブラウザーからルートを確認できます。さらに、定義されていないURLにアクセスするなどしてRouting Errorが発生した際には定義済みルートをブラウザーに表示してくれるようになり、とても便利になっています。
モデルは「app/models」に置かれます。「app/models/book.rb」を見てみましょう。
class Book < ActiveRecord::Base end
まだ生成されたばかりのモデルは非常にシンプルです。「ActiveRecord::Base」クラスを継承しており、そこに便利なメソッドが定義されています。コントローラー中で使われていた「Book.all」や「Book.new」などが、それに当たります。Bookクラスには今後バリデーションやコールバックなどのメソッドを追加していきます。
Railsアプリケーション開発を楽に進めるために、以下に挙げるサイトを押さえておくと良いでしょう。
Ruby on Railsの公式ガイドです。本文は英語ですが、ここに書いてある内容がRailsの公式仕様なので、正しい情報を得たい時にはこちらを参考にすると良いでしょう。
さまざまなRailsの機能やgemの解説を動画で紹介しています。動画の言語は英語ですが、テキスト化された幾つかのコンテンツには日本語訳が付いています。
今回はRailsの基本を駆け足で紹介しましたが、いかがでしたでしょうか。
Railsはプログラミング言語ではなくフレームワークであるため、基本的なことだけでもたくさんの要素があります。しかし、フレームワークの要素をいちいち暗記する必要はなく、困った時の索引程度に考えておけばよいでしょう。
次回はscaffoldを使わないで開発する方法を紹介します。ご期待ください。
林 慶(Rails技術者認定シルバー試験問題作成者)
平成2年大阪生まれ。2006年から高専で情報工学を学んでいたが当時は所謂プログラミングができない工学生だった。卒業後、高専の専攻科に上がったもののマンネリ化したキャンパスライフに飽きたため休学して渡豪。そこでプログラミングに対するコンプレックスを克服するためにRuby on Railsなどでアプリケーションを作ることを覚える。
帰国後から現在までは復学し推薦システムに関する研究を行いながら、アジャイルウェアでRuby on Railsアプリケーションの開発業務に従事している。
好きなメソッドはinject。
山根 剛司(Ruby業務開発歴7年)
兵庫県生まれ。1997年からベンチャー系のパッケージベンダーで10年間勤務。当時、使用していた言語はJavaとサーバーサイドJavaScript。
2007年よりITコンサル会社に転職し、Rubyと出会って衝撃を受ける。基幹システムをRuby on Railsで置き換えるプロジェクトに従事。それ以来Ruby一筋で、Ruby on Railsのプラグインやgemも開発。
2013年より、株式会社アジャイルウェアに所属。アジャイルな手法で、Ruby on Railsを使って企業向けシステムを構築する業務に従事。
Ruby関西所属。好きなメソッドはtap。
Twitter:@spring_kuma、Facebook:山根 剛司
Ruby on Rails3で学ぶWeb開発のキホン(2):Railsの全体像を知ろう
Rails情報源の歩き方(前編):要チェックのRails関連情報源はここ!
Rails Girls Tokyo レポート:キラッキラな「Ruby on Rails」の世界へ――Rails Girls 25人が集結
Ruby on RailsのRJSでかんたんAjax開発(前編):かんたんAjax開発をするためのRuby on Railsの基礎知識
実用レベルに達したJRubyを体感してみよう(前編):Aptana RadRailsで始める JRuby on Rails超入門
小山博史のJavaを楽しむ(4):(Java+Derby)* Ruby on Rails プログラミング
JavaエンジニアのためのRuby入門(3):Strutsの知識を基に、Ruby on Railsを学ぶ方法Copyright © ITmedia, Inc. All Rights Reserved.