密码重置让我在生产中出现 500 错误

Password reset gives me a 500 error in production

我正尝试按照 Michael Hartl 的教程将密码重置添加到我的应用程序。在 localhost:3000 中,当我输入我的电子邮件以发送密码重置时,它说它有效(我得到一个 flash[:success],因为它是按程序设置的)。然后当我访问邮件程序预览并重置我的密码时,它起作用了(虽然我实际上没有收到电子邮件,所以我不知道 reset_digest 是否真的被创建了,因为 user_mailer_preview 自动为数据库中的第一个用户(我)创建一个。

但是,在生产环境中(在 heroku 上),当我输入我的电子邮件以发送密码重置时,我只收到 500 错误。这是我的 heroku 日志:

2015-07-08T16:55:11.773924+00:00 app[web.1]: Started GET "/password_resets/new" for 71.202.16.30 at 2015-07-08 16:55:11 +0000
2015-07-08T16:55:11.855679+00:00 app[web.1]:   Rendered password_resets/new.html.erb within layouts/application (3.5ms)
2015-07-08T16:55:11.862888+00:00 app[web.1]:   Rendered layouts/_nav.html.erb (1.4ms)
2015-07-08T16:55:11.865474+00:00 app[web.1]: Completed 200 OK in 34ms (Views: 19.3ms | ActiveRecord: 0.0ms)
2015-07-08T16:55:11.831107+00:00 app[web.1]: Processing by PasswordResetsController#new as HTML
2015-07-08T16:55:11.860630+00:00 app[web.1]:   Rendered layouts/_head.html.erb (2.7ms)
2015-07-08T16:55:11.864807+00:00 app[web.1]:   Rendered layouts/_footer.html.erb (0.9ms)
2015-07-08T16:55:11.871089+00:00 heroku[router]: at=info method=GET path="/password_resets/new" host=readlio.herokuapp.com request_id=4fca3717-319b-4d23-9a55-6e7795caa6ef fwd="71.202.16.30" dyno=web.1 connect=2ms service=99ms status=200 bytes=4219
2015-07-08T16:55:15.372791+00:00 app[web.1]: Completed 500 Internal Server Error in 138ms
2015-07-08T16:55:15.230300+00:00 app[web.1]: Started POST "/password_resets" for 71.202.16.30 at 2015-07-08 16:55:15 +0000
2015-07-08T16:55:15.234361+00:00 app[web.1]: Processing by PasswordResetsController#create as HTML
2015-07-08T16:55:15.254529+00:00 app[web.1]:   User Load (1.6ms)  SELECT  "users".* FROM "users" WHERE "users"."email" =  LIMIT 1  [["email", "cozymonster29@gmail.com"]]
2015-07-08T16:55:15.234393+00:00 app[web.1]:   Parameters: {"utf8"=>"✓", "authenticity_token"=>"XoYIZsoFM7aDANpKPO9DlxWDKlRe1OGBrXO1PBGJHVS89AmlU2aKExmGgH9/mUWNwrK3eq9pzMo+AJx384Bt9Q==", "password_reset"=>"[FILTERED]", "commit"=>"Submit"}
2015-07-08T16:55:15.374555+00:00 app[web.1]: 
2015-07-08T16:55:15.374558+00:00 app[web.1]: NoMethodError (undefined method `reset_digest=' for #<User:0x007ff5bbb90f88>):
2015-07-08T16:55:15.374562+00:00 app[web.1]:   app/controllers/password_resets_controller.rb:12:in `create'
2015-07-08T16:55:15.374560+00:00 app[web.1]:   app/models/user.rb:47:in `create_reset_digest'
2015-07-08T16:55:15.374563+00:00 app[web.1]: 
2015-07-08T16:55:15.374564+00:00 app[web.1]: 
2015-07-08T16:55:15.384624+00:00 heroku[router]: at=info method=POST path="/password_resets" host=readlio.herokuapp.com request_id=09d2d771-1119-4fa9-abc8-c47d30e95497 fwd="71.202.16.30" dyno=web.1 connect=0ms service=154ms status=500 bytes=1714
2015-07-08T16:55:15.590920+00:00 heroku[router]: at=info method=GET path="/favicon.ico" host=readlio.herokuapp.com request_id=95cb9d84-534a-4d8e-9290-172721301867 fwd="71.202.16.30" dyno=web.1 connect=1ms service=4ms status=200 bytes=188

这是我的控制器的一部分:

def create
    @user = User.find_by(email: params[:password_reset][:email].downcase)
    if @user
      @user.send_password_reset_email
        flash[:info] = "An email was sent to " + @user.email + " with password reset instructions."
        redirect_to login_url
    else
        flash.now[:danger] = "Hmm. We don't recognize that email. Make sure you signed up with this email."
        render 'new'
    end
  end

这是我的用户模型的一部分 create_reset_digest:

def create_reset_digest
    self.reset_token = User.new_token
    update_attribute(:reset_digest, User.digest(reset_token))
    update_attribute(:reset_sent_at, Time.zone.now)
  end

  def send_password_reset_email
    UserMailer.password_reset(self).deliver_now
  end

所以它告诉我没有 reset_digest 这样的方法,我很困惑,因为我从来没有真正调用过它。我在 def create 中调用 @user.create_reset_digest,我认为这是 heroku logs 调用的行。我该如何解决这个错误?

So it's telling me that there's no such method as reset_digest, which I'm confused because I never actually call that. I call @user.create_reset_digest in def create, and I think that's the line that heroku logs are calling out

没有! @user.create_reset_digest 在你的 user.rb 中调用 create_reset_digest 实际上是 updating reset_digestupdate_attribute(:reset_digest, User.digest(reset_token))

NoMethodError (undefined method `reset_digest=' for User:0x007ff5bbb90f88

我相信你没有 运行 migrations heroku 。您应该 运行 使用以下命令进行迁移。

heroku run rake db:migrate

这应该可以解决您的错误。