dsp*_*099 6 ruby routing sinatra
说我有:
get '/' do
$random = Random.rand()
response.body = $random
end
Run Code Online (Sandbox Code Playgroud)
如果我每秒有数千个请求进入/,$ random会在上下文之外共享和"泄漏",还是会像get块的"本地"变量一样?
我想如果它是在它的上下文之外定义get '/' do它确实会被共享,但我想知道是否有一个我不知道的红宝石机制.
iai*_*ain 19
关于范围的Sinatra README的这一部分总是有助于阅读,但如果您只需要变量来保留请求,那么我认为有三种主要方式我建议这样做,而且关键是过滤器
before do
@my_log = []
end
get "/" do
@my_log << "hello"
@my_log << "world"
@my_log.inspect
end
get "/something-else" do
@my_log << "is visible here too"
end
# => output is ["hello", "world"]
Run Code Online (Sandbox Code Playgroud)
@my_log将在请求结束时超出范围,并在下一个开始时重新初始化.它可以通过任何路径访问,因此,例如,如果您曾经pass将其传递到另一个路径,那么其他路径将是唯一一次可以看到先前路由块已设置的路径.
set :mylog, []
Run Code Online (Sandbox Code Playgroud)
然后与上面相同,只需替换@my_log为settings.my_log.如果没有before块重新初始化它,那么内容@my_log将在请求之间保持不变.
# I always do this within a config block as then it's only initialised once
config do
uri = URI.parse(ENV["URL_TO_REDIS"])
set :redis, Redis.new(:host => uri.host, :port => uri.port, :password => uri.password)
end
Run Code Online (Sandbox Code Playgroud)
现在redis实例可以通过settings.redis.无需担心变量范围(我会使用本地人),只需直接推送到Redis.那时你会得到两全其美,但如果你想要,你可以做到:
before do
@my_log = []
end
get "/" do
@my_log << "hello"
@my_log << "world"
"Hello, World"
end
after do
settings.redis.set "some_key", @my_log
settings.redis.expire "some_key", 600 # or whatever
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6067 次 |
| 最近记录: |