在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 (not method: :destroy as question)
  • 我们像往常一样使用带有设计用户模型的destroy_user_session_path ,如果您定义其他模型名称,例如Manager,您只需将注销路径更改为destroy_manager_session_path