2016-10-22 72 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

例如,這就像自動查詢系統? – max

回答

0

演練你的代碼,它應該是顯而易見的,爲什麼它始終是2

我假設你導航到IndexController#index(可能通過indexes_path)。這會創建一個全新的等待對象,並將其初始化爲0,並在下一行中增加1。然後您將其保存。

然後(假設html來自index.html.erb)rails會顯示html,在此期間,@waiting對象會再次增加一次,然後再顯示現在爲2的值。然後再次保存該對象。

它的行爲完全像它應該那樣,但我認爲真正的問題是您可能對軌道的工作原理有誤解。在控制器上調用索引操作時,調用該操作的結果(默認情況下)是頁面index.html.erb將在這段時間內呈現嵌入的ruby進行評估。這一切都發生在服務器端,然後將生成的html發送回客戶端。您沒有任何客戶端可以啓動觸發增量。

目前還不清楚你在這裏實際嘗試達到什麼樣的目標,以及預計增量會以何種方式被調用。

在審查了您的問題後,我發現您可能希望實例變量在初始化後可用於所有請求。情況並非如此 - 每個請求都會獲得控制器的新實例,因此每次重新加載頁面時,@instance最初都將爲零,並且會導致創建新的等待對象。你應該做的,而不是從數據庫中抓取等待對象,然後遞增是,例如:

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

順便按照規定,您通常會通過索引操作顯示現有對象的列表。

+0

非常感謝你的冗長答覆,你解決了我的問題。 :) –

+0

很高興我可以幫助:)如果這確實解決了你的問題將是偉大的,如果你能接受解決方案:) – David