【发布时间】:2016-07-14 07:34:48
【问题描述】:
我有一个经典的 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 对象。
我很确定我只是不习惯 Sinatra 约定。对我有什么指导吗?
【问题讨论】:
-
我对如何使用设置存储 Persons 有点困惑。也许我有点傻。除非它存储在 Sinatra 之外的某个地方,否则每个用户如何从中获得相同的值?
-
建议不要让您的 Person 类依赖于 Sinatra。这会让测试变得更加困难,不是吗? IMO 依赖注入是你的朋友——当然这会让你的问题消失......
标签: ruby sinatra sinatra-activerecord