質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

0回答

806閲覧

expecting <"password_resets/edit"> but rendering with <[]>

divclass123

総合スコア35

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

0クリップ

投稿2020/10/29 02:33

前提・実現したいこと

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ヶ月目のひよこです

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問