setter未在rails

时间:2016-02-26 04:05:25

标签: 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 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?任何帮助表示赞赏。

注意:最初我将这些方法提取到一个问题,但我已经编辑了这个以消除关注,因为问题不在于关注,而在于设置器和/或getter。

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

2 个答案:

答案 0 :(得分:0)

尝试切换到include ActiveSupport::Concern

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

答案 1 :(得分: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

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