0

既存の Rails アプリから Sinatra アプリを抽出して、同じ Rails アプリで再利用できるようにしています。構成ファイルを現在の場所 (標準スポット) に残しておきたいのですRails.root/configが、それでも Sinatra アプリケーションから使用します。これをきれいにするにはどうすればよいですか?

現在、Sinatra アプリsettings.rootはベンダー ディレクトリの奥深くにあるパスを指しています。これは、Sinatra アプリが宝石だからだと思います。これは、Rails アプリのルートを見つけるために、多くのディレクトリを推測しなければならないことを意味します。

Sinatra アプリがマウントされているメインの Rack アプリのルートを取得する標準的な方法はありますか?

4

3 に答える 3

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デフォルト値を設定する必要があります。fooinitializeset

configure do
  set :foo, nil
end

application.rbこれで、次のように(または追加したい場所に)ミドルウェアを追加できます。

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

Rails アプリの外部に Sinatra アプリをマウントしたい場合は、 config.ruwith プレーンで同様のことができます。useRails アプリを必要とする行の後に行を追加するuseと、引き続きRails.root変数を使用できます。

于 2013-08-20T14:46:35.840 に答える