我有条不紊地通过Agile Web Development with Rails一书。到目前为止没有问题,直到我使用会话控制器遇到注销开发。我只是想让destroy方法在会话控制器中工作。这就是我所拥有的:
sessions_controller.rb
def destroy
session[:user_id] = nil
redirect_to store_url, :notice => "Logged out"
end
的routes.rb
controller :sessions do
get 'login' => :new
post 'login' => :create
delete 'logout' => :destroy
end
我重置服务器并可以使用localhost:3000 / login登录但是如果我尝试localhost:3000 / logout我收到以下路由错误:没有路由匹配" / logout"
我非常感谢任何帮助,因为我一直在通过网络寻找答案。
答案 0 :(得分:4)
我相信
delete 'logout' => :destroy
应该是
get 'logout' => :destroy
或
post 'logout' => :destroy
取决于您处理行为的方式。您最有可能想要get
。
答案 1 :(得分:1)
在AWDWR中确定没有TYPO。如果您想执行以下按钮,原始问题提供的代码/路线是正确的:
<%= button_to 'Logout', logout_path, :method => :delete %>
不知道为什么这对按钮有用,但当我在URL中输入/注销时“get”答案有效?
答案 2 :(得分:1)
这是因为浏览器只支持两个HTTP谓词:GET和POST。 Rails使用技巧(JavaScript - 我认为)假装浏览器正在发送“PUT”和“DELETE”,它们将被路由以与GET和POST的不同动作相关联。在上面的例子中,DELETE方法被路由到控制器的destroy操作,其唯一目的是关闭一个会话而不是渲染页面。
在config / route.rb中 - 以下是注销按钮单击的键:
controller :sessions do
get 'login' => :new
post 'login' => :create
delete 'logout' => :destroy
end