如何存储应用程序的首选项?

时间:2011-03-21 23:06:52

标签: ruby programming-languages metaprogramming

我是Ruby的新手,主要来自基于PHP / SQL的Web开发。我在考虑如何在我的应用程序中存储首选项。例如,如果我想将路径存储为default_path,并在用户重新启动应用程序时也设置该路径。

在网络世界中,人们可能会将其存储在数据库或XML中。数据库对于独立应用程序来说似乎有些过分。但我不确定XML / YAML / Other-Write-Format是什么方式。如果是这样,我应该在哪里存储这些偏好?它们应该是,例如在Mac上,在〜/ Library / MyAppName中吗?

3 个答案:

答案 0 :(得分:2)

我喜欢使用YAML,因为它很容易通过很多语言读/写,使得多个应用可以共享相同的配置信息。这是一个记录良好的标准,因此数据很可能会陷入漏洞。

此外,因为人们很容易理解并且不需要任何特殊工具来改变,所以对于可能偶尔会在应用中发生变化的任何数据,无论是微调还是启用特殊行为,它都能很好地工作。

您可以定期检查YAML文件的上次修改时间,这样可以使您的应用程序在调整prefs文件时动态修改其行为。我有一个很棒的应用程序,我不想关闭更改并设置该行为。它连续运行了三周,我通过配置文件调整了它的运行参数。它会每分钟读取一次文件,并在运行中继承对其参数的任何更改。

如果数据库是集中式服务器或基于Web的应用程序,则它是存储参数/首选项的好方法。对于在单个机器上运行的分布式内容,没有任何意义。

答案 1 :(得分:1)

Ruby为您提供了另一种存储名为Marshaling的数据的方法。这将允许您将类/对象存储到文件中,并在以后重新构建它。如果您的所有用户首选项都存储在单个对象中(或者您可以创建一个可以容纳您需要的所有数据的对象),则可能最容易编组数据而不是将导入/导出例程写入文本 - 基于格式或试图引入额外的库或宝石。

关于磁盘上存储数据的位置,这取决于您。大多数平台都有一个标准位置,用于存储应用程序数据,具体取决于单个用户或所有用户是否可以使用。在您选择的目标平台上遵循常规做法通常是最安全的。

更新:最简单的example封送可能是这样的:假设您有一个名为UserPrefs的类,用于存储所有用户首选项。您可以使用以下代码将首选项数据存储到文件中:

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

下次加载应用程序时,可以使用以下命令恢复这些首选项:

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

此时,my_prefs对象应该与最初运行封送处理代码时完全相同。这实际上允许您在某个时间点(例如,当程序关闭时)对对象进行“快照”并稍后恢复(例如,在程序加载时)。在内部,结构中的所有数据都被编码为单个字符串,该字符串是存储在磁盘中的字符串; Marshal模块只是为您处理编码和解码。

Here是另一个使用编组来存储和检索数据的示例。

Marshal模块中内置的默认编码/解码例程通常足以满足大多数数据存储类的需要。特别复杂的类可能有问题,如果是这种情况,那么您可以定义自己的编码和解码方法(first link包括定义自定义方法的示例)。

然而,某些类型的数据无法编组(诸如打开文件的句柄,Proc对象等),因为它们通常不会在Ruby会话中持续存在。如果您需要编组一个包含Marshal不喜欢的成员的类,您可以使用自定义编码/解码函数来编组其余类,并省略有问题的成员。

答案 2 :(得分:0)

我看到了一些使用ruby gconf2

的应用程序