コマンド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:山根 剛司
Copyright © ITmedia, Inc. All Rights Reserved.
Coding Edge 鬮ォ�ェ陋滂ソス�ス�コ闕オ譁溷クキ�ケ譎「�ス�ウ驛「�ァ�ス�ュ驛「譎「�ス�ウ驛「�ァ�ス�ー