2011-12-16 88 views
6

我想讓用戶使用Devise的可恢復的選項重置密碼。這似乎不適合我。設計 - 可恢復(密碼重置)

我擴展了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 

在我的登錄頁,我(我使用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" 

任何想法,我該怎麼處理?我認爲使用可恢復的選項意味着比這更容易。我究竟做錯了什麼?

UPDATE 爲了記錄在案,我只是刪除一切我所做的,並使用標準色器件控制器嘗試過了,我修改了應用程序的佈局,這樣就不會導致錯誤,並且一切工作。所以我只需要一個很好的方法從密碼重置頁面中刪除應用程序佈局。

回答

2

看起來,當您在視圖代碼中調用password_path(resource_name)時,路由系統認爲您的意思是/passwords/resource_name,而不是由Devise在users下的控制器命名空間。這是因爲你有

resources :passwords 

直接根據你的devise_for調用你的路由文件。現在我不確定這條線是否有原因,但是當你評論它時,你的問題是否會消失?

+0

問題仍然存在。如果沒有它,它不會讓我訪問重置密碼頁面。它會抱怨沒有用戶/密碼/新的路線。我原來也是這麼想的,我在這裏找到了這個信息:https:// github。com/plataformatec/devise/wiki /如何: - 允許用戶編輯他們的密碼 – ardavis 2011-12-16 16:57:32

+0

我認爲主要問題是我試圖擴展Devise :: PasswordsController。我希望我不必這樣做,我唯一想要的是重置密碼頁面不使用我的應用程序佈局。 – ardavis 2011-12-16 16:58:16

0

爲了發現這個舊線程並希望某些頁面具有不同佈局的人的利益,我在我的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 %>