我是一位來自web開發的Ruby新手,主要是PHP/SQL。我正在考慮如何將偏好存儲在我的應用程序中。例如,如果我想將路徑存儲爲default_path
,並且在用戶重新啓動應用程序時也設置了該路徑。如何存儲應用程序的偏好?
在網絡世界中,人們可能會將其存儲在數據庫或XML中。數據庫看起來對於獨立應用程序來說過分了。但我不確定是否需要XML/YAML /其他寫入格式。如果是這樣,我應該在哪裏存儲這些偏好?它們應該是,例如在Mac上,在〜/ Library/MyAppName中?
我是一位來自web開發的Ruby新手,主要是PHP/SQL。我正在考慮如何將偏好存儲在我的應用程序中。例如,如果我想將路徑存儲爲default_path
,並且在用戶重新啓動應用程序時也設置了該路徑。如何存儲應用程序的偏好?
在網絡世界中,人們可能會將其存儲在數據庫或XML中。數據庫看起來對於獨立應用程序來說過分了。但我不確定是否需要XML/YAML /其他寫入格式。如果是這樣,我應該在哪裏存儲這些偏好?它們應該是,例如在Mac上,在〜/ Library/MyAppName中?
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
不喜歡的成員的課程,則可以使用自定義編碼/解碼功能來封送課程的其餘部分並省略有問題的成員。
我喜歡使用YAML,因爲它很容易被很多語言讀取/寫入,這使得多個應用程序可以共享相同的配置信息。這是一個有據可查的標準,所以數據很少有機會落入其中。另外,因爲人類很容易理解,並且不需要任何特殊的工具來更改,所以它可以很好地適用於任何可能偶爾會在應用中更改的數據,無論是用於微調還是啓用特殊行爲。
定期檢查YAML文件上次修改時間的小創意編碼可能會使您的應用程序在調整prefs文件時動態修改其行爲。我有一個很大的應用程序,我不想關閉更改並設置該行爲。它連續運行了三週,我通過它的配置文件調整了它的操作參數。它會每分鐘讀取一次文件並隨時繼承其參數的任何更改。
如果數據庫是中央服務器或基於Web的應用程序,則它們是存儲參數/首選項的好方法。對於在單個機器上運行的分佈式事物來說,這是毫無意義的
感謝您的回答!一個非常好的和正確的答案。這是最好的答案,除非@bta可以找到一個很好的參考資料,以儲存與編組偏好的偏好,這將提供幫助。否則我會在一兩天內接受這個。 – maetthew 2011-03-22 00:46:12
太好了。這是一場像eBay這樣的競購戰。那麼,請記住,YAML是爲這類問題而設計的,與XML或JSON不同。 :-) – 2011-03-22 02:36:25
我看到一些應用程序使用ruby gconf2
這是用於桌面應用程序還是Web應用程序? – 2011-03-22 22:16:00