我正在使用Rack尝试在我的Sinatra应用程序中实现"记住我"功能.
我能够将会话cookie设置为在会话结束时或在X秒时间内到期,但我想同时执行这两项操作.
例如,如果用户点击了"记住我",那么我希望他们的会话在X秒后结束.例如,我的app.rb有一行如下所示:
use Rack::Session::Cookie, :expire_after => 2592000, #30 days in seconds
:secret => MY_SECRET
Run Code Online (Sandbox Code Playgroud)
当用户登录时,我尝试执行以下操作:
if (!remember_me)
env['rack.session.options'][:expire_after] = nil
end
Run Code Online (Sandbox Code Playgroud)
但是,这不会设置cookie值.
怎么设置这个?
以前,我一直在使用ssl_requirement来对我们通过ssl提供服务的页面进行细粒度控制,并通过纯http提供服务.
根据ssl_requirement自己的wiki,它已被rails 3.1的Force SSL 取代.然而,情况似乎并非如此.强制SSL似乎没有暴露出相反方向的选项,没有办法强制页面通过常规http发送.
什么是正确的Rails 3.1方式强制页面以纯http显示?Force SSL真的取代了ssl_requirement吗?
公共服务中提供静态内容的红宝石代码有多少?它完全通过rails应用程序吗?它是否使用Rack :: Static?
我看着它的railscast(http://railscasts.com/episodes/368-miniprofiler)之后我正在使用rack-mini-profiler .
我把它添加到我的Gemfile中:
gem 'rack-mini-profiler'
Run Code Online (Sandbox Code Playgroud)
使用bundler安装它并使用"rails s"启动我的开发环境.profilling工作,它显示在网页的左上角,但它恰好分析所有静态文件(js,css,图像等).它似乎也有10行限制,因此隐藏了实际请求.

是否可以配置它以避免分析静态文件?
Rack :: Session :: Pool和Rack :: Session :: Cookie的不同用例有哪些?
据我所知(如果我错了,请纠正我):
Cookie将所有会话密钥:值对直接存储在cookie中(编组)Pool 只在cookie中存储一个id,并在其中维护会话哈希的其余部分 @pool那么:选择一个而不是另一个的含义/原因是什么?什么@pool?为什么Pool需要公开不同的公共接口Cookie?为什么文档如此缺乏?
我正在尝试使用Rack :: Test为我的Sinatra应用程序编写RSpec测试.我无法理解如何使用cookies.例如,如果我的应用程序设置了cookie(不是通过:session),我该如何检查该cookie是否正确设置?
另外,如何使用该cookie发送请求?
我正在使用Ruby on Rails 3,我想cookies.signed在Rack中间件中使用该方法.我需要这个,因为我想直接在中间件中验证用户,而不是before_filter在application_controller.rb文件中使用.
例如,如果我以这种方式在控制器中使用该方法:
cookies.signed[:user_id']
Run Code Online (Sandbox Code Playgroud)
我明白了
---
- 1 # This is the id of the current signed in user
- a64ee3asdtjhcc7b35fcb280956be00ba27f94d48dfe4291c06db7d57577d5893 # This is the cookie salt
Run Code Online (Sandbox Code Playgroud)
但如果我在这个方式的Rack中间件(同一个应用程序)中使用它:
request = Rack::Request.new(env)
request.cookies.signed[:user_id']
Run Code Online (Sandbox Code Playgroud)
我明白了
NoMethodError
undefined method `signed' for #<Hash:0x00000103333d40>
Run Code Online (Sandbox Code Playgroud)
那么,我怎样才能在中间件中使用该方法呢?如何获取用户ID以便我可以对其进行身份验证?
也许我必须包含\ extend,例如,ActionDispatch ...如果是这样,怎么样?
我在本地机器上安装了三个版本的机架(rack (1.4.1, 1.3.6, 1.3.5)).对于某些宝石(例如Cucumber),它需要更低版本的rack激活?
我试过bundle但没有好处.
执行时,cucumber仍然会使用带有1.4.1系统版本的激活机架.Bundle指定应安装哪个gem但不确保激活哪个gem.
我怎么能激活某些版本的rack?
我在一个Sinatra应用程序中有一个util方法,我想从我的测试中进行测试TestCase.
问题是我不知道如何调用它,如果我只是使用app.util_method我有错误NameError: undefined local variable or method 'util_method' for #<Sinatra::ExtendedRack:0x007fc0c43305b8>
class MyApp < Sinatra::Base
# [...] routes methods
# utils methods
def util_method
return "hi"
end
end
Run Code Online (Sandbox Code Playgroud)
require "my_app.rb"
require "test/unit"
require "rack/test"
class MyAppTest < Test::Unit::TestCase
include Rack::Test::Methods
def app
MyApp.new
end
# [...] routes methods tests
def test_util_method
assert_equal( "hi", app.util_method )
end
end
Run Code Online (Sandbox Code Playgroud) 我在本地运行Sinatra应用程序.
自从我安装了Thin之后,我的Sinatra应用程序总是将它用作Web服务器.但是,我一直在使用Thin提供应用程序所需的大量静态文件的性能问题,我想切换到Mongrel或WEBrick.
我似乎无法弄清楚如何将我的应用程序切换到Mongrel或WEBrick.即使我放在app.rb的顶部require 'mongrel'或者require 'webrick'在我的顶部ruby app.rb,Sinatra仍然以Thin开头.
所以,我的问题是:如何指定Sinatra的Web服务器在开发模式下使用?另外,我怎么能在生产模式下这样做?