2017-06-03 105 views
1

我有幾個向網站發出請求的類。例如,對於刮www.example.com/albums,另一個用於www.example.com/singles在類之間共享字符串ruby

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

在每種這些類的一個I類具有恆定的限定外部URL。例如

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定義別的地方。我應該在哪裏定義這樣一個常數?如果我在較低級別的模塊中定義它,我是否沒有打破依賴倒置原則?我應該把它放在配置中嗎? (即使我可以認爲url不會改變)

我也想共享所有請求之間的請求頭哈希。

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

謝謝。

+2

某些應用程序的配置將是,在我看來 –

+0

application.yml最好的地方,將有助於 – baskara

回答

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 
+0

我不知道,如果有一個基類只包含常量,這是一個好主意?有這些子類的部分原因是封裝請求的內部(url,http動詞,params)。例如,我可以調用'album_request.perform'。我不認爲我可以在基類 –

+0

當中共享任何功能,但對於只有常量的人來說這不是一個好主意。這就是爲什麼建議你一個執行請求的集中方法,這會干擾你的代碼。如果你不能共享任何功能,那麼不要這樣做...或者你可以做的是編寫一個模塊,說'constants.rb',如果你可以把它放在初始化器中,這樣常量就可以到處使用了(我推薦),很好,很好。否則'包括'它在所有的類。 –

+0

謝謝,我會盡力去看看哪種方法最適合! –

0

也許你可以使用ENV文件來管理你的應用程序,