gpt4 book ai didi

ruby - Sinatra 中的通用设置

转载 作者:数据小太阳 更新时间:2023-10-29 08:00:41 24 4
gpt4 key购买 nike

我在 Sinatra 中有一个类,我在其中设置了一些设置(碰巧来自 JSON):

class Pavo < Sinatra::Base
configure :development do
set :config, JSON.parse(File.open(File.dirname(__FILE__) + "/pavo.configuration.development.json", "rb").read)
set :config_mtime, File.mtime(File.dirname(__FILE__) + "/pavo.configuration.development.json")
end

[...]

get '/' do
puts "whatever"
end
end

那个类有一个模型,需要它来读取这些设置。

class Resolver < Sinatra::Base
def get_data(workpid)
url_str = settings.config['public']['BOOKS_DATA_SERVICE_URL'].gsub('${WORKPID}', workpid)
return Resolver.get_json(url_str)
end
[...]
end

但是,Resolver 类不能这样做:Resolver:Class 的未定义方法 `config'。

也许我的作用域不对,或者我应该使用 Sinatra::Application?

最佳答案

当你得到一个继承自Sinatra::Base的类时你正在制作一个 Sinatra 应用程序。每个应用程序都有自己的 settings目的。如果您想跨应用程序共享设置,您有一些选择:

  1. 合并应用程序。
  2. 使设置更易于全局访问。
  3. 继承(见下文编辑)

合并它们很容易(除非有一些我们不知道的特殊原因),您基本上将它们放在同一个类中。

为了使设置更易于全局访问,我将执行以下操作:

a) 将整个应用程序包装在一个模块中,为其命名空间。
b) 将您要使用的设置放在可通过“getter”方法访问的类实例变量中。

例如

module MyNamespace

def self.global_settings
@gs ||= # load your settings
end

class App < Sinatra::Base
configure do
set :something_from_the_global, MyNamespace.global_settings.something
end
end

class SecondaryApp < Sinatra::Base
helpers do
def another_method
MyNamespace.global_settings.something_else # available anywhere
end
end
configure do # they're also available here, since you set them up before the app
set :something_from_the_global, MyNamespace.global_settings.something
end
end

end

如果您有一些非常小的应用程序,那很好,但如果您使用多个应用程序,那么您需要将它们分开一些。我倾向于组织应用程序的方式是从 rackup 文件(通常是 config.ru )中删除除 require 之外的所有内容。 s 和 run .我将中间件和应用程序设置放在另一个文件中,通常是 app/config.rb所以我知道这是来自 config.ru 的东西.然后每个应用程序都有自己的文件(例如 app/app.rbapp/secondary.rb )

# app/config.rb

require "app"
require "secondary"

module MyNamespace
# set up your getters… e.g.

def self.global_settings
@gs ||= # load your settings
end

def self.app
Rack::Builder.app do

# …and middleware here
use SecondaryApp
run App
end
end
end

# config.ru

require 'rubygems'
require 'bundler'
Bundler.require

root = File.expand_path File.dirname(__FILE__)
require File.join( root , "./app/config.rb" )

map "/" do
run MyNamespace.app
end

这种设置有很多好处 - 更容易测试;更容易组织;您可以更轻松地移动应用程序。但 YMMV 一如既往。


我还应该补充一点,因为我很失职,不这样做,也可以使用继承,例如:

require 'sinatra/base'    

module MyNamespace
class Controller < Sinatra::Base
configure :development do
set :config, "some JSON"
set :mtime, Time.now.to_s
end
end

class App1 < Controller

get "/app1" do
"in App1 config: #{settings.config} mtime: #{settings.mtime}"
end
end

class App2 < Controller

get "/app2" do
"in App2 with config: #{settings. config} mtime: #{settings.mtime}"
end
end
end

设置、路由、助手、过滤器都是继承的,所以如果你在祖先应用程序中配置了一些东西,它将在继承者中可用。有时这样做会更好,可能是当设置对 Sinatra 应用程序来说只是“全局”时,或者当您想要创建可重用的应用程序和 Controller 时。其他时候,您将需要可在模型、库等中使用的设置,然后我首先给出的更全局的解决方案将是最好的。

关于ruby - Sinatra 中的通用设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14846031/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com