переменные рельсы в производственной среде - PullRequest
0 голосов
/ 17 апреля 2019

Я занимаюсь разработкой приложения для рельсов. Большинство частей работают нормально, но у меня возникла одна странная проблема, когда я попытался подсчитать время, которое пользователь использовал для редактирования и отправки одной формы.

Я подумал, что было бы хорошо сделать это в следующем порядке: 1. в методе «edit» контроллера запишите время, когда пользователь начинает видеть форму. 2. в методе «update» запишите время отправки, затем выполните математические расчеты и узнайте, сколько времени пользователь провел в форме.

class Test
  @@start_time = 0
  @@end_time = 0

  def edit
    @@start_time = Time.now
  end

  def update
    @@end_time = Time.now
    time_used = @@end_time - @@start_time
    puts time_used.to_i
  end
end

Приведенный выше код на самом деле отлично работает при работе на моем собственном развивающемся компьютере, результат - то, что я ожидал. Но когда я загружаю код в производственную среду (многоядерный процессор), иногда результат получается верным, иногда нет. Я отладил код и обнаружил, что в некоторых случаях @@ start_time устанавливается в 0 при отправке формы. Я не понимаю, что происходит, может быть, я просто неправильно использовал @@ для переменной. Пожалуйста, помогите мне, любая идея будет оценена, спасибо.

Edit: Проблема решается путем добавления виртуального атрибута к модели, на что намекал Вишал. Кроме того, я добавил скрытое поле в форму отправки и в часть с сильными параметрами добавил соответствующий параметр, чтобы его можно было передать из метода редактирования в обновление.

Ответы [ 2 ]

1 голос
/ 17 апреля 2019

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

  1. Добавьте один виртуальный атрибут в вашу модель edit_start_time Вам не нужен атрибут для endtime, потому что он может быть напрямую выбран Time.now в любое время.

  2. Установить edit_start_time значение в методе edit, например:

      @model.edit_start_time = Time.now.utc #you can use any  
    
  3. В update методе непосредственно рассчитать время редактирования, как:

    total_update_time = Time.now.utc - @model.edit_start_time.utc
    

Если вы не знаете, как создавать виртуальные атрибуты, тогда есть много вопросов о StackOverflow, а также о документах. Я не объясняю, как это сделать здесь, потому что это другая тема.

Всего наилучшего

0 голосов
/ 17 апреля 2019

Вы используете переменные класса, которые могут мешать друг другу.С вашим Test классом будет когда-либо связана только одна переменная класса с именем * 1002. *

Это означает, что если другой пользователь увидит форму, он сбросит @@ start_time для каждого пользователя, который в данный момент находится в ней.

Чтобы предотвратить это, используйте экземплярные переменные.Когда новый пользователь увидит форму, он создаст новую переменную экземпляра, которая связана с его экземпляром класса, а не с самим классом.Это позволит пользователям иметь разное время начала и окончания.Таким образом, вместо @@start_time', try @ start_time` во всем вашем коде, и то же самое для end_time.

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