0

我正在从现有的 Rails 应用程序中提取一个 Sinatra 应用程序到一个 gem 中,以便在同一个 Rails 应用程序中重用。我想在Rails.root/config(标准位置)的当前位置保留一个配置文件,但仍从 Sinatra 应用程序中使用它。我如何干净地做到这一点?

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

有没有一种标准方法来获取安装我的 Sinatra 应用程序的主 Rack 应用程序的根目录?

4

3 回答 3

1

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

您可以使用您服务器的操作系统对 Sinatra 代码进行操作,这是我们所做的。

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

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

ln -s path_to_rails_file.yaml path_to_sinatra_file.yaml

您甚至可以为 Rails 和 Sinatra 的 YAML 文件创建软链接,指向父目录或 /etc 某处的文件的单个实例。你会想在适当的地方添加一些自述文件来记录软链接的使用,或者你会在某天凌晨 3 点讨厌自己,因为你不记得你为什么这样做了。

于 2013-08-19T22:15:07.457 回答
0

如果您通过在您的 中安装一个条目来包含您的 Sinatra 应用程序config/routes.rb,您可以通过在调用之前调用它的方法来配置它mount

您在此处调用的任何方法都将在您的应用程序中的任何块之后configure运行,因此,如果您想做比设置单个变量(使用 Sinatraset命令)更复杂的事情,您将需要添加一个您可以从中调用的类方法routes.rb

例如,如果您想要一个包含 entry 的 Yaml 配置文件foo,那么在您的 Sinatra 应用程序中添加如下内容:

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将在您的路线中可用。

在您的 Railsconfig/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'
于 2013-08-20T01:39:00.240 回答
0

如果您通过将 Sinatra 应用程序添加为中间件将其包含在 Rails 应用程序中,那么您可以将构造函数添加到配置它的应用程序中。Sinatra 有一个遵循通用 Rack 中间件接口的initialize方法,第一个参数是要向其传递请求的应用程序。通过在您的子类中覆盖它,您可以执行任何需要的配置。

例如,在您的 Sinatra 应用程序中:

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")

如果你想在 Rails 应用程序之外安装 Sinatra 应用程序,你可以在你的config.ruwith plain中做类似的事情。use如果您在use需要 Rails 应用程序的行之后添加该行,您仍然可以使用该Rails.root变量。

于 2013-08-20T14:46:35.840 回答