所以我有一段代码如下:
post '/calendar' do
#pull variables from form
@cal = a.makeCal(form, variables) #do some work here with variables
session["value"] == @cal
haml :calendar
end
然后我有了这个:
get '/print' do
@cal = session["value"]
haml :print
end
我通过将表单发布到/ calendar创建了日历来创建日历。接下来我去手动/打印,我期望我的变量@cal在cookie中持久存在。我应该吗?我这样做了吗?
我要做的是将@cal值取为彼此内部的四个数组并将其传递到打印页面而不必重新计算@cal。试图以正确的方式通过会话来做到这一点吗?
答案 0 :(得分:3)
您的post
路线中有拼写错误:
session["value"] == @cal
# ^^ compares for equality, does not set.
这不会影响会话,但会评估为true
或(更有可能)false
。
@cal
是什么类型的对象,以及您在会话支持中使用了什么? (这些Cookie支持的会话,又名Rack::Session::Cookie
是否已通过enable :sessions
启用?如果是,您的对象是否能够通过Marshal序列化?)
修改强>
是的,如果你解决了这个错字,那么你应该有所作为。
这是一个适合我的测试应用程序......
require 'sinatra'
enable :sessions
get('/'){ haml :show_and_go }
post '/' do
session["foo"] = [[[1,2],[3,4]],[5,6]]
"Now get it!\n"
end
__END__
@@show_and_go
%p= session["foo"].inspect
%form(method='post' action='/')
%button go
......这是对它的实际测试。我们看到没有cookie就没有会话,但是一旦编写了cookie,下一个请求就会有效。这也适用于浏览器:
phrogz$ cat cookies.txt
cat: cookies.txt: No such file or directory
phrogz$ curl http://localhost:4567/ # GET
<p>nil</p>
<form action='/' method='post'>
<button>go</button>
</form>
phrogz$ curl -d "" -c cookies.txt http://localhost:4567 # POST
Now get it!
phrogz$ curl -b cookies.txt http://localhost:4567 # GET, with cookies
<p>[[[1, 2], [3, 4]], [5, 6]]</p>
<form action='/' method='post'>
<button>go</button>
</form>