【问题标题】:Heroku confirmation token - Devise error (even with Sendgrid)Heroku 确认令牌 - 设计错误(即使使用 Sendgrid)
【发布时间】:2013-05-20 21:03:06
【问题描述】:

我正在使用 Heroku、Devise 和 Sendgrid。

这些是我在environment/production.rb中的设置:

  config.action_mailer.default_url_options = { :host => 'myapp.herokuapp.com' }

  # ActionMailer Config
  # Setup for production - deliveries, no errors raised
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.perform_deliveries = true
  config.action_mailer.raise_delivery_errors = false
  config.action_mailer.default :charset => "utf-8"

  config.action_mailer.smtp_settings = {
    address: "smtp.sendgrid.net",
    port: 25,
    domain: "myapp.herokuapp.com",
    authentication: "plain",
    user_name: ENV["SENDGRID_USERNAME"],
    password: ENV["SENDGRID_PASSWORD"]
  }

我已经在 Heroku 上设置了 ENV 变量,当我注册一个帐户时,它会正确地将电子邮件发送到正确的电子邮件地址。

只是当我点击确认链接时,我收到一堆错误并且没有确认帐户:

Started GET "/users/confirmation?confirmation_token=dZf6Jqc7x88q8tyH5bZp" for XX.XX.XX.XX at 2013-05-20 20:59:29 +0000
2013-05-20T20:59:29.413847+00:00 app[web.1]: 
2013-05-20T20:59:29.413847+00:00 app[web.1]: NameError (uninitialized constant Confirmation):
2013-05-20T20:59:29.413847+00:00 app[web.1]:   

编辑 1

这是我的User.rb设计部分:

class User < ActiveRecord::Base
  rolify
  # Include default devise modules. Others available are:
  # :token_authenticatable, :confirmable,
  # :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable, :confirmable,
         :recoverable, :rememberable, :trackable, :validatable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :role_ids, :as => :admin
  attr_accessible :name, :email, :password, :password_confirmation, :remember_me

编辑 2

当我做同样的事情时,我的development.log 会发生这种情况。

Started GET "/users/confirmation?confirmation_token=Gs3UYE2m6D84zfuXfa66" for 127.0.0.1 at 2013-05-20 17:12:39 -0500
Processing by ConfirmationsController#show as HTML
  Parameters: {"confirmation_token"=>"Gs3UYE2m6D84zfuXfa66"}
Completed 500 Internal Server Error in 10ms

NameError - uninitialized constant Confirmation:
  (gem) activesupport-3.2.13/lib/active_support/dependencies.rb:520:in `load_missing_constant'

我已经运行了所有的迁移,也许我需要为Confirmable 模块生成一个新的迁移?我该怎么做?

编辑 3

这就是我的schema.rb 中的users 表的样子:

  create_table "users", :force => true do |t|
    t.string   "email",                  :default => "", :null => false
    t.string   "encrypted_password",     :default => "", :null => false
    t.string   "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer  "sign_in_count",          :default => 0
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.string   "current_sign_in_ip"
    t.string   "last_sign_in_ip"
    t.datetime "created_at",                             :null => false
    t.datetime "updated_at",                             :null => false
    t.string   "name"
    t.string   "confirmation_token"
    t.datetime "confirmed_at"
    t.datetime "confirmation_sent_at"
    t.string   "unconfirmed_email"
    t.float    "sales_today"
    t.float    "sales_this_week"
    t.float    "sales_lifetime"
    t.boolean  "is_seller"
  end

所以在我看来,Confirmable 模块已全部设置完毕。

编辑 4

我忘了我确实覆盖了ConfirmationsController

class ConfirmationsController < Devise::ConfirmationsController
  load_and_authorize_resource

  protected
    def after_confirmation_path_for(resource_name, resource)
      if resource.has_role? :seller
        new_item_path
      else
        root_path
      end
    end
end

【问题讨论】:

  • 这实际上根本不是 SendGrid 问题,这是一个设计问题。介意为您的设计用户分享您的代码吗?
  • 我假设您的意思是用户模型的设计配置,对吧?如果是这样......我已经做到了。如果你想要别的东西,请告诉我。谢谢!
  • 您是否覆盖了任何默认的设计类?如果您在开发模式而不是生产模式下确认,这是否有效?
  • 我可能错了,但是 environment/production.rb 会被 Heroku 取代吗?
  • 这是一个公平的观点,没关系,问题在于模型。

标签: ruby-on-rails ruby-on-rails-3 heroku devise devise-confirmable


【解决方案1】:

在我看来,当您添加 :confirmable 模型时,您忘记了迁移数据库。从这几行就知道了

Started GET "/users/confirmation?confirmation_token=dZf6Jqc7x88q8tyH5bZp" for XX.XX.XX.XX at 2013-05-20 20:59:29 +0000
2013-05-20T20:59:29.413847+00:00 app[web.1]: 
2013-05-20T20:59:29.413847+00:00 app[web.1]: NameError (uninitialized constant Confirmation):

主要是

NameError (uninitialized constant Confirmation):

错误出现在您的应用中。我在数据库中猜测,因为没有数据库表,设计可能甚至不会设置模型。

您覆盖了 ConfirmationsController。不要忘记在您覆盖的每个方法上调用super

另外:仅仅因为您的 schema.rb 说存在列,并不意味着它确实存在。确保将您的迁移检查到版本控制中,否则它将永远无法到达服务器。

现在:进入您的终端并运行heroku run rails console。在那里尝试一些代码,并发布你得到的任何错误日志。这是一个非常强大的工具。

最好的,

布赖恩

【讨论】:

  • 你可能是对的。我用我的development.log 的日志更新了这个问题。所以现在,问题是......我该如何解决这个问题?我最近运行了rake db:migrate....所以这不是问题。
  • 另外,在我的Schema.rbusers 表中,我有这些列:t.string "confirmation_token"t.datetime "confirmed_at"t.datetime "confirmation_sent_at"。那么还缺少什么?
  • 我忘记了我曾尝试覆盖 ConfirmationsController - 所以这可能是现在让我头疼的原因?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-19
  • 2013-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多