Komei22 / rails-tutorial

rails-tutorialのsample_app作っていきます
0 stars 0 forks source link

ch11.3.3演習 #79

Closed Komei22 closed 7 years ago

Komei22 commented 7 years ago

演習1

リスト 11.35にあるactivateメソッドはupdate_attributeを2回呼び出していますが、これは各行で1回ずつデータベースへ問い合わせしていることになります。リスト 11.39に記したテンプレートを使って、update_attributeの呼び出しを1回のupdate_columns呼び出しにまとめてみましょう (これでデータベースへの問い合わせが1回で済むようになります)。また、変更後にテストを実行し、 greenになることも確認してください。

  def activate
    update_columns(activated: true, activated_at: Time.zone.now)
  end

テスト結果

16:49:48 - INFO - Running: test/models/user_test.rb
Started with run options --seed 34242

  10/10: [=======================================================================] 100% Time: 00:00:00, Time: 00:00:00

Finished in 0.55004s
10 tests, 19 assertions, 0 failures, 0 errors, 0 skips

演習2

現在は、/usersのユーザーindexページを開くとすべてのユーザーが表示され、/users/:idのようにIDを指定すると個別のユーザーを表示できます。しかし考えてみれば、有効でないユーザーは表示する意味がありません。そこで、リスト 11.40のテンプレートを使って、この動作を変更してみましょう9。なお、ここで使っているActive Recordのwhereメソッドについては、13.3.3でもう少し詳しく説明します。

  def index
    @users = User.where(activated: true).paginate(page: params[:page])
  end

  def show
    @user = User.find(params[:id])            
    # ユーザが有効でなかったらroot_urlに飛ばしてreturn
    redirect_to root_url and return unless @user.activated?
  end

演習3

ここまでの演習課題で変更したコードをテストするために、/users と /users/:id の両方に対する統合テストを作成してみましょう。

/usersに対するテスト:users_index_test.rb

  def setup
    @admin = users(:michael)
    @non_admin = users(:archer)
  end
.
.
.
  test "index should only show activated users" do
    log_in_as(@non_admin)
    get users_path
    assigns(:users).each do |user|
      assert user.activated?
    end
  end

/user/:idに対するテスト:users_show_test.rb

class UsersShowTest < ActionDispatch::IntegrationTest
  def setup
    @user = users(:archer)
    @non_activated_user = users(:lana)
  end

  test "show should display root_url when non-activated user" do
    log_in_as(@user)
    get user_path(@non_activated_user)
    assert_redirected_to root_url
  end
end