3

私のRailsアプリケーションの上には、最新のホットディール、予定されたダウンタイム通知などのテキストが表示されたバーがあります。これは基本的にすべてのリクエストでアクセスする必要のある種類の情報であり、時折更新される可能性があります。これを達成する最良の方法は何ですか?Railsの永続変数

私がしたいのは、(コントローラからアクセス可能な)永続的なグローバル変数です。

  • 非常にまれに更新されるため、更新後しばらくの間、作業者間で矛盾が生じても問題ありません。
  • 一方、サーバーの障害(定期的なバックアップで十分です)の場合は、永続的にする必要があります。
  • これは本当に頻繁にアクセスされるため、できるだけ早く、好ましくはメモリにとどめてください。
  • また、それは種類の唯一のものなので、私は本当に専用データベースモデルでアプリケーションを膨らませたくないです。

Node.jsのようなものは簡単ですが、Railsでこれを実現する方法は一つもありません。何をすればよいでしょうか?

EDITこれまでに答えを

おかげで、彼らは感動している間、私は、彼らがすべて欠けている一つのキーの機能を強調するべきだと思います。 変数は、アプリ内で編集可能で永続的である必要があります。変数を編集することは可能ですが、サーバーを再起動した場合はデフォルトに戻りますが、これは悪いことです。

答えて

0

これは私のやったことです。値をイニシャライザに置くのではなく、それを扱う簡単なクラスを作成しました。変数自体は、あらかじめ定義されたファイルに格納されます。初期化時にファイルを読み込むほかに、クラスは値が変更されたときにファイルを更新し、ファイルを定期的に再読み込みしてワーカー間の一貫性を維持します。また、JSONの処理とバックアップ機能をいくつか用意して、使いやすくしています。

興味がある人のために、ここで重要なコードです:

class Pomegranate 

    def initialize 
    @delay = 30.minutes 
    @path = "db/pomegranate.json" 
    @valid = Time.now - 1 
    validate 
    end 

    def get(*p) 
    validate 
    p.inject(@data) {|object,key| object[key] if object} 
    end 

    def set(*p, q, v) 
    hash = p.inject(@data) {|object,key| object[key]||={}} 
    hash[q] = v 
    end 

    def save 
    @valid = Time.now + @delay 
    File.open(@path,"w") {|f| f.write(@data.to_json)} 
    end 

    private 

    def validate 
    if @valid < Time.now 
     @data = ActiveSupport::JSON.decode(File.read(@path)) rescue {} 
     @valid = Time.now + @delay 
     @valid = Time.now - 1 if @data.empty? 
    end 
    end 

end 

$pom = Pomegranate.new 
0

出典: Where to put Global variables in Rails 3

このようなあなたのapplicaton.rbでそれを入れてみてください:

module MyAppName 
    class Application < Rails::Application 
    YOUR_GLOBAL_VAR = "test" 
    end 
end 

は、その後、あなたのコントローラ、ビュー、またはどんな名前空間とそれを呼び出すことができます。..

MyAppName::Application::YOUR_GLOBAL_VAR 

もう1つの方法は、settingslogicのようなものを使用します。 settingslogicでは、yml設定ファイルと設定ファイルを指すモデル(Settings.rb)を作成するだけです。

config/initialzers/foo.rb:どこでも、あなたのアプリケーション内から

MYVARIABLE = 'some string' 

のバリアフリーあなたは初期化子で定数として、それを宣言することができ

Settings.my_setting 
1

:次に、あなたとあなたのレールのアプリで任意の場所にこれらの設定にアクセスすることができますas MYVARIABLE

+0

後で変数を変更すると、それは作業者間で一貫していますか? –

+0

いいえ、潜在的にdRubyを使用して、すべてのワーカーにまたがってアップデートを伝えることができます。 – rudolph9

2

本当にあなたが探しているものによって異なります。あなたは、関数(文字列)は、あなたのアプリケーション内の任意のコントローラからアクセス可能であることをごapplication_controller.rb

class ApplicationController < ActionController::Base 
    def system_message 
    "Come buy our amazing .99 iphone chocolate bar apps, with 100% more gamification!" 
    end 
end 

にそれを置くことによって非常に簡単に何かを行うことができます。application.rbファイルのafter_initializeブロックに何かを指定することもできます。

config.after_initialize do 
    ::MYTEXT = "MY SUPER AMAZING TEXT" 
end 

また、レールにプリロードされてinitializersディレクトリの下に独自のファイルを作成することができます。

ます。また、このRailscast video about site wide announcements

+0

私はイニシャライザに向かっています。一つの質問は、後で変数を変更すると、それは労働者の間で一貫しているのだろうか? –

+0

変数がサイトにハードコードされ、コードを展開するためにサーバーをシャットダウンする必要があります。すべてのバックアップを一度スピンさせると、一貫性があるはずです。あなたが何らかの継続的な展開システムで変数を変更しようとしたが、私の専門分野ではないことが起こった場合、あなたが走っているのは唯一の問題です。 –

0

をチェックアウトすることができますので、siteAnnounce.rb

MYANNOUNCEMENT = "NOW LISTEN TO ME!" 

私は、例えば、設定オブジェクトに次のように定数や変数を入れ始めました

TestApp::Application.config.foo = 'bar' 
TestApp::Application.config.something = { :a => 1, :b => 2 } 
2

私はそれをデータベースに保存し、キャッシュで処理します。

多くの場所で共通の値を共有する必要があるコードではなく、ユーザービューではなくコードであるため、グローバル変数が適切であると感じています。
この場合、OPが「アプリで編集可能」に太字になっているので、これは明らかです。だから私は、ユーザーがそれを入力することができるビューを持って、それはdbテーブルに格納され、必要に応じて(一度一度使用してキャッシュされた)リコールされます。

2

まあ、私は同様の問題に直面していました。 私の問題は、すべてのレベル(MVC)でグローバル変数が必要だったことです。 Memcacheを使用して変数を保存しました。 似たような解決策を考えてもいいですか? 追加ボーナスとして、プログラム全体で変更することができます。

関連する問題