Ruby on Rails Tutorial【第6版】 をテキスト通りにやっていて少しハマった箇所がありましたので共有します。
リスト10.33のテストが通りませんでした。原因は2つありました。
##原因1
リスト10.30でメソッドの定義の順番が逆だったことでリダイレクトが上手くできていませんでした。正しくは以下です。
sessions_helper.rb
module SessionsHelper
#(中略)
#アクセスしようとしたURLを覚えておく
def store_location
session[:forwarding_url] = request.original_url if request.get?
end
#記憶したURL(もしくはデフォルト値)にリダイレクト
def redirect_back_or(default)
redirect_to(session[:forwarding_url] || default)
session.delete(:forwarding_url)
end
end
##原因2
リスト10.32でuser変数と@user変数を混同して使っていました。リスト9.27の演習でassignsメソッドを使ってテストコードの改善をした人は次のように書いてください。
sessions_controller.rb
class SessionsController < ApplicationController
def new
end
def create
@user = User.find_by(email: params[:session][:email].downcase)
if @user&.authenticate(params[:session][:password])
log_in @user
params[:session][:remember_me] == '1' ? remember(@user) : forget(@user)
redirect_back_or @user
else
flash.now[:danger] = 'Invaid email/password combination' # 本当は正しくない
render 'new'
end
end
def destroy
log_out if logged_in?
redirect_to root_url
end
end