Ruby on Rails チュートリアルの第9章のメモです。第9章では、第8章で行ったユーザの登録に加え、ユーザ情報を編集したり削除したりする機能を実装します!Webアプリケーションの基本であるRESTアーキテクチャの実装方法を学ぶことができます!
第9章 ユーザーの更新・表示・削除 | Rails チュートリアル
ユーザの更新
ユーザを生成するときは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_action
でedit
とupdate
にはログイン済みユーザかどうか判定する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は@users
をUser
オブジェクトのリストであると推測する
そして、自動的にコレクションを列挙し、それぞれのブロックをパーシャル出力してくれる
とてもキレイにかけるが、慣れない!
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のおすすめ書籍はこちら!