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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

602閲覧

「アカウントの有効化」ができなくて困っています(railsチュートリアル10)

jagaimo0

総合スコア33

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2022/07/16 10:20

困っていること

アカウントの有効化ができなくて困っています。
user.authenticated?がfalseを返しているみたいです。

該当のソースコード

user.rb

1class User < ApplicationRecord 2 # アクセス可能な属性を作成 ( 永続トークン + 有効化トークン) 3 attr_accessor :remember_token, :activation_token 4 before_save :downcase_email 5 before_create :create_activation_digest 6 validates :name, presence: true, length: { maximum: 50 } 7 8 # 属性の存在性検証 9 before_save { self.email = email.downcase } # 小文字変換 10 validates :name, presence: true, length: { maximum: 30 } 11 VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i # メールアドレスパターン 12 validates :email, presence: true, length: { maximum: 50 }, 13 format: { with: VALID_EMAIL_REGEX }, # フォーマットチェック 14 uniqueness: { case_sensitive: false } # 一意性 15 # パスワード 16 has_secure_password 17 # nilを許すことにより編集できる (has_secureで存在性チェックを通すためpasswordがnilで登録できるわけではない) 18 validates :password, presence: true, length: { minimum: 6 }, allow_nil: true 19 20 # 与えられた文字列のハッシュ値を返す 21 def User.digest(string) 22 cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : BCrypt::Engine.cost 23 BCrypt::Password.create(string, cost: cost) 24 end 25 26 # ランダムなトークンを返す 27 def User.new_token # 記憶トークンの作成 => ユーザと関連付け => ハッシュ値をDBに保存 28 SecureRandom.urlsafe_base64 # 長さ22かつ64種類 29 end 30 31 # ユーザの記憶処理 32 def remember 33 # ユーザの記憶トークン属性を設定(selfがないとローカル変数になってしまう) 34 self.remember_token = User.new_token 35 update_attribute(:remember_digest, User.digest(remember_token)) # 記憶ダイジェストを更新 => DBに保存 36 # => 永続cookiesに保存 37 # => 永続セッションの作成 38 # => ログイン情報保持 39 end 40 41 # アカウントを有効にする 42 def activate 43 update_attribute(:activated, true) 44 update_attribute(:activated_at, Time.zone.now) 45 end 46 47 # 有効化用のメールを送信する 48 def send_activation_email 49 UserMailer.account_activation(self).deliver_now 50 end 51 52 # トークンがダイジェストと一致したらtrueを返す 53 def authenticated?(attribute, token) # attribute: 状態, token: 記憶トークン 54 digest = send("#{attribute}_digest") # sendしてメソッド呼び出しに名前を付ける 55 return false if digest.nil? 56 BCrypt::Password.new(digest).is_password?(token) 57 #pass = BCrypt::Password.create(digest) 58 #pass.is_password?(token) 59 end 60 61 # ユーザーログインを破棄する 62 def forget 63 update_attribute(:remember_digest, nil) # 記憶ダイジェストをnilに 64 end 65 66 67 private 68 69 # メールアドレスをすべて小文字にする 70 def downcase_email 71 self.email = email.downcase 72 end 73 74 # 有効化トークンとダイジェストを作成および代入する 75 def create_activation_digest 76 self.activation_token = User.new_token 77 self.activation_digest = User.digest(activation_token) 78 end 79 80end

account_activations_controller.rb

users_controller.rb

1class UsersController < ApplicationController 2 #loginユーザのみeditとupdateを許す 3 before_action :logged_in_user, only: [:index, :edit, :update, :delete] 4 #currentユーザのみeditとupdateを許す(自分の情報のみ) 5 before_action :correct_user, only: [:edit, :update] 6 before_action :admin_user, only: :destroy 7 8 # GET /users or /users.json 9 def index 10 @users = User.paginate(page: params[:page], per_page: 3) # page単位で取り出す 11 end 12 13 # GET /users/1 or /users/1.json 14 def show 15 @user = User.find(params[:id]) 16 end 17 18 # GET /users/new 19 def new 20 @user = User.new 21 end 22 23 # GET /users/1/edit 24 def edit 25 @user = User.find(params[:id]) 26 end 27 28 # POST /users or /users.json 29 # Sign Up 30 def create 31 @user = User.new(user_params) 32 33 if @user.save # 成功時 34 @user.send_activation_email 35 flash[:info] = "アカウントを有効化するためにメールをチェックしてください。" 36 redirect_to root_url 37 else # 失敗時 38 render 'new', status: :unprocessable_entity 39 end 40 end 41 42 # PATCH/PUT /users/1 or /users/1.json 43 def update 44 @user = User.find(params[:id]) 45 46 if @user.update(user_params) # 更新成功時 47 flash[:success] = "Profile updated" 48 redirect_to @user 49 else # 失敗時 50 render 'edit', status: :unprocessable_entity 51 end 52 end 53 54 # DELETE /users/1 or /users/1.json 55 def destroy 56 User.find(params[:id]).destroy 57 flash[:success] = "ユーザーは削除されました" 58 redirect_to users_url 59 end 60 61 private 62 # Use callbacks to share common setup or constraints between actions. 63 def set_user 64 @user = User.find(params[:id]) 65 end 66 67 # Only allow a list of trusted parameters through. 68 def user_params 69 # adminはpermitしない 70 params.require(:user).permit(:name, :email, :password, :password_confirmation) 71 end 72 73 # ログイン済みユーザーかどうか確認 74 def logged_in_user 75 unless logged_in? 76 store_location # 飛ぼうとしたページを取得 77 flash[:danger] = "ログインしてください" 78 redirect_to login_url 79 end 80 end 81 82 # 正しいユーザーかどうか確認 83 def correct_user 84 @user = User.find(params[:id]) 85 redirect_to(root_url) unless current_user?(@user) # 正しいユーザかどうか 86 end 87 88 private 89 90 # メールアドレスをすべて小文字にする 91 def downcase_email 92 self.email = email.downcase 93 end 94 95 # 有効化トークンとダイジェストを作成および代入する 96 def create_activation_digest 97 self.activation_token = User.new_token 98 self.activation_digest = User.digest(activation_token) 99 end 100end 101

