По моему мнению, у меня есть элемент link_to
"Начать викторину!". который вызывает метод контроллера (метод A), который устанавливает переменную "Фаза" и перенаправляет пользователя на новую статическую страницу. В моем CoffeeScript у меня есть прослушиватель событий, который прослушивает клики по этому элементу link_to
. Слушатель вызывает другой метод (метод B) на бэкэнд, который использует переменную "Phase" для выполнения sth.
Проблема: иногда метод B пытается использовать переменную "Phase" до того, как она была обновлена с помощью метода контроллера A! Есть ли у кого-нибудь предложение, какой лучший способ был бы для того, чтобы обновить переменную "Фаза", прежде чем использовать ее для чего-нибудь еще?
Я новичок Rails и буду признателен за любые указатели. :)
EDIT: "Фаза" - это переменная, которую я использую для отслеживания текущего вопроса о моей викторине. Он не зависит от какого-либо ввода, но ему требуется инкремент всякий раз, когда отображается новая страница (которая запускается нажатием кнопки).
EDIT2: я теперь попытался решить эту проблему, введя флаг переменной экземпляра "is_changed" в мой контроллер и позволяя методу B спящего режима до тех пор, пока флаг не будет установлен в true:
#method B:
def send_answers
until controller.index_changed?
sleep(0.5)
end
...
do sth.
end
#method A (in controller):
def initialize
@index_changed = false
end
def index_changed?
@index_changed
end
def set_index_changed!
@index_changed = false
end
def switch_to_next_question
...
self.phase += 1
if self.save
Thread.new do
@index_changed = true
ActiveRecord::Base.connection.close
end
else
...
end
end
Это не работает. Метод А застревает. Как это исправить? И это даже правильный подход?
Это проблема с областью моей переменной @index_changed? Я пытаюсь создать переменную экземпляра, доступную из нескольких методов в классе, но индивидуальную для каждого экземпляра этого класса.
Хорошо, я решил это, найдя способ вызвать 2 метода последовательно. Я закончил тем, что полностью удалил прослушиватель нажатий, и сразу же вызвал метод BackCalance ActionCable, что стало возможным, превратив его в метод класса:
class QuizDataChannel < ApplicationCable::Channel
#method B:
def self.send_answers #self. makes it a class method
#...
#do something with phase
end
end
И в моем контроллере:
#method A:
def switch_to_next_question
#...
self.phase += 1
if self.save
QuizDataChannel.send_answers
else
#...
end
end
Как вы можете видеть, в конце концов я избавился от всех этих: sleep
, новые потоки и флаг index_changed
.