26

一度作成して、モデルの 1 つでアクセスしたいオブジェクトがあります。彼をどこに置く?モデルクラスファイルに彼を入れると、そのモデルの新しいインスタンスを作成するたびに彼が作成されるのではないかと心配しています。このオブジェクトを起動時に一度だけ作成したい。オブジェクトは次のとおりです。

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)

私はモデルで彼を次のように使用します。

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
4

2 に答える 2

41

Railsでは、オブジェクトはリクエストごとに再作成されます。これが何らかのサービスである場合、リクエストの範囲内でシングルトンである必要があります。

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

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か、サービス用の新しいディレクトリを作成することがよくあります。状況によります。

それが役に立てば幸い!

于 2012-05-25T23:13:50.217 に答える
5

アプリケーション全体でインスタンスを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.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

また、クラス変数にして、特定のモデルにより緊密にリンクすることもできます。

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
于 2012-05-25T23:24:51.737 に答える