2011-05-31 69 views
2

我有條不紊地通過Agile Web Development with Rails書籍工作。到目前爲止,我沒有遇到任何問題,直到我遇到使用會話控制器註銷的開發。我只是試圖讓destroy方法在會話控制器中工作。以下是我有:Rails 3在會話中註銷路由控制器

sessions_controller.rb

def destroy 
    session[:user_id] = nil 
    redirect_to store_url, :notice => "Logged out" 
end 

的routes.rb

controller :sessions do 
    get 'login' => :new 
    post 'login' => :create 
    delete 'logout' => :destroy 
end 

我重啓服務器並可以登錄使用本地主機:3000 /登錄,但如果我嘗試本地主機:3000 /註銷我得到以下路由錯誤:沒有路由匹配「/註銷」

任何幫助非常感謝,因爲我一直在挖掘通過網絡試圖找到答案。

+0

您可以顯示註銷鏈接的代碼在你的看法呢?也許它缺少':method =>:delete'? – Mischa 2011-05-31 06:09:21

+1

奧斯汀是正確的。當您直接在瀏覽器中輸入'/ logout'時,您正在執行'get'請求,而預計將發出'delete'請求。如果您希望通過在瀏覽器的地址欄中輸入'/ logout'來註銷,則必須將'delete'更改爲'get'。 – Mischa 2011-05-31 06:32:32

回答

4

我相信

delete 'logout' => :destroy 

應該

get 'logout' => :destroy 

post 'logout' => :destroy 

取決於你是如何處理的行爲。最有可能你想要get

+0

不,註銷破壞會話,所以刪除請求是正確的。 – Mischa 2011-05-31 06:07:45

+0

是的行動本身是一個破壞行動,因爲你正在破壞會議。但是對於rails,當用戶進入/註銷時,他們正在執行獲取請求。 – 2011-05-31 06:23:12

+0

我現在明白你的觀點......他不是在談論一個鏈接,而是直接去/註銷。如果你稍微編輯你的答案,我可以撤銷我的失望。對不起... – Mischa 2011-05-31 06:29:01

1

OK AW TYW AWDWR。在原來的問題提供的代碼/路線是正確的,如果你想執行以下按鈕:

<%= button_to 'Logout', logout_path, :method => :delete %> 

不知道爲什麼這個工程的按鈕,但是當我在網址欄中輸入/註銷「獲取」的答案工程??

1

這是因爲瀏覽器只支持兩個HTTP動詞:GET和POST。 Rails使用技巧(我認爲JavaScript)假裝瀏覽器正在發送「PUT」和「DELETE」,它們將被路由到與GET和POST的不同操作關聯。在上面的例子中,DELETE方法被路由到控制器的destroy操作,唯一的目的是關閉會話但不呈現頁面。

在配置/ route.rb - 以下是註銷按鈕點擊的關鍵是:

controller :sessions do 
    get 'login' => :new 
    post 'login' => :create 
    delete 'logout' => :destroy 
end