2016-09-07 4 views
0

ページに費やされた時間を測定しようとしています。私は、コントローラのインスタンス変数に開閉時間を格納しようとしています。しかし、それらは初期化しないか、またはゼロではありません。ここに私のコードです:Rubyのインスタンス変数nil

def table 
    @numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16] 
    if @time_opened.nil? 
     @time_opened = 1 
     @open_time = 0.0 
     @close_time = 0.0 
    else 
     @time_opened += 1 
    end 

    if @open_time > 0.0 
     @close_time = Time.now 
    end 

    @visit = Visit.new({number: @number, time_spent: @close_time - @open_time}) 
    @visit.save 
end 

def show 
    url = request.url 
    @number = url[url.rindex('/')+1..-1] 
    @title = @number 

    @open_time = Time.now 
end 

私は測定したい時間のページが表示されるたびに表示されます。訪問データをチェックすると、numberはゼロになり、time_spentは0.0になります。

+0

ここで@time_openedを設定していますか?私はこれがあなたが達成しようとしているものの最良のアプローチだとは思わないが、@ time_openedの値を設定しているとは思わない。 –

答えて

7

インスタンス変数を使用してリクエスト間で状態を共有することはできません。コントローラのインスタンスは、各要求の最後に完全に破棄され、次に要求がそのアクションの1つにルーティングされると、コントローラの新しいインスタンスが作成されます。

データを保持する場合は、sessionを使用するか、データをクライアントに送信して<input type="hidden">フィールドを使用して保持する必要があります。そのため、後続の要求とと​​もに返信することができます。

+0

また、クラス変数を使うこともできる。これらは要求の間に保持されますが、依然として異なるアプリケーションサーバープロセス間では共有されません。より一般的な解決策は、ログ記録システムを使用するか、少なくとも各訪問時にデータベースレコードを追加/更新することです。 –

+0

@HolgerJustあなたは*できますが、絶対にしてはいけないので、言及する価値はありません。 – meagar

関連する問題