2015-01-18 9 views
0

У меня есть переменная класса, которую я инициализирую, которая позже волшебным образом становится неинициализированной сама по себе ... При разработке локально на сервере по умолчанию rails (WEBrick) нет проблема. Это происходит только на nginx на ec2. Вот код ..@@ classVariable в ruby ​​on rails не инициализируется на nginx - ec2

< Защиту TestController ApplicationController
@@ classVariable = ""

Индекс четкости
@@ classVariable = "Что это братан"
лога (@@ classVariable)
конец

def callThisMethodViaAJAXFromJavascript
log ("достиг этот метод")
журнала (@@ classVariable)
конца

Защита журнал (ул)
file.write ("aValidPath", ул)
конца

конец

Вот что я делаю: Когда я загружаю страницу по тесту/индексу, метод индекса выполняет и правильно регистрирует @@ classVariable как:
«Что такое homie»

Но когда я вызываю метод callThisMethodViaAJAXFromJavascript с помощью AJAX из интерфейса, мой лог-файл выглядит следующим образом:
«метод достиг»
«»

Опять же, это происходит только на Nginx на, EC2 (ОС - ubuntu). Когда я запускаю локально на WEBrick, это НИКОГДА не происходит.

Любые идеи? Большое спасибо.

ответ

0

Вы не говорите, как вы используете nginx (как обратный прокси-сервер для некоторых экземпляров единорога, с пассажиром и т. Д.), Но в любом случае у вас обычно будет несколько экземпляров вашего приложения. Каждый из них представляет собой отдельный процесс, поэтому установка переменной класса в одном процессе не влияет на другой процесс.

Nginx будет балансировать запросы между экземплярами рельсов - поэтому индексная страница обслуживается одним экземпляром, и действие ajax часто будет обслуживаться другим процессом, где переменная clas по-прежнему является пустой строкой.

В разработке с webrick существует только один экземпляр рельсов, поэтому вы не сталкиваетесь с этой проблемой. Я не уверен, что вы пытались сделать, но переменные класса не являются хорошим способом сохранить состояние по запросам.

+0

Это интересно - я об этом не думал. Как вы думаете, лучший способ справиться с этой ситуацией - так, что вызов AJAX использует тот же экземпляр rails? Благодарю. – hackstar15

+0

@ hackstar15 лучший способ не полагаться на это вообще –

0

Ответ на вопрос Фредерика, вместо этого я использовал сеанс рельсов, чтобы сохранить переменную.

Как правило, вам не следует использовать глобальные переменные или переменные класса в рельсах, если ваши переменные изменяются.

Значения, хранящиеся в объекте сеанса, одинаковы из любого процесса в рельсах.Хотя указатель на сеанс может отличаться, значения остаются неизменными. Вот еще одно сообщение о более подробных занятиях: How is rails session shared among unicorn workers?

 Смежные вопросы

  • Нет связанных вопросов^_^