2012-03-02 3 views
1

У меня есть HTTParty «модель», который я использую, как такКак я могу изменить этот класс, чтобы использовать шаблон singleton, например activemodel?

myRest = RestModel.new 
myRest.someGetResquest() 
myRest.somePostRequest() 

Как бы я идти об изменении его так же работать с ActiveModel, как так?

RestModel.someGetRequest() 
RestModel.somePostRequest() 

это blog post показано, как включить одноплодной модуль, но его все еще получает доступ к экземпляру так: RestModel.instance.someGetRequest()

Вот мой код:

class Managementdb 
    include HTTParty 

    base_uri "http://localhost:7001/management/" 

    def initialise(authToken) 
     self.authToken = authToken 
    end 

    def login() 
     response = self.class.get("/testLogin") 
     if response.success? 
      self.authToken = response["authToken"] 
     else 
      # this just raises the net/http response that was raised 
      raise response.response  
     end 
    end 

    attr_accessor :authToken 

    ... 
end 

Скажите, пожалуйста, что я делаю это все неправильно (показать мне свет)

+0

Использование шаблона одноплодной всегда будет обращаться к нему с помощью 'RestModel.instance.method()', ГЭТ аксессор для проверки экземпляра, если один был создан и возвращает этот экземпляр или создает его, если он ранее не использовался. Использование его с 'RestModel.method()' было бы способом, которым будет работать статический класс, а не singleton – jzworkman

+0

ok, вы не возражаете, если я изменю заголовок. –

+0

@jzworkman Это неправда в Ruby. «Класс» или «статические» методы и свойства в Ruby существуют на одноэлементном объекте класса. Ruby - это не Java. –

ответ

3

Вы хотите использовать extend, а не include, что добавит методы в класс singleton, а не сделает их доступными для экземпляров.

class Managementdb 
    extend HTTParty 
end 

длиннее пример, иллюстрирующий это:

module Bar 
    def hello 
    "Bar!" 
    end 
end 
module Baz 
    def hello 
    "Baz!" 
    end 
end 
class Foo 
    include Bar 
    extend Baz 
end 

Foo.hello  # => "Baz!" 
Foo.new.hello # => "Bar!" 
+0

Могу ли я использовать метод в 'Baz' из' Foo'? –

+0

@JosephLeBrech Я не уверен, что вы подразумеваете под этим, вы можете уточнить? –

+0

Если у 'Baz' есть другой метод, как его вызвать из метода в' Foo'? –