刷新后缓存实例变量

时间:2012-07-25 20:27:11

标签: ruby-on-rails caching instance-variables

我有3种型号:游戏,玩家,卡片。

在游戏模型中,我的功能是:

def cards
    @cards ||= Card.all.shuffle
end

当我向玩家发牌时:

player.cards << cards.pop

我正在尝试保存卡片变量,刷新后我可以通过剩余卡片与其他玩家交易。

基本上我试图避免以这种方式计算卡片:

  def remain_cards
    all_cards = Card.all
    table_cards = players.map(&:cards).flatten

    all_cards - table_cards
  end 

有没有办法做到这一点?

这是一个BlackJack游戏,游戏周期:

  • 人类玩家进入游戏并点击开始游戏按钮和发送给服务器的ajax请求
  • 游戏模型为每个玩家提供两张牌,第一个是机器人玩家,然后是人类玩家。
  • 在开始交易之后,我将发回包括玩家及其卡片在内的所有数据。
  • 然后我希望如果玩家点击“点击我”按钮,那将会从剩余的卡片中添加他随机卡

1 个答案:

答案 0 :(得分:0)

你能详细介绍一下发生了什么吗?刷新是什么意思?

更新:在这种情况下,我认为简单的答案是否定的。 “每个请求都被视为一个独立的事件,除了存储在用户会话和任何外部数据库,缓存或文件存储中的内容之外,不会传递任何状态信息。最好是设计应用程序而不考虑这一点而不是期待事情只是因为你已经设定它们而持续存在。“ (来源:What data (if any) persists across web-requests in Ruby on Rails?)。我能想到的唯一允许“卡片”数据在请求中保持不变的另一件事是使用cookie。但是,无论如何,你必须不断更新cookie信息。因此,取决于您的情况可能会更好或不好。

更新:我一直在想......持有“卡片组”的一种可能方法是尝试以下内容:

#config/initializers/card.rb - store an instance to an app-wide Card object using an initializer.
THE_CARD_DECK = Card.new

#Now we change the before filter which sets the @cards variable to use that constant:
class ApplicationController < ActionController::Base
  before_filter :init_cards
  def init_cards
    @cards = THE_CARD_DECK
  end
end

现在@cards应该是唯一的牌组,你可以在整个游戏中改变它的价值。