Rails的新手,所以我提前感谢您的耐心等待!对于课堂作业,我们必须建立一个非常基本的网络应用程序(没有数据库),其中包括“猜猜密码”游戏和“摇滚,纸,剪刀”游戏。在这一点上,我已经完成了这两个游戏,但我觉得要进一步增加一个简单的“当前得分”项目,无论你在那个应用程序的哪个部分,它都会持续存在于屏幕顶部,并且从游戏到游戏时记录你的分数 - 基本上重新启动服务器时分数会刷新。
我最初的本能是在我的应用程序控制器中创建一个名为@score的实例变量,但我的游戏控制器无法看到该变量,尽管它是应用程序控制器的子项。所以我尝试只是简单地将它添加到我的游戏控制器 - 正确地引入了'10'的起始值,但每次我点击刷新时重置该值。好吧,现在我卡住了。
我的假设是在这种情况下使用实例变量是不正确的。将它存储在某种全局可访问的变量中是有意义的,无论我在应用程序中的哪个位置,我都可以增加或减少它。因此,它似乎应该存在于应用程序控制器中,但后来我遇到了在应用程序的每个部分都可以访问它的问题。
我希望这很清楚。我想基本的问题是这样的:如果我想从有人启动应用程序的那一刻起初将变量初始化为0,并且能够永久增加和减少该数量,直到我重新启动服务器,我该怎么做?创建变量的位置,以及如何从应用程序中的其他点访问变量?
谢谢!
答案 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。