Разработать обновление пароля маршрута - PullRequest
0 голосов
/ 06 апреля 2020

В приложении 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 [: пользователь]

Что у меня есть пропустил?

1 Ответ

0 голосов
/ 06 апреля 2020

Прежде всего в решении 3 написано resource, а не resources. Внимательно следите за различиями между вами и приведенным ниже -

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

Во-вторых, подобное должно указывать на edit_user_path, а не update_password_user, так как это маршрут patch.

В-третьих, Вы должны добавить действие 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 %>

Вы пропустили много вещей. Попробуйте снова прочитать вики.

...