Ruby on rails 如何在一个非常基本的Rails应用程序中保持跑步成绩?

Ruby on rails 如何在一个非常基本的Rails应用程序中保持跑步成绩?,ruby-on-rails,Ruby On Rails,Rails新手,因此我提前感谢您的耐心!对于课堂作业,我们必须构建一个非常基本的网络应用程序(没有数据库),其中包括一个“猜秘密号码”游戏和一个“石头、布、剪刀”游戏。在这一点上,我已经完成了这两个游戏,但我想再进一步,添加一个简单的“当前分数”项目,无论你在应用程序的哪个部分,它都会持续出现在屏幕顶部,并在你从一个游戏到另一个游戏的过程中跟踪你的分数——基本上,当你重新启动服务器时,分数会刷新 我最初的直觉是在我的应用程序控制器中创建一个名为@score的实例变量,但我的游戏控制器看不到该变量

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

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

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

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


谢谢

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

config/initializers/score.rb

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

development: &default
 score: 0

test: 
 <<: *default

production:
 <<: *default

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

应用程序中不应该有任何类型的状态变量。 这是一种糟糕的做法,它会破坏生产应用程序中的所有内容。 分数的值是state

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

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

您还可以像这样使用Rails会话(默认情况下存储在cookie中)

session[:score] = score
但是,当服务器重新启动时,会话和cookie解决方案都不会破坏您的价值。 我真的不明白你为什么要重置分数。 如果你真的想要这样的东西,你可以生成一个随机值,然后对照它检查分数

将其放入您的应用程序_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

这样,您就可以通过使用这些方法随时获取或保存您的分数。

您可以使用Cookiet这很有意义。它应该进入哪个控制器?应用程序控制器?cookie将在应用程序重新启动时保持不变,如果最终用户愿意,他们可以轻松地操纵分数。如果你想让这些信息可靠,你就必须将其存储在数据库中,并对更新进行验证。您当前如何存储游戏状态?@JonathanBender对cookie值的操作是正确的。另一种选择是将用户信息存储为一个简单的文本文件(技术上不是数据库),其内容是分数。Rails为每个请求使用一个特定控制器的新实例。由于@score是一个实例变量(single@),它将只对一个请求有效。你有一个很好的观点——我也不确定为什么要在服务器重新启动时重置它。我想我主要感兴趣的是,如果有必要的话,如何实现这样一个目标,但我想这并不是一个实际的用例,因为实际的开发服务器并不总是关闭和打开。事实上,数据持久性是一件好事。嗯。这是一个很好的答案,让我了解一些我不熟悉的事情。非常感谢。这也是一个很好的答案,因为它涉及到我最初的问题,并且走了一条与上面的答案完全不同的路线。至少,我可以在这里研究很多我还不熟悉的东西。谢谢你的提示!
session[:score] = score
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