Login upon signup

現在我們要讓使用者註冊完就直接被登入進網站。因為如果註冊完,還要讓使用者再執行登入其實有點奇怪。

我們要在 Users controller 的 create action 調用 log_in 方法:

app/controllers/users_controller.rb

def create
    @user = User.new(user_params)
    if @user.save
      log_in @user
      flash[:success] = "Welcome to the Sample App!"
      redirect_to @user
    else
      render 'new'
    end
  end

為了測試這個功能,我們可以在 test/integration/users_signup_test.rb 加上一行程式碼,檢查使用者是否已登入。我們可以定義一個 is_logged_in? 方法,跟之前的 logged_in? 方法一樣,如果(test 環境)session 中有使用者的 ID 就回傳 true ,反之回傳 false

test/test_helper.rb

ENV['RAILS_ENV'] ||= 'test'
.
.
.
class ActiveSupport::TestCase
  fixtures :all

  # Returns true if a test user is logged in.
  def is_logged_in?
    !session[:user_id].nil?
  end
end

我們定義的方法是 is_logged_in? 而不是 logged_in?,測試的輔助方法跟 Sessions 的輔助方法不一樣,這樣才不會混淆。

我們不能使用 current_user 輔助方法,因為輔助方法無法用在測試裡面,但 session 方法可以,所以用它來取代。

接著就可以在測試裡加上:

test/integration/users_signup_test.rb

require 'test_helper'

class UsersSignupTest < ActionDispatch::IntegrationTest
  .
  .
  .
  test "valid signup information" do
    get signup_path
    assert_difference 'User.count', 1 do
      post_via_redirect users_path, user: { name:  "Example User",
                                            email: "[email protected]",
                                            password:              "password",
                                            password_confirmation: "password" }
    end
    assert_template 'users/show'
    assert is_logged_in?
  end
end

執行測試應該能通過(Green):

$ bundle exec rake test