html - 在 Sinatra 请求之间共享 Ruby 变量

标签 html ruby rest web sinatra

我正在尝试在 sinatra 中编写一个简单的问答游戏,我需要让所有用户都可以访问公共(public)对象(大厅状态、聊天消息等)。问题在于 Sinatra 在每个请求和对象都处于初始状态后重新加载代码。如何实现?

最佳答案

嗯,这个话题有点棘手。 Sinatra 实际上并没有重置服务器状态:

require 'sinatra'

GlobalState = {}
GlobalState[:some_counter] = 0

get '/' do
  response = "GlobalState[:some_counter]: #{GlobalState[:some_counter]}"
  GlobalState[:some_counter] += 1
  response
end

这段代码没有任何问题:如果您运行它并转到 http://localhost:4567,您将看到 GlobalState[:some_counter] 按预期递增。

但是由于以下原因不鼓励这样做,这些原因主要与应用程序的网络性质有关:

  1. 由于数据存储在 Ruby 对象中,如果您停止服务器,就会丢失数据。但是,如果您不需要持久数据,这不是问题
  2. 当您运行网络应用时,通常您会同时拥有多个应用实例,以便同时处理多个请求。有几种方法可以实现它:
    1. fork :同一应用程序的多个进程。它们不共享内存,因此 Ruby 全局状态变量变得无用
    2. 线程:线程共享内存,因此您可以访问全局状态,但您必须管理对同一个全局对象的并发访问,这会带来不小的后果
  3. 您不能将数据关联到用户,反之亦然:这是因为 HTTP 不提供状态保存方法(它是 stateless protocol )。为了解决它,您需要:
    1. 客户端数据存储:cookies、HTML5 Local Storage...
    2. 服务器端数据存储: session (不是真正的服务器端,您至少需要将 session 关联到各个客户端,通常将 session ID 存储到 cookie 中)

由于这些原因,网络应用数据管理并非易事。无论如何不用担心,您不必重新发明轮子;解决方案就在手边:

关于html - 在 Sinatra 请求之间共享 Ruby 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21945101/

相关文章:

json - 在 PLSQL 中调用 REST API (JSON)

html - 我如何绝对定位一个 div 并使其保持在其原始顶部位置,并且其上方的 dom 元素是 float 的?

ruby-on-rails - Rspec 验证测试 (Mongoid)

java - 唯一注释@GenerateValue

Ruby 挽救除 MyException 之外的所有异常

ruby-on-rails - 没有图像时如何在回形针中显示隐藏图像

rest - 使用 Mailchimp api v3.0 将订阅者添加到分段

jquery - 通过多个数据属性值添加元素填充?

javascript - 如何用angularJs闪烁按钮

html - 如何将框阴影应用于相邻元素而不出现重叠?