В приложении rails с Devise я пытаюсь предоставить пользователям форму для смены паролей.
Я следовал решению 3 из вики Devise: https://github.com/heartcombo/devise/wiki/How-To: - Разрешить -users-to-edit-их-пароль
и соответственно имеют в пользовательском контроллере
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
rout.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
Rake маршруты дает я:
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 / пароль
, что приводит к ошибке
неопределенная локальная переменная или метод `user_update_password_path 'для
<#: 0x00007f86cfe48f10> Вы имели в виду? user_password_path
однако, маршруты рельсов показывают:
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". Это может произойти по двум причинам:
1) Вы забыли обернуть свой маршрут внутри блока области видимости. Например:
devise_scope: пользователь действительно получает "/ some / route" => "some_devise_controller" end
2) Вы тестируете контроллер Devise в обход маршрутизатора. Если это так, вы можете явно указать Devise, какое отображение использовать:
@request.env ["devise.mapping"] = Devise.mappings [: пользователь]
Что у меня есть пропустил?