Ruby on Rails

【Ruby on Rails】チュートリアル 「第9章 ユーザの更新、表示、削除」をやってみた

Ruby on Rails チュートリアルの第9章のメモです。第9章では、第8章で行ったユーザの登録に加え、ユーザ情報を編集したり削除したりする機能を実装します!Webアプリケーションの基本であるRESTアーキテクチャの実装方法を学ぶことができます!

第9章 ユーザーの更新・表示・削除 | Rails チュートリアル

Railsチュートリアル第9章をやってみた

ユーザの更新

ユーザを生成するときはPOSTリクエストに応答するcreateを利用した
ユーザを更新するときはPATCHリクエストに対するupdateアクションを利用する
重要なのはユーザ情報を更新できるのはそのユーザ自身に限られるということ
WebブラウザではデフォルトでPATCHリクエストを送信できない
Railsはinputのhiddenを使ってPATCHリクエストを偽造して送信している

Railsではcreateとeditのフォームを全く同じに書くことができる

form_for(@user)で新しく生成されるユーザか基本ユーザかを判定しているから
Active Recordのnew record?論理値メソッドを使用

編集の時パスワードが入力されていない場合、更新しない

実現するためには

validates :password, allow: true

とする
空のパスワードを許可してしまうと新規登録のときに空のパスワードが有効になってしまいそうだが
has_secure_passwordがバリデーションとは別に存在性を検証してくれる
実は空のパスワードを入力すると2つのエラメッセージが出ていたバグはこれが原因

リスト9.15のテストに関して

テスト駆動型のコーディングには慣れが必要そう
特にリスト9.15らへんは難しいのでまとめておく

リスト9.15らへんのテストに関する思考ロジックまとeditアクションやupdateアクションは

editアクションやupdateアクションはログイン済みの本人ユーザしか実行できないようにする
そのために、before_actioneditupdateにはログイン済みユーザかどうか判定するlogged_in_userを実行するようにしている

9.15以前のテストコードでは、ログインしているという前提でしかテストしていない
したがって、ログインしていない場合のテストケースが抜けてしまっている

ログインチェックはコントローラで行うため、コントローラの統合テストを書く

ページネーション

1ページに全ユーザをレンダリングするのは、ユーザ数が増えた時に問題となる
ページごとに設定した数だけ表示するために方法をページネーションという
チュートリアルではwill_paginateメソッドを使用する

Railsの一覧出力におけるリファクタリングの極み

<ul class="users">
  <% @users.each do |user| %>
    <li>
      <%= gravatar_for user, size: 50 %>
      <%= link_to user.name, user %>
    </li>
  <% end %>
</ul>

これを

<ul class="users">
  <% @users.each do |user| %>
    <%= render user %>
  <% end %>
</ul>

これにリファクタリングするのはよくある話
Railsはさらに改良できて、

<ul class="users">
  <%= render @users %>
</ul>

とかける
Railsは@usersUserオブジェクトのリストであると推測する
そして、自動的にコレクションを列挙し、それぞれのブロックをパーシャル出力してくれる
とてもキレイにかけるが、慣れない!

Railsにおける管理ユーザの生成

特権を持つ管理ユーザを識別するために、論理値をとるadmin属性をUserモデルに追加する
なぜかこうするだけで、admin?メソッドが使えるようになる

Ruby on Rails チュートリアル 「第9章 ユーザの更新、表示、削除」のまとめ

  • 編集フォームからPATCHリクエストをupdateアクションに送信して情報を更新する
    • ただし、ブラウザではPATCHリクエストを送信できないから、Railsが偽装している
  • Strong Parametersを使うことで、更新するカラムを限定することができ安全に情報を更新できる
  • beforeフィルタを使用すると、アクションが実行される直前に指定したメソッドを実行できる
    • ログインチェックや権限チェックなどをするのに使われる
  • フレンドリーフォワーディングとは、ログイン成功時にもともと行きたかったページに遷移させること
  • render @usersを実行すると、各ユーザコレクションを自動的にパーシャルしてくれる
  • ユーザModelにadmin属性を追加すると、自動的にadmin?メソッドが利用できるようになる
  • fixtureファイルでも埋め込みRubyを使うことができる
    • 大量のテストユーザを作れる

もうメモする内容というよりは、ひたすらコーディングすることが多い章だった
写経するので精一杯
かかった時間は2.5時間
:destroy:deleteとしてしまって、デバッグに時間かかってしまった
Ruby on Rails チュートリアル 第9章までかかった合計時間は16時間

続きの記事はこちら!
Ruby on Rails チュートリアル 「第10章 アカウント有効化とパスワードリセット」をやってみた

Ruby on Railsのおすすめ書籍はこちら!


-Ruby on Rails