Rails 3在会话控制器中注销路由

时间:2011-05-31 02:12:04

标签: ruby-on-rails routing

我有条不紊地通过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"

我非常感谢任何帮助,因为我一直在通过网络寻找答案。

3 个答案:

答案 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