連載
» 2014年03月28日 18時00分 公開

開発現場でちゃんと使えるRails 4入門(2):scaffoldの中身を理解するためにMVCコンポーネントと7つのアクションを個別で自作する (2/3)

[著:林慶、監修:山根剛司,株式会社アジャイルウェア]

コントローラーの作成

「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.

編集部からのお知らせ

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。