2015-12-11 4 views
0

Я хочу добавить небольшое расширение для класса в рубиновой драгоценности.Ruby on Rails Глобальная переменная класса, не обновляемая при изменении

Жемчужиной я использую private_pub: https://github.com/ryanb/private_pub и класс я переопределение является: https://github.com/ryanb/private_pub/blob/master/lib/private_pub/faye_extension.rb

Я поместил свою реализацию в виде нового файла в конфиге/Инициализаторы называется faye_extension.rb. Часть, которую я добавил в код, - это клиенты @@ и метод класса get_list_of_subscribers. Код в faye_extension.rb выглядит следующим образом:

PrivatePub::FayeExtension 
module PrivatePub 
    # This class is an extension for the Faye::RackAdapter. 
    # It is used inside of PrivatePub.faye_app. 
    class FayeExtension 
    # Callback to handle incoming Faye messages. This authenticates both 
    # subscribe and publish calls. 

##### MY NEW BIT 
    @@clients = 0 
    def self.get_list_of_subscribers 
     @@clients 
    end 

#### 


    def incoming(message, callback) 
    @@clients = @@clients + 1 
     if message["channel"] == "/meta/subscribe" 
     authenticate_subscribe(message) 
     elsif message["channel"] !~ %r{^/meta/} 
     authenticate_publish(message) 
     end 
     callback.call(message) 
    end 

    private 

    # Ensure the subscription signature is correct and that it has not expired. 
    def authenticate_subscribe(message) 
     subscription = PrivatePub.subscription(:channel => message["subscription"], :timestamp => message["ext"]["private_pub_timestamp"]) 
     if message["ext"]["private_pub_signature"] != subscription[:signature] 
     message["error"] = "Incorrect signature." 
     elsif PrivatePub.signature_expired? message["ext"]["private_pub_timestamp"].to_i 
     message["error"] = "Signature has expired." 
     end 
    end 

    # Ensures the secret token is correct before publishing. 
    def authenticate_publish(message) 
     if PrivatePub.config[:secret_token].nil? 
     raise Error, "No secret_token config set, ensure private_pub.yml is loaded properly." 
     elsif message["ext"]["private_pub_token"] != PrivatePub.config[:secret_token] 
     message["error"] = "Incorrect token." 
     else 
     message["ext"]["private_pub_token"] = nil 
     end 
    end 
    end 
end 

При развертывании в моем приложении, метод входящего() кода FayeExtension вызывается несколько раз, однако, если в представлении где-то я использую следующую строку кода :

<h3><%= PrivatePub::FayeExtension.get_list_of_subscribers.to_s %></h3> 

называть мой метод get_list_of_subscribers класса, он всегда возвращает 0, несмотря я зову входящие() 5 раз, где я хотел бы ожидать, что это выход 5. Таким образом, кажется мой @@clients = @@clients +1 код внутри входящего() является не ссылаясь или не обновляя мою глобальную переменную.

Как я могу изменить код для достижения этого?

ответ

3

@@clients может быть переменной класса, но не разделяется между различными процессами. Приложения, развернутые для производства, обычно запускают несколько процессов.

Вам нужно будет сохранить это значение где-нибудь, где каждый процесс имеет доступ к: вашей базе данных, redis, memcache ...