我一直坚持这个超过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>
有什么想法吗?
答案 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