2016-10-22 3 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のように見えるようになります:それは2で常にあり、変更されないいくつかの理由

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

。この単純な問題の解決策を数時間探していたので、助けてください。

+0

このコードがどのような問題を解決するはずですか? 「ユーザーがクリックすると、彼らは...そして...」 – max

+0

たとえば、自動キューシステムのようなものですか? – max

答えて

0

チュートリアルあなたのコードと、それは常に2

私はあなたが(おそらくindexes_path経由)IndexController#indexに移動していると仮定している理由、それは明らかです。これにより、0に初期化された完全に新しいWaitingオブジェクトが作成され、次の行に1ずつインクリメントされます。次に、保存します。

次に、railsは@waitingオブジェクトがもう一度インクリメントされるhtmlをレンダリングしてから、2の値を表示します。その後、そのオブジェクトは再び保存されます。

これはまさにそれと同じように動作しますが、本当の問題は、レールがどのように機能するのか誤解していると思います。コントローラ上でindexアクションを呼び出すと、そのアクションを呼び出すと(デフォルトで)、ページindex.html.erbがレンダリングされ、埋め込まれたルビが評価されます。これはすべてサーバー側で発生し、結果のhtmlがクライアントに返されます。増分のトリガーを開始するクライアント側はありません。

ここで実際に何を達成しようとしているのか、どのように増分が必要なのかは不明です。

質問を確認した後、インスタンス変数が初期化された後にすべてのリクエストで使用可能になると思われるかもしれません。そうでない場合、各リクエストはコントローラの新しいインスタンスを取得するので、ページをリロードするたびに@instanceは最初はnilになり、新しいWaitingオブジェクトが作成されます。あなたが代わりにやるべきことは、データベースから待機オブジェクトを取得し、その増分を、例えば:

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

ちなみに普段indexアクションを通じて、既存のオブジェクトのリストを表示していました慣例です。

+0

あなたの長い返事をありがとう、私の問題を解決しました。 :) –

+0

私は助けてくれると嬉しかった:)あなたが解決策を受け入れることができれば、これがあなたの質問を解決するかどうかは素晴らしいだろう:) – David

関連する問題