【问题标题】:Ruby/Sinatra - Using Helper *classes that can also consume Sinatra settingsRuby/Sinatra - 使用 Helper *classes 也可以使用 Sinatra 设置
【发布时间】: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


【解决方案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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多