【问题标题】:Sessions in Sinatra: Used to Pass VariableSinatra 中的会话:用于传递变量
【发布时间】:2011-11-16 12:34:10
【问题描述】:

所以我有一段看起来像这样的代码:

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 创建一个日历。接下来我手动转到 /print,我希望我的变量 @cal 能够保留在 cookie 中。我应该有吗?我这样做对吗?

我正在尝试做的是获取@cal 值,该值是彼此内部的四个数组,并将其传递到打印页面,而无需重新计算@cal。尝试通过会话执行此操作是否正确?

【问题讨论】:

  • 唯一的“不正确的方法”是,根据数组的大小,使用 cookie 支持的会话可能会在 cookie 中为响应和请求传递大量信息从那时起。 require "base64"; Base64.encode64(Marshal.dump(@cal)).length 有多大?
  • @Phrogz 当我运行它时它给了我 '6666' 是不是太大了?
  • 是的;不保证任何超过 4k 的内容都可以正常工作,并且在许多浏览器中都无法正常工作。您应该考虑使用更好的会话存储,例如内存支持、文件支持或数据库支持的会话。

标签: ruby session sinatra


【解决方案1】:

您的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>

【讨论】:

  • 我正在使用 enable :sessions,是的。我不确定它是否可以序列化。它是一个深度为三个数组的数组。例如@cal[0][0][0][0] 用于访问元素。
  • 这很容易序列化。我对这个功能没有问题;请参阅上面的编辑。
  • 我已经启动并运行了您的测试代码,我在代码中将 == 更改为 =,我得到: undefined method `each' for nil:NilClass 在我的 haml 模板中,问题是被这一行所困扰:-@cal.each do |holder|
  • 看来我必须想出一个新的方法来做到这一点,但我确实从这次经历中学到了一些东西!谢谢你教我。
  • @NoahClark 执行 session[:foo] = @bar 不会使 @bar 在以后的路线中可用,除非您执行 @bar = session[:foo]
猜你喜欢
  • 2019-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-03
  • 2018-05-09
  • 2011-06-12
  • 2013-08-11
  • 1970-01-01
相关资源
最近更新 更多