0

実稼働用にアセットをコンパイルしようとしていますが、これはローカルでは行われません。

2 つの制約があります。

  • データベースに接続できません (このステップの場合)
  • 通常、データベースから情報を取得する必要がある動的ルートがあります (ただし、アセットのコンパイルには必要ありません)。

基本的に、本番環境の外でビルドされた docker イメージで実行します。データベースに接続できません。dockerfileでenv_varを使用して偽のdbアドレスを直接渡すというトリックを使用していました。

しかし今、私は動的ルートを持っています:

scope path: ":tenant", constraints: {tenant: Apartment.tenant_names.join('|')}  do
  .... 
end

新しいテナント名が追加されたときにルートをリロードするため、これは機能しています。

しかし、アセットをコンパイルする必要がある場合、コンパイルがアプリを初期化し、ルートが実行しようとしたためApartment.tenant_names.join('|')に失敗しました。これは、db 接続なしでは明らかに失敗します。

文字列に置き換えるApartment.tenant_names.join('|')と、データベースは呼び出されず、コンパイルは正常に実行されます。

コンパイル手順がアプリを初期化し、次のようなことを行う条件を作成しようとしているかどうかを確認するために使用できるものはありますか:

if assets_are_compiling?
   scope path: ":tenant", constraints: {tenant: "assets_compiling"}  do
   ....
else
  scope path: ":tenant", constraints: {tenant: Apartment.tenant_names.join('|')}  do
  .... 
end

何か案が ?

編集:回避策

質問の解決策ではありませんが、今後の参考のための回避策を次に示します。どうやらラムダを使用してもコンパイルエラーは発生しませんでした:

scope path: ":tenant", constraints: lambda {|request| (Apartment.tenant_names.include?(request.path.split('/')[1])) } do
4

1 に答える 1

1

これは機能するはずですが、他のタスクが誤検知をトリガーしないように、正規表現を微調整する必要がある場合があります。

if caller.to_s.match(/\/bin\/rake:\d+/) and caller.to_s.match(/\/lib\/sprockets\/rails\/task\.rb:\d+/)
   scope path: ":tenant", constraints: {tenant: "assets_compiling"}  do
     ...
   end
else
  scope path: ":tenant", constraints: {tenant: Apartment.tenant_names.join('|')}  do
    ...
  end
end

このコードは基本的にスタック トレースを実行して、 から呼び出されたかどうかを確認していますrake assets:precompile。しかし、私が言ったように、正規表現を微調整する必要があるかもしれません。

于 2016-09-22T19:47:58.750 に答える