繁体   English   中英

用Devise找不到ID = update_password的用户

[英]Couldn't find User with id=update_password with Devise

我在Rails应用程序上使用devise,出于各种原因,我需要使用此处的解决方案3添加自定义密码更改: https : //github.com/plataformatec/devise/wiki/How-To : -Allow-users -to-编辑自己的密码

我已经研究了其他各种问题,并尝试通过多种方式来扩展我的路线,但是url总是出现在/ users / update_password(未传递参数)或/users/update_password.254(已传递参数)中。 我需要它是/ users / 254 / update_password。

这是我正在使用的用户控制器(相关方法是update_password和user_params)。

class UsersController < ApplicationController
inherit_resources
load_and_authorize_resource
before_filter :authenticate_user!

def destroy
  name = @user.to_s
  destroy!(notice: "User #{@user.to_s} was deleted.")
end

def edit
  @user = current_user
end

def update_password
  @user = User.find(current_user.id)
  if @user.update_with_password(user_params)
    sign_in @user, :bypass => true
    redirect_to root_path
  else
     render "edit"
 end
end

private

def build_resource_params
  [params.fetch(:user, {}).permit(:name, :email, :phone_number, :password, :password_confirmation).tap do |p|
    p[:institution_pid] = build_institution_pid if params[:user][:institution_pid]
    p[:role_ids] = build_role_ids if params[:user][:role_ids]
  end]
end

def build_institution_pid
  institution = Institution.find(params[:user][:institution_pid])
  authorize!(:add_user, institution)
  institution.id
end

def build_role_ids
  [].tap do |role_ids|
    roles = Role.find(params[:user][:role_ids].reject &:blank?)
    roles.each do |role|
      authorize!(:add_user, role)
      role_ids << role.id
    end
  end
end

def user_params
  params.required(:user).permit(:password, :password_confirmation, :current_password)
end

end

这是route.rb的相关部分

devise_for :users

resources :users do
  collection do
    get 'password'
    put 'update_password'
  end
end

这是我为其创建的视图:

<div class="page-header">
  <h1>Change Password</h1>
</div>

<%= form_for(@user, :url => { :action => "update_password" } ) do |f| %>
  <div class="field">
  <%= f.label :password, "Password" %><br />
  <%= f.password_field :password, :autocomplete => "off"  %>
</div>
<div class="field">
  <%= f.label :password_confirmation %><br />
  <%= f.password_field :password_confirmation %>
</div>
<div class="field">
  <%= f.label :current_password %> <i>(we need your current password to confirm your changes)</i><br />
  <%= f.password_field :current_password %>
</div>
<div class="action_container">
  <%= f.submit %>
</div>

这是链接:(当前带有参数,但我也尝试过不带)

<li><%= link_to "Change Password", update_password_users_path(current_user) %></li>

当我单击该链接时,我被路由到在UsersController#show中显示ActiveRecord :: RecordNotFound的页面,找不到ID = update_password的用户。

我试图严格按照说明进行操作,并且试图弄乱路线几次才能使其正常工作,但此时我迷路了。 有没有人看过这个并且可以提供帮助? 谢谢!

为了实现您所需要的,您将有以下路线:

resources :users do
  patch 'update_password', on: :collection
  get 'edit_password', on: :member
end

然后,您将添加一个链接,该链接将导致用户update password form 该链接应如下所示:

<li><%= link_to "Change Password", edit_password_user_path(current_user) %></li>

该链接将指向users/edit_password.html.erb

<div class="page-header">
  <h1>Change Password</h1>
</div>

<%= form_for(@user, :url => { :action => "update_password" } ) do |f| %>
  <div class="field">
  <%= f.label :password, "Password" %><br />
  <%= f.password_field :password, :autocomplete => "off"  %>
</div>
<div class="field">
  <%= f.label :password_confirmation %><br />
  <%= f.password_field :password_confirmation %>
</div>
<div class="field">
  <%= f.label :current_password %> <i>(we need your current password to confirm your changes)</i><br />
  <%= f.password_field :current_password %>
</div>
<div class="action_container">
  <%= f.submit %>
</div>
<% end %>

提交表单后,将触发UsersController update_password 这是控制器的代码:

class UsersController < ApplicationController

    def edit_password
        @user = current_user
    end


    def update_password
        @user = User.find(current_user.id)
        if @user.update_with_password(user_params)
            sign_in @user, :bypass => true
            redirect_to root_url
        else
            render "edit_password"
        end
    end

    private

    def user_params
        params.required(:user).permit(:password, :password_confirmation, :current_password)
    end

end

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM