我正在使用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