【发布时间】:2012-01-14 11:05:25
【问题描述】:
我正在使用与我的密码重置代码相同的代码作为我的电子邮件更改代码。 用户想要更改他们的电子邮件地址,所以他们输入他们的电子邮件地址,单击一个按钮,他们就退出了。
会向他们发送一封电子邮件,其中包含他们单击的链接,其中包含作为 id 的代码,然后将其与存储在数据库中的代码进行匹配,以确认他们实际上是帐户所有者。无论如何,当我单击时,我都会收到如下所示的错误。
问题是我收到此错误:
ArgumentError in EmailsController#edit
comparison of String with ActiveSupport::TimeWithZone failed
Rails.root: /Users/greg/site
Application Trace | Framework Trace | Full Trace
app/controllers/emails_controller.rb:19:in `<'
app/controllers/emails_controller.rb:19:in `edit'
Request
Parameters:
{"id"=>"KdFTTeWuOGqpDm6F_iY7aw"}
Show session dump
Show env dump
Response
Headers:
None
电子邮件控制器创建:
def create
@user = User.find_by_email(params[:email_change][:email])
logout if logged_in?
@user.generate_and_store_email_change_token && UserMailer.email_change(@user).deliver if @user
flash[:success] = "Email sent with email reset instructions."
redirect_to root_url
end
电子邮件控制器编辑:
def edit
@user = User.find_by_email_change_token(params[:id])
if @user.nil?
flash[:error] = "The email change link you clicked has been used."
redirect_to root_url
elsif @user.email_change_sent_at < 2.hours.ago
flash[:error] = "Email change token has expired."
redirect_to email_change_url
end
end
用户模型:
def generate_and_store_email_change_token
self.email_change_token = SecureRandom.urlsafe_base64
self.email_change_sent_at = Time.zone.now
save!(:validate => false)
end
def remove_used_email_change_token
self.email_change_token = nil
save!(:validate => false)
end
这很奇怪,因为完全相同的代码适用于我的密码重置。我再次测试,我没有收到电子邮件版本给我的错误。
亲切的问候
【问题讨论】:
-
email_change_sent_at的类型是什么?你确定是日期时间吗? -
啊,是的!这解释了它现在,甚至没有我测试。我实际上记得昨天创建迁移并将属性类型设置为字符串。让我测试确认。
-
感谢错误消失了!也许您可以发布您的答案,我可以接受并标记您。
标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.1 rubygems