Devise - Восстанавливаемый (Сброс пароля) - PullRequest
6 голосов
/ 16 декабря 2011

Я пытаюсь разрешить пользователю сбросить свой пароль с помощью опции Devise recoverable .Похоже, это не работает для меня.

Я расширяю Devise::PasswordsController, чтобы он не использовал макет приложения.

class PasswordsController < Devise::PasswordsController
  layout false
end

В моих маршрутах я гарантирую, чтоиспользуется мой контроллер паролей.

devise_for :users, :controllers => {:passwords => "passwords"}
resources :passwords

Вот моя модель пользователя, поэтому вы видите, что у меня есть опция :recoverable.

devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

На моей странице входа у меня есть (яm используя haml):

...
= link_to "Forgot your password?", new_password_path(resource_name)

Эта ссылка правильно переводит меня на http://localhost:3000/users/password/new. Вот форма, которую можно найти там:

%h2 Forgot your password?
= form_for(resource, as: resource_name, url: password_path(resource_name), html: { :method => :post }) do |f|
  = devise_error_messages!
  %div
    = f.label :email
    %br/
    = f.email_field :email
  %div= f.submit "Send me reset password instructions"

Однако, похоже, что это попытка взятьменя не туда, когда я нажимаю кнопку.Каждый раз происходит сбой, и в журнале сервера не отображаются электронные письма.

Он перенаправляет меня на: http://localhost:3000/passwords/user и сообщает:

Ошибка маршрутизации

No route matches "/passwords/user"

Есть идеи, как мне поступить?Я думал, что использование опции recoverable должно быть проще, чем это.Что я делаю не так?

ОБНОВЛЕНИЕ Для записи я просто удалил все, что я сделал, и попытался использовать стандартные контроллеры devise, и я изменил макет приложения, чтобы он невызывают ошибку, и все работает.Поэтому мне просто нужен хороший способ удалить макет приложения со страницы сброса пароля.

Ответы [ 2 ]

2 голосов
/ 16 декабря 2011

Похоже, что когда вы вызываете password_path(resource_name) в вашем коде представления, система маршрутизации думает, что вы имеете в виду /passwords/resource_name, а не пространство имен контроллера под users от Devise.Это потому, что у вас есть строка

resources :passwords

прямо под вашим вызовом devise_for в вашем файле маршрутов.Теперь я не уверен, есть ли эта строка по какой-то причине, но ваша проблема исчезает, когда вы ее комментируете?

0 голосов
/ 27 ноября 2013

Для того, чтобы тот, кто находит эту старую ветку и хотел, чтобы у некоторых страниц был другой макет, я использую этот метод в своем app / views / layouts / application.html.erb, чтобы удалить макет по умолчанию.

<% if ( current_page?(what_ever_path)) %>
    <div class="container">
        <%= yield %>
    </div>      

<% else %> 
    <%= render 'layouts/header' %>
    <div class="container">
        <%= yield %>
    </div>
    <%= render 'layouts/footer' %>
<% end %>
...