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が実行されるようになっています。
ブラウザでユーザー一覧ページを開くと下の図のようになっています。
先ほど記述した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行を追記したところで、一度ブラウザで確認してみましょう。