[英]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) %>
在浏览器中,该链接将我定向到:
但我收到路由错误
没有路线匹配 [GET] "/en/users/1/update_password"
当我包装
resources :users do
resources :wishlists
collection do
patch 'update_password'
end
end
发送到的链接
导致错误
未定义的局部变量或方法“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.