Ruby/Sinatra - 使用助手 *也可以使用 Sinatra 设置的类



我有一个经典的Sinatra应用程序:

module Tds
  class Application < Sinatra:: Application
    set :persons, []
  end
end 

我的所有路由都按照上述样式分解为控制器。

正在使用sinatra-websockets构建一个websockets应用程序,所以我想使用一些自制的对象来帮助我管理我的连接状态。我可能需要这样的帮助程序类:

class Person
  attr_accessor: :favorite_color, :name, :etc
end

我想将我的人存储在 Sinatra 设置数组中:

get '/' do
  person = Person.new(init_data)
  settings.persons << person
  erb :whatev
end

但我希望 Person 类能够访问 sinatra 设置对象,以便它可以进行一些自我维护。也许是这样的:

get '/quit' do
  person.delete!
end

这将这样做:

class Person
  #....
  def delete!
   settings.persons.delete_if{|p| p == self}
  end
end

我很确定我的伪代码非常接近实际代码,给出或接受语法问题或记错关键字。

我一直遇到的问题是名称空间问题 - 要么我不明白将我的辅助类放在哪里(我是否必须将它们放在模块 Tds 中并将它们包含在某个地方?)或者 Sinatra 不支持类作为辅助程序?还是我根本不使用助手?

在命名空间问题之后,我仍然有范围问题。无论我尝试了什么,即使我可以弄清楚命名空间问题(我不记得我是怎么做到的),我的帮助程序类也无法访问 Settings 对象。

我很确定我只是不习惯辛纳屈公约。对我有什么指导吗?

看到这样保存这些片段的地方有点令人困惑。我们需要查看整个代码,以准确指出问题所在。您知道您的主文件/类中需要 helpers.rb 文件吗?并且还包括,因为它是一个模块?将类放在模块内部或外部会在范围上有所不同。

如果您可以发布整个代码,我们可以提供更多帮助,如果没有,请在此处提供一些一般建议。

Sinatra中的设置对象是您在主类/启动文件中配置的对象。通过做

configure do
  enable :run
  set :port, 8003
  ...
  set :public_folder, File.join(File.dirname(__FILE__), 'public')
  set :files, File.join(settings.public_folder, 'files')
end

或者只是

set :port, 8002
set :bind, '0.0.0.0'
...

在帮助程序中,您可以访问同一 Sinatra 应用程序命名空间中的这些设置,如下所示

settings.files
我不知道

以前像这样使用的设置数组。这个settings数组是否作为Sinatra的一部分存在?你能像这样存储东西吗?

我想如果可能的话,那就足够公平了,但它可能会有一些限制。获取持久性的一般做法是使用 session 哈希。这仅限于几千字节,因此如果它不够大,请设置一个数据库。

相关内容

最新更新