2011-06-01 56 views
2

基本上,我正在編寫一個與許多熱門網站(Facebook,Twitter,Youtube等)接口的網站。我的主要目標是相同的,但是我實現我的目標的方式與我支持的每個站點都不同,因爲它們的佈局不同,並且我必須根據其網站的運行情況編寫我的請求。如何模塊化Rails代碼?

用戶選擇他們想要使用我提供的服務的特定網站(即,他們是否希望將其用於Facebook或Twitter等)。他們只能根據我的服務請求選擇這些網站中的一個。

我想知道當Rails模塊化(這是我的第一個Rails項目,儘管我已經接觸過其他語言),好的設計主體/實踐是什麼。基本上,我看到它的方式是,用戶將他們的請求提交給我的控制器,它將檢查他們選擇的站點。然後,我的控制器將「加載」一個特定的模塊(即如果他們選擇了Facebook,它將加載facebook模塊),其中將包含處理Facebook請求的所有代碼。然後它將以任何必要的方式調用該代碼,並將結果提供給用戶。

所以基本上,我的問題是真正歸結爲有關Rails的最佳實踐和設計原則。您認爲在這種情況下分離我的代碼的好方法是什麼?我是否應該爲每個支持的網站開設一個班級(臉書,推特等)?這是我能想到的唯一真正的選擇(因爲我對Rails不是很熟悉),但是我確信會有更好的選擇,所以我可以限制代碼冗餘的數量,因爲每個類的目標將是相同的,它只是一個不同的技術來獲得目標(即方法名稱將是相同的每個類,等)。

謝謝!

回答

3

看起來像我的戰略模式。你可以這樣做(不知道把它放在Rails中)。

require "delegate" 

class Youtube 
    def open_connection 
    #code to open connection with youtube 
    end 

    def do_stuff  
    puts "doing stuff on Youtube" 
    end 

    def close_connection 
    #code to close connection 
    end 
end 

class Facebook 
    #define the same methods here 
end 


class Service < SimpleDelegator 
    def hello 
    puts "Hello, I stole most of my methods from #{__getobj__}" 
    end 
end 


s = Service.new(Youtube.new) 
s.hello  #=> Hello, I stole most of my methods from #<Youtube:0xb7724b1c> 
s.do_stuff #=> doing stuff on Youtube 
+0

謝謝steenslag,這聽起來很完美:)!如果有人知道這種事情會在軌道中出現,我就全部定下來。我唯一的猜測是在/ lib目錄中,但我可能是錯的。 – b0xxed1n 2011-06-01 14:35:45

1

這是一個主觀問題,它取決於你想添加多少功能,以及它們有多複雜。關於使用外部apis,我很確定每個都有api連接寶石。如果你不喜歡它們,你可以使用ActiveResource,這對於REST API來說非常有用。另外,我建議觀看關於ActiveResource的這些截屏視頻。

關於您的應用程序的結構,我會用namespaces保持你的控制器和路線,每條路線模塊上很好的分離。

+0

感謝您的回答。那麼,我會在命名空間中使用控制器嗎?例如說,以下內容: support_websites_controller.rb: 命名空間的Facebook做 結束 命名空間的Youtube做 結束 等? – b0xxed1n 2011-06-01 13:36:08

+0

這取決於你的網站是關於什麼。如果每個api都有類似的功能,命名空間可以幫助您識別控制器。例如,如果你對每個api有不同的首選項,你將在不同的命名空間中有多個'preferences_controller.rb'。一個在facebook名稱空間中,另一個在twitter名稱空間中。 – dombesz 2011-06-01 14:27:10