我正在使用Devise 3.2.2。并打开Confirmable。
使用SQL,它显示在users表中创建了一个成功的令牌。
令牌位于生成的电子邮件链接中。但是点击它,给出确认令牌无效错误。我已经有了工作代码,允许使用用户名或电子邮件进行登录,但希望这不会产生冲突。
ERB:
<p>Welcome <%= @email %>!</p>
<p>You can confirm your account email through the link below:</p>
<p><%= link_to 'Confirm my account', confirmation_url(@resource, :confirmation_token => @resource.confirmation_token) %></p>
用户模型:
class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable, :confirmable
# Virtual attribute for authenticating by either username or email
# This is in addition to a real persisted field like 'username'
attr_accessor :login
# Setup accessible (or protected) attributes for your model
attr_accessible :email, :password, :password_confirmation, :remember_me, :approved, :role, :username, :userfriendlyname, :persona, :public, :login, :active, :confirmation_token, :confirmed_at, :confirmation_sent_at
# attr_accessible :title, :body
# MTM 06/21/2014 to allow for login with username or email
def self.find_for_database_authentication(warden_conditions)
conditions = warden_conditions.dup
if login = conditions.delete(:login)
where(conditions).where(["lower(username) = :value OR lower(email) = :value", { :value => login.downcase }]).first
else
where(conditions).first
end
end
# MTM 06/23/2014 to allow for login with username or email
def self.find_first_by_auth_conditions(warden_conditions)
conditions = warden_conditions.dup
if login = conditions.delete(:login)
where(conditions).where(["lower(username) = :value OR lower(email) = :value", { :value => login.downcase }]).first
else
where(conditions).first
end
end
end
答案 0 :(得分:0)
首先,我在SO上阅读了很多其他类似的问题,这个问题至少有助于理解流程,因为用户处于类似的绑定状态。 Devise Confirmation Resend "Login can't be blank" error & Confirmation link from email has "Confirmation token is invalid" error
但是我得到了解决方案来处理以下事情。
第1步。
confirmation_instructions.html.erb最初是在我使用pre Devise 3.1.x版本时创建的,因此link_to代码已更改。 SO中有很多文章。
基本上,替换:confirmation_token =&gt; @ resource.confirmation_token with:confirmation_token =&gt; @token。
第2步。
这是棘手的部分。我之前创建了一个自定义邮件程序,工作正常,因此必须将Devise操作复制到自定义邮件程序中。同样,也许是因为我当时使用的是旧版本的Devise,在这些操作中没有提及@token,所以在confirmation_instructions动作/方法中添加了@token =标记,因为标记被传递到此动作/方法作为参数。
def confirmation_instructions(record, token, opts={})
@token = token
devise_mail(record, :confirmation_instructions)
end
通过这样做,并在我提交重新发送确认指令请求时查看Rails控制台,我可以看到其他SO文章关于典型的Devise 3.1和更高行为的讨论,即,confirm_token是创建并存储在数据库中,但它与确认说明电子邮件发送的值不同,后者似乎是加密版本。当我点击电子邮件链接时,它进入登录页面并说确认成功。
答案 1 :(得分:-2)
使用您的代码更改此代码并检查。
%p = link_to'确认我的帐户',confirmation_url(@resource,:confirmation_token =&gt; @resource)