🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

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

Ruby on Rails

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

Q&A

解決済

1回答

3964閲覧

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

takuo5

総合スコア48

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2019/09/11 05:17

編集2019/09/13 04:00

前提・実現したいこと

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

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

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

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

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

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

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

urbainleverrier

2019/09/15 15:59

エラーはCannot GET ~のみですか? その前後の文はありませんか?
takuo5

2019/09/16 02:25

ありがとうございます! エラーはCannot GET ~ の1行のみです。
urbainleverrier

2019/09/16 04:04

ブラウザのエラーだけでなく、サーバー側のエラーはありませんか?
takuo5

2019/09/16 04:07

サーバー側のエラーはありませんでした。 rails test Running via Spring preloader in process 6936 Started with run options --seed 5878 37/37: [=================================================================================================================================] 100% Time: 00:00:01, Time: 00:00:01 Finished in 1.68797s 37 tests, 155 assertions, 0 failures, 0 errors, 0 skips
urbainleverrier

2019/09/16 07:32

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

2019/09/16 08: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 04:20

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

回答1

0

ベストアンサー

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

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/24 23:57

編集2019/09/25 13:41
suama

総合スコア1997

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

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

takuo5

2019/09/25 08:39

ご回答頂きましてありがとうございます。 suamaさんのおっしゃっている通り自分のURLに置き換えず、michaelさんのURLをそのまま貼り付けておりました。 ここでいくつか質問があります。 ①【ご自身のURL】の部分は = localhost:3000  でよろしいでしょうか。 ②【別途生成されたコード】はどこで確認できるのでしょうか。 ③ ログの確認方法 現在チュートリアル1周目でわけのわからない状態でも進めてアプリを完成させることを目標にやっております。上記の質問はもしかしたら初歩的すぎることをお聞きしてるかも知れませんが、可能な限りで教えていただけますでしょうか。 何卒よろしくお願い申し上げます。
suama

2019/09/25 08:57

上記拝見すると、Cloud9をご利用でしょうか? ご自身のノートPCなどで直にRailsアプリケーションを起動している場合は、 localhost:3000 になります。 また、Cloud9を使ってブラウザ上でコードを書いたり動作確認している場合は、プレビュー画面を通して確認していますでしょうか? プレビュー画面(ミニブラウザ)が見えたら、プレビュー画面の左上にある四角の中に右上の矢印があるアイコンを押せば別タブでプレビュー画面が開くかと思います。 そのURLが、インターネット経由でCloud9上で動いているアプリケーションと、ご自身をつないでくれるアドレスになります。 ただし、あくまでも開発用なので、ご注意くださいね。 > 別途生成されたコード こちらは、アカウントの登録をした際に、本来はメールが飛ぶことを想定していますが、開発段階ではRailsのアプリケーションのログに出てくるかと思います。 コメントでなく回答のほうに追記しますね。
takuo5

2019/09/25 12:15

ありがとうございます。 今新たにユーザー登録をしてみるとサーバー立ち上げているターミナルから下記のように書かれているのを見つけました。 <p> Welcome to the Sample App! Click on the link below to activate your account: </p> <a href="https://rails-tutorial-mhartl.c9users.io/account_activations/CPjn4RgD2-f2XUk5woU92g/edit?email=takuya.sss7777%40gmail.com">Activate</a> 上記URLをブラウザーに貼り付けましたが同じエラーメッセージが出ました。 URLの最後の部分は自分のメールアドレスになったのですが、https://の後がチュートリアル作者のものなのでつながらないのかと思い、下記のようにAWSでアプリを開いたときのURLを下記のように貼り付けてみました。 https://https//1053620c5a164250883f0d4e96004078.vfs.cloud9.us-east-2.amazonaws.com//account_activations/CPjn4RgD2-f2XUk5woU92g/edit?email=takuya.sss7777%40gmail.com しかしながらこれではIPアドレスが見つかりませんというメッセージが表示され、ページが表示されません。 送信メールの設定を更に変更する必要があるのでしょうか?
takuo5

2019/09/25 12:38

申し訳ありません。上記だとhttpsがダブってしまうので消してみましたところ、account activateのページが表示されました! ありがとうございます! これで問題は解決できましたが、https://のあとがrails-tutorial ~ でメールが送られる設定になっていますがこれはどうすれば自分のAWSでアプリを開いたときのURLに変更できますでしょうか?
suama

2019/09/25 13:36 編集

> 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を使ったり、別途専用のサーバで稼働させたりということになります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問