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

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

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

Cloud9は、クラウドからのプログラミングが可能になるWebサービス。IDEとしての機能が搭載されており、GitHubやHerokuなど他ツールとの連携も可能です。ブラウザ上で動くため、デバイスに関係なく開発環境を準備できます。

Ruby

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

Ruby on Rails 6

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

Q&A

解決済

rails チュートリアル アカウントの有効化ができない。

taba.3011
taba.3011

総合スコア7

Cloud9

Cloud9は、クラウドからのプログラミングが可能になるWebサービス。IDEとしての機能が搭載されており、GitHubやHerokuなど他ツールとの連携も可能です。ブラウザ上で動くため、デバイスに関係なく開発環境を準備できます。

Ruby

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

Ruby on Rails 6

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

3回答

0グッド

0クリップ

269閲覧

投稿2022/11/15 11:47

編集2022/11/15 11:52

前提

railsチュートリアルを学習中のものです。

11章の11.3のところで詰まっています。

リンク内容

11.3.2でeditアクションに変更を加えて、リスト11.25にかかれているURLをブラウザでアクセスしましたが、アカウントが有効化されたというページが表示されません。

実現したいこと

アカウント有効化機能を動作するようにすること

発生している問題・エラーメッセージ

エラーは出ていないのですが、有効化に失敗したときの条件分岐が動作してしまいます。
また、if文のuser.authenticated?(:activation, params[:id])という記述をdebuggerで試したときに、falseとなりました。
なのでそれに関連する箇所を一通り確認したのですが、どこに間違いがあるのかが見つかりませんでした。

app/controllers/account_activation_controllers

1class AcountActivationsController < ApplicationController 2 3def edit 4 user = User.find_by(email: params[:email]) 5 # debugger 6 if user && !user.activated? && user.authenticated?(:activation, params[:id]) 7 user.update_attribute(:activated, true) 8 user.update_attribute(:activated_at, Time.zone.now) 9 log_in user 10 flash[:success] = "Account activated!" 11 redirect_to user 12 else 13 flash[:danger] = "Invalid activation link" 14 redirect_to root_url 15 end 16 end 17 18end

該当のソースコード

app/controllers/account_activation_controller.rb

1class AcountActivationsController < ApplicationController 2 3def edit 4 user = User.find_by(email: params[:email]) 5 # debugger 6 if user && !user.activated? && user.authenticated?(:activation, params[:id]) 7 user.update_attribute(:activated, true) 8 user.update_attribute(:activated_at, Time.zone.now) 9 log_in user 10 flash[:success] = "Account activated!" 11 redirect_to user 12 else 13 flash[:danger] = "Invalid activation link" 14 redirect_to root_url 15 end 16 end 17 18end

app/controllers/users_controller.rb

1class UsersController < ApplicationController 2 def create 3 @user = User.new(user_params) 4 if @user.save 5 # log_in @user 6 # flash[:success] = "Welcome to the Sample App!" 7 UserMailer.account_activation(@user).deliver_now 8 flash[:info] = "Please check your email to active your account." 9 redirect_to root_url 10 #redirect_to @user #redirectでモデルオブジェクトを指定すると、 11 else #railsはそのモデルのidを取得し、そのidのページに移動する 12 render 'new' 13 end 14 end 15end

app/models/user.rb

1class User < ApplicationRecord 2 attr_accessor :remember_token, :activation_token 3 #remember_tokenはuserテーブルにない為、仮想的にここで定義する 4 before_save :downcase_email 5 before_create :create_activation_digest 6 7 8 # before_save { email.downcase! } メソッド参照に切り替え 9 validates :name, presence: true, length: { maximum: 50 } 10 VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i 11 validates :email, presence: true, length: { maximum: 255 }, 12 format: { with: VALID_EMAIL_REGEX }, 13 uniqueness: { case_sensitive: false } 14 has_secure_password 15 validates :password, presence: true, length: { minimum: 6 }, allow_nil: true 16 17 # 渡された文字列のハッシュ値を返す 18 def User.digest(string) 19 cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : 20 BCrypt::Engine.cost 21 BCrypt::Password.create(string, cost: cost) 22 end 23 24 # ランダムなトークンを返す 25 def User.new_token 26 SecureRandom.urlsafe_base64 27 end 28 29 # 永続セッションのためにユーザーをデータベースに記憶する 30 def remember 31 self.remember_token = User.new_token 32 update_attribute(:remember_digest, User.digest(remember_token)) 33 end 34 35 # 渡されたトークンがダイジェストと一致したらtrueを返す 36 def authenticated?(attribute, token) 37 digest = send("#{attribute}_digest") 38 return false if remember_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 private 48 49 # メールアドレスをすべて小文字にする 50 def downcase_email 51 email.downcase! 52 end 53 54 # 有効化トークンとダイジェストを作成および代入する 55 def create_activation_digest 56 self.activation_token = User.new_token 57 self.activation_digest = User.digest(activation_token) 58 end 59 60end

