我正在为我的用户制作重置密码功能。用户收到带有重置令牌的电子邮件就好了,点击其中的链接后,他们会被重定向到新的密码表单。一旦提交它,虽然没有任何反应。该方法如下所示:
def update
self.resource = resource_class.reset_password_by_token(resource_params)
if resource.errors.empty?
resource.unlock_access! if unlockable?(resource)
flash_message = resource.active_for_authentication? ? :updated : :updated_not_active
set_flash_message(:notice, flash_message) if is_flashing_format?
sign_in(resource_name, resource, :bypass => true)
redirect_to new_user_session_url, :notice => "Your password has been changed."
else
redirect_to new_user_session_url, :flash => { :error => resource.errors.full_messages }
end
end
我收到错误,没有任何消息。有人有主意吗?相当困在这里。谢谢!
更新
日志输出:
Started PUT "/change.user" for 127.0.0.1 at 2013-12-12 11:09:23 +100
Processing by UserPasswordsController#update as
Parameters: {"utf8"=>"✓", "authenticity_token"=>"BXUu0J7OVxbKRaRqnI88w/bNuJF5uhaEabnw5GlFj+w=", "user"=>{"reset_password_token"=>"[FILTERED]", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"Change my password"}
User Load (0.3ms) SELECT `users`.* FROM `users` WHERE `users`.`reset_password_token` = 'c83cf7b19af0b5eb100d7f1a73eefbeb07ce53980bc1dea14301f7417c4eea32' LIMIT 1
Redirected to http://lvh.me:3000/d/sign_in
Completed 302 Found in 3ms (ActiveRecord: 0.3ms)
就是这样。没有错误,没有。
路线
reset_password GET /reset_password(.:format) user_passwords#new
new_password GET /new_password(.:format) user_passwords#edit
create_password POST /send_email(.:format) user_passwords#create
update_password PUT /change(.:format) user_passwords#update
答案 0 :(得分:0)
您为什么要自己构建重置密码功能? Devise已在recoverable
模块下自动内置重置密码功能。此外,您可以在此处发布堆栈跟踪或日志输出。感谢。
答案 1 :(得分:0)
我可以不弄清楚那里发生了什么,所以我写了自己的方法。它有效,也许它会帮助别人。
def update
@user = User.where(:reset_password_token => params[:user][:reset_password_token]).first
@user.password = params[:user][:password]
@user.password_confirmation = params[:user][:password_confirmation]
@user.reset_password_token = ""
@user.save!
if @user.errors.empty?
redirect_to new_user_session_url, :notice => "Your password has been changed."
else
redirect_to new_user_session_url, :flash => { :error => @user.errors.full_messages }
end
end
答案 2 :(得分:0)
我遇到了与Devise 2.2 / Rails 3.2 / Ruby 2.1相同的问题。我的日志只显示Devise使SELECT查询找到用户,然后BEGIN一个事务,然后立即ROLLBACK。我尝试更新到Devise 3.0,3.1和3.2。每次生成新设计初始化和视图:
rails generate devise:install
rails generate devise:views
那是不成功的。所以我安装了'byebug'调试器。然后找到设计文件:
bundle show devise
编辑密码控制器:
sudo nano /var/lib/gems/2.1.0/gems/devise-3.2.4/app/controllers/devise/passwords_controller.rb
在 update 方法中添加了调试断点并检查了错误。我发现这只是我的用户模型的验证导致了错误。但由于错误发生在特定字段上, simple_form 不会显示错误。最后,为了使调试更容易,我添加了一行来记录我日志中的错误:
if resource.errors.empty?
...
else
logger.debug "[Devise] #{resource.errors.full_messages}"
respond_with resource
end