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

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

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

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

Ruby on Rails 5

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

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

パスワード

パスワードは主に情報にアクセスする際に扱われます。主に、アクセス可能なユーザーを限定する手段として使われます。

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

Q&A

1回答

1752閲覧

開発環境AWS Cloud9にて実装したパスワード再設定機能が本番環境であるherokuで機能しない

Tomato_leaf

総合スコア178

Cloud9

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

Ruby on Rails 5

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

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

パスワード

パスワードは主に情報にアクセスする際に扱われます。主に、アクセス可能なユーザーを限定する手段として使われます。

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

0グッド

0クリップ

投稿2020/06/19 07:10

編集2020/06/20 08:35

Railsチュートリアル12章を参照し、herokuにデプロイしたのですが
既存メールアドレスを送信すると下図のようなエラーが発生しました。
https://gyazo.com/f44dff53d19eb2a08b76c35476ea0f62

Rails sでの環境では送信ができるのですが
https://gyazo.com/cf1c079fbd83c60ff19c86028411eed4
なぜだかherokuにデプロイしたものは送信できません。

ログをみてみると以下のようにありました。

2020-06-19T04:22:54.566364+00:00 app[web.1]: F, [2020-06-19T04:22:54.566307 #4] FATAL -- : [18842aaf-91d3-45d6-be88-85d52aea211f] 2020-06-19T04:22:54.566502+00:00 app[web.1]: F, [2020-06-19T04:22:54.566452 #4] FATAL -- : [18842aaf-91d3-45d6-be88-85d52aea211f] NoMethodError (undefined method `reset_digest=' for #<User:0x0000555861fa7030> 2020-06-19T04:22:54.566503+00:00 app[web.1]: Did you mean? reset_token=): 2020-06-19T04:22:54.566542+00:00 app[web.1]: F, [2020-06-19T04:22:54.566499 #4] FATAL -- : [18842aaf-91d3-45d6-be88-85d52aea211f] 2020-06-19T04:22:54.566584+00:00 app[web.1]: F, [2020-06-19T04:22:54.566545 #4] FATAL -- : [18842aaf-91d3-45d6-be88-85d52aea211f] app/models/user.rb:20:in `create_reset_digest' 2020-06-19T04:22:54.566584+00:00 app[web.1]: [18842aaf-91d3-45d6-be88-85d52aea211f] app/controllers/password_resets_controller.rb:12:in `create' 2020-06-19T04:22:54.568553+00:00 heroku[router]: at=info method=POST path="/password_resets" host=randomtag.herokuapp.com request_id=18842aaf-91d3-45d6-be88-85d52aea211f fwd="69.118.84.101" dyno=web.1 connect=1ms service=321ms status=500 bytes=1827 protocol=https

ここから、reset_digestメソッドが存在しないのではないかと推測したのですが
models/user.rbと
controllers/password_resets_controller.rb
には自分では問題が確認できませんでした。

おそらく下記の部分の書き方に問題があるのかなと
感じているのですが、原因究明できていません。

一部抜粋(models/user.rb)

# パスワード再設定の属性を設定する def create_reset_digest self.reset_token = User.new_token update_columns(reset_digest: User.digest(reset_token), reset_sent_at: Time.zone.now ) end

どなたか原因がわかりそうな方がおりましたら
アドヴァイスいただけますと助かります。

開発環境:AWS Cloud9
本番環境:heroku

関係していると思われる箇所(全体のコード)

controllers/password_resets_controller.rb

class PasswordResetsController < ApplicationController before_action :get_user, only: [:edit, :update] before_action :valid_user, only: [:edit, :update] before_action :check_expiration, only: [:edit, :update] def new end def create @user = User.find_by(email: params[:password_reset][:email].downcase) if @user @user.create_reset_digest @user.send_password_reset_email flash[:info] = "Email sent with password reset instructions" redirect_to root_url else flash.now[:danger] = "Email address not found" render 'new' end end def edit end def update if params[:user][:password].empty? @user.errors.add(:password, :blank) render 'edit' elsif @user.update_attributes(user_params) log_in @user @user.update_attribute(:reset_digest, nil) flash[:success] = "Password has been reset." redirect_to @user else render 'edit' end end private def user_params params.require(:user).permit(:password, :password_confirmation) end def get_user @user = User.find_by(email: params[:email]) end # 正しいユーザーかどうか確認する def valid_user unless (@user && @user.activated? && @user.authenticated?(:reset, params[:id])) redirect_to root_url end end # トークンが期限切れかどうか確認する def check_expiration if @user.password_reset_expired? flash[:danger] = "Password reset has expired." redirect_to new_password_reset_url end end end

models/user.rb

```ここに言語を入力 class User < ApplicationRecord attr_accessor :remember_token, :activation_token, :reset_token before_save :downcase_email before_save { self.email.downcase! } validates :name, presence: true, length: { maximum: 50 } validates :email, presence: true, length: { maximum: 255 }, format: { with: /\A[\w+\-.]+@[a-z\d\-.]+.[a-z]+\z/i }, uniqueness: { case_sensitive: false } has_secure_password has_many :hashtags, dependent: :destroy # パスワード再設定の属性を設定する def create_reset_digest self.reset_token = User.new_token update_columns(reset_digest: User.digest(reset_token), reset_sent_at: Time.zone.now ) end # パスワード再設定のメールを送信する def send_password_reset_email UserMailer.password_reset(self).deliver_now end class << self # 渡された文字列のハッシュ値を返す def digest(string) cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : BCrypt::Engine.cost BCrypt::Password.create(string, cost: cost) end # ランダムなトークンを返す def new_token SecureRandom.urlsafe_base64 end end # パスワード再設定の期限が切れている場合はtrueを返す def password_reset_expired? reset_sent_at < 2.hours.ago 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

追記

マイグレーションに失敗しているのかなと思い
heroku run rake db:migrateのコマンドを実行した後、
アプリを立ち上げてみましたが結果は変わらずでした。

ec2-user:~/environment/randomtag (master) $ heroku run rake db:migrate Running rake db:migrate on ⬢ randomtag... up, run.9196 (Free) D, [2020-06-19T21:57:26.831193 #4] DEBUG -- : (4.0ms) SELECT pg_try_advisory_lock(5483695990905341160) D, [2020-06-19T21:57:26.901984 #4] DEBUG -- : (3.6ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC D, [2020-06-19T21:57:26.931595 #4] DEBUG -- : ActiveRecord::InternalMetadata Load (1.6ms) SELECT "ar_internal_metadata".* FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = $1 LIMIT $2 [["key", "environment"], ["LIMIT", 1]] D, [2020-06-19T21:57:26.961387 #4] DEBUG -- : (1.2ms) BEGIN D, [2020-06-19T21:57:26.963787 #4] DEBUG -- : (1.0ms) COMMIT D, [2020-06-19T21:57:26.965204 #4] DEBUG -- : (1.2ms) SELECT pg_advisory_unlock(5483695990905341160) ec2-user:~/environment/randomtag (master) $

追記2

db/schema.rb

ActiveRecord::Schema.define(version: 2020_06_18_121655) do create_table "hashtags", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| t.string "content" t.bigint "user_id" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.index ["user_id"], name: "index_hashtags_on_user_id" end create_table "users", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| t.string "name" t.string "email" t.string "password_digest" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.string "reset_digest" t.datetime "reset_sent_at" end add_foreign_key "hashtags", "users" end

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

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

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

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

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

guest

回答1

0

update_columns(reset_digest: ... とあるので、reset_digest はモデルUserの tableのcolumnであると思われます。
にもかかわらず
NoMethodError (undefined method reset_digest=' `となるのは
Railsは modelのcodeを読み込み初期化するときにDBのcolumnに対していくつかのmethodを定義します。読み込むための def reset_digest, 値設定のためのdef reset_digest=(val), などです。そのdef reset_digest=(val)がないと言ってます。
ということは table users にcolumn reset_digestがない、ということです
localでは動くのにherokuではだめということは、
reset_digestをusersに用意するmigrationがgit管理されていない か
herokuで db:migrate が失敗しているか、ではないかと推定されます

投稿2020/06/19 10:35

winterboum

総合スコア23567

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

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

Tomato_leaf

2020/06/19 22:01

アドヴァイスありがとうございます。git管理はしており、追記にも書きましたがマイグレーションに失敗しているのかなと思い heroku run rake db:migrateのコマンドを実行した後、 アプリを立ち上げてみましたが結果は変わらずでした。。
winterboum

2020/06/20 00:51

herok上のdb/schema.rbを確認していただけますか?usersにreset_digestがあるかどうか
Tomato_leaf

2020/06/20 08:46

追記2をさせていただきました。確認する限りreset_digestはあるようです。
winterboum

2020/06/21 08:17

申し訳ないです。私の知識では理解不能に陥りました。
Tomato_leaf

2020/06/22 04:10

いえ、お時間を割いてくださりありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問