Sinatra的会话:用于传递变量

时间:2011-09-13 20:52:11

标签: ruby session sinatra

所以我有一段代码如下:

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。试图以正确的方式通过会话来做到这一点吗?

1 个答案:

答案 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>