Rails Tutorial 第3版 第9章

Ruby on Rails チュートリアル:実例を使って Rails を学ぼう の2周目です。
第9章 ユーザーの更新・表示・削除 | Rails チュートリアル

第9章 ユーザーの更新・表示・削除

フレンドリーフォワーディングの実装(ログイン前にアクセスしたURLにログイン後に遷移する)
あたりも良いですね。

複数オブジェクトに対するpartial呼び出し

これが

<% @users.each do |user| %>
  <%= render user %>
<% end %>

こう書けます

<%= render @users %>

知らんかった。

Railsは@usersをUserオブジェクトのリストであると推測します。
さらに、ユーザーのコレクションを与えて呼び出すと、
Railsは自動的にユーザーのコレクションを列挙し、
それぞれのユーザーを_user.html.erbパーシャルで出力します

partialのloop呼び出しとか遅いかもと思って雑に計測してみると 速度的には誤差っぽい。この程度なら問題ないようです。
before

Rendered users/index.html.erb within layouts/application (8.8ms)
Rendered layouts/_shim.html.erb (0.1ms)
Rendered layouts/_header.html.erb (0.8ms)
Rendered layouts/_footer.html.erb (0.3ms)
Completed 200 OK in 91ms (Views: 89.1ms | ActiveRecord: 0.8ms)

after

  Rendered users/_user.html.erb (5.4ms)
  Rendered users/index.html.erb within layouts/application (16.0ms)
  Rendered layouts/_shim.html.erb (0.1ms)
  Rendered layouts/_header.html.erb (0.6ms)
  Rendered layouts/_footer.html.erb (0.2ms)
Completed 200 OK in 85ms (Views: 83.2ms | ActiveRecord: 0.8ms)

9.6 演習

1つ目。
演習は全てやっていますが、これで合っているかどうか不安なので、載せてみます。

test "should redirect user_path with friendly forwarding when request user_path before login" do
  get user_path(@user)
  log_in_as(@user)
  assert_redirected_to user_path(@user)
end

test "should redirect user_path without friendly forwarding when request edit before login" do
  name = "Foo Bar"
  email = "foo@bar.com"
  patch user_path(@user), user: { name: name,
    email: email,
    password: "password",
    password_confirmation: "password" }
  assert_not flash.empty?
  log_in_as(@user)
  assert_redirected_to user_path(@user)
end