【问题标题】:Rails 4: Route scope and session cookieRails 4:路由范围和会话 cookie
【发布时间】:2013-09-23 10:52:09
【问题描述】:

如果我有以下routes.rb:

MyApp::Application.routes.draw do
  resources :foo
end

会生成一个会话 cookie:

$ curl -s -D - http://127.0.0.1:3000/foo -o /dev/null | grep Set-Cookie
Set-Cookie: _myapp_session=...; path=/; HttpOnly
$

但如果我将路线更改为:

MyApp::Application.routes.draw do
  scope "/bar" do
    resources :foo
  end
end

没有cookie:

$ curl -s -D - http://127.0.0.1:3000/bar/foo -o /dev/null | grep Set-Cookie
$

会话 cookie 和路由范围之间的关系是什么?如何在这两种情况下保持相同的行为?

【问题讨论】:

  • 恐怕您在上一个示例中遇到 500 内部错误或 404 未找到,因此无法设置 cookie。
  • 为什么我会得到 404? scope 将 /bar/foo 请求路由到 FooController。
  • 我说可能有错误但没有说一定是404。500是可能的。为什么不直接在浏览器中查看呢?
  • 当然,我在浏览器中看到了该站点。 curl 命令只是一个使用示例。这两个示例都有效,减去了第二个示例的 cookie 生成。
  • 我无法重现您的问题。你重启 Rails 服务器了吗?

标签: ruby-on-rails ruby cookies scope routes


【解决方案1】:

好的。解决了我的问题。与资产前缀有关。重现步骤:

创建一个新的 Rails 应用程序:

$ rails new sample --skip-active-record

取消注释 Gemfile 中的 therubyracer gem。这与问题无关,只是为了让我们可以运行应用程序。

生成新资源:

$ rails generate resource foo

向使用会话的控制器添加一些代码(app/controllers/foos_controller.rb):

class FoosController < ApplicationController
    def index
        session[:foo] = 'bar'
        render nothing: true
    end
end

测试:

$ curl -s -D - http://127.0.0.1:3000/foos -o /dev/null | grep Set-Cookie
Set-Cookie: _sample_session=R1..; path=/; HttpOnly

更改资源的范围(config/routes.rb):

Sample::Application.routes.draw do
  scope '/bar' do
    resources :foos
  end
end

再次测试:

$ curl -s -D - http://127.0.0.1:3000/bar/foos -o /dev/null | grep Set-Cookie
Set-Cookie: _sample_session=Sk...; path=/; HttpOnly

更改资产前缀 (config/application.rb):

module Sample
  class Application < Rails::Application
    config.assets.prefix = '/bar'
  end
end

再次测试。没有 cookie:

$ curl -s -D - http://127.0.0.1:3000/bar/foos -o /dev/null | grep Set-Cookie
$

再次更改资产前缀:

module Sample
  class Application < Rails::Application
    config.assets.prefix = '/bar/assets'
  end
end

再次测试:

$ curl -s -D - http://127.0.0.1:3000/bar/foos -o /dev/null | grep Set-Cookie
Set-Cookie: _sample_session=L3...; path=/; HttpOnly

【讨论】:

    猜你喜欢
    • 2014-09-25
    • 1970-01-01
    • 2016-05-03
    • 2015-02-26
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 2015-10-16
    • 2016-07-23
    相关资源
    最近更新 更多