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