Ruby on rails RubyonRails教程-第11章-在开发中使用身份验证,但不在生产中使用

Ruby on rails RubyonRails教程-第11章-在开发中使用身份验证,但不在生产中使用,ruby-on-rails,heroku,Ruby On Rails,Heroku,我正在学习Michael Hartl的ruby on rails教程,目前正在学习电子邮件身份验证(第11章) 我已经完成了本章中的所有内容,所有内容在开发环境中都能完美运行,但当我与Heroku一起投入生产时,我遇到了一个bug 预期:新用户提交帐户创建表单后,应将其发送回root_url,并发送一条闪光消息,要求其检查电子邮件以进行身份验证 实际行为:新用户提交帐户创建表单后,他们似乎被路由到/users,出现错误(错误为:很抱歉,出现了问题,请检查日志) 同样,这在dev中非常有效,只是在

我正在学习Michael Hartl的ruby on rails教程,目前正在学习电子邮件身份验证(第11章)

我已经完成了本章中的所有内容,所有内容在开发环境中都能完美运行,但当我与Heroku一起投入生产时,我遇到了一个bug

预期:新用户提交帐户创建表单后,应将其发送回root_url,并发送一条闪光消息,要求其检查电子邮件以进行身份验证

实际行为:新用户提交帐户创建表单后,他们似乎被路由到/users,出现错误(错误为:很抱歉,出现了问题,请检查日志)

同样,这在dev中非常有效,只是在生产中没有

我所尝试的:

-我检查了日志,可以看到电子邮件已按预期生成

-我在Heroku中运行了一个控制台,可以看到新用户是在数据库中正确创建的,并且其身份验证字段被正确设置为false(等待电子邮件)

-我可以从日志中拉出身份验证链接并将其放在浏览器中,这样就可以看到它正确地验证了用户的身份

-我检查了用户模型和用户控制器,但看不到任何错误(希望测试套件能够在dev中捕获它们,或者错误会在dev中重现)

-我重置了heroku数据库,并重新运行了迁移和db:seed,看看这是否有帮助,没有变化

-我再次推了一下Heroku,看看那里是否出了问题——没有变化

-我试图删除Heroku中的插件并重新安装,但这样做显然会禁止我的Sendgrid帐户…所以我强烈建议你不要这样做。我现在正在使用Sendgrid重新激活

附件是Heroku日志中的错误,我可以找到:

