2016-10-22 5 views
1

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

Модель выглядит следующим образом

class Waiting < ApplicationRecord 
def increment 
    self.number_waiting += 1 
    save! 
end 
def decrement 
    self.number_waiting -= 1 
    save! 
end 
def reset 
    self.number_waiting = 0 
    save! 
end 
end 

контроллер выглядит следующим образом

class IndexController < ApplicationController 
def index 
    @waiting ||= Waiting.new(number_waiting: 0) 
    @waiting.increment 
    @waiting.save! 
end 
end 

Html выглядит следующим образом:

<p id="waiting_counter"> 
     <% @waiting.increment %> 
     <%= @waiting.number_waiting %> 
     <% @waiting.save! %> 
    </p> 

почему-то всегда на 2 и никогда не меняется. .. Ищете решение этой простой проблемы в течение нескольких часов, пожалуйста, помогите.

+0

Можете ли вы дать описание какой проблемы этот код должен решить? «Когда пользователь нажимает ... тогда они должны видеть ... и затем ...» – max

+0

Например, это что-то вроде автоматической системы que? – max

ответ

0

Пошаговое ваш код, и это должно быть понятно, почему это всегда 2.

Я предполагаю, что вы перемещаетесь к IndexController#index (возможно, через indexes_path). Это создает полностью новый объект ожидания, инициализированный до 0, который находится на следующей строке, увеличенной на 1. Затем вы сохраняете его.

Затем (предположим, что html is from index.html.erb) рельсы будут отображать html, в течение которого объект @waiting будет увеличиваться еще раз, перед отображением значения, которое теперь равно 2. Затем этот объект снова сохраняется.

Это ведет себя так, как должно, однако я считаю, что реальная проблема заключается в том, что у вас может быть неправильное представление о том, как работают рельсы. При вызове действия индекса на контроллере результатом вызова этого действия (по умолчанию) является то, что будет отображаться страница index.html.erb, в течение которой оценивается внедренный рубин. Все это происходит на стороне сервера, а затем полученный html отправляется обратно клиенту. У вас нет клиентской стороны, чтобы инициировать запуск приращения.

Непонятно, что вы на самом деле пытаетесь достичь здесь и каким образом ожидается приращение.

После рассмотрения вашего вопроса мне пришло в голову, что, возможно, вы ожидаете, что переменная экземпляра будет доступна для всех запросов после инициализации. Это не так - каждый запрос получит новый экземпляр контроллера, поэтому каждый раз, когда вы перезагружаете страницу @instance, изначально будет nil и приведет к созданию нового объекта ожидания. То, что вы должны сделать вместо этого захватить ожидающем объект из базы данных, а затем увеличить, что, например .:

def index 
    @waiting = Waiting.first 
    @waiting ||= Waiting.new(number_waiting: 0) 
    @waiting.increment 
    @waiting.save! 
end 

Кстати по соглашению вы обычно отображается список существующих объектов с помощью индекса действия.

+0

Большое вам спасибо за длинный ответ, вы решили мою проблему. :) –

+0

рад, что я мог бы помочь :) если это решит ваш вопрос, было бы здорово, если бы вы могли принять решение :) – David