ruby-on-rails-3 - singletons - singleton javascript ejemplo
¿Cómo puedo crear un objeto global de singleton en rieles (2)
En Rails, los objetos se recrean en cada solicitud. Si este es algún tipo de servicio, debería ser un singleton en el alcance de una solicitud.
Los objetos Singleton deben crearse con el rubin singleton mixin:
require ''singleton''
class Pubnub
include Singleton
def initialize(publish_key, subscribe_key, secret_key, ssl_on)
# ...
end
def publish
# ...
end
end
Entonces puedes llamarlo con el método de instance
:
Pubnub.instance.publish
De esta manera, se asegura de que este objeto sea realmente un singleton (solo existirá una instancia).
Puede colocarlo de manera segura en el directorio de models
, aunque a menudo prefiero el directorio lib
o tal vez cree un nuevo directorio para servicios. Depende de la situación.
¡Espero eso ayude!
Tengo un objeto que quiero crear una vez y accesible en uno de mis modelos. ¿Dónde lo pongo? Me temo que si lo pongo en el archivo de clase de modelo, se creará cada vez que haga una nueva instancia de ese modelo. Solo quiero que este objeto se cree una vez al inicio. Aquí está el objeto:
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)
Lo uso así en el modelo:
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
Si solo desea una instancia en toda su aplicación, use un singleton, de lo contrario use una variable de clase.
Para usar un singleton, incluye el mixin de Singleton.
require ''singleton''
class Pubnub
include Singleton
attr_writer :publish_key, :subscribe_key, :secret_key, :ssl_on
def publish
#...
end
end
y luego usarlo así:
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
También puede convertirla en una variable de clase, para vincularla más estrechamente a un modelo específico:
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