【问题标题】:Rails 3 logout route in sessions controller会话控制器中的 Rails 3 注销路由
【发布时间】:2011-09-05 03:44:41
【问题描述】:

我一直有条不紊地阅读《Agile Web Development with Rails》一书。到目前为止没有问题,直到我遇到使用会话控制器的注销开发。我只是想让销毁方法在会话控制器中工作。这是我所拥有的:

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”

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

【问题讨论】:

  • 你能在你的视图中显示注销链接的代码吗?也许它丢失了:method => :delete?
  • 奥斯汀是正确的。当您直接在浏览器中输入/logout 时,您正在执行get 请求,而delete 请求是预期的。如果你想在浏览器地址栏输入/logout退出,你必须把delete改成get。

标签: ruby-on-rails routing


【解决方案1】:

我相信

delete 'logout' => :destroy

应该是

get 'logout' => :destroy

或

post 'logout' => :destroy

取决于您如何处理该行为。你很可能想要get。

【讨论】:

  • 不,注销会破坏会话,所以删除请求是正确的。
  • 是的,该操作本身就是一个销毁操作,因为您正在销毁会话。但是对于 Rails,当用户转到 /logout 时,他们正在执行获取请求。
  • 我现在明白你的意思了......他不是在谈论链接,而是直接进入 /logout 。如果您稍微编辑您的答案,我可以撤消我的反对意见。对不起...
  • 如果他想通过在浏览器的地址栏中输入/logout 退出,我同意你可以使用get,但我不知道你会如何在这里post .无论如何,我编辑了你的答案,所以我可以撤消我的反对票。希望你不介意:-)
  • 感谢工作。我想知道这是否只是 AWDWR (Fourth Edition) depot_r/config/routes.rb 中的一个错字
【解决方案2】:

AWDWR 中没有错别字。如果您希望执行以下按钮,则原始问题提供的代码/路线是正确的:

<%= button_to 'Logout', logout_path, :method => :delete %>

不知道为什么这对按钮有效,但当我在 URL 中输入 /logout 时“获取”答案有效??

【讨论】:

    【解决方案3】:

    这是因为浏览器只支持两个 HTTP 动词:GET 和 POST。 Rails 使用技巧(我认为是 JavaScript)来假装浏览器正在发送“PUT”和“DELETE”,它们将被路由以与 GET 和 POST 的不同操作相关联。在上述情况下,DELETE 方法被路由到控制器的销毁操作,其唯一目的是关闭会话但不呈现页面。

    在 config/route.rb - 以下是注销按钮点击的键:

    controller :sessions do
        get 'login' => :new
        post 'login' => :create
        delete 'logout' => :destroy
    end
    

    【讨论】:

      猜你喜欢
      • 2012-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-29
      • 1970-01-01
      • 1970-01-01
      • 2011-07-07
      • 1970-01-01
      相关资源
      最近更新 更多