Rails - по событию click - как бороться с состоянием гонки между двумя методами Ruby?

1

По моему мнению, у меня есть элемент 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? Я пытаюсь создать переменную экземпляра, доступную из нескольких методов в классе, но индивидуальную для каждого экземпляра этого класса.

  • 0
    Для чего вы устанавливаете переменную «Фаза»? Это может быть явно установлено во время рендеринга?
  • 1
    вам просто нужно понять разницу между событиями javascript и ruby. Обработчик событий Javascript будет происходить первым и только в браузере. Событие ruby происходит только после того, как HTTP-запрос к серверу - на самом деле rails не волнует, был ли это щелчок или зависание или что, пока он получает http-запрос.
Показать ещё 2 комментария
Теги:
coffeescript

1 ответ

0
Лучший ответ

Хорошо, я решил это, найдя способ вызвать 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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню