在类ruby之间共享一个字符串

时间:2017-06-03 08:24:00

标签: ruby

我有几个类向网站发出请求。例如,一个类用于抓取www.example.com/albums,另一个类用于www.example.com/singles等。

/lib
   /classes
      /example
        album_request.rb
        singles_request.rb

在每个类中,我都有一个定义外部URL的常量。 e.g。

module Example
   class AlbumRequest 
       BASE_URL = 'http://www.example.com/albums'
   end
end

这意味着我要在所有课程中重复example.com。如果主机名突然改变怎么办?

我认为我的代码会更好:

module Example
   class AlbumRequest
      ALBUM_URL = "#{BASE_URL}/albums"
   end
end

BASE_URL在其他地方定义的地方。我应该在哪里定义这样的常数?如果我在较低级别的模块中定义它,我是不是打破了依赖倒置原则?我应该把它放在配置中吗? (即使我可以假设网址不会改变)

我还想在所有请求之间共享请求标头哈希。

REQUEST_HEADERS = {
     'Content-Type' => 'application/json',
      ...
}

感谢。

2 个答案:

答案 0 :(得分:0)

每个其他类继承的MainRequest类怎么样,比如

# lib/classes
class MainRequest
  BASE_URL = 'http://www.example.com/albums'

  HEADERS = {
    header1: 'value1',
    header2: 'value2'
  }
end

因此,你可以这样做,

module Example
  class AlbumRequest < MainRequest
    ALBUM_URL = "#{BASE_URL}/albums"
  end
end

我认为,你可能也在重复执行请求的逻辑,因为上面的代码,你也可以集中处理这些代码。

#lib/classes/main_request.rb

def execute_request(url, method = 'GET', params = {})
  # common logic of request and return response where params include headers, body, params
end

module Example
  class AlbumRequest < MainRequest
    ALBUM_URL = "#{BASE_URL}/albums"

    response = execute_request(ALBUM_URL, 'GET', some_params)
  end
end

答案 1 :(得分:0)

也许您可以使用ENV文件来管理您的应用,