1

如果我有以下情况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 和路由范围之间的关系是什么?如何在这两种情况下保持相同的行为?

4

1 回答 1

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

再次测试。没有饼干:

$ 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
于 2013-09-24T09:53:40.123 回答