コントローラーとビューの実装に移りましよう。次のコマンドでコントローラーに関するコンポーネントを作成します。
bundle exec rails g controller users
「rails g(enerate) controller」コマンドは引数にコントローラー名(特定のモデルに関するものであれば複数形)を取り、以下のようなファイルを生成します。
たくさんのファイルが生成されましたが、ここではコントローラーとビューにだけ注目して実装していきます。
ユーザーを一覧する「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.