8

我已经安装了 RESTFUL 身份验证,一切似乎都运行良好。我可以注册和登录。我可以注销的唯一方法是输入 URL http://localhost:3000/logout

如何在页面上添加注销按钮?我尝试在 members.rhtml 中添加一个

<%= link_to "logout", :controller=> "sessions", :action=> "destroy" %>

它引用了 session_controller.rb 但我收到一个错误“没有响应显示的操作。操作:创建、销毁和新建”

有什么想法吗?谢谢

4

2 回答 2

8

您的路线文件中有什么?

试着放

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 从外到内的路由

整个页面值得一遍又一遍地阅读,直到您真正理解为止。路由是理解 Rails 的关键!

对于像 Sessions 这样的简单控制器,只需指定 log_out 路由然后链接到 log_out_url 就更容易了。

(希望这是有道理的,睡眠剥夺正在蔓延!)

于 2010-01-30T03:17:30.683 回答
1

如果您正在使用设计并且您关注的模型是User,那么优雅的方法就在这里:

<%= link_to 'logout', destroy_user_session_path, method: :delete %>

它之所以有效,是因为:

  • 由于 HTTP 方法是 GET、POST、PUT、PATCH 和 DELETE,所以使用method: :delete(not method: :destroy)
  • 我们像往常一样使用destroy_user_session_path设计用户模型,如果您定义其他模型名称,例如Manager,您只需将注销路径更改为destroy_manager_session_path
于 2018-02-15T11:07:07.503 回答