前提・実現したいこと
Failure:
PasswordResetsTest#test_password_resets [/home/ubuntu/environment/sample_app/test/integration/password_resets_test.rb:40]:
expecting <"password_resets/edit"> but rendering with <[]>
とエラーが出ました
該当のソースコード
ruby
1class PasswordResetsController < ApplicationController 2 before_action :get_user, only: [:edit,:update] 3 before_action :valid_user,only: [:edit,:update] 4 before_action :check_expiration, only: [:edit,:update] 5 def new 6 end 7 8 def create 9 # パスワードの再設定をしたいと言うことはもうすでに 10 # DBのなかにemailがあるはずなので、(email: params[:password_reset][:email 11 # で受け取ったemailをそのまま検索かける 12 @user = User.find_by(email: params[:password_reset][:email].downcase) 13 if @user 14 # もしユーザーがいたら 15 @user.create_reset_digest 16 @user.send_password_reset_email 17 flash[:info] = "Email sent with password reset instructions" 18 redirect_to root_url 19 else 20 flash.now[:danger] = "Email address not found" 21 render 'new' 22 end 23 end 24 25 def edit 26 end 27 28 def update 29 if params[:user][:password].empty? 30 @user.errors.add(:password,:blank) 31 render 'edit' 32 elsif @user.update(user_params) 33 log_in @user 34 flash[:success] = "Password has been reset" 35 redirect_to @user 36 else 37 render 'edit' 38 end 39 end 40 41 private 42 43 def user_params 44 params.require(:user).permit(:password,:password_confirmation) 45 end 46 47 def get_user 48 @user = User.find_by(email: params[:mail]) 49 end 50 51 def valid_user 52 unless @user && @user.activated? && 53 @user.authenticate?(:reset,params[:id]) 54 redirect_to root_url 55 end 56 end 57 58 def check_expiration 59 if @user.password_reset_expired? 60 flash[:danger] = "Password reset has expired." 61 redirect_to new_password_reset_url 62 end 63 end 64end
ruby
1require 'test_helper' 2 3class PasswordResetsTest < ActionDispatch::IntegrationTest 4 5 def setup 6 ActionMailer::Base.deliveries.clear 7 @user = users(:harasou) 8 end 9 10 test "password resets" do 11 get new_password_reset_path 12 assert_template 'password_resets/new' 13 assert_select 'input[name=?]', 'password_reset[email]' 14 # メールアドレスが無効 15 post password_resets_path, params: { password_reset: { email: "" } } 16 assert_not flash.empty? 17 assert_template 'password_resets/new' 18 # メールアドレスが有効 19 post password_resets_path, 20 params: { password_reset: { email: @user.email } } 21 assert_not_equal @user.reset_digest, @user.reload.reset_digest 22 assert_equal 1, ActionMailer::Base.deliveries.size 23 assert_not flash.empty? 24 assert_redirected_to root_url 25 # パスワード再設定フォームのテスト 26 user = assigns(:user) 27 # メールアドレスが無効 28 get edit_password_reset_path(user.reset_token, email: "") 29 assert_redirected_to root_url 30 # 無効なユーザー 31 user.toggle!(:activated) 32 get edit_password_reset_path(user.reset_token, email: user.email) 33 assert_redirected_to root_url 34 user.toggle!(:activated) 35 # メールアドレスが有効で、トークンが無効 36 get edit_password_reset_path('wrong token', email: user.email) 37 assert_redirected_to root_url 38 # メールアドレスもトークンも有効 39 40# ここの部分でテストが上手くいきません 41# ここの部分でテストが上手くいきません 42# ここの部分でテストが上手くいきません 43 get edit_password_reset_path(user.reset_token, email: user.email) 44 assert_template 'password_resets/edit' 45 assert_select "input[name=email][type=hidden][value=?]", user.email 46 # 無効なパスワードとパスワード確認 47 patch password_reset_path(user.reset_token), 48 params: { email: user.email, 49 user: { password: "foobaz", 50 password_confirmation: "barquux" } } 51 assert_select 'div#error_explanation' 52 # パスワードが空 53 patch password_reset_path(user.reset_token), 54 params: { email: user.email, 55 user: { password: "", 56 password_confirmation: "" } } 57 assert_select 'div#error_explanation' 58 # 有効なパスワードとパスワード確認 59 patch password_reset_path(user.reset_token), 60 params: { email: user.email, 61 user: { password: "foobaz", 62 password_confirmation: "foobaz" } } 63 assert is_logged_in? 64 assert_not flash.empty? 65 assert_redirected_to user 66 end 67end
ruby
1# user.rb 2class User < ApplicationRecord 3 attr_accessor :remember_token, :activation_token, :reset_token 4 before_save :downcase_email 5 before_create :create_activation_digest 6 validates :name, presence: true, length: { maximum: 50 } 7 VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+.[a-z]+\z/i 8 validates :email, presence: true, length: { maximum: 255 }, 9 format: { with: VALID_EMAIL_REGEX }, 10 uniqueness: { case_sensitive: false } 11 has_secure_password 12 validates :password, presence: true, length: { minimum: 6 }, allow_nil: true 13 14 # 渡された文字列のハッシュ値を返す 15 def User.digest(string) 16 cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : 17 BCrypt::Engine.cost 18 BCrypt::Password.create(string, cost: cost) 19 end 20 21 # ランダムなトークンを返す 22 def User.new_token 23 SecureRandom.urlsafe_base64 24 end 25 26 # 永続セッションのためにユーザーをデータベースに記憶する 27 def remember 28 self.remember_token = User.new_token 29 update_attribute(:remember_digest, User.digest(remember_token)) 30 end 31 32 # 渡されたトークンがダイジェストと一致したらtrueを返す 33 def authenticate?(attribute, token) 34 digest = send("#{attribute}_digest") 35 # 渡された属性によってなんのダイジェストを一致させるか 36 # 判別 37 # 渡された属性によって、digestの名前が変わる 38 return false if digest.nil? 39 BCrypt::Password.new(digest).is_password?(token) 40 end 41 42 # ユーザーのログイン情報を破棄する 43 def forget 44 update_attribute(:remember_digest, nil) 45 end 46 47 # アカウントを有効にする 48 def activate 49 update_attribute(:activated, true) 50 update_attribute(:activated_at, Time.zone.now) 51 end 52 53 # 有効化用のメールを送信する 54 def send_activation_email 55 UserMailer.account_activation(self).deliver_now 56 end 57 58 59 60 # メールアドレスをすべて小文字にする 61 def downcase_email 62 self.email = email.downcase 63 end 64 65 # 有効化トークンとダイジェストを作成および代入する 66 def create_activation_digest 67 self.activation_token = User.new_token 68 self.activation_digest = User.digest(activation_token) 69 end 70 71 72 def send_activation_email 73 UserMailer.account_activation(self).deliver_now 74 end 75 76 def create_reset_digest 77 # railsが発行したトークンをユーザーの 78 # emailに送りつけて、そのリンクの中に入ってる 79 # トークンとカラムに入ってるハッシュ化されたトークンが 80 # 一致したらパスワード再設定してあげますよ 81 # みたいな感じなので、まずはハッシュ化した 82 # トークンを:reset_digestにいれる 83 self.reset_token = User.new_token 84 update_attribute(:reset_digest, User.digest(reset_token)) 85 update_attribute(:reset_sent_at, Time.zone.now) 86 end 87 88 def send_password_reset_email 89 UserMailer.password_reset(self).deliver_now 90 # 名前の通りユーザーにパスワードリセットに 91 #関するメールを送る 92 end 93 94 # パスワード再設定の期限内だったらtrueを返す 95 # 96 def password_reset_expired? 97 self.reset_sent_at < 2.hours.ago 98 end 99 100end
試したこと
renderが上手くいかないのでコントローラーを注視しましたが問題となる点は見受けられませんでした。
同じような人を探そうと思い
expecting <"password_resets/edit"> but rendering with <[]>
で検索しましたが上位3記事とも
ruby
1 def create_reset_digest 2 # railsが発行したトークンをユーザーの 3 # emailに送りつけて、そのリンクの中に入ってる 4 # トークンとカラムに入ってるハッシュ化されたトークンが 5 # 一致したらパスワード再設定してあげますよ 6 # みたいな感じなので、まずはハッシュ化した 7 # トークンを:reset_digestにいれる 8 self.reset_token = User.new_token 9 update_attribute(:reset_digest, User.digest(reset_token)) 10 update_attribute(:reset_sent_at, Time.zone.now) 11 end
ここの間違いでした。
しかし自分のここの部分のコードに不備は見受けられませんでした。
補足情報(FW/ツールのバージョンなど)
cloud9
ruby 2.6.3
rails 6.0.0
自分は学習4ヶ月目のひよこです
あなたの回答
tips
プレビュー