繁体   English   中英

Devise 更新密码路由

[英]Devise update password route

在使用 Devise 的 Rails 应用程序设置中,我试图为用户提供更改密码的表单。

我遵循了 Devise wiki 中的解决方案 3: https://github.com/heartcombo/devise/wiki/How-To:-Allow-users-to-edit-their-password

并因此在用户 controller

class UsersController < Devise::RegistrationsController
  def update_password
    @user = current_user
    if @user.update(user_params)
      # Sign in the user by passing validation in case their password changed
      bypass_sign_in(@user)
      redirect_to root_path
    else
      render "edit"
    end
   end
end

路线.rb

devise_for :users,
           path: "", path_names: {
             sign_in: "login",
             sign_out: "logout",
             sign_up: "register",
             edit: "settings"
           },
           controllers: {
             registrations: "users",
             sessions: "users/sessions"
           }
resources :users do
 patch 'update_password'    
end

耙路线给了我:

user_update_password_path   POST    (/:locale)/users/:user_id/update_password(.:format)     

users#update_password {:locale=>/fr|en|de/}

访问菜单的链接如下:

<%= link_to user_update_password_path(current_user) %>

在浏览器中,该链接将我定向到:

http://localhost:3000/en/users/1/update_password

但我收到路由错误

没有路线匹配 [GET] "/en/users/1/update_password"

当我包装

resources :users do
  resources :wishlists
  collection do
    patch 'update_password'
  end
end

发送到的链接

http://localhost:3000/1/password

导致错误

未定义的局部变量或方法“user_update_password_path”

<#:0x00007f86cfe48f10> 你的意思是? 用户密码路径

但是,rails 路线显示:

update_password_users PATCH  (/:locale)/users/update_password(.:format)                                               users#update_password {:locale=>/fr|en|de/}

但是一个link_to

update_password_users_path

导致错误

找不到路径“/en/users/update_password”的 devise 映射。 这可能有两个原因:

1)您忘记将路线包装在 scope 块内。 例如:

devise_scope:用户确实得到“/some/route”=>“some_devise_controller”结束

2) 您正在绕过路由器测试 Devise controller。 如果是这样,您可以明确告诉 Devise 使用哪个映射:

@request.env["devise.mapping"] = Devise.mappings[:user]

我错过了什么?

首先在解决方案 3 中它说resource而不是resources 仔细观察你的和下面的区别 -

resource :user, only: [:edit] do
  collection do
    patch 'update_password'
  end
end

其次,like 应该指向edit_user_path而不是update_password_user ,因为那是patch路由。

第三,您必须按照 wiki 的建议向 controller 添加edit操作。 也是行动的一种形式。

  before_action :authenticate_user!

  def edit
    @user = current_user
  end

并在app/views/users/edit.html.erb

<%= 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="action_container">
    <%= f.submit %>
  </div>
<% end %>

你错过了很多东西。 再次尝试阅读 wiki。

暂无
暂无

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

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