Roy --
Thank you for that example!! I guess I'll give that a shot :)
It still hurts my heart that this doesn't appear to be possible with
Rails. :(
One followup question, if I may:
Why is it that class variables don't behave as I expect them to? So
since it appears that adding class attributes (inheritable or not) to a
descendent of ActiveRecord is unsupported, I added a new Class
(inheriting from Object) and put it in /lib:
class ConnectionManager
HOST = "the.host.com"
PATH = '/'
PORT = 2195
PASSPHRASE = "foobar"
CACERT = File.expand_path(File.dirname(__FILE__) +
"certs/ca.the.host.com.crt")
USERAGENT = 'Mozilla/5.0 (ConnectionManager Ruby on Rails 0.1)'
cattr_accessor :connection, :cert_name, :cert
self.cert_name = "my_pem_file.pem"
def initialize
super
cert = File.read("config/#{cert_name}") if
File.exists?("config/#{cert_name}")
puts "cert = #{cert.inspect}"
if connection.nil?
puts "Connecting now!!"
ctx = OpenSSL::SSL::SSLContext.new
ctx.key = OpenSSL::PKey::RSA.new(cert, PASSPHRASE)
ctx.cert = OpenSSL::X509::Certificate.new(cert)
s = TCPSocket.new(HOST, PORT)
connection = OpenSSL::SSL::SSLSocket.new(s, ctx)
connection.sync = true
connection.connect
end
end
end
But when I try to use this in my class that inherits from ActiveRecord,
like this:
def send
ssl = cm.class.connection
logger.info "ssl = #{ssl.inspect}"
ssl.write(self.message_for_sending)
rescue SocketError => error
raise "Error while sending: #{error}"
end
First I got an error and I realized that my ConnectionManager's
initialize method wasn't being called. So I added a line to get an
instance of ConnectionManager, just so that initialize would be called:
def send_notification
cm = ConnectionManager.new
ssl = cm.class.connection
logger.info "ssl = #{ssl.inspect}"
ssl.write(self.message_for_sending)
rescue SocketError => error
raise "Error while sending notifications: #{error}"
end
I could tell from my log ("Connecting Now!!" appeared) that initialize
had been called. But I'm still getting an error:
You have a nil object when you didn't expect it! The error occurred
while evaluating nil.write
Clearly ConnectionManager.connection is returning null. In Java, once
you've used a class, its static vars are instantiated and hold their
values. It seems that in Ruby, the class's static vars are
instantiated/sandboxed in each .rb file. Am I correct here, or no?
Thanks again for the example code Roy!
-Steve
--
Posted via http://www.ruby-forum.com/.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Ruby
on Rails: Talk" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---