らくだ🐫にもできるRailsチュートリアル|10.4(と10.5)

10.4 ユーザーを削除する

RESTに準拠した正統なアプリケーションとなる為に、最後の一つ、destroy機能を実装していく!
削除権限を持つ管理 (admin)ユーザーのクラスを作成し→ユーザーを削除するためのリンクを追加し→destroyアクションを実装する
見本はこちら→RoRT本文

10.4.1 管理ユーザー

論理値をとるadmin属性をUserモデルに追加する → 自動的に論理値を返すadmin?メソッドも使えるようになる → 管理ユーザーの状態をテストできる

admin属性をUserモデルに追加

属性の型をbooleanと指定してマイグレートファイルを作る
boolean型 → 論理値を取る型

usersテーブルにadminカラムを追加するためのマイグレートファイルが生成されたので
default: falseという引数を追加する

これは、デフォルトでは管理者になれないということを示すためです (default: false引数を与えない場合、 adminの値はデフォルトでnilになりますが、これはfalseと同じ意味ですので、必ずしもこの引数を与える必要はありません。ただし、このように明示的に引数を与えておけば、コードの意図をRailsと開発者に明確に示すことができます)。

実は結構重要なのできっちり指定が吉との事(言語・DBによってNull/True/Falseの解釈が違ったりするから)

→マイグレーションの実行

10.3で作ったサンプルデータを
最初のユーザーがデフォルトで管理者になるように変更する

データベースのリセットと再生成

Strong Parameters、再び

例えば下記のようなPATCHリクエストを送信されたら?

17番目のユーザーが管理者に変更されてしまう!コワイ!!
危ない危険を防ぐ為に編集してもよい安全な属性だけが更新できるように指定する!
7.3.2と同じくStrong Parametersを使って対策する。

これにより、任意のユーザーが自分自身にアプリケーションの管理者権限を与えることを防止できます。

これはとても大切な問題なので編集可能になってはならない属性に対するテストを行う!(演習でやる)

演習

  1. Web経由でadmin属性を変更できないことを確認してみましょう。具体的には、リスト 10.56に示したように、PATCHを直接ユーザーのURL (/users/:id) に送信するテストを作成してみてください。テストが正しい振る舞いをしているかどうか確信を得るために、まずはadminをuser_paramsメソッド内の許可されたパラメータ一覧に追加するところから始めてみましょう。最初のテストの結果は redになるはずです。

/sample_app/test/controllers/users_controller_test.rbにテストを追加

usersコントローラーのuser_paramsメソッド内にadminを追加するとRED、削除(元に戻す)とGREENになる

10.4.2 destroyアクション

削除機能を完成させる

destroyアクションへのリンクを追加

ユーザー一覧ページに削除用のリンクを表示させる

ログインしているユーザーが管理者の場合のみ削除用リンクが表示される
(管理者自身のユーザー情報には削除用リンクは表示されない)

ブラウザはネイティブではDELETEリクエストを送信できないため、RailsではJavaScriptを使って偽造します。つまり、JavaScriptがオフになっているとユーザー削除のリンクも無効になるということです。JavaScriptをサポートしないブラウザをサポートする必要がある場合は、フォームとPOSTリクエストを使ってDELETEリクエストを偽造することもできます。こちらはJavaScriptがなくても動作します

RailsCastの “JavaScriptを使わない削除” (英語サイト)

destroyアクションの実装

destroyアクションでは

  1. 該当するユーザーを見つける
  2. (Active Recordの)destroyメソッドを使って削除
  3. ユーザー一覧へリダイレクト

ユーザーを削除するためには(管理者として)ログインしていることが必須なので
:destroyアクションもlogged_in_userフィルターに追加する

destroyアクションへのアクセス制御

destroyアクションには管理者だけがアクセスできるようにする

演習

  1. 管理者ユーザーとしてログインし、試しにサンプルユーザを2〜3人削除してみましょう。ユーザーを削除すると、Railsサーバーのログにはどのような情報が表示されるでしょうか?

10.4.3 ユーザー削除のテスト

ユーザーを削除するといった重要な操作については、期待された通りに動作するか確かめるテストを書くべきです。

超大事!と言うこと。
準備としてサンプルユーザーの一人を管理者にする。

アクション単位での削除機能のテスト

アクション単位→コントローラーテスト

ここでは管理者ではないユーザーのふるまいについてテストしている
→管理者ユーザーのふるまいと一緒にテストできるともっと良い!

管理者であればユーザー一覧画面に削除リンクが表示される仕様を利用して、リスト 10.48のテスト(users_index_test.rb)に今回のテストを追加していくことにします。

  1. DELETEリクエストを適切なURLに向けて発行
  2. User.countを使ってユーザー数が1減ったか

演習

動作確認のみにて省略

10.5 最後に

5.4でUsersコントローラをご紹介して以来、長い道のりをたどってきました。あの頃はユーザー登録すらありませんでしたが、今は登録もログインもログアウトもできます。プロフィールの表示も、設定の編集も、すべてのユーザーの一覧画面もあります。さらに、一部のユーザーは他のユーザーを削除することすらできるようになりました。

まじで長かった!がんばったね!!

章の終わりには

テストしてaddしてcommitしてbranchにpushしてGitHubで自分にプルリクしてmergeして戻ってmasterにcheckoutしてpullする

デプロイ!

実際のWebサイトではサンプルデータを生成したくないという人もいるかと思いますが、これには理由があります (図 10.16)。それは、図 10.16が示すように、サンプルユーザーの表示順序が変化してしまい、図 10.11にあるようなローカル環境での表示順序と異なってしまうことです。これは現時点ではまだデフォルトの表示順序が指定されていないことが原因です。結果として、データベースの内容に応じて表示順序が異なってしまいます。

図に関してはRoRT本文参照でヒトツ。

これはデフォルトの表示順序が指定されていないことが原因ということで、13.1.4で解決していくとの事。

まとめとか感想

上でもちょっと触れられてるけど、user関連長かったね!
でももうちょっとだけ続くんじゃ(メール認証と再設定)

らくだ🐫にもできるRailsチュートリアルとは

「ド」が付く素人のらくだ🐫が勉強するRailsチュートリアルの学習記録です。
自分用に記録していますが、お役に立つことがあれば幸いです。

調べたとはいえらくだ🐫なりの解釈や説明が含まれます。間違っている部分もあるかと思います。そんな所は教えて頂けますと幸いなのですが、このブログにはコメント機能がありません💧お手数おかけしますがTwitterなどでご連絡いただければ幸いです