scaffoldの中身を理解するためにMVCコンポーネントと7つのアクションを個別で自作する:開発現場でちゃんと使えるRails 4入門(2)(2/3 ページ)
エンタープライズ領域での採用も増えてきたRuby on Railsを使ってWebアプリケーションを作るための入門連載。最新版の4に対応しています。今回は、便利なscaffoldをただ使うだけではなく、中身をちゃんと理解するためにMVCコンポーネントと7つのアクション「index」「show」「new」「create」「edit」「update」「destroy」を個別で自作しルーティング設定をしていこう。
コントローラーの作成
「rails g(enerate) controller」コマンドでコントローラーに関するコンポーネントを作成
コントローラーとビューの実装に移りましよう。次のコマンドでコントローラーに関するコンポーネントを作成します。
bundle exec rails g controller users
「rails g(enerate) controller」コマンドは引数にコントローラー名(特定のモデルに関するものであれば複数形)を取り、以下のようなファイルを生成します。
- app/controllers/users_controller.rb
- app/views/users(ディレクトリ)
- app/assets/stylesheets/users.css.scss
- app/assets/javascripts/users.css.scss
- app/helpers/users_helper.rb
- test/controllers/users_controller_test.rb
- test/controllers/users_helper_test.rb
たくさんのファイルが生成されましたが、ここではコントローラーとビューにだけ注目して実装していきます。
ユーザーを一覧する「index」アクションを作る
ユーザーを一覧する「index」アクションを作りましょう。先ほど「rails g(enerate) controller」コマンドによって生成されたコントローラーのファイル(app/controllers/users_controller.rb)の中身は以下のようになっています。
class UsersController < ApplicationController end
このコントローラーのクラスに次のメソッドを追加します。
def index @users = User.all end
このメソッドはindexアクションにひも付いたURLにアクセスがあると実行され、全ユーザーのモデルオブジェクトをインスタンス変数「@users」に代入します。コントローラーはメソッドの実行後、同じ名前を持つビュー(app/views/users/index.html.erb)をレンダリングします。
ビューの実装
ここまででビューは作成されていないので、「app/views/users/index.html.erb」を作り、次のコードを実装しましょう。
<h1>利用者一覧</h1> <table> <thead> <tr> <th>氏名</th> <th>部署</th> </tr> </thead> <tbody> <% @users.each do |user| %> <tr> <td><%= user.name %></td> <td><%= user.department %></td> </tr> <% end %> </tbody> </table>
ビュー中のインスタンス変数はコントローラーのメソッドで定義したものになります。このコードはRubyのイテレーターを利用しており、「<% @users.each do |user| %>」と「<% end %>」はコンテナーオブジェクトである@usersの要素ごとに、間にあるコードを実行します。
ルーティングの設定
以上でアクションは用意されましたが、まだルーティングが設定されていません。ルーティングは「config/routes.rb」の「BookLibrary::Application.routes.draw」に渡すブロックの中で定義されます。
すでにBookモデルに関するscaffoldのルーティングがresourcesメソッドで定義されているかと思います。この時のアクションとルーティングの対応の一覧は前回紹介した「rake routes」コマンドで確認できます。
resourcesメソッドは第1引数に渡したシンボルのRESTfulなURLをまとめて生成します。デフォルトでは「index」「show」「new」「create」「edit」「update」「destroy」の7個のアクションと対応するルーティングを作ります。
現時点でUsersControllerのメソッドはまだ「index」アクションしか用意していないので、「only」オプションに使用するアクション名を要素に持つ配列を渡します。
BookLibrary::Application.routes.draw do resources :books resources :users, only: %i(index) end
この状態で「rake routes」を実行すると次の行が追加されています。
users GET /users(.:format) users#index
resourcesのオプションには「only」と反対に前述の7個のアクションから取り除くものを指定する「except」などがあります。
実行確認
それではブラウザー上でindexアクションを確認しましょう。「rails s」コマンドでサーバーを起動し、ルートのURLに「rake routes」最後の行の3項目を足した「http://localhost:3000/users」にアクセスします。
ユーザー一覧を確認できましたか? もしエラーなどに遭遇したら、慌てずエラー画面やサーバーのログを調べてみてください。エラーの原因は、ほとんどの場合その中で示されています。
Copyright © ITmedia, Inc. All Rights Reserved.