2012-05-25 7 views
20

私は一度作成したいモデルがあります。どこに置くの?彼をモデルクラスファイルに入れれば、モデルの新しいインスタンスを作成するたびに作成されることになります。私は起動時に一度作成されたこのオブジェクトを必要とします。ここでは、オブジェクトがあります:レールにシングルトングローバルオブジェクトを作成するには

require 'pubnub'  
publish_key = 'fdasfs' 
subscribe_key = 'sdfsdsf' 
secret_key = 'fsdfsd' 
ssl_on  = false 

pubnub_obj = Pubnub.new(publish_key, 
        subscribe_key, 
        secret_key, 
        ssl_on) 

私がモデルで、このように彼を使用します。

Railsでは
class Message < ActiveRecord::Base 

    def self.send_new_message_client(message) 
    message = { 'some_data' => message } 
    info = pubnub_obj.publish({ 
          'channel' => 'testing', 
          'message' => message 
          }) 
    puts(info) 
    end 

end 
+0

require 'pubnub' class Message < ActiveRecord::Base Pubnub.instance.publish_key = 'xyz' Pubnub.instance.subscribe_key = 'xyz' Pubnub.instance.secret_key = 'xyz' Pubnub.instance.ssl_on = 'xyz' def self.send_new_message_client(message) message = { 'some_data' => message } info = Pubnub.instance.publish({ 'channel' => 'testing', 'message' => message }) puts(info) end end 

あなたはまた、特定のモデルにより緊密にリンクし、そのクラス変数作ることができますグローバル変数も使用してください。次の例を参照してください:https://github.com/pubnub/ruby/blob/master/examples/pubnub_livestream/config/initializers/pubnub.rb –

答えて

31

、オブジェクトは要求ごとに再作成されます。これが何らかのサービスの場合、要求の範囲内のシングルトンでなければなりません。

シングルトンオブジェクトは、ルビーシングルトンミックスインを使用して作成する必要があります。

require 'singleton' 

class Pubnub 
    include Singleton 

    def initialize(publish_key, subscribe_key, secret_key, ssl_on) 
    # ... 
    end 

    def publish 
    # ... 
    end 
end 

次にあなたがinstance方法でそれを呼び出すことができます:あなたは、このオブジェクトが実際になることを確認してください

Pubnub.instance.publish 

この方法シングルトン(1つのインスタンスのみが存在する)。

modelsディレクトリに安全に置くことができますが、私はしばしばlibディレクトリを好むかもしれませんし、サービスのための新しいディレクトリを作成することもできます。状況によって異なります。

希望すると助かります!

+0

レコードの場合、最初のステートメントはconfig.cache_classesは次のとおりです。 falseに設定します。これは、デフォルトでは本番では真実ではありません。私はシングルトンのミックスインで何が起こっているのか分かりません。 – Michael

+1

Phusion Passengerのようなマルチプロセスサーバーを使用する場合、このアプローチでは潜在的な危険性があります。 PPはリクエストごとに1つのスレッドを作成し、さらにこれらのスレッドは別のプロセスに存在する可能性が高いため、各プロセスはこのプロセスの複数のスレッドによって共有される独自のシングルトンオブジェクトを持ちます。 – Paul

+0

上記のPaulのコメントを拡張するには、要求を共有することを望まない場合は、リクエストごとにシングルトンを持つことが欲しいという点でも問題があることに注意してください。 http://stackoverflow.com/questions/24927928/singleton-in-scope-of-a-request-in-rails – futbolpal

2

アプリケーション全体で1つのインスタンスだけが必要な場合は、シングルトンを使用します。そうでない場合は、クラス変数を使用します。

シングルトンを使用するには、シングルトンミキシンを使用します。その後、

require 'singleton' 

class Pubnub 
    include Singleton 

    attr_writer :publish_key, :subscribe_key, :secret_key, :ssl_on 

    def publish 
    #... 
    end 
end 

と、このようにそれを使用する:私はあなたができると思う

require 'pubnub'  
class Message < ActiveRecord::Base 
    @@pubnub_obj = Pubnub.new('xyz', 'xyz', 'xyz', 'xyz') 

    def self.send_new_message_client(message) 
    message = { 'some_data' => message } 
    info = @@pubnub_obj.publish({ 
          'channel' => 'testing', 
          'message' => message 
          }) 
    puts(info) 
    end 

end 
関連する問題