12

lib/some/middleware.rb に配置されたミドルウェアを備えた Rails 4 アプリがあります。これは現在、次のような初期化子を介してスタックに注入されています。

MyApp::Application.configure.do |config|
    config.middleware.use 'Some::Middleware'
end

残念ながら、何かを変更するたびに、サーバーを再起動する必要があります。開発モードでリクエストごとに再ロードするにはどうすればよいですか? 自動読み込みまたは to_prepare ブロックでのコードのラップのいずれかを使用して lib コードを再読み込みすることについて同様の質問を見たことがありますが、このシナリオでそれをどのように適用できるかはわかりません。

ありがとう - FJM

更新 #1

ミドルウェアを削除して to_prepare ブロックに再度追加しようとすると、「凍結された配列を変更できません」というエラーが表示されます。

4

4 に答える 4

1

@phoetの回答に基づいて、実際にこの種の遅延読み込みでミドルウェアをラップできます。これはさらに便利です。

class ReloadableMiddleware
  def initialize(app, middleware_module_name, *middleware_args)
    @app = app
    @name = middleware_module_name
    @args = middleware_args
  end

  def call(env)
    # Lazily initialize the middleware item and call it immediately
    @name.constantize.new(@app, *@args).call(env)
  end
end

次に、文字列として指定された最初の引数として、他のミドルウェアを使用して Rails 構成にフックできます。

Rails.application.config.middleware.use ReloadableMiddleware, 'YourMiddleware'

reloadable_middleware別の方法として、次のように使用できるという宝石にパッケージ化しました。

Rails.application.config.middleware.use ReloadableMiddleware.wrap(YourMiddleware)
于 2019-04-20T18:31:35.707 に答える