在 RESTFUL 身份验证中添加注销按钮
Posted
技术标签:
【中文标题】在 RESTFUL 身份验证中添加注销按钮【英文标题】:Add a logout button in RESTFUL authentication 【发布时间】:2011-01-11 02:50:46 【问题描述】:我已经安装了 RESTFUL 身份验证,一切似乎都运行良好。我可以注册和登录。我可以注销的唯一方法是输入 URL http://localhost:3000/logout
如何在页面上添加注销按钮?我尝试在 members.rhtml 中添加一个
<%= link_to "logout", :controller=> "sessions", :action=> "destroy" %>
引用 session_controller.rb 但我收到一个错误“没有对显示做出响应的操作。操作:创建、销毁和新建”
有什么想法吗?谢谢
【问题讨论】:
【参考方案1】:你的路由文件中有什么?
试试看
map.log_out 'logout', :controller => 'sessions', :action => 'destroy'
在你的路线中。
然后就可以了
<%= link_to "Sign out", log_out_url %>
退出链接。
编辑
这完全取决于您如何指定路由。
因为您在路由中有 map.log_out,所以 url http://localhost:3000/logout url 会被它拾取并路由到正确的操作。
如果你有:
<%= link_to "logout", :controller=> "sessions", :action=> "destroy" %>
这只会为您生成http://localhost:3000/session 的链接。但是,它对路由没有任何作用。您仍然需要指定正确的路线。
请注意,Rails 不会将销毁操作附加到 url。 (它不会创建http://localhost:3000/session/destroy。) 它假设如果你有一个破坏动作,你将使用 DELETE http 动词发送它。由于某种原因,它不是很完美,实际上也没有默认发送 DELETE 动词。
你可以强制它这样做:
<%= link_to "logout", :controller=> "user_sessions", :action=> "destroy", :method => :delete%>
除非您也正确路由它,否则这仍然不起作用。如果您将以下内容放入路线中:
map.resource :session
然后 rails 将为所有动词生成路由并为它们指定默认操作,包括 DELETE。更多信息可以在这里找到:Rails Routing from the Outside In。
整个页面值得一遍又一遍地阅读,直到您真正理解为止。路由是理解 Rails 的关键!
对于像 Sessions 这样的简单控制器,只需指定 log_out 路由,然后链接到 log_out_url..
(希望这是有道理的,睡眠剥夺正在蔓延!)
【讨论】:
我的 routes.rb 有 map.logout '/logout', :controller => 'sessions', :action => 'destroy' 太棒了......这工作!我用 谢谢 只是出于好奇...不应该 "sessions", :action=> "destroy" %> 工作吗?它引用了 session_controller 中的 'destroy' def,它执行了 'logout'【参考方案2】:如果您正在使用 devise 并且您关注的模型是 User,那么优雅的方法就在这里:
<%= link_to 'logout', destroy_user_session_path, method: :delete %>
之所以有效,是因为:
由于HTTP方法有GET、POST、PUT、PATCH和DELETE,所以使用method: :delete
(不是method: :destroy
)
我们像往常一样将destroy_user_session_path
与 devise 和 User 模型一起使用,如果您定义其他模型名称,例如 Manager,您只需将注销路径更改为destroy_manager_session_path
【讨论】:
以上是关于在 RESTFUL 身份验证中添加注销按钮的主要内容,如果未能解决你的问题,请参考以下文章
如何在 asp.net 应用程序中注销按钮 Windows 身份验证