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

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

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

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

Ruby on Rails

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

解決済

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

jagaimo0
jagaimo0

総合スコア33

Ruby

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

Ruby on Rails

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

1回答

0リアクション

0クリップ

229閲覧

投稿2022/07/16 10:20

困っていること

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

該当のソースコード

user.rb

class User < ApplicationRecord # アクセス可能な属性を作成 ( 永続トークン + 有効化トークン) attr_accessor :remember_token, :activation_token before_save :downcase_email before_create :create_activation_digest validates :name, presence: true, length: { maximum: 50 } # 属性の存在性検証 before_save { self.email = email.downcase } # 小文字変換 validates :name, presence: true, length: { maximum: 30 } VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i # メールアドレスパターン validates :email, presence: true, length: { maximum: 50 }, format: { with: VALID_EMAIL_REGEX }, # フォーマットチェック uniqueness: { case_sensitive: false } # 一意性 # パスワード has_secure_password # nilを許すことにより編集できる (has_secureで存在性チェックを通すためpasswordがnilで登録できるわけではない) validates :password, presence: true, length: { minimum: 6 }, allow_nil: true # 与えられた文字列のハッシュ値を返す def User.digest(string) cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : BCrypt::Engine.cost BCrypt::Password.create(string, cost: cost) end # ランダムなトークンを返す def User.new_token # 記憶トークンの作成 => ユーザと関連付け => ハッシュ値をDBに保存 SecureRandom.urlsafe_base64 # 長さ22かつ64種類 end # ユーザの記憶処理 def remember # ユーザの記憶トークン属性を設定(selfがないとローカル変数になってしまう) self.remember_token = User.new_token update_attribute(:remember_digest, User.digest(remember_token)) # 記憶ダイジェストを更新 => DBに保存 # => 永続cookiesに保存 # => 永続セッションの作成 # => ログイン情報保持 end # アカウントを有効にする def activate update_attribute(:activated, true) update_attribute(:activated_at, Time.zone.now) end # 有効化用のメールを送信する def send_activation_email UserMailer.account_activation(self).deliver_now end # トークンがダイジェストと一致したらtrueを返す def authenticated?(attribute, token) # attribute: 状態, token: 記憶トークン digest = send("#{attribute}_digest") # sendしてメソッド呼び出しに名前を付ける return false if digest.nil? BCrypt::Password.new(digest).is_password?(token) #pass = BCrypt::Password.create(digest) #pass.is_password?(token) end # ユーザーログインを破棄する def forget update_attribute(:remember_digest, nil) # 記憶ダイジェストをnilに end private # メールアドレスをすべて小文字にする def downcase_email self.email = email.downcase end # 有効化トークンとダイジェストを作成および代入する def create_activation_digest self.activation_token = User.new_token self.activation_digest = User.digest(activation_token) end end

account_activations_controller.rb

users_controller.rb

class UsersController < ApplicationController #loginユーザのみeditとupdateを許す before_action :logged_in_user, only: [:index, :edit, :update, :delete] #currentユーザのみeditとupdateを許す(自分の情報のみ) before_action :correct_user, only: [:edit, :update] before_action :admin_user, only: :destroy # GET /users or /users.json def index @users = User.paginate(page: params[:page], per_page: 3) # page単位で取り出す end # GET /users/1 or /users/1.json def show @user = User.find(params[:id]) end # GET /users/new def new @user = User.new end # GET /users/1/edit def edit @user = User.find(params[:id]) end # POST /users or /users.json # Sign Up def create @user = User.new(user_params) if @user.save # 成功時 @user.send_activation_email flash[:info] = "アカウントを有効化するためにメールをチェックしてください。" redirect_to root_url else # 失敗時 render 'new', status: :unprocessable_entity end end # PATCH/PUT /users/1 or /users/1.json def update @user = User.find(params[:id]) if @user.update(user_params) # 更新成功時 flash[:success] = "Profile updated" redirect_to @user else # 失敗時 render 'edit', status: :unprocessable_entity end end # DELETE /users/1 or /users/1.json def destroy User.find(params[:id]).destroy flash[:success] = "ユーザーは削除されました" redirect_to users_url end private # Use callbacks to share common setup or constraints between actions. def set_user @user = User.find(params[:id]) end # Only allow a list of trusted parameters through. def user_params # adminはpermitしない params.require(:user).permit(:name, :email, :password, :password_confirmation) end # ログイン済みユーザーかどうか確認 def logged_in_user unless logged_in? store_location # 飛ぼうとしたページを取得 flash[:danger] = "ログインしてください" redirect_to login_url end end # 正しいユーザーかどうか確認 def correct_user @user = User.find(params[:id]) redirect_to(root_url) unless current_user?(@user) # 正しいユーザかどうか end private # メールアドレスをすべて小文字にする def downcase_email self.email = email.downcase end # 有効化トークンとダイジェストを作成および代入する def create_activation_digest self.activation_token = User.new_token self.activation_digest = User.digest(activation_token) end end

user_mailer.rb

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

application_mailer.rb

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

account_activation.text.erb

user_mailer_preview.rb

# Preview all emails at http://localhost:3000/rails/mailers/user_mailer class UserMailerPreview < ActionMailer::Preview # Preview this email at http://localhost:3000/rails/mailers/user_mailer/account_activation def account_activation user = User.first user.activation_token = User.new_token UserMailer.account_activation(user) end end

development.rb

require "active_support/core_ext/integer/time" Rails.application.configure do # Settings specified here will take precedence over those in config/application.rb. # In the development environment your application's code is reloaded any time # it changes. This slows down response time but is perfect for development # since you don't have to restart the web server when you make code changes. config.cache_classes = false # Do not eager load code on boot. config.eager_load = false # Show full error reports. config.consider_all_requests_local = true # Enable server timing config.server_timing = true # Enable/disable caching. By default caching is disabled. # Run rails dev:cache to toggle caching. if Rails.root.join("tmp/caching-dev.txt").exist? config.action_controller.perform_caching = true config.action_controller.enable_fragment_cache_logging = true config.cache_store = :memory_store config.public_file_server.headers = { "Cache-Control" => "public, max-age=#{2.days.to_i}" } else config.action_controller.perform_caching = false config.cache_store = :null_store end # Store uploaded files on the local file system (see config/storage.yml for options). config.active_storage.service = :local # Don't care if the mailer can't send. config.action_mailer.raise_delivery_errors = false config.action_mailer.perform_caching = false # Print deprecation notices to the Rails logger. config.active_support.deprecation = :log # Raise exceptions for disallowed deprecations. config.active_support.disallowed_deprecation = :raise # Tell Active Support which deprecation messages to disallow. config.active_support.disallowed_deprecation_warnings = [] # Raise an error on page load if there are pending migrations. config.active_record.migration_error = :page_load # Highlight code that triggered database queries in logs. config.active_record.verbose_query_logs = true # Suppress logger output for asset requests. config.assets.quiet = true # mailerプレビュー用 config.action_mailer.raise_delivery_errors = true config.action_mailer.delivery_method = :test host = 'localhost:3000' config.action_mailer.default_url_options = { host: host} # Raises error for missing translations. # config.i18n.raise_on_missing_translations = true # Annotate rendered view with file names. # config.action_view.annotate_rendered_view_with_filenames = true # Uncomment if you wish to allow Action Cable access from any origin. # config.action_cable.disable_request_forgery_protection = true end

できたこと

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

環境

rails 7.0.3

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Ruby

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

Ruby on Rails

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