Функция сброса пароля реализована в среде разработки AWS Cloud9 не работает в heroku, который является производственной средой - PullRequest
0 голосов
/ 19 июня 2020

Я развернулся на heroku, обратившись к главе 12 руководства по Rails. При отправке существующего адреса электронной почты произошла ошибка, показанная ниже. https://gyazo.com/f44dff53d19eb2a08b76c35476ea0f62

Я могу отправить в среде Rails 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 and 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

Весь код

контроллеры / 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

модели / 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  

1 Ответ

0 голосов
/ 19 июня 2020

Я предполагаю, что миграции еще не были применены к вашей среде Heroku.

IIR C Heroku требует, чтобы вы вручную запускали миграции.

Попробуйте получить доступ к консоли heroku и выдайте bundle exec rake db:migrate, а затем перезапустите дино.

...