0

Rails 新手,提前感谢您的耐心等待!对于课堂作业,我们必须构建一个非常基本的网络应用程序(没有数据库),其中包括“猜密码”游戏和“石头、纸、剪刀”游戏。在这一点上,我已经完成了两个游戏,但我想更进一步,添加一个简单的“当前分数”项目,无论你在该应用程序的哪个部分,它都会持续存在于屏幕顶部,并且在您进行游戏时跟踪您的分数——基本上,当您重新启动服务器时,分数会刷新。

我最初的直觉是在我的应用程序控制器中创建一个名为 @score 的实例变量,但我的游戏控制器看不到该变量,尽管它是应用程序控制器的子级。所以我试着简单地将它添加到我的游戏控制器中——它正确地引入了“10”的起始值,但每次我点击刷新时都会重置该值。好吧,所以现在我被卡住了。

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

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

谢谢!

4

2 回答 2

1

你的应用程序中不应该有任何类型的状态变量。这是不好的做法,它会破坏生产应用程序中的各种东西。分数的值是状态。

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

在您的情况下(为了练习),您也可以将其存储在 cookie 中。Cookies 作为 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

这样,您始终可以使用这些方法获取或保存您的分数。

于 2013-10-22T07:00:55.897 回答
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。

于 2013-10-22T05:05:58.690 回答