Сессии в Синатре: используются для передачи переменной - PullRequest
3 голосов
/ 14 сентября 2011

Итак, у меня есть кусок кода, который выглядит следующим образом:

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. Пытается ли сделать это с помощью сессий правильным способом?

1 Ответ

3 голосов
/ 14 сентября 2011

У вас есть опечатка в вашем 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...