app/helpers/sessions_helper.rb

1module SessionsHelper 2 3 def log_in(user) 4 session[:user_id] = user.id 5 end 6 7 # ユーザーのセッションを永続的にする 8 def remember(user) 9 user.remember 10 cookies.permanent.encrypted[:user_id] = user.id 11 cookies.permanent[:remember_token] = user.remember_token 12 end 13 14 # 記憶トークンcookieに対応するユーザーを返す 15 def current_user 16 if (user_id = session[:user_id]) #ユーザーがログインしているとき 17 @current_user ||= User.find_by(id: user_id) 18 elsif (user_id = cookies.encrypted[:user_id]) #ユーザーがログインしていないとき 19 user = User.find_by(id: user_id) 20 if user && user.authenticated?(:remember, cookies[:remember_token]) 21 log_in user 22 @current_user = user 23 end 24 end 25 end 26end

app/mailers/application_mailer.rb

1class ApplicationMailer < ActionMailer::Base 2 default from: "example@railstutorial.org" 3 layout 'mailer' 4end

app/mailers/user_mailer.rb

1class UserMailer < ApplicationMailer 2 3 def account_activation(user) 4 @user = user #ビューで使えるようにしている 5 mail to: user.email, subject: "Account activation" #件名 6 end 7end

app/views/user_mailer/account_activation.html.erb

1<h1>Sample App</h1> 2 3<p>Hi <%= @user.name %>,</p> 4 5<p> 6Welcome to the Sample App! Click on the link below to activate your account: 7</p> 8 9<%= link_to "Activate", edit_acount_activation_url(@user.activation_token, email: @user.email) %>

app/views/user_mailer/account_activation.text.erb

1Hi <%= @user.name %> 2 3Welcome to the Sample App! Click on the link below to activate your account: 4 5<%= edit_acount_activation_url(@user.activation_token, email: @user.email) %>

test/mailers/previews/user_mailer_preview.rb

1class UserMailerPreview < ActionMailer::Preview 2 def account_activation 3 user = User.first #有効なユーザーを設定 4 user.activation_token = User.new_token #モデルで設定した仮変数に代入 5 UserMailer.account_activation(user) #メソッドに引数を与えて呼び出し 6 end 7end
サーバーログから貼り付けたURL <a href="https://17a475026ec84008aaa4a3956a5472f8.vfs.cloud9.ap-northeast-1.amazonaws.com/acount_activations/_UIfFfBrL2x6lGTRIIkq9A/edit?email=55555%40example.com">Activate</a>

試したこと

・debuggerメソッドを使用したときにuser.authenticated?(:activation, params[:id])がfalseになった。

補足情報(FW/ツールのバージョンなど)

cloud9
Rails 6.0.4
ruby 2.7.6

以下のような質問にはグッドを送りましょう

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

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

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

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

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

taba.3011

2022/11/15 11:55

はい、クエリパラメータに記載されているメールアドレスと、新規登録したメールアドレスは一致しています。

回答3

2

Text

1メールアドレスは正しい?

投稿2022/11/15 11:48

atcoderyellow

総合スコア481

Hevendor👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

2022/11/15 11:52

こちらの回答が複数のユーザーから「質問に対する回答となっていない投稿」という指摘を受けました。

2022/11/15 15:56

こちらの回答が他のユーザーから「スパムと見受けられる内容を含む回答」という指摘を受けました。

1

コード

投稿2022/11/15 11:48

atcoderyellow

総合スコア481

退会済みユーザー👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

2022/11/15 11:52

こちらの回答が複数のユーザーから「質問に対する回答となっていない投稿」という指摘を受けました。

2022/11/15 15:56

こちらの回答が他のユーザーから「スパムと見受けられる内容を含む回答」という指摘を受けました。

回答へのコメント

0

自己解決

今まではサーバーログに出力されたURLをクリックしてブラウザに移動していたのですが、URLをブラウザにコピペして開いたらアカウント認証ができていました。
エラーが起こっていたわけではないものの、原理が分からずモヤモヤが残る解決になりました。

投稿2022/11/15 12:45

taba.3011

総合スコア7

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

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

Cloud9

Cloud9は、クラウドからのプログラミングが可能になるWebサービス。IDEとしての機能が搭載されており、GitHubやHerokuなど他ツールとの連携も可能です。ブラウザ上で動くため、デバイスに関係なく開発環境を準備できます。

Ruby

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

Ruby on Rails 6

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