2014-04-18 81 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