連載
» 2014年05月09日 18時00分 UPDATE

開発現場でちゃんと使えるRails 4入門(3):特定データに関するscaffoldアクションの実装&基礎的なリファクタリング手法 (1/2)

エンタープライズ領域での採用も増えてきたRuby on Railsを使ってWebアプリケーションを作るための入門連載。最新版の4に対応しています。今回は、show、edit、update、deleteアクションを個別で自作し、できたコードをフィルターや部分テンプレートでリファクタリングしよう。

[著:林慶、監修:山根剛司,株式会社アジャイルウェア]
「開発現場でちゃんと使えるRails 4入門」のインデックス

連載目次

 前回の「scaffoldの中身を理解するためにMVCコンポーネントと7つのアクションを個別で自作する」からRailsのscaffoldを自作する取り組みを進めてきました。前回は複数のデータを対象とする「index」アクション、新しくデータを登録するための「new」「create」アクションを実装しました。

 今回は既にデータベースに保存されているデータの詳細を閲覧したり、編集・削除するアクションを実装していきます。そして、自作したscaffoldの「リファクタリング」を行ってみましょう。

※編集部注

本連載はRuby on Rails 4の入門連載です。Rubyについて学びたい方は連載「若手エンジニア/初心者のためのRuby 2.1入門」をご覧ください。


特定のデータに関するscaffoldのアクション

 実際の開発現場では、データを一覧にしたり、追加し続けたりするだけではなく、すでに保存されている特定のデータに対しても操作したいと考えます。

 特定のデータとはデータベースにおけるテーブル上の1つのレコードです。より具体的に言えば、1人のユーザーの情報や、1つのアイテムの情報のことです。アプリケーションを使う上で、それらについて個別に詳しく見たり、編集したり、削除したりといった操作をすることがあります。

 前回に引き続き「book_library」を拡張し、それらの機能を作っていきましょう。

ルーティング設定でresourcesに渡すonlyオプションを外す

 事前にルーティングを設定しておきます。前回「config/routes.rb」でユーザーに関するルーティングを設定しましたが、onlyオプションで一部のアクションに限定していました。今回はユーザーのCRUD(生成、読み取り、更新、削除)機能のための全アクションを実装するので、そのオプションを外します。

 以下のように「config/routes.rb」のresourcesメソッドに:usersだけを渡すように変更してください(「#」から始まる行はコメントです)。

    BookLibrary::Application.routes.draw do
      resources :books
      # resources :users, only: %w(index new create) 前回の状態
      resources :users
    end

 これによって「rake routes」コマンドで確認すると以下のルーティングが追加されていることが分かります。

    edit_user GET    /users/:id/edit(.:format) users#edit
         user GET    /users/:id(.:format)      users#show
              PATCH  /users/:id(.:format)      users#update
              PUT    /users/:id(.:format)      users#update
              DELETE /users/:id(.:format)      users#destroy

特定のデータを閲覧する「show」アクション

 データを閲覧するためのshowアクションを実装します。showアクションでは、複数のデータを一覧するindexアクションと違い、データベース上のテーブルのある1つのレコードを指定してデータを取得します。

 「app/controllers/users_controller.rb」のUsersControllerクラスに次のメソッドを追加してください。

      def show
        @user = User.find(params[:id])
      end

「find」メソッドで特定のレコードを取得する

 モデルの「find」メソッドは、引数の値を主キーとして持っているレコードをモデルオブジェクトとして返します。ここの引数の「params[:id]」はURL中のパラメーターのidの部分に当たる値を持ち、インスタンス変数@userにはその値をidに持つUserのモデルオブジェクトが入ります。

showアクションの結果をビューに表示

 showアクションはメソッドの実行を終えると、ビューの「app/views/users/show.html.erb」をレンダリングし、レスポンスします。そこで、そのビューを次のように実装します。

    <p>
      <strong>氏名:</strong>
      <%= @user.name %>
    </p>
    <p>
      <strong>部署:</strong>
      <%= @user.department %>
    </p>

 ここで使用している@userは上のコントローラーで代入しておいたモデルオブジェクトです。氏名や部署といった文字列の後に、指定したUserオブジェクトの情報が表示されます。

「link_to」メソッドでアクションへのリンクを持たせる

 また、indexアクションのビュー(app/views/users/index.html.erb)にshowアクションへのリンクを持たせるようにしましょう。以下のようにuser.nameを「link_to」メソッドの引数にします。ついでに、ユーザーのnewアクションへのリンクも追加しておきましょう。

    <% @users.each do |user| %>
      <tr>
        <td><%= link_to user.name, user_path(user) %></td>
        <td><%= user.department %></td>
      </tr>
    <% end %>
    <%= link_to '新規ユーザ登録', new_user_path %>

 「link_to」メソッドは第1引数にアンカータグで表示する文字列、第2引数にhref属性値を渡すことでリンクを生成します。

「*_path」メソッドで主キーを含むパスを生成

 第2引数で渡している「user_path」などの「*_path」メソッドは「rake routes」コマンド出力の第1項目を接頭辞として付けることで、そのURLを生成する名前付きパスです。

 特定のデータに対するパスは引数にそのオブジェクトを渡すと、その主キーを含むパスを生成してくれます。

「show」アクションの実行確認

 それでは「http://localhost:3000/users」にアクセスし、一覧のユーザー名のリンクからそのユーザーの詳細閲覧ページに移行できることを確認しましょう。

 次にデータを編集・更新する「edit」「update」アクションを作ります。

       1|2 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

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

メールマガジン登録

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