2011-09-13 41 views
3

所以我有一段代碼,看起來像:會議在西納特拉:用來傳遞變量

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 

我做了什麼來測試這個創建將日曆發佈到/日曆的日曆。接下來我去手動/打印,我希望我的變量@cal在cookie內保存。我應該有嗎?我做對了嗎?

我想要做的是採取@cal值,這是相互內部的四個數組,並將其傳遞到打印頁面上,而無需重新計算@cal。正在嘗試通過會話做到這一點正確的方式來做到這一點?

+0

這個唯一的「不正確的方式」是,根據您的數組的大小,使用的cookie支持的會話可能是短暫的很多信息從那時起響應和請求的cookie。需要「base64」有多大? Base64.encode64(Marshal.dump(@cal))。length'? – Phrogz

+0

@Progro當我運行它時,它給了我'6666'是那麼大? –

+0

是的;超過4k的任何內容都不能保證能夠正常工作,並且在許多瀏覽器中無法使用。您應該考慮使用更好的會話存儲,例如內存支持,文件支持或數據庫支持的會話。 – Phrogz

回答

3

你有一個錯字在你post路線:

session["value"] == @cal 
#    ^^ compares for equality, does not set. 

這不會影響會議,而只是評估要麼true或(更可能)false

什麼樣的對象@cal,你用什麼爲你的會議支持? (難道這些cookie的支持會話,又名Rack::Session::Cookie,通過enable :sessions啓用?如果是這樣,你的目標肯定能夠通過元帥被序列化?)

編輯

是的,如果你解決這個錯字,是什麼你應該工作。

這是一個測試應用程序,它爲我的作品...

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> 
+0

我正在使用enable:sessions,是的。我不確定它可以被序列化。它是一個深度爲三個數組的數組。例如@cal [0] [0] [0] [0]用於訪問元素。 –

+0

這很容易序列化。我沒有這個功能的問題;看到上面的編輯。 – Phrogz

+0

我有你的測試代碼啓動和運行,我做了從== = =在我的代碼中的變化,我得到:未定義的方法'each'爲零:NilClass在我的haml模板中,這個問題是由這一行輸出: @ cal.each do |持有人| –