设计:重置密码什么都不做

时间:2013-12-12 00:12:43

标签: ruby-on-rails ruby-on-rails-3 devise

我正在为我的用户制作重置密码功能。用户收到带有重置令牌的电子邮件就好了,点击其中的链接后,他们会被重定向到新的密码表单。一旦提交它,虽然没有任何反应。该方法如下所示:

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

3 个答案:

答案 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