2012-03-02 52 views
1

我有一个httparty“模型”,我用像这样如何修改此类以使用单例模式,如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

使用Singleton模式使用'RestModel.instance.method()',get访问例如支票将始终访问它,如果一个已经创建并返回该实例或创建一个,如果它以前没有使用过。在RestModel.method()中使用它将是静态类的运行方式,而不是单身。 – jzworkman 2012-03-02 17:05:20

+0

好吧,如果我改变标题,你介意吗? – 2012-03-02 17:07:44

+0

@jzworkman在Ruby中这不是真的。类的单例对象中存在Ruby中的“类”或“静态”方法和属性。 Ruby不是Java。 – 2012-03-02 17:14:07

回答

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

我是否仍然可以在'Foo'中使用'Baz'中的方法? – 2012-03-02 17:24:27

+0

@JosephLeBrech我不确定你的意思,你能澄清吗? – 2012-03-02 17:25:18

+0

如果'Baz'有另外一个方法,我怎样从'Foo'中的方法调用它? – 2012-03-02 17:26:52