2016-02-26 53 views
0

我有一個控制器,計算的時候用戶已經到頁面的數量。我試圖將這個計數提取給一個getter和setter來設置會話變量。獲得作品,但設置不。這是控制器:二傳手不是設置在軌道會話變量

class StoreController < ApplicationController 
    def index 
     @products = Product.order(:title) 

     v = store_visits + 1 
     store_visits = v # tests fail if I do it like this 

     # store_visits += 1 # Undefined method '+' for NilClass if i do it like this 

     @visits = store_visits 
    end 

    def store_visits 
     if session[:store_counter].nil? 
      session[:store_counter] = 0 
     end 
     session[:store_counter] 
    end 

    def store_visits=(value) 
     session[:store_counter] = value 
    end 
end 

這裏還有一個失敗的測試:

require 'test_helper' 

class StoreControllerTest < ActionController::TestCase 
    test "should count store visits" do 
     get :index 
     assert session[:store_counter] == 1 
     get :index 
     assert session[:store_counter] == 2 
    end 
end 

爲什麼不將它設置,如果我用+=爲什麼store_visits返回nil?任何幫助表示讚賞。

注:本來我提取的方法來一個問題,但我已經編輯這篇刪除的問題,因爲這個問題是不是與關注,它與setter和/或吸氣。

更新:添加日誌記錄後,很明顯內部的store_visits =()方法永遠不會到達(但不知何故不會拋出錯誤)。但是,如果我將它重命名爲assign_store_visits(),它會被調用,並更新會話變量。所以我猜這是要麼setter方法不能在控制器中工作的錯誤(這是Rails 4.0.0),或者它們被故意阻塞(在這種情況下,異常會很好)。

+0

的樣子,你'配置/初始化/ session_store.rb' – devanand

+0

它有一個(非註釋)線: '車廠:: Application.config.session_store:cookie_store,鍵:「_depot_session'' – cathodion

回答

0

嘗試切換到include ActiveSupport::Concern

這將爲實例方法,而不是類方法

+0

沒有了任何效果。 – cathodion

0

你需要用這些方法你關心的內內像一個包含塊:

module Visits 
    extend ActiveSupport::Concern 

    included do 
    #private 

     def store_visits 
      if session[:store_counter].nil? 
       session[:store_counter] = 0 
      end 
      session[:store_counter] 
     end 

     def store_visits=(value) 
      session[:store_counter] = value 
     end 

    # private 
    end 
    end 
end 

這樣做是將使這些方法成爲控制器內的實例方法。

+0

它仍然表現相同。問題似乎並不是它們不可用,而是store_visits =()似乎沒有做正確的事情。 store_visits()返回從控制器調用時什麼在會話變量,但如果我不store_visits + =,我猜它會隱含首先調用store_visits(),和行爲就好像它返回零。但是,當我只是將它作爲一個集合(store_visits = v)來執行時,它並未設置,因爲store_visits()仍然返回0.我想知道是否以某種方式查看不同的「會話」。 – cathodion

+0

真奇怪的是,當我將方法移動到StoreController本身時,它仍然失敗。 – cathodion