作って学ぶRuby on Rails Vol.20 削除機能を実装しよう!


作って学ぶRuby on Rails Vol.20 削除機能を実装しよう!
目次
  1. Modelを利用したCRUD(Delete編)

Modelを利用したCRUD(Delete編)

までに、Modelを利用したCRUDのC,R,Uについて学習してきました。本項では、DであるDelete(データの削除)を実装していきます。前項

ユーザー一覧から対象のユーザー情報を削除する機能を実装していきます。

app/views/users/index.html.erbを開き、tdタグを追加し、下記のコードを記述して下さい。

link_toメソッドは前項までに学習しており、記述としてはユーザーの詳細情報ページへのリンクの作成と似ていますが、第3引数にmethodを指定しているところが異なります。

前項までに、サーバーへのリクエスト方式としてgetというのを学習していますが、今回はgetではなくdeleteを指定しています。link_toメソッドではmethodの項目を指定しない(デフォルトの状態)ではgetとしてaタグが作成されますが、methodを指定することで指定された方式でサーバーへリクエストすることが可能です。


<h1>ユーザー一覧</h1>
 <div class="profile_list">
  <table>
  <theader>
  <tr>
  <th>名前</th><th>性別</th><th>生年月日</th><th>出身</th><th>編集</th><th>削除</th>
  </tr>
  </theader>
  <tbody>
  <% @users.each do |user| %>
  <tr>
  <td>
  <%= link_to user.name, user_path(user) %>
  </td>
  <td>
  <%= user.gender %>
  </td>
  <td>
  <%= user.birthday %>
  </td>
  <td>
  <%= user.hometown %>
  </td>
  <td>
  <%= link_to "編集", edit_user_path(user) %>
  </td>
  <td>
  <%= link_to "削除", user_path(user), :method => :delete %>
  </td>
  </tr>
  <% end %>
  </tbody>
  </table>
</div>

config/routes.rbでresourceと指定した場合は、deleteでリクエストを行った場合、自動的にdestroyというActionが実行されるようになっています。

ブラウザでユーザー一覧ページを開くと下の図のようになっています。

Ruby_on_Rails_5-5-1

先ほど記述したlink_toメソッドにより生成されたaタグは下記のようになります。

link_toにより生成されたaタグ

hrefにはリンク先のURL(パラメータとしてユーザーIDが付加されている)とdata-method(リクエスト方式)が生成されていることがわかります。

rel=”nofollow”とはrel=”nofollow”という記述については、Google等の検索エンジンからのクローラーに誤ってリンクを踏ませないようにする記述です。クローラーについてはここでは解説いたしませんが、この記述が無いと知らない間にユーザーが削除されていたということになりかねません。RubyonRailsのlink_toメソッドではこの記述を自動付加することだけ頭に入れておいてください。

現状ではdestroyというActionには何も記述していないのでリンクをクリックすると、Viewが存在しないというエラーになってしまいます。

続いて、Actionの内容を記述していきます。

app/controllers/users_controller.rbを開いて、destroyというAction内に下記の3行を記述してください。

@user.destroyredirect_tousers_path

上記コードの意味としては、

1行目:パラメータとして受け取ったユーザーidを元にUserというModelを利用してusersテーブルからユーザー情報を取得し、@userというインスタンス変数に格納します。

2行目:@userに格納されたユーザー情報を削除します。Modelに実装されているdestroyというメソッドを実行することで削除することができます。

3行目:redirect_toメソッドは、どのViewを表示するかを指定しています。users_pathと指定しているので、indexというActionが実行され、app/views/users/index.html.erbを表示します。このように、Actionから明示的に呼び出すViewを指定することができるので覚えておきましょう。


class UsersController < ApplicationController
  # 初期表示
  def index
  @users = User.all
  end
  # データを閲覧する画面を表示するためのAction
  def show
  @user = User.find(params[:id])
  end
  # データを作成する画面を表示するためのAction
  def new
  @user = User.new
  end
  # データを更新する画面を表示するためのAction
  def edit
  @user = User.find(params[:id])
  end
  # データを作成するためのAction
  def create
  @user = User.new(user_params)
  @user.save
  redirect_to @user
  end
  # データを更新するためのAction
  def update
  @user = User.find(params[:id])
  @user.update_attributes(user_params)
  redirect_to @user
  end
  # データを削除するためのAction
  def destroy
  @user = User.find(params[:id])
  @user.destroy
  redirect_to users_path
  end

  def user_params
  params.require(:user).permit(:name, :gender, :birthday, :hometown, :remarks)
  end
end

3行を追記したところで、一度ブラウザで確認してみましょう。

NEXTLESSON検索機能を盛り込もう!検索機能を盛り込もう!

PREVLESSONパーシャルを活用しよう!パーシャルを活用しよう!

目次-Ruby&RubyonRailsテキスト目次目次-Ruby&RubyonRailsテキスト目次


CodeCampus編集部
この記事を書いた人
CodeCampus編集部
まずは7日間お試し!人気プログラミング講座を無料公開中
オンライン・プログラミングレッスンNo.1のCodeCamp