user_mailer.rb

1class UserMailer < ApplicationMailer 2 # アカウント有効化 3 def account_activation(user) 4 @user = user 5 mail to: user.email, subject: "アカウント有効化" 6 end 7end

application_mailer.rb

1class ApplicationMailer < ActionMailer::Base 2 default from: "noreply@example.com" 3 layout "mailer" 4end

account_activation.text.erb

user_mailer_preview.rb

1# Preview all emails at http://localhost:3000/rails/mailers/user_mailer 2class UserMailerPreview < ActionMailer::Preview 3 4 # Preview this email at http://localhost:3000/rails/mailers/user_mailer/account_activation 5 def account_activation 6 user = User.first 7 user.activation_token = User.new_token 8 UserMailer.account_activation(user) 9 end 10end

development.rb

1require "active_support/core_ext/integer/time" 2 3Rails.application.configure do 4 # Settings specified here will take precedence over those in config/application.rb. 5 6 # In the development environment your application's code is reloaded any time 7 # it changes. This slows down response time but is perfect for development 8 # since you don't have to restart the web server when you make code changes. 9 config.cache_classes = false 10 11 # Do not eager load code on boot. 12 config.eager_load = false 13 14 # Show full error reports. 15 config.consider_all_requests_local = true 16 17 # Enable server timing 18 config.server_timing = true 19 20 # Enable/disable caching. By default caching is disabled. 21 # Run rails dev:cache to toggle caching. 22 if Rails.root.join("tmp/caching-dev.txt").exist? 23 config.action_controller.perform_caching = true 24 config.action_controller.enable_fragment_cache_logging = true 25 26 config.cache_store = :memory_store 27 config.public_file_server.headers = { 28 "Cache-Control" => "public, max-age=#{2.days.to_i}" 29 } 30 else 31 config.action_controller.perform_caching = false 32 33 config.cache_store = :null_store 34 end 35 36 # Store uploaded files on the local file system (see config/storage.yml for options). 37 config.active_storage.service = :local 38 39 # Don't care if the mailer can't send. 40 config.action_mailer.raise_delivery_errors = false 41 42 config.action_mailer.perform_caching = false 43 44 # Print deprecation notices to the Rails logger. 45 config.active_support.deprecation = :log 46 47 # Raise exceptions for disallowed deprecations. 48 config.active_support.disallowed_deprecation = :raise 49 50 # Tell Active Support which deprecation messages to disallow. 51 config.active_support.disallowed_deprecation_warnings = [] 52 53 # Raise an error on page load if there are pending migrations. 54 config.active_record.migration_error = :page_load 55 56 # Highlight code that triggered database queries in logs. 57 config.active_record.verbose_query_logs = true 58 59 # Suppress logger output for asset requests. 60 config.assets.quiet = true 61 62 # mailerプレビュー用 63 config.action_mailer.raise_delivery_errors = true 64 config.action_mailer.delivery_method = :test 65 host = 'localhost:3000' 66 config.action_mailer.default_url_options = { host: host} 67 # Raises error for missing translations. 68 # config.i18n.raise_on_missing_translations = true 69 70 # Annotate rendered view with file names. 71 # config.action_view.annotate_rendered_view_with_filenames = true 72 73 # Uncomment if you wish to allow Action Cable access from any origin. 74 # config.action_cable.disable_request_forgery_protection = true 75end

できたこと

メールのプレビューと認証ページへのアクセスまではできました。

環境

rails 7.0.3

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

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

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

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

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

guest

回答1

0

自己解決

bcryptのバージョンが低かったみたいです。

投稿2022/07/21 13:01

jagaimo0

総合スコア33

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問