Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails setter未在rails中设置会话变量_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails setter未在rails中设置会话变量

Ruby on rails setter未在rails中设置会话变量,ruby-on-rails,ruby,Ruby On Rails,Ruby,我有一个控制器,可以计算用户访问页面的次数。我试图将该计数提取到设置会话变量的getter和setter。获得工作,但设置不起作用。这是控制器: class StoreController < ApplicationController def index @products = Product.order(:title) v = store_visits + 1 store_visits = v # tests fail if

我有一个控制器,可以计算用户访问页面的次数。我试图将该计数提取到设置会话变量的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
class StoreController
下面是一个失败的测试:

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
需要“测试助手”
类StoreControllerTest
为什么没有设置,如果我使用
+=
,为什么商店访问返回零?感谢您的帮助

注意:最初我将方法提取到一个关注点,但是我编辑了这个以删除该关注点,因为问题不在于关注点,而在于setter和/或getter


更新:添加日志记录语句后,很明显,从未到达store_vists=()方法的内部(但不知何故没有抛出错误)。但是,如果我将其重命名为assign_store_visions(),它确实会被调用,并且会更新会话变量。所以我猜这可能是一个错误,其中setter方法在控制器中不起作用(这是Rails 4.0.0),或者它们被故意阻止(在这种情况下,一个异常会很好)。

尝试切换到
include ActiveSupport::Concern


这将提供实例方法而不是类方法

您需要将关注点中的方法包装到包含的块中,如:

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

这样做将使这些方法作为控制器内的实例方法可用

没有任何效果。它的行为仍然相同。问题似乎不是它们不可用,而是商店访问=()似乎做得不对。store_visits()从控制器调用时返回会话变量中的内容,但如果我执行store_visits+=,我猜它会先隐式调用store_visits(),其行为就好像它返回nil一样。但是当我把它作为一个集合(store_visions=v)来处理时,它不会被设置,因为store_visions()仍然返回0。我想知道它是不是在看一个不同的“会话”。真正奇怪的是,当我将方法移动到StoreController本身时,它仍然失败。你看起来怎么样
config/initializer/session\u store.rb
它有一行(无注释):
Depot::Application.config.session\u store:cookie\u store,key:'\u Depot\u session'