无法从缓存访问对象属性

时间:2011-04-13 17:46:19

标签: ruby-on-rails

我正在使用Rails.cache.write缓存几个User对象,但是当我从缓存中检索它并尝试在我得到的任何User对象上调用属性方法(id,name,email等)时

You have a nil object when you didn't expect it! 
You might have expected an instance of Array. 
The error occurred while evaluating nil.include? 

我可以在User对象上调用inspect,然后看到所有属性。有任何想法吗?感谢

我正在使用标准缓存配置,无需修改。这是一些代码:

我在我的模型中写入一个实例方法中的缓存,当用户登录时会调用该方法:

cached_friends = self.friends
Rails.cache.write(self.id.to_s+"_friends", cached_friends)

然后在我的控制器中我有一个前过滤器:

def get_friends_from_cache
  if current_user
    friends = Rails.cache.read(current_user.id.to_s+"_friends")
    friends.each do |friend|
      if !friend.facebook_id.nil?
        #other stuff....
      end
    end
  end
end

我在if !friend.facebook_id.nil?行上收到错误。 facebook_id是数据库中的一列。基本上,每个User对象都没有可用的User实例方法。但是我知道对象就在那里,因为我可以插入raise "#{friends.first.inspect}"并且所有东西都像我期望的那样吐出来。

1 个答案:

答案 0 :(得分:1)

这在开发模式下发生(即设置config.cache_classes = false)。根本原因:

  1. ActiveRecord从类对象中剥离属性访问器方法
  2. MemoryStore(即默认缓存存储)不是军事/非军事对象
  3. 一种解决方法是使用MemCacheStore另一种方法是设置config.cache_classes = true。另请参阅Comments on railscasts