密码重置让我在生产中出现 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_digest
第 update_attribute(:reset_digest, User.digest(reset_token))
行
NoMethodError (undefined method `reset_digest=' for
User:0x007ff5bbb90f88
我相信你没有 运行 migrations heroku 。您应该 运行 使用以下命令进行迁移。
heroku run rake db:migrate
这应该可以解决您的错误。
我正尝试按照 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_digest
第 update_attribute(:reset_digest, User.digest(reset_token))
NoMethodError (undefined method `reset_digest=' for User:0x007ff5bbb90f88
我相信你没有 运行 migrations heroku 。您应该 运行 使用以下命令进行迁移。
heroku run rake db:migrate
这应该可以解决您的错误。