2014-04-18 112 views
1

真的是新設計 - 這是非常令人沮喪的所有誠實...設計銷燬會話不會破壞會話嗎?

我的用戶會話沒有被破壞。

這裏是我的導航欄的鏈接:

<li><%= link_to 'Logout', destroy_user_session_path, :method => :delete %></li> 

devise.rb有:刪除配置方法:

# The default HTTP method used to sign out a resource. Default is :delete. 
    config.sign_out_via = :delete 

路線是:

destroy_user_session DELETE /users/sign_out(.:format)    sessions#destroy 

應用控制器說:

class ApplicationController < ActionController::Base 
    protect_from_forgery 

    private 
     def after_sign_out_path_for(resource_or_scope) 
     root_path 
     end 

我點擊我的退出鏈接,我的控制檯顯示:

Started GET "https://stackoverflow.com/users/sign_out" for 127.0.0.1 at 2014-04-18 12:00:26 -0500 
Processing by UsersController#show as HTML 
    Parameters: {"id"=>"sign_out"} 
MONGODB (0.8ms) waittext_development['users'].find({:_id=>BSON::ObjectId('53515685963e6507ad00003e')}).limit(-1) 

這似乎並沒有被找到活動會話(我點擊它在挫折十多次),但問題是我登陸的頁面 - UsersController#show - 不是我告訴它路由到的頁面。它應該是root_path這是用戶#index

所以我得到所有這些nil類錯誤的用戶#show,因爲它試圖呈現默認的rails @ user.name等,而@user沒有定義 - 我終於推翻手動秀動作簡單地渲染「索引」我結束了我的索引頁上 - 但還是 - 我看到這裏current_user.email印刷:

<% if user_signed_in? -%> 
    <ul> 
    <li><%= current_user.email %></li> 
    <li><%= link_to 'My info', edit_user_registration_path %></li> 
    <li><%= link_to 'Sign out', destroy_user_session_path %></li> 
    </ul> 

它正在評估TRUE和我得到這三個列表項。

用戶不應該在上簽名,因爲我剛剛銷燬了會話!

這是什麼?

回答

1

這是多麼我已經實現這個使已知的工作:

devise_scope :user do 
    match "sign_out", :to => "sessions#destroy", via: [:delete] 
    end 

<%= link_to sign_out_path, :method => "DELETE" do %> 

<% end%> 
+0

你讓我至少有一步 - 但我得到這個錯誤:未定義的方法'stringify_keys'的「/用戶/ sign_out」:字符串 - 現在谷歌搜索... – notaceo

+0

好的,所以你得到我試圖得到的錯誤: <%= link_to「TEXT」,path,:method =>「DELETE」do%><%end%> 你必須把do和end之間的文本塊以避免stringify_keys錯誤。謝謝 - 這解決了我的問題 – notaceo

2

您發出GET請求,而不是一個DELETE(甚至POST請求並提供一組_method參數來模擬一個適當的DELETE)。因此,您的請求被路由到UsersController#show,該收聽GET /users/:id

原因是,純HTML鏈接通常只能導致GET請求。對於其他任何事情,你需要一個表格。如果您現在在視圖中將:method參數傳遞給link_to方法,那麼Rails將生成一些JavaScript,它會捕獲鏈接上的單擊以生成表單並以此方式發送請求。如果用戶禁用Javascript,這將失敗,這似乎就是這種情況。

因此,您應該確保所有用戶(包括您)都已啓用Javascript,或者使用類似button_to的東西,這會在HTML中創建適當的不帶Javascript的表單。

+0

你的解釋幫助我理解了這個問題 - 謝謝。我對下面的人給出了正確的答案,因爲它直接幫助我解決了我的實際問題。 – notaceo