特定データに関するscaffoldアクションの実装&基礎的なリファクタリング手法:開発現場でちゃんと使えるRails 4入門(3)(1/2 ページ)
エンタープライズ領域での採用も増えてきたRuby on Railsを使ってWebアプリケーションを作るための入門連載。最新版の4に対応しています。今回は、show、edit、update、deleteアクションを個別で自作し、できたコードをフィルターや部分テンプレートでリファクタリングしよう。
前回の「scaffoldの中身を理解するためにMVCコンポーネントと7つのアクションを個別で自作する」からRailsのscaffoldを自作する取り組みを進めてきました。前回は複数のデータを対象とする「index」アクション、新しくデータを登録するための「new」「create」アクションを実装しました。
今回は既にデータベースに保存されているデータの詳細を閲覧したり、編集・削除するアクションを実装していきます。そして、自作したscaffoldの「リファクタリング」を行ってみましょう。
特定のデータに関する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」アクションを作ります。
Copyright © ITmedia, Inc. All Rights Reserved.