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

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

ただいまの
回答率

89.06%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 762

takuo5

score 44

前提・実現したいこと

railsチュートリアルを学習中のものです。
11章の11.3のところで詰まっています。リンク内容
11.3.2でeditアクションに変更を加えて、リスト11.25にかかれているURLをブラウザでアクセスしましたが、アカウントが有効化されたというページが表示されず、下記のようなエラーメッセージが表示されます。
どなたか解決方法を教えていただけないでしょうか。

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

Cannot GET /announcement/account_activations/-L9kBsbIjmrqpJGB0TUKcA/edit?email=michael%40michaelhartl.com```    

該当のソースコード

app/helpers/sessions_helper.rb  


module SessionsHelper  

# 渡されたユーザーでログインする  
def log_in(user)  
session[:user_id] = user.id  
end  

# ユーザーのセッションを永続的にする  
def remember(user)  
user.remember  
cookies.permanent.signed[:user_id] = user.id  
cookies.permanent[:remember_token] = user.remember_token  
end  

# 渡されたユーザーがログイン済みユーザーであればtrueを返す  
def current_user?(user)  
user == current_user  
end  

# 現在ログイン中のユーザーを返す (いる場合)  
def current_user  
if (user_id = session[:user_id])  
@current_user ||= User.find_by(id: user_id)  
elsif (user_id = cookies.signed[:user_id])  
user = User.find_by(id: user_id)  
if user && user.authenticated?(:remember, cookies[:remember_token])  
log_in user  
@current_user = user  
end  
end  
end  

# ユーザーがログインしていればtrue、その他ならfalseを返す  
def logged_in?  
!current_user.nil?  
end  

# 永続的セッションを破棄する  
def forget(user)  
user.forget  
cookies.delete(:user_id)  
cookies.delete(:remember_token)  
end  

# 現在のユーザーをログアウトする  
def log_out  
forget(current_user)  
session.delete(:user_id)  
@current_user = nil  
end  

# 現在ログイン中のユーザーを返す (いる場合)  
def current_user  
if (user_id = session[:user_id])  
@current_user ||= User.find_by(id: user_id)  
elsif (user_id = cookies.signed[:user_id])  
user = User.find_by(id: user_id)  
if user && user.authenticated?(:remember, cookies[:remember_token])  
log_in user  
@current_user = user  
end  
end  
end  

# 記憶したURL (もしくはデフォルト値) にリダイレクト  
def redirect_back_or(default)  
redirect_to(session[:forwarding_url] || default)  
session.delete(:forwarding_url)  
end  

# アクセスしようとしたURLを覚えておく  
def store_location  
session[:forwarding_url] = request.original_url if request.get?  
end  


end  
test/models/user_test.rb  


require 'test_helper'  

class UserTest < ActiveSupport::TestCase  

def setup  
@user = User.new(name: "Example User", email: "user@example.com",  
password: "foobar", password_confirmation: "foobar")  
end  

test "should be valid" do  
assert @user.valid?  
end  

test "name should be present" do  
@user.name = ""  
assert_not @user.valid?  
end  

test "email should be present" do  
@user.email = "     "  
assert_not @user.valid?  
end  

test "name should not be too long" do  
@user.name = "a" * 51  
assert_not @user.valid?  
end  

test "email should not be too long" do  
@user.email = "a" * 244 + "@example.com"  
assert_not @user.valid?  
end  

test "email validation should accept valid addresses" do  
valid_addresses = %w[user@example.com USER@foo.COM A_US-ER@foo.bar.org  
first.last@foo.jp alice+bob@baz.cn]  
valid_addresses.each do |valid_address|  
@user.email = valid_address  
assert @user.valid?, "#{valid_address.inspect} should be valid"  
end  
end  

test "email validation should reject invalid addresses" do  
invalid_addresses = %w[user@example,com user_at_foo.org user.name@example.  
foo@bar_baz.com foo@bar+baz.com]  
invalid_addresses.each do |invalid_address|  
@user.email = invalid_address  
assert_not @user.valid?, "#{invalid_address.inspect} should be invalid"  
end  
end  

test "email addresses should be unique" do  
duplicate_user = @user.dup  
@user.save  
assert_not duplicate_user.valid?  
end  

test "password should be present (nonblank)" do  
@user.password = @user.password_confirmation = " " * 6  
assert_not @user.valid?  
end  
#@user.password = @user.password_confirmationに空白を6個代入した時  
#@userは有効か → Falseである と言うテスト  

test "password should have a minimum length" do  
@user.password = @user.password_confirmation = "a" * 5  
assert_not @user.valid?  
end  
#@user.password = @user.password_confirmationにaを5個代入した時  
#@userは有効か → Falseである と言うテスト  

test "authenticated? should return false for a user with nil digest" do  
assert_not @user.authenticated?(:remember, '')  
end  
end  
#現状ではバリデーションが設定されていない略でGREENにならない→RED  
app/controllers/account_activations_controller.rb  

class AccountActivationsController < ApplicationController  

def edit  
user = User.find_by(email: params[:email])  
if user && !user.activated? && user.authenticated?(:activation, params[:id])  
user.update_attribute(:activated,    true)  
user.update_attribute(:activated_at, Time.zone.now)  
log_in user  
flash[:success] = "Account activated!"  
redirect_to user  
else  
flash[:danger] = "Invalid activation link"  
redirect_to root_url  
end  
end  
end  

試したこと

rails testを行いましたがエラーは出ませんでした。

下記URLをブラウザでアクセスすると上記のエラーメッセージが出ます。
https://rails-tutorial-mhartl.c9users.io/account_activations/
fFb_F94mgQtmlSvRFGsITw/edit?email=michael%40michaelhartl.com

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

AWS Cloud9

ここにより詳細な情報を記載してください。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • urbainleverrier

    2019/09/16 16:32

    rails testではなく、ブラウザでアクセスした際にサーバー側でエラーはありませんか?
    もしなければ通信が発生する前のjavascript側でのエラーということになります。

    キャンセル

  • takuo5

    2019/09/16 17:08

    知識不足で申し訳ありません。
    サーバー側でのエラーというのはrails server を起動しているターミナル上で確認すればよろしいでしょうか?
    もしそうであれば、下記のように立ち上げたあとは何も変化はないままでした。
    ブラウザでURLにアクセスした後もなにも変化ありません。

    ~/environment/sample_app (account-activation) $ rails server
    => Booting Puma
    => Rails 5.1.6 application starting in development
    => Run `rails server -h` for more startup options
    Puma starting in single mode...
    * Version 3.9.1 (ruby 2.6.3-p62), codename: Private Caller
    * Min threads: 5, max threads: 5
    * Environment: development
    * Listening on tcp://localhost:8080
    Use Ctrl-C to stop

    キャンセル

  • urbainleverrier

    2019/09/18 13:20

    とんでもございません。
    かくいう私もrailsでwebpackを扱ったことないのですが、ブラウザ側で起きているエラーなような気がします。
    なので、上記のテストやrbファイルに原因はないかもしれません。
    もし他に回答やコメントなければ、該当のエラーとrailsのwebpackの設定関連の部分を調べられると良いと思います。

    キャンセル

回答 1

checkベストアンサー

+1

こんにちは。解決済みだったり、認識間違いでしたらご容赦ください。

URLを見て、もしかしてと思いましたので、確認させてください。

本当に、rails-tutorial-mhartl.c9users.ioにアクセスしましたでしょうか?
それとも、ご自身のアプリケーションのURLでアクセスして同じエラーになりましたでしょうか?

下記URLをブラウザでアクセスすると上記のエラーメッセージが出ます。
https://rails-tutorial-mhartl.c9users.io/account_activations/
fFb_F94mgQtmlSvRFGsITw/edit?email=michael%40michaelhartl.com

とありますが、念のため。
こちらはご自身のCloud9のURLに置き換える必要があります。

テストは正しく通っているので、この直前まで、ご自身のCloud9上やlocalhost:3000のRailsを通してアカウントの登録をしていれば、11.25 のメールのように、ログにメッセージが出ていると思います。

http://ここはご自身のURL/account_activations/ここも別途生成されたコード/edit?email=ご自身で登録したメールアドレス

ログに出ていたら、そちらをブラウザで開くといいのではと思います。

rails-tutorial-mhartl.c9users.io は、Rails Tutorial用にチュートリアルの作者の方が記載しているURLになります。ここも、 (クラウドIDEを使っている場合は、localhost:3000の部分を対応するベースURLに置き換えてください) と同じになります。

追記

上記拝見すると、Cloud9をご利用でしょうか?
ご自身のノートPCなどで直にRailsアプリケーションを起動している場合は、 http://localhost:3000/ になります。

また、Cloud9を使ってブラウザ上でコードを書いたり動作確認している場合ですが、この場合はプレビュー画面を通してアクセスしている状態です。

まず、プレビュー画面(ミニブラウザ)が見えたら、プレビュー画面の左上にある四角の中に右上の矢印があるアイコンを押せば別タブでプレビュー画面が開くかと思います。
そのURLが、インターネット経由でCloud9上で動いているアプリケーションと、ご自身をつないでくれるアドレスになります。

ただし、あくまでも開発用なので、ご注意くださいね。

別途生成されたコード

リスト11.2.4の部分は一通り試されましたか?

リスト11.24 のあとに、

この状態で実際に新規ユーザーとして登録してみると、リダイレクトされて図 11.4のようになり、リスト 11.25のようなメールが生成されます。ただし、実際にメールが生成されるわけではないのでご注意ください。ここに引用したのはサーバーログに出力されたメールです (メールが見えるまで多少スクロールが必要でしょう)。

という一文がありますね。
実際にご自身で新規ユーザを登録すると、Cloud9のターミナル、もしくはローカル開発環境のターミナルにログとして出てきます。

チュートリアルの内容そっくりそのままではなく、登録したアカウント(メールアドレス)に置き換えてみてください。そこに出てきたリンクを使ってのアクティベートになります。

https://railstutorial.jp/chapters/account_activation?version=5.1#code-account_activation_email

もしわからなかったら、とりあえず新規ユーザを登録してみて、ターミナル上にメールとしての内容が出てきたら、質問のところに貼ってみてください。

追記2

送信されるメールがチュートリアルの例のURLになってしまっている場合は、リスト 11.16 での設定がどうなっているか確認してみてくださいね。

ここでも、「ホスト名 ’example.com’ の部分は、各自のdevelopment環境に合わせて変更してください」との注意書きの通り、ご自身の環境のURLにしてください。
(でないと、全く別の環境で動いている、他人のサイトのURLに飛んでしまいます)

https://railstutorial.jp/chapters/account_activation?version=5.1#code-development_email_settings

config/environments/development.rb のhostのところを確認し、もし、host = 'rails-tutorial-mhartl.c9users.io' となっていたら、ここは書き換えてください。

(こちらはチュートリアルの例ですので、ご注意を)

ここを、ご自身のCloud9用のURLに置き換えてみてくださいね。(https:// の部分は除いて、xxxxxxx.amazonaws.com まで)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/25 21:38

    申し訳ありません。上記だとhttpsがダブってしまうので消してみましたところ、account activateのページが表示されました! ありがとうございます!

    これで問題は解決できましたが、https://のあとがrails-tutorial ~ でメールが送られる設定になっていますがこれはどうすれば自分のAWSでアプリを開いたときのURLに変更できますでしょうか?

    キャンセル

  • 2019/09/25 22:35 編集

    > httpsがダブってしまうので消してみましたところ、

    こちら、ご自身で解決されていて何よりです。
    もうちょっとですね!

    > https://のあとがrails-tutorial ~ でメールが送られる設定になっていますが

    ここは、チュートリアルの11.16のところで、設定を変えればよいです。

    https://railstutorial.jp/chapters/account_activation?version=5.1#code-development_email_settings

    config/environments/development.rb のhostのところに、現在、host = 'rails-tutorial-mhartl.c9users.io' としていると思います。

    ここを、ご自身のCloud9用のURLに置き換えてみてくださいね。(https:// の部分は除いて、xxxxxxx.amazonaws.com まで)
    そのあとアプリケーションを停止して再度立ち上げると、問題なくなると思います。

    Cloud9の環境は、いずれにしても開発用なので、本番運用の場合はHerokuを使ったり、別途専用のサーバで稼働させたりということになります。

    キャンセル

  • 2019/09/25 23:28

    上記にてご指示いただきましたとおりに変更して再度ユーザー登録してみるとしっかりと変更できていました。
    <a href="https://1053620c5a164250883f0d4e96004078.vfs.cloud9.us-east-2.amazonaws.com/account_activations/PZqah7NmwL9zXPSPZRmvZQ/edit?email=sakun%40yahoo.co.jp">Activate</a>

    これで次に進むことができます。
    大変ご丁寧に教えていただきまして本当にありがとうございました。

    キャンセル

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

  • ただいまの回答率 89.06%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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