2016-02-26 50 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