冬天温泉的小庭院

在sinatra中使用实例变量

在进行sinatra的开发过程中经常会想在多个方法中使用同一个对象,这时候一般就会想到的是使用实例变量来实现这个功能。
But,@parameter这样声明的话是不好用的,因为,@parameter这个变量是给视图使用的,OMG。。。

所以你可以用以下两种方式

1)在configure中通过set定义

比如

main.rb
1
2
3
4
5
6
7
8
9
10
11
12
configure do
set :hashmap => HashMap.new
end
post '/value' do
settings.hashmap[params[:key]] = params[:value]
redirect '/value/params[:key]'
end
get '/value/:key' do
erb :value, :locals => { :value => settings.hashmap[params[:key]] }
end

这样在以上两个方法中使用的HashMap类的对象都是唯一。

不过这样做需要事先定义set一个对象才行,而这个对象是对整个应用都是能使用的,如果只想在那么几种情况下使用该怎么办??

2)通过session实现
(迷之音:太长时间没写java代码的结果就是,在web上这么个经常使用的方式都给忘记了,fml

main.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
use Rack::Session::Pool, :expire_after => 2592000
helpers do
def hashmap
unless session[:hashmap]
session[:hashmap] = HashMap.new
end
session[:hashmap]
end
end
post '/value' do
hashmap[params[:key]] = params[:value]
redirect '/value/params[:key]'
end
get '/value/:key' do
erb :value, :locals => { :value => hashmap[params[:key]] }
end

不过需要注意的是这句话use Rack::Session::Pool, :expire_after => 2592000
这么写的原因请参照这里