设计真的很新 - 诚实地说这非常令人沮丧......
我的用户会话未被销毁。
以下是导航栏中的链接:
<li><%= link_to 'Logout', destroy_user_session_path, :method => :delete %></li>
devise.rb配置了:delete方法:
# 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 "/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
所以我在用户#show上得到了所有这些nil类错误,因为它试图渲染默认的rails @ user.name等,并且@user未定义 - 我最终手动覆盖了show动作以简单地渲染'index',我最终在我的索引页面上 - 但仍然 - 我看到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,我正在获取这三个列表项。
用户不应该在中登录,因为我刚刚销毁了会话!
到底是什么?
答案 0 :(得分:2)
您发出GET
请求,而不是DELETE
(甚至是带有_method
参数设置的POST,以模拟正确的DELETE
)。因此,您的请求会被路由到UsersController#show
,该GET /users/:id
会收听:method
。
原因是,纯HTML链接通常只会导致GET请求。对于其他任何事情,你需要一个表格。如果您现在将link_to
参数传递给视图中的button_to
方法,Rails将生成一些Javascript,捕获链接上的点击以生成表单并以此方式发送请求。如果用户禁用了Javascript,这将失败,这似乎就是这种情况。
因此,您应该确保所有用户(包括您)都启用了Javascript,或者使用类似{{1}}的内容,这样可以在HTML中创建一个不使用Javascript的正确表单。
答案 1 :(得分:1)
这就是我实现这一点的方式:
devise_scope :user do
match "sign_out", :to => "sessions#destroy", via: [:delete]
end
<%= link_to sign_out_path, :method => "DELETE" do %>
<% end%>