速習Larave3(その6)、削除処理
タグ: Laravel3
記事の削除を実装しましょう。なにせ、最初はバリデーションを入れていませんでしたから、でたらめな記事がわんさか出来たことでしょう。見苦しい記事は無かったことにしなくてはなりません。
- ソース:github
最初に削除のためのルートを定義しましょう。post/delete/ポスト番号
です。routes.php
に付け加えてください。
// 記事削除 // フォーム表示 Route::get('/post/delete/(:num)', array('as' => 'post-delete', 'uses' => 'post@delete')); // フォーム処理 Route::post('/post/delete/(:num)', array('as' => 'post-delete', 'before' => 'csrf', 'uses' => 'post@delete'));
続いてPostコントローラーに削除処理を付け加えます。
/** * 記事削除確認表示 */ public function get_delete($id) { $post = Post::find($id); if ( $post === null ) { return Redirect::error('404'); } return view('post.delete') ->with('post', $post); } /** * 記事削除確認処理および削除 */ public function post_delete($id) { $post = Post::find($id); if ( $post === null ) { return Redirect::error('404'); } $rules = array( 'delete-confirm' => 'accepted', ); $input = Input::only(array('delete-confirm')); $val = Validator::make($input, $rules); if ( $val->passes() ) { $post->delete(); return Redirect::to_route('post-index') ->with('message', '記事を削除しました。'); } else { return Redirect::to_route('post-delete', array( $post->id )) ->with_errors($val->errors) ->with_input(); } }
なんだか入力項目名が長いですね。それには秘密があります。その秘密とは…CM2の後で!
削除の確認フォームを作成します。なにせ、いきなり削除は危ないですからね。application/views/post/delete.blade.php
です。
@layout('template') @section('title') 記事削除 @endsection @section('content') <h2>記事削除の確認</h2> <p>下記のレコードを削除します。確認してください。</p> <p>タイトル:{{ e($post->title) }}</p> <p>内容:{{ e($post->body) }}</p> <p>作成日時:{{ $post->created_at }}</p> {{ Form::open() }} <div> {{ Form::checkbox('delete-confirm', '1', Input::old('delete-confirm', '')) }} この記事を削除する </div> @if ($errors->has('delete-confirm')) <p style="color: red;">{{ $errors->first('delete-confirm') }}</p> @endif <div> {{ Form::submit('削除実行') }} </div> {{ Form::token() }} {{ Form::close() }} @endsection
削除の確認をチェックボックで行います。
削除のようにデータ破壊的なアクションを取らせる前に、慎重に考えさせるため、わざと手間を取らせるのはUIデザインの基本です。間違って削除したら、戻せませんからね。(自身がある方は、戻せるようにコーディングしてください。それもデザインの一手です。いつでも戻せるというのはユーザーに安心感を与えます。)
さて、削除はこれで出来ますが、いちいちURLを叩くのは面倒です。一覧ページからワンクリックで行えるようにしましょう。ビューの変更だけで済みますからね。index.blade.view
です。
@layout('template') @section('title') 一覧表示 @endsection @section('content') <table> <tr> <th>タイトル</th> <th>作成日</th> <th>削除</th> </tr> @foreach($posts as $post) <tr> <td>{{ HTML::link_to_route('post-show', $post->title ,array($post->id)) }}</td> <td>{{ $post->created_at }}</td> <td>{{ HTML::link_to_route('post-delete', '✖', array($post->id)) }}</td> </tr> @endforeach </table> @endsection
ようし、できました。早速動かしてみましょう。
動作には問題が無いですが、エラーメッセージには問題があります。「delete-confirmを承認してください。」ですか、そうそう、前にやりましたね。language/ja/validation.php
の中で設定するんでしたね。
- 参照:カスタムエラーメッセージ
'attributes' => array( 'title' => 'タイトル', 'body' => '本文', 'delete-confirm' => '削除', ),
これで、「削除を承認してください。」になりました。よしよし。
しかしです…もしかしたらユーザーは間違って削除実行ボタンを押しちゃったのかも知れません。Enterを叩いちゃったのかも知れません。それなのに、承認しろというメッセージはやや不親切です。ここは、オリジナルメッセージを表示しましょう。同じPHPファイルのちょっと上に、custom
という項目があります。
このcustom
には、フィールド名、続いて下線、最後にバリデーションルール名でキーを指定すると、その組み合わせのオリジナルメッセージを定義できるのです。そのために下線を使用しない、やや長い名前を付けました。短すぎる名前ですと、他のビューでも使用され、かぶってしまう可能性があります。
では、これをセットしましょう。
'custom' => array( 'delete-confirm_accepted' => '削除する場合は、チェックを入れてください。', ),
こうした文言もセンスが問われます。もちろん、あなたが良いと思うメッセージを選んでください。