2

我已经坚持了 24 小时以上,试图遵循此处发布的其他解决方案,但我无法让它发挥作用。我是 Rails 新手,需要帮助!

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

这是我所做的:

我按照Devise Wiki中的示例将其插入到我指定从 Devise::RegistrationsController 继承的用户控制器中

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 显示它已保存)...

有任何想法吗?

4

1 回答 1

3

尝试做类似的事情: 为登录用户设计忘记密码

这让您有一个单独的视图来更改密码。

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

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

<%= 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

配置/路由.rb

resource :users do
  post 'do_reset_password'
end
于 2012-02-22T04:25:36.803 回答