保持Web应用程序配置的最佳方法是什么?

时间:2009-12-08 10:36:42

标签: ruby-on-rails database web-config

如果我有一些网络管理员配置来设置,例如每页发布的数量,一些枚举显示选择。我应该如何在db中保留此设置?我应该将其序列化并保存为blob。

谢谢,


我使用rails并希望它通过Web界面动态更改此设置,因此我认为environment.rb不适合这种情况。所以我应该有一个额外的表,其中有两个元组作为名称,值?

6 个答案:

答案 0 :(得分:1)

大多数语言/框架都有各种配置文件。例如ASP中的web.config或RoR中的environment.rb文件。你可以使用其中一种。

或者没有在数据库中有一个键值对表。

如果您想通过网站动态执行此操作,我肯定会使用键值对表。

答案 1 :(得分:1)

对于动态配置值,您应该创建一个名为Configuration的模型,其中包含键和值。我通常有多个值列(数字,字符串和日期),然后调用适当的配置方法。

对于“枚举”,您应该创建具有外键关系的查找表,以便它们附加到何处。例如,如果您有Post模型并且想要枚举Category,则应该Post belong_to :categoryCategory has_many :posts

答案 2 :(得分:1)

使用YAML文件。 YAML比XML更简单。

在“config”目录中创建一个名为“config.yml”的文件。并使用YAML :: load()加载文件。您可以通过将第一级命名为环境(例如,生产,开发,测试)来为每个环境进行设置。

请参阅this episode of RailsCasts for details

答案 3 :(得分:0)

如果您使用的是asp.net,则可以使用Web.Config文件。

请参阅Asp .net Web.config Configuration File

答案 4 :(得分:0)

您可以在数据库中创建一个表来存储键值对。

答案 5 :(得分:0)

这就是我使用的。从其他地方得到了这个想法,但实施是我的。从我的一个生产项目中拉出来:

class AppConfig
  # Loads a YAML configuration file from RAILS_ROOT/config/. The default file
  # it looks for is 'application.yml', although if this doesn't match your
  # application, you can pass in an alternative value as an argument 
  # to AppConfig.load.
  # After the file has been loaded, any inline ERB is evaluated and unserialized
  # into a hash. For each key-value pair in the hash, class getter and setter methods
  # are defined i.e., AppConfig.key => "value" 
  # This allows you to store your application configuration information e.g., API keys and 
  # authentication credentials in a convenient manner, external to your application source
  #
  # application.yml example
  #
  # :defaults: &defaults
  #  :app_name: Platform
  #  :app_domain: dev.example.com
  #  :admin_email: admin@example.com
  # :development:
  #  <<: *defaults
  # :test:
  #  <<: *defaults
  # :production:
  #  <<: *defaults
  #  :app_domain: example.com
  #
  # For example will result in AppConfig.app_domain => "dev.example.com"
  # when Rails.env == "development" 
  #

  class << self
    def load(file='application.yml')
      configuration_file = File.join Rails.root, 'config', file
      File.open(configuration_file) do |configuration|
        configuration = ERB.new(configuration.read).result
        configuration = YAML.load(configuration)[Rails.env.to_sym]
        configuration.each do |key, value|
          cattr_accessor key
          send "#{key}=", value
        end
      end if File.exists? configuration_file
    end
  end
end
AppConfig.load

创建config/initializers/app_config.rb并将上述代码粘贴到其中。我要把它变成一颗宝石。我认为其他人会发现它很有用。

编辑:刚看到您希望编辑配置,因为应用程序通过基于Web的界面运行。您可以使用此方法执行此操作,因为为每个属性定义了getter和setter方法。

在您的控制器中:

def update
  params[:configuration].each { |k,v| AppConfig.send "#{k}=", v }
  …
end

我发现模型不是正确的解决方案。忘记DB被无意中听到,能够实例化控制应用程序配置的东西的想法没有意义。你是如何实现它的?每个元组的一个实例?!它应该是一个单独的类。