обмен сообщениями от уровня модели до уровня контроллера для целей AJAX - PullRequest
2 голосов
/ 07 октября 2011

У меня есть страница с именем / examples / 1 / duplicate, есть ajax-форма, которая запускает / examples / 1 / run_duplicate

метод контроллера для run_duplicate, запускает Example.duplicate (session), который я передаюсеанс, который, как я понимаю, является священным нет-нет.

код модели дубликата примерно равен:

def duplicate(session)
   session[:duplicate] = 0
   duplicate_foobars
   session[:duplicate] = 1
   duplicate_snafus
   session[:duplicate] = 2
   duplicate_widgets 
   session[:duplicate] = 3
end

У меня есть другой метод контроллера на странице дубликата, который выполняет длинный опрос: / examples / 1 / check_dupe_status Цель состояла в том, чтобы получить обновленный статус из сеанса [: duplicate], настроить отчет о проделанной работе и сообщить о нем пользователю через ajax, чтобы они могли видеть ход выполнения Example.duplicate ().

сеансов не обновили, как я надеялся.Я вижу, как выполняется код, но сеансы не обновляются, поэтому / examples / 1 / check_dupe_status никогда не знает, что что-то началось.

Учитывая, что я сделал это неправильно с самого начала, что является правильнымспособ уведомить пользователя о состоянии Example.duplicate ()?

1 Ответ

1 голос
/ 07 октября 2011

Звучит так, как будто у вас есть два отдельных запроса, один из которых записывает данные в сеанс, а другой пытается одновременно считывать данные из сеанса.Это верно?Прекратите чтение, если это не так.

Это может не сработать, потому что «сессия» - это просто cookie - заголовок HTTP-ответа, который загружается в ваш браузер как cookie, а затем повторно загружается при следующем запросе,затем повторно загрузили следующий ответ, ad nosium.В вашем коде порядок операций следующий:

  1. / examples / 1 / run_duplicate записывает "0" в то, что по сути является Ruby Hash, представляя ваш сеансовый cookie

  2. / examples / 1 / check_dupe_status считывает значения из файла cookie сеанса , который был только что отправлен из вашего браузера с этим запросом.Скорее всего, в нем ничего нет: duplicate, поэтому он будет выглядеть пустым.

  3. / examples / 1 / run_duplicate записывает "1" в сеанс Ruby Hash

  4. / examples / 1 / check_dupe_status снова читает файл cookie сеанса, который отправил этот запрос - ничего не изменилось

  5. / examples / 1 / run_duplicate write "2 "в хэш сеанса Ruby

  6. / examples / 1 / check_dupe_status считывает исходный файл cookie сеанса, который он отправил - без изменений

  7. / examples/ 1 / run_duplicate записывает «3» в хэш сеанса Ruby , и запрос завершается , отправляя сеанс обратно в виде файла cookie со значением 3 в: duplicate.

  8. / examples / 1 / check_dupe_status все еще сидит там как дуфус, читая пустой сеансовый файл cookie, который он первоначально отправил

В какой-то момент / examples / 1 / check_dupe_status может истечь время ожидания, ион может вернуться с файлом cookie сеанса.Но угадайте что?Так как: дубликат никогда не устанавливался в этом сеансовом cookie, он будет перезаписывать тот в вашем браузере, и: duplicate будет пустым при следующем отправляемом вами запросе.

Надеюсь, я четко выразил это,По сути, вы используете гоночные условия в своих файлах cookie, и это очень трудно преодолеть, если вы отправляете параллельные запросы из одного и того же браузера.

Лучший способ справиться с этим - написать свой дубликат 0,1,2 и т. Д. Значения для некоторой таблицы базы данных.Ваш длинный опросный запрос может затем просто считаться из базы данных.Возможно, немного менее эффективно, но, конечно, у него есть то преимущество, что оно может работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...