如何在Sinatra中的请求中保持实例持续存在?

时间:2015-02-28 08:28:27

标签: ruby gem sinatra

我正在使用Sinatra建立一个非常简单的指挥中心'控制各种USB设备。

我创建了类似class Device的类,并将各种类型的设备子类化。

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

问题是,当应用程序首次加载时,它们会出现,当我刷新时,它们会消失。我已经尝试将它放在应用的各个部分,我无法弄清楚应该去哪里。

我还试过把它放在一个前置过滤器中,但是每次刷新都会创建它们的副本(......奇怪的是,当你在第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 (这些是设备本身的实例,我基本上是&#39;硬编码&#39;)。

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 %>  

1 个答案:

答案 0 :(得分:2)

您没有保留对对象的任何引用,因此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