2020-04-08T16:52:25.985006+00:00应用程序[web.1]:----==\u mimepart\u 5e8e0149d677d\u b2b0ebb83ed445621b-- 2020-04-08T16:52:25.985006+00:00应用程序[网站1]: 2020-04-08T16:52:25.985363+00:00应用程序[web.1]:I[2020-04-08T16:52:25.985276#11]信息--:[f4baf186-2987-4d21-bd92-c8324b3a09ca]在716ms内完成了500个内部服务器错误(ActiveRecord:6.2ms |分配:5310) 2020-04-08T16:52:25.986654+00:00应用程序[web.1]:F[2020-04-08T16:52:25.986541#11]致命--:[f4baf186-2987-4d21-bd92-c8324b3a09ca] 2020-04-08T16:52:25.986655+00:00应用程序[web.1]:[f4baf186-2987-4d21-bd92-c8324b3a09ca]网络::SMTPAuthenticationError(535身份验证失败:帐户已禁用) 2020-04-08T16:52:25.986655+00:00应用程序[web.1]:): 2020-04-08T16:52:25.986655+00:00应用程序[web.1]:[f4baf186-2987-4d21-bd92-c8324b3a09ca] 2020-04-08T16:52:25.986656+00:00应用程序[web.1]:[f4baf186-2987-4d21-bd92-c8324b3a09ca]应用程序/模型/用户。rb:53:in
send_activation_email'
2020-04-08T16:52:25.986656+00:00应用程序[web.1]:[f4baf186-2987-4d21-bd92-c8324b3a09ca]应用程序/控制器/用户/控制器。rb:22:in
create' 2020-04-08T16:52:25.997396+00:00 heroku[路由器]:at=info method=POST path=“/users”host=午后-dawn-31172.herokuapp.com请求\u id=f4baf186-2987-4d21-bd92-c8324b3a09ca-fwd=“72.38.16.251”dyno=web.1 connect=0ms服务=724ms状态=500字节=1891协议=https

非常感谢您的帮助

附件是SMTP服务器设置,以防出现问题

`


在您所附的日志中,您可以找到以下片段: Net::SMTPAuthenticationError(535身份验证失败:帐户已禁用2020-04-08T16:52:25.986655+00:00应用程序[web.1]:)

这意味着SMTP(发送电子邮件的服务)的身份验证不好。因此,您应该在这里检查SMTP配置。也许有一条规则只为开发环境设置配置

谢谢你的帮助

考虑到SENDGRID给我带来的麻烦,包括我试图通过删除/重新安装Heroku插件来完全禁止自己使用SENDGRID,我决定将SMTP改为Google

这很容易做到,而且第一次就奏效了

注意:请记住在设置SMTP之前设置两步验证,并生成特定于应用程序的密码


再次感谢所有发表评论的人。

我完全通过了相同的问题,所有这些步骤现在都完成了!尽管你已经用另一种方式解决了这个问题,但以下是如何为其他迈克尔·哈特尔的读者解决这个问题:

  • 当我试图重新安装插件时,Sendgrid坏连接也被禁止了!我在Sendgrid.com上创建了一个新的Sendgrid帐户,并向支持部门发送了一份SOS。在12小时内,他们用我的heroku登录名修复了我的访问权限:)

  • 然后我在sendgrid.com上创建了一个API密钥,并用它配置了heroku:
    heroku配置:设置SENDGRID\u API\u KEY=my\u API\u KEY

  • 在config/environment/production.rb中:

  • 我还添加了“sendgrid ruby”宝石

这个过程在这里有详细说明:

只要在迈克尔的书中写下这个,以防有人碰到同样的问题。Heroku目前似乎不支持SENDGRID加载项,或者您必须设置API密钥并做更多不必要的工作。通过使用MailGun服务而不是SENDGRID解决了这个问题。你所要做的就是:

  • 将MailGun附加组件添加到您的应用程序。您可以从终端直接执行此操作:
    $heroku addons:create mailgun:starter

  • 配置production.rb文件。您的设置应该与书中的SENDGRID版本几乎相同,只是更改了域名

  • config.action\u mailer.perform\u caching=false
    主机='.herokuapp.com'
    config.action_mailer.default_url_options={host:{host}
    config.action\u mailer.delivery\u method=:smtp
    config.action\u mailer.perform\u deliveries=true
    config.action\u mailer.smtp\u设置={
    :user_name=>ENV['MAILGUN_SMTP_LOGIN'],
    :密码=>
    
      config.action_mailer.delivery_method = :smtp
      host = 'afternoon-dawn-31172.herokuapp.com'
      config.action_mailer.default_url_options = { host: host }
      ActionMailer::Base.smtp_settings = {
        :address        => 'smtp.sendgrid.net',
        :port           => '587',
        :authentication => :plain,
        :user_name      => ENV['SENDGRID_USERNAME'],
        :password       => ENV['SENDGRID_PASSWORD'],
        :domain         => 'heroku.com',
        :enable_starttls_auto => true
      }  `
    
        config.action_mailer.perform_deliveries = true
        config.action_mailer.default_url_options = { host: host, protocol: 'https' }
        ActionMailer::Base.smtp_settings = {
            user_name: ENV['SENDGRID_USERNAME'],
            password: ENV['SENDGRID_PASSWORD'],
            domain: 'staticpages-pg.herokuapp.com',
            address: 'smtp.sendgrid.net',
            port: 587, 
            authentication: :plain,
            enable_starttls_auto: true
          }
    
      config.action_mailer.perform_caching = false
      host = '<yourHerokuApp>.herokuapp.com'
      config.action_mailer.default_url_options = {host: "#{host}"}
      config.action_mailer.delivery_method = :smtp
      config.action_mailer.perform_deliveries = true
      config.action_mailer.smtp_settings = {
        :user_name => ENV['MAILGUN_SMTP_LOGIN'],
        :password => ENV['MAILGUN_SMTP_PASSWORD'],
        :domain => "<yourHerokuApp>.heroku.com",
        :address => 'smtp.mailgun.org',
        :port => 587,
        :authentication => :plain,
        :enable_starttls_auto => true
        }