0

我使用的密码与我的密码重置代码完全相同,用于我的电子邮件更改代码。 用户想要更改他们的电子邮件地址,以便他们键入他们的电子邮件地址点击一个按钮,他们已注销。ActiveSupport :: TimeWithZone在Ruby on Rails上失败错误

一封电子邮件发送给他们包含他们点击的链接,包含一个代码作为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 

这很奇怪,因为完全相同的代码适用于我的密码重置。我再次测试,我没有收到电子邮件版本给我的错误。

亲切的问候

+0

'email_change_sent_at'的类型是什么?你确定它是日期时间吗? – 2012-01-14 11:19:01

+0

啊,是的!现在解释它,甚至测试我。我实际上记得创建迁移并将属性类型设置为字符串。让我测试以确认。 – LondonGuy 2012-01-14 11:25:02

+0

感谢错误消失了!也许你可以发布你的答案,我可以接受它并标记你。 – LondonGuy 2012-01-14 11:31:52

回答

2

好像email_change_sent_at类型是string。您应该将其更改为datetime

+0

感谢错误消失了! – LondonGuy 2012-01-14 12:14:28