如何在一个非常基本的Rails应用程序中保持运行得分?

时间:2013-10-22 02:10:46

标签: ruby-on-rails

Rails的新手,所以我提前感谢您的耐心等待!对于课堂作业,我们必须建立一个非常基本的网络应用程序(没有数据库),其中包括“猜猜密码”游戏和“摇滚,纸,剪刀”游戏。在这一点上,我已经完成了这两个游戏,但我觉得要进一步增加一个简单的“当前得分”项目,无论你在那个应用程序的哪个部分,它都会持续存在于屏幕顶部,并且从游戏到游戏时记录你的分数 - 基本上重新启动服务器时分数会刷新。

我最初的本能是在我的应用程序控制器中创建一个名为@score的实例变量,但我的游戏控制器无法看到该变量,尽管它是应用程序控制器的子项。所以我尝试只是简单地将它添加到我的游戏控制器 - 正确地引入了'10'的起始值,但每次我点击刷新时重置该值。好吧,现在我卡住了。

我的假设是在这种情况下使用实例变量是不正确的。将它存储在某种全局可访问的变量中是有意义的,无论我在应用程序中的哪个位置,我都可以增加或减少它。因此,它似乎应该存在于应用程序控制器中,但后来我遇到了在应用程序的每个部分都可以访问它的问题。

我希望这很清楚。我想基本的问题是这样的:如果我想从有人启动应用程序的那一刻起初将变量初始化为0,并且能够永久增加和减少该数量,直到我重新启动服务器,我该怎么做?创建变量的位置,以及如何从应用程序中的其他点访问变量?

谢谢!

2 个答案:

答案 0 :(得分:1)

您的应用程序中永远不应该有任何类型的状态变量。 这是不好的做法,它会破坏生产应用程序中的各种事物。 得分的值是州。

理想情况下,您将状态存储在数据库中,或存储在应用程序之外的某种存储中。 (这样,您可以运行应用程序的多个实例,并且它们都将看到相同的数据)

在您的情况下(为了练习),您也可以将其存储在cookie中。 Cookie会作为http响应的一部分发送回浏览器,并且每次后续响应都会将它们发送回服务器。

您也可以使用Rails会话(默认情况下存储在cookie中),如此

session[:score] = score

但是,当服务器重新启动时,会话和cookie解决方案都不会破坏您的值。 对我来说,为什么你想要重置分数真的没有任何意义。 如果你真的想要这样的东西,你可以产生一次随机值,然后根据它来检查分数。

将它放在application_controller.rb中:

def score_key
    @@score_key ||= SecureRandom.uuid
end

def get_score
   if session[:score_key] == score_key
      session[:score]
   else
      0
   end
end

def save_score score
   session[:score] = score
   session[:score_key] = score_key
end

这样您就可以使用这些方法获得或保存您的分数。

答案 1 :(得分:0)

一种非常简单的方法是使用环境变量。

配置/初始化/ score.rb

SCORE_CONFIG = YAML.load_file("#{::Rails.root}/config/score.yml")[::Rails.env]

配置/ score.yml

development: &default
 score: 0

test: 
 <<: *default

production:
 <<: *default

在任何视图中:

<%= SCORE_CONFIG["score"] %>

在任何控制器操作中:

SCORE_CONFIG["score"] += 1

当服务器运行时,应用程序将继续score变量的当前状态,但一旦重新启动服务器,则默认为0。