升级到rails 3.2并设计2.0后 并单击通过电子邮件发送的确认链接或从开发中的控制台复制的确认链接,confirm_at列不会更新。结果就是你无法登录。
解决这个问题的方法是什么,因为日志中没有任何内容,可访问的属性包含了confirmed_at,因此该列应该是可更新的。
答案 0 :(得分:8)
您的故障排除很少。
首先(显而易见的:-))您已在用户模型中激活确认
devise : :confirmable
然后,检查数据库和模型中是否定义了以下列(如果您使用的是Mongoid,则使用不同的类型)
## Confirmable
t.string :confirmation_token
t.datetime :confirmed_at
t.datetime :confirmation_sent_at
# t.string :unconfirmed_email # Only if using reconfirmable
最后(我不知道它适用于你并提出问题)但是关于确认的2.0有变化
此外,还重命名或删除了一些配置选项:
Devise.confirm_within已重命名为Devise.allow_unconfirmed_access_for;
然后为刚刚创建的新用户提供rails控制台的是什么?
应该提供类似
的内容User.last
=> #<User .... email: "youremail@example.com", confirmation_token: "abch76UfqHBBxHw97123", confirmed_at: nil, confirmation_sent_at: 2012-02-10 11:06:41 UTC, unconfirmed_email: nil, ....>
您收到的链接(您也可以在浏览器中手动复制粘贴应该类似于(并与上述确认令牌一致)
<p><a href="http://localhost:5000/users/confirmation?confirmation_token=abch76UfqHBBxHw97123">Confirm my account</a></p>
应该相应地修改控制台中的用户
User.last
=> #<User .... email: "youremail@example.com", confirmation_token:nil, confirmed_at: confirmed_at: 2012-02-10 11:28:04 UTC, confirmation_sent_at: 2012-02-10 11:06:41 UTC, unconfirmed_email: nil, ....>
如果您在浏览器中复制链接仍然无效,您可以复制日志的最后几行吗?
周围的人
20:36:51 web.1 | Started GET "/users/confirmation?confirmation_token=abch76UfqHBBxHw97123" for 127.0.0.1 at 2012-02-10 20:36:51 +0900
20:36:51 web.1 | [127.0.0.1] Processing by Devise::ConfirmationsController#show as HTML
20:36:51 web.1 | [127.0.0.1] Parameters: {"confirmation_token"=>"abch76UfqHBBxHw97123"}
答案 1 :(得分:1)
(我把它转移到一个不同的答案,因为我觉得它应该得到它)
{“confirmation_token”=&gt;“PAPe74HyVmRheFbaBAaw”}用户负载(0.4ms)SELECT用户。* FROM用户WHERE users.confirmation_token ='PAPe74HyVmRheFbaBAaw'LIMIT 1(0.2ms)BEGIN(0.1ms)COMMIT已完成401未经授权为15ms
您是否与CanCan一起使用?这是一个Cancan配置问题! 如果您删除CanCan它可能会工作:-)。尽管如此,CanCan Wiki还是有一个优雅的解决方案。
将以下内容放入ApplicationController
check_authorization :unless => :devise_controller?
https://github.com/ryanb/cancan/wiki/Ensure-Authorization
有条件地检查授权
从CanCan 1.6开始,check_authorization方法支持:if和:unless options。任何一个都将方法名称作为符号。将调用此方法以确定是否将执行授权检查。这使得在所有Devise控制器上跳过此检查非常容易,因为它们提供了devise_controller?方法
class ApplicationController < ActionController::Base
check_authorization :unless => :devise_controller?
end