2011-12-16 3 views
6

Sto tentando di consentire all'utente di reimpostare la propria password utilizzando l'opzione ripristinata di Devise. Questo non sembra funzionare per me.Devise - Recoverable (Reimposta password)

Estendo lo Devise::PasswordsController in modo che non utilizzi il layout dell'applicazione.

class PasswordsController < Devise::PasswordsController 
    layout false 
end 

Nei miei percorsi, mi assicuro che venga utilizzato il controller delle mie password.

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

Ecco il mio modello per l'utente in modo da vedere che ho la possibilità :recoverable.

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

Sulla mia pagina di login, ho (sto usando Haml):

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

Questo link mi porta correttamente per http://localhost:3000/users/password/new Qui è il modulo che si trova lì:

%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" 

Tuttavia, questo sembra cercare di portarmi nel posto sbagliato quando faccio clic sul pulsante. Sta fallendo ogni volta e non mostra alcuna email nel log del server.

Mi ha reindirizzamento a: http://localhost:3000/passwords/user e dicendomi:

Routing Errore

No route matches "/passwords/user" 

Qualsiasi idea di come posso procedere? Pensavo che usare l'opzione ripristinabile fosse pensata per essere più facile di così. Che cosa sto facendo di sbagliato?

UPDATE Per la cronaca, ho appena rimosso tutto quello che ho fatto, e ha cercato con i controllori testamentaria standard e ho modificato il mio layout applicazione in modo che non causerebbe un errore, e tutto funziona. Quindi ho solo bisogno di un buon metodo per rimuovere il layout dell'applicazione dalla pagina di reimpostazione della password.

risposta

2

Sembra che quando si chiama password_path(resource_name) nel codice di visualizzazione, il sistema di routing pensa che si intenda /passwords/resource_name, anziché il nome del controller specificato in users da Devise. Questo perché si ha la linea

resources :passwords 

direttamente sotto la vostra devise_for chiamata nel file percorsi. Ora non sono sicuro che quella linea sia lì per un motivo, ma il tuo problema scompare quando lo commenta?

+0

Il problema rimane. Non mi consentirà di accedere alla pagina di reimpostazione della password senza di essa. Si lamenterà che non esiste un percorso per gli utenti/password/nuovi. Inizialmente l'ho pensato anch'io, ho trovato queste informazioni qui: https: // github.com/plataformatec/devise/wiki/How-To: -Allow-users-to-edit-their-password – ardavis

+0

Penso che il problema principale sia il fatto che sto cercando di estendere Devise :: PasswordsController. Vorrei non doverlo fare, l'unica cosa che voglio è che la pagina di reimpostazione della password non utilizzi il layout dell'applicazione. – ardavis

+0

Per la cronaca, ho appena rimosso tutto ciò che ho fatto e ho provato a utilizzare i controller di elaborazione standard e ho modificato il layout dell'applicazione in modo che non causasse un errore e tutto funzionasse. Quindi ho solo bisogno di un buon metodo per rimuovere il layout dell'applicazione dalla pagina di reimpostazione della password. – ardavis

0

Per il beneficio di chi trova questo thread precedente e desidera che alcune pagine abbiano un layout diverso, utilizzo questo metodo nell'app/views/layouts/application.html.erb per rimuovere il layout predefinito.

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

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

So che questo è/era un vecchio commento, ma puoi facilmente sovrascrivere il layout di idea creando il proprio file di layout app/views/layouts/devise.html.erb'. – Dan

+0

Grazie per il commento e l'aggiornamento a queste informazioni. Non sapevo quel pezzo di bacchetta magica al momento del mio post. – JosephK