在RESTFUL身份validation中添加注销按钮
我已经安装了RESTFUL身份validation,一切似乎都运行正常。 我可以注册并登录。 我可以注销的唯一方法是输入URL http:// localhost:3000 / logout
如何在页面上添加注销按钮? 我尝试在members.rhtml中添加一个
"sessions", :action=> "destroy" %>
它引用了session_controller.rb但是我得到一个错误“没有动作响应显示。动作:创建,销毁和新”
有什么想法吗? 感谢名单
您在路线文件中有什么?
试试吧
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不会将destroy操作附加到url。 (它不会创建http:// localhost:3000 / session / destroy 。)它假定如果你有一个destroy的动作,你将使用DELETE http动词发送它。 由于某种原因,它不是很完美,它实际上也没有默认发送DELETE动词。
你可以强迫它这样做:
<%= link_to "logout", {:controller=> "user_sessions", :action=> "destroy"}, :method => :delete%>
除非您也正确地路由它,否则这仍然无效。 如果您将以下内容放入路线:
map.resource :session
然后rails将为所有动词生成路由并指定它们的默认操作,包括DELETE。 更多信息可以在这里找到: Rails从外部路由 。
整个页面值得一遍又一遍地阅读,直到你真正理解它为止。 路由是理解Rails的关键!
对于像Sessions这样的简单控制器,只需指定log_out路由然后链接到log_out_url即可。
(希望有道理,睡眠剥夺正在蔓延!)
如果您正在使用设计并且您关注的模型是User ,那么优雅的方式是:
<%= link_to 'logout', destroy_user_session_path, method: :delete %>
它的工作原因是:
- 由于HTTP方法是GET,POST,PUT,PATCH和DELETE,所以使用
method: :delete
修复method: :delete
(notmethod: :destroy
as question) - 我们像往常一样使用带有设计和用户模型的
destroy_user_session_path
,如果您定义其他模型名称,例如Manager,您只需将注销路径更改为destroy_manager_session_path