如何使实例在Sinatra中跨请求持久存在



我正在使用Sinatra构建一个非常简单的"命令中心"来控制各种USB设备。

我创建了像class Device这样的类,并对各种类型的设备进行了子类化。

问题是,我不想使用数据库来存储我的所有信息。设备列表永远不会改变,我希望通过在常量文件或纯ruby中定义它们(我将对设备ID等进行硬编码),使其更易于移植。

问题是当应用程序第一次加载时,它们会出现,而当我刷新时,它们就会消失。我试着把它放在应用程序的各个部分,但我不知道它们应该放在哪里。

我也试过把它放在before过滤器中,但它每次刷新都会创建它们的副本(……奇怪的是,当你在第6次左右刷新时,它会把它们重置回1,我不知道这是怎么回事)。

此外,根据我使用的是rackup config.ru还是thin -R config.ru start,它的作用也截然不同。。。

谢谢!

app.rb

require 'sinatra'
module RhubarbPi 
  class App < Sinatra::Application
    configure do
      set     :root, App.root
      disable :method_override
    end
    helpers do
      include Rack::Utils
      alias_method :h, :escape_html
    end
  end
end
Dir.glob('./{models,lib,routes}/*.rb').each { |file| require file }

lib/devices.rb(这些是设备本身的实例,我基本上是在"硬编码")。

USBSK.new(1)
USBSM.new(1)
USBWK.new(1, '192.168.1.127')

这是一个示例模型。。。简单

class USBSK
  attr_reader :id
  def initialize(id)
    @id = id
  end
  def self.all
    ObjectSpace.each_object(self).to_a
  end
end

在我看来,我正在做

<% USBSK.all.each do |dev| %>                 
  <ul>                                      
    <li><span>ID:</span> <%= dev.id %></li> 
  </ul>                                     
<% end %>  

您没有保留对对象的任何引用,所以Ruby正在垃圾收集它们。此外,不要使用ObjectSpace来查找项目,它主要用于调试和内省任务。

我会更改lib/devices.rb以使用Ruby常量,比如这个

   class USBSK
     ALL_DEVICES = [
       self.new(1),
       self.new(1),
       self.new(1, '192.168.1.127')
     ]
   end

显然,在定义了构造函数之后,您将需要require

然后更改您的类所有设备访问器:

  def self.all
    ALL_DEVICES
  end

最新更新