さて、引き続き電話帳アプリを作っていきます。前々回までで一覧画面、新規作成画面、編集画面ができました。
今回は、リソースの削除機能を実装します。
スポンサーリンク
削除処理のルーティングを確認する
まずルーティングを確認してみましょう。
| 1 | $ rails routes | 
| 1 2 3 4 5 6 7 8 9 | Prefix      Verb   URI Pattern                 Controller#Action members     GET    /members(.:format)          members#index             POST   /members(.:format)          members#create new_member  GET    /members/new(.:format)      members#new edit_member GET    /members/:id/edit(.:format) members#edit member      GET    /members/:id(.:format)      members#show             PATCH  /members/:id(.:format)      members#update             PUT    /members/:id(.:format)      members#update             DELETE /members/:id(.:format)      members#destroy | 
9行目がmemberリソースの削除用に用意されたリクエストです。
 見ての通り、
 メソッドはDELETE
 urlは/members/:id
 となっています。
 つまり、ID1番のmemberリソースを削除したい場合は、/members/1へとdeleteメソッドによるhttpリクエストを送ればいいというわけです。
 ※もちろん削除処理自体は自分で書く必要があります。
スポンサーリンク
削除リクエストを送るリンクを作る
まず削除リクエストを送るためのリンクを作ります。ボタンにしてもいいのですが、ここでは普通のリンクにします。
削除は一覧画面ではなく、各編集画面からできるようにしたいと思います。
views/members/edit.html.erbを開いて、5行目を挿入して下さい。
| 1 2 3 4 5 6 | <h2>編集</h2> <%= render "form" %> <%= link_to "削除する", member_path(@member.id), method: :delete %> <%= link_to "戻る", members_path %> | 
link_toメソッドを使ってaタグを出力しています。結果的に、以下のaタグが出力されることになります。
| 1 | <a rel="nofollow" data-method="delete" href="/members/1">削除する</a> | 
おさいになりますが、link_toメソッドの第一引数にアンカーテキストを、第二引数にリンク先urlを渡すことで、aタグを出力しています。
| 1 | <%= link_to "text", "url" %> | 
出力↓↓
| 1 | <a href="url">text</a> | 
 上記の削除リンクについては引数が1つ増えています。第三引数以降はオプションで、キーを指定した上でその値を渡します。
 ※指定できるオプションは他にもあります。詳しくは→link_to – リファレンス – – Railsドキュメント
| 1 | <%= link_to "text", "url", method: :delete %> | 
出力↓↓
| 1 | <a rel="nofollow" data-method="delete" href="url">text</a> | 
 この場合、aタグにdata-method="delete"という属性が追加されているのが分かると思います。
 ※rel="nofollow"も自動的に追記されています。
これで各編集画面に、削除リクエストを送るボタン(というかリンク)が出来ました。

destroyアクションを追加して削除処理を実装する
この削除リクエストに反応するのが、destroyアクションです。ルーティングを確認してください。
| 1 2 3 4 5 6 7 8 9 | Prefix      Verb   URI Pattern                 Controller#Action members     GET    /members(.:format)          members#index             POST   /members(.:format)          members#create new_member  GET    /members/new(.:format)      members#new edit_member GET    /members/:id/edit(.:format) members#edit member      GET    /members/:id(.:format)      members#show             PATCH  /members/:id(.:format)      members#update             PUT    /members/:id(.:format)      members#update             DELETE /members/:id(.:format)      members#destroy | 
membersコントローラーにdestroyアクションを追加して、リソースをDBから削除する処理を実装しましょう。
/app/controllers/members_controller.rbを開いて下さい。
destroyアクションを追加します。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | class MembersController < ApplicationController   def index     @members = Member.all   end   def new     @member = Member.new   end   def create     @member = Member.new(member_params)     @member.save     redirect_to members_path   end   def edit     @member = find_member_by_id   end   def update     @member = find_member_by_id     @member.update(member_params)     redirect_to members_path   end   def destroy   end   private   def member_params     params.require(:member).permit(:name, :yomi, :phone)   end   def find_member_by_id     Member.find(params[:id])   end end | 
その中で、リクエストパラメータに含まれるIDから該当のMemberオブジェクト(モデル)を作って、destroyメソッドで削除してしまいます。
| 1 2 3 4 | def destroy   @member = find_member_by_id   @member.destroy end | 
注)このdestroyメソッドはモデルクラスが持つインスタンスメソッドであって、destroyアクションとは全然別物なので混同しないように。
たったこれだけの表記で、テーブルから該当の一行(一人のデータ)を削除してしまえるんです。Railsって楽ちんです。
削除するだけでは、その後表示する画面がなくてエラーになるので、一覧画面へとリダイレクトを行ってdestroyアクション終了です。
| 1 2 3 4 5 | def destroy   @member = find_member_by_id   @member.destroy   redirect_to members_path end | 
確認ダイアログを出す
これで削除するのリンクをクリックすれば、そのmemberリソースを削除することができるようになりました。
が、削除する場合、確認ダイアログを出してあげた方が親切です。

なので、削除するリンクをクリックした際に、まずこの確認ダイアログが表示し、OKをクリックして初めて削除処理が走るようにしましょう。
views/members/edit.html.erbを開いて下さい。
いちいちJavascriptを書くのは面倒ですが、Railsならめちゃ簡単です。なんとlink_toメソッドにもう一つオプションを追加するだけで出来ます。
| 1 | <%= link_to "削除する", member_path(@member.id), method: :delete, data: {confirm: "本当に削除しますか?"} %> | 
これだけです。
 第四引数に
 data: {confirm: “本当に削除しますか?”}
 を渡すだけで、確認ダイアログ用のJavascriptを出力してくれます。
これで削除処理も完成です。


 
 
 
 