2011-03-21 33 views
1

我是一位來自web開發的Ruby新手,主要是PHP/SQL。我正在考慮如何將偏好存儲在我的應用程序中。例如,如果我想將路徑存儲爲default_path,並且在用戶重新啓動應用程序時也設置了該路徑。如何存儲應用程序的偏好?

在網絡世界中,人們可能會將其存儲在數據庫或XML中。數據庫看起來對於獨立應用程序來說過分了。但我不確定是否需要XML/YAML /其他寫入格式。如果是這樣,我應該在哪裏存儲這些偏好?它們應該是,例如在Mac上,在〜/ Library/MyAppName中?

+0

這是用於桌面應用程序還是Web應用程序? – 2011-03-22 22:16:00

回答

1

Ruby爲您提供了另一種存儲數據的方法,稱爲Marshaling。這會讓你將一個類/對象存儲到一個文件中,並在稍後重新構建它。如果您的所有用戶首選項都存儲在單個對象中(或者您可以創建一個可以容納所有需要的數據的對象),那麼對數據進行編組可能最簡單,而不必將導入/導出例程寫入文本編輯器,基於格式的格式或試圖拉入額外的庫或寶石。

至於在磁盤上存儲數據的位置,這取決於您。大多數平臺都有一個用於存儲應用程序數據的標準位置,這取決於它是否可供單個用戶或所有用戶使用。按照目標平臺上的常規做法通常最安全。

更新:編組將可能是這一點最簡單example:假設你有一個類中調用,你用它來存儲所有用戶喜好的UserPrefs。您可以使用下面的代碼到偏好的數據存儲到一個文件:

# Load prefs from file 
my_prefs = nil 
File.open("user_prefs.data", "rb") {|f| my_prefs = Marshal.load(f)} 

此時:

my_prefs = UserPrefs.new 
# ... Fill in the 'my_prefs' object with the user's preferences, etc ... 

# Store the object into a file 
File.open("user_prefs.data", "wb") do |file| 
    Marshal.dump(my_prefs, file) 
end 

您加載應用程序的下一次,你可以使用以下還原這些首選項,my_prefs對象應該與最初運行封送處理代碼時的對象完全相同。這基本上可以讓你在某個時間點(例如,當程序關閉時)對某個對象進行「快速啓動」並稍後恢復(比如,當你的程序加載時)。在內部,結構中的所有數據都被編碼爲單個字符串,並且該字符串是存儲到磁盤的內容; Marshal模塊僅爲您編碼和解碼。

Here是使用封送處理來存儲和檢索數據的另一個示例。

對於大多數數據存儲類,Marshal模塊中內置的默認編碼/解碼例程通常已足夠。特別複雜的類可能會有問題,如果是這種情況,那麼您可以定義自己的編碼和解碼方法(first link包括定義自定義方法的示例)。

但是,某些類型的數據無法編組(例如打開文件的句柄,對象等的句柄),因爲它們通常不會在Ruby會話中持續存在。如果您需要編組包含Marshal不喜歡的成員的課程,則可以使用自定義編碼/解碼功能來封送課程的其餘部分並省略有問題的成員。

+0

這似乎是一個不錯的選擇。但是我找不到任何與我正在嘗試做的事情相近的事情,而且我很難理解如何使用它。您可以善良,找到一些參考資料(即url),在那裏我可以瞭解更多關於編組並使用它來存儲偏好的信息。 Marshalling似乎可以用於很多東西,不僅僅用於存儲數據,對嗎? – maetthew 2011-03-22 00:16:34

+0

@ maetthew-查看我更新的答案,瞭解一些其他鏈接和示例代碼。 – bta 2011-03-22 18:11:44

2

我喜歡使用YAML,因爲它很容易被很多語言讀取/寫入,這使得多個應用程序可以共享相同的配置信息。這是一個有據可查的標準,所以數據很少有機會落入其中。另外,因爲人類很容易理解,並且不需要任何特殊的工具來更改,所以它可以很好地適用於任何可能偶爾會在應用中更改的數據,無論是用於微調還是啓用特殊行爲。

定期檢查YAML文件上次修改時間的小創意編碼可能會使您的應用程序在調整prefs文件時動態修改其行爲。我有一個很大的應用程序,我不想關閉更改並設置該行爲。它連續運行了三週,我通過它的配置文件調整了它的操作參數。它會每分鐘讀取一次文件並隨時繼承其參數的任何更改。

如果數據庫是中央服務器或基於Web的應用程序,則它們是存儲參數/首選項的好方法。對於在單個機器上運行的分佈式事物來說,這是毫無意義的

+0

感謝您的回答!一個非常好的和正確的答案。這是最好的答案,除非@bta可以找到一個很好的參考資料,以儲存與編組偏好的偏好,這將提供幫助。否則我會在一兩天內接受這個。 – maetthew 2011-03-22 00:46:12

+1

太好了。這是一場像eBay這樣的競購戰。那麼,請記住,YAML是爲這類問題而設計的,與XML或JSON不同。 :-) – 2011-03-22 02:36:25

相關問題