设计:更改密码

时间:2012-02-22 03:54:32

标签: devise change-password ruby-on-rails-3.2

我一直坚持这个超过24小时试图按照这里发布的其他解决方案,但我不能让这个工作。我是Rails的新手,需要帮助!

我想让我的/ users / edit页面正常工作,这样我就可以简单地更改用户密码。最初,我想在没有current_password的情况下这样做,但我不介意将其留在那里,只要我能够更改和更新密码。

这就是我的所作所为:

我按照Devise Wiki中的示例将其插入到我指定继承自Devise :: RegistrationsController

的Users控制器中
class UsersController < Devise::RegistrationsController
  ...
end

我改变了路线:

devise_for :users, :controllers => { :registrations => 'users' } do 
  match '/users' => 'users#index'
end

这是我的模特:

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  attr_accessor :password, :password_confirmation, :current_password
  attr_accessible :email, :password, :password_confirmation, :current_password,      :remember_me, :full_name, :coach, :bio 

  validates :full_name, presence: true

end

我假设我创建的UsersController会覆盖Registrations控制器,我可以更改/更新密码。它工作到重定向到root_path的程度(这只是在没有当前密码更新后发生)但新密码没有保存(我检查了日志,没有SQL显示它已保存)... < / p>

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

尝试做类似的事情: Devise Forgot Password for logged in user

这使您可以使用单独的视图来更改密码。

关键是我无法让它在设计中工作,所以我在用户控制器中编写了我自己的解决方案并发布到该解决方案,而不是使用设计提供的方法。

将此添加到您希望能够编辑密码的用户表单中:

<%= form_for(@user, :url => url_for(:action => :do_reset_password) , :html => { :method => :post }) do |f| %>

  <%= f.hidden_field :reset_password_token %>

  <div><%= f.label :password, "New password" %><br />
  <%= f.password_field :password %></div>

  <div><%= f.label :password_confirmation, "Confirm new password" %><br />
  <%= f.password_field :password_confirmation %></div>

  <div><%= f.submit "Change my password" %></div>
<% end %>

用户控制器:

    def do_reset_password
        id = params[:id]

        # there may be a better way of doing this, devise should be able to give us these messages
        if params[:user][:password] != params[:user][:password_confirmation]
            flash[:alert] = "Passwords must match." 
              redirect_to :back
              return
        end
        if @user.reset_password!(params[:user][:password],params[:user][:password_confirmation])
            @user.save
            respond_to do |format|
                format.html { redirect_to '/home', notice: 'Your password has been changed.' }
            end
        else
            flash[:alert] = "Invalid password, must be at least 6 charactors." 
              redirect_to :back 
        end
    end

配置/ routes.rb中

resource :users do
  post 'do_reset_password'
end