Ruby / Sinatra - 使用Helper *类也可以使用Sinatra设置

时间:2015-06-18 16:58:54

标签: ruby sinatra sinatra-activerecord

我有一个经典的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不会这样做。 t支持类作为帮助者?或者根本不使用帮助者?)

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

我相当确定我不习惯Sinatra会议。对我有什么指导?

2 个答案:

答案 0 :(得分:1)

这样看起来有点令人困惑,你保留这些片段。 我们需要查看整个代码以确切地指出错误。 您知道主文件/类中需要一个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

答案 1 :(得分:0)

我之前不知道正在使用的设置数组。这个settings数组是否作为Sinatra的一部分存在?你可以像这样存放东西吗?

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