2013-08-19 54 views
0

我将一个Sinatra应用程序从现有的Rails应用程序中解压缩到一个gem中,以便在相同的Rails应用程序中重用。我想在它的当前位置Rails.root/config(标准点)保留一个配置文件,但仍然在Sinatra应用程序中使用它。我该如何干净地做这件事?在Sinatra和Rails之间共享Yaml配置文件

目前Sinatra应用程序的settings.root指向供应商目录内的某个路径。我认为这是因为Sinatra应用程序是一个宝石。这意味着我必须猜出许多目录才能找到Rails应用程序的根目录。

有没有一种标准方式来获取我的Sinatra应用程序所在的主Rack应用程序的根目录?

回答

0

如果您将您的Sinatra应用安装在您的config/routes.rb中的条目中,则可以在拨打mount之前调用其中的方法进行配置。

你打电话,这里将后的应用程式内configure块运行的任何方法,所以如果你想做的任何事情比设置单个变量(与西纳特拉set命令)更复杂,你需要添加一个类的方法你可以拨打电话routes.rb

例如,如果你想有一个包含一个条目foo一个YAML配置文件,然后在你的末日应用程序添加类似:

def self.config_from_file(filename) 
    data = YAML.load_file(filename) 
    set :foo, data['foo'] 
    # set other vars from Yaml as appropriate 
end 

现在settings.foo将在你的路由可用。

在你的Rails config/routes.rb,你将需要添加类似:

# first configure your app 
MyApp.config_from_file(File.join("#{Rails.root}/config", "foo_config.yaml")) 
# now mount it at the appropriate url 
mount MyApp.new => '/foo' 
+0

我将这与使用中间件结合使用,在传递呼叫之前设置一些环境散列值。我的每个Sinatra模块都会检查值的环境散列值。 – Jason

1

没有干净的方法,因为这些应用程序是完全不同的堆栈。

您可以使用您的服务器的操作系统在Sinatra代码上玩弄技巧,这是我们所做的。

如果您在Linux或Mac OS上,请为您的Sinatra应用程序创建一个指向Rails配置文件的软链接。您可以编写一个创建它的rakefile,并在安装代码时运行该脚本。

在操作系统级别,您要使用:

ln -s path_to_rails_file.yaml path_to_sinatra_file.yaml 

你甚至可以创建两个Rails和Sinatra的YAML文件指向的父目录或文件的单个实例的软链接/等地方。你需要在适当的地方添加一些自述文件来记录软链接的使用情况,或者当你不记得你为什么这样做时,你会在凌晨3点憎恨自己。

0

如果你包括你可以将其作为中间件分离西纳特拉应用在你的Rails应用程序,那么你可以添加一个构造函数配置它的应用程序。 Sinatra的initialize method遵循通用Rack中间件接口,第一个参数是传递请求的应用程序。通过在你的子类中重载这个,你可以执行任何需要的配置。

例如,在你的末日应用:

def initialize(app, config_file) 
    super(app) 
    data = YAML.load_file(config_file) 
    settings.foo = data['name'] 
end 

为了调用settings.foo工作,你将需要设置在配置块foo的默认值,因为initialize方法在运行类和实例的范围没有访问set方法:

configure do 
    set :foo, nil 
end 

现在你可以在application.rb添加中间件(或任何你想添加的话)像这样:

config.middleware.use MyApp, File.join(Rails.root, "config/foo_settings.yaml") 

你可以做一些你config.ru与普通use如果你想安装到您的Rails应用程序之外的应用程序西纳特拉similiar。如果在需要Rails应用程序的行之后添加use行,您仍然可以使用Rails.root变量。