2017-07-13 10 views
1

Ruby on Railsアプリケーションでは、最も論理的な場所は "ファイルフラグ"を置く場所です。ファイルフラグを入れる論理的な場所はどこですか?

私は設定を外部化しようとしており、ファイルの存在がWebアプリケーションに何かが表示されているかどうかを決定する要因になるようにしています。

は今、私はここでファイルを持っている:

lib/ 
    deployment_enabled 

モデルdeployment.rb

class Deployment... 
    ... 
    def deployment_enabled? 
    Dir["#{Rails.root}/lib/deployment_enabled"].any? 
    end 
end 

は今、これは当然のことながら動作しますが、私は、これはMVCパラダイムを以下のわからないんだけどlibディレクトリはスクリプトで構成する必要があります。私はconfigに置くことができましたが、レールにはwebappと同じではなく、レールの設定にこれを使用しているので、そこには必ず含まれているかどうかはわかりません。

もちろん、これを私たちのデータベースに入れることはできますが、新しいテーブルを作成する必要があり、それは不要です。

このフラグファイルを配置する最も論理的な場所はどこですか? Railsには、この種のファイルを作成するために生成されたディレクトリがありますか?

+0

この設定 'フラグ'は実行時に変更されますか?私は、アプリケーションの起動後にファイルを追加/削除することを意味しますか? – ehoffmann

+0

そう、@ehoffmann。すぐに再度有効にしたい場合は、ファイル – sircapsalot

答えて

1

この目的で、Rails tmpディレクトリを使用することをお勧めします。次に:

File.exist?("#{Rails.root}/tmp/deployment_enabled") 

Phusion Passengerもこの種のメカニズムを使用します。 https://www.phusionpassenger.com/library/walkthroughs/basics/ruby/reloading_code.html#tmp-always_restart-txt

+0

hmを作成してください... tmpは合理的な場所のようです。 – sircapsalot

+0

これは間違いなく最も論理的な場所です。理由は次のとおりです。1. tmpディレクトリは、サーバーの再起動時にリセットされません。 2. tmp dirはほとんどの.gitignoreファイルにすでに追加されているため、ファイルが追加されるとSCMに追加されません – sircapsalot

+0

アプリケーションのメモリに保存する必要がある設定値のファイルシステムコールのランタイム呼び出しですか?これは非常に悪い習慣です。ファイルシステムの呼び出しは高価です。 – anothermh

0

Twelve-Factor Appのガイドラインに従い、コードを設定とは別に保存することをおすすめします。この場合、実際には単純なブール値について話しています。ファイルの存在は、値を定義するために使用するメカニズムに過ぎません。これは、代わりに環境変数を使用して行う必要があります。あなたが、その後値を検出するためのRailsで初期化子を使用することになり

DEPLOYMENT_ENABLED=1 RAILS_ENV=production rails server 

# config/initializers/deployment.rb 
foo if ENV['DEPLOYMENT_ENABLED'] 

値はまだENV['DEPLOYMENT_ENABLED'] = 0、例えば、実行時に変更することができるよう

何か。

+0

私は環境変数がOPケースを管理する最善の方法であるとは思わない。彼は実行時にフラグを更新できるようにしたい。上記のソリューションを使用すると、多くの問題が発生します。実行時のENVの変更は、各アプリケーションの再起動の間にリセットされます。実行時にENVを更新する機能を作成する必要があります(コントローラアクション...)。フラグの更新プロセスを簡単に自動化することはできません(あるいは最後に 'touch tmp/filename'と同じくらい簡単にはできません)。 IMHO、ENVは定数とみなされ、実行時には変更されません。 – ehoffmann

+0

それどころか、ファイルシステムはRailsの制御下にありません。環境に格納されているアプリケーション構成は、Railsの排他制御下にあります。ファイルを使用して行う必要がある理由のすべての例は、アプリ開発のベストプラクティスに反するものです。ここでは、ファイルを使用しないというもっとも簡単な理由があります.1つのインスタンスを超えて拡張することはできません。悪い習慣は、たとえ彼らが空虚に賢明に見えるとしても、理由のために悪いです。 – anothermh

+0

'tmp'はRailsフレームワークの制御下にあります('/tmp'については言及しません)。これはキャッシング、PIDなどに使われています。多くの人気のある宝石もそれを使用しています。すべてのRailsアプリケーションのインスタンスには独自の 'tmp'があるのでスケーラブルです。 Unixシステムでは、ファイルをフラグとして使用するのが一般的なイディオムでもあります。実行時に環境変数を変更することは、OPケースには関係ありません。再起動後も永続化されず、実際には「悪い習慣」である「グローバル変数」を使用する場合と同じです。なぜENVが一定であると考えられるのか。 – ehoffmann

関連する問題