2009-07-10 9 views
2

Je connais YAML et les plugins comme les rails-settings, mais aucun d'entre eux n'est utile pour les paramètres de configuration qui doivent être modifiés en temps réel. Par exemple, disons que j'ai MAX_ALLOWED_REGISTERED_USERS réglé à 2000, mais je veux le monter à 2300. Avec une solution typique de «configuration» ou de YAML, cela impliquerait de changer un fichier de configuration et de le redéployer. Je préférerais une approche RESTful basée sur une base de données où je pourrais simplement changer une paire clé/valeur.Quelle est la meilleure façon de gérer les variables de configuration en temps réel avec Ruby on Rails?

Pensées?

Répondre

3

J'utilise un modèle de configuration similaire à ceci:

# == Schema Information 
# Schema version: 20081015233653 
# 
# Table name: configurations 
# 
# id   :integer   not null, primary key 
# name  :string(20)  not null 
# value  :string(255) 
# description :text 
# 

class InvalidConfigurationSym < StandardError; end 

class Configuration < ActiveRecord::Base 
    TRUE = "t" 
    FALSE = "f" 

    validates_presence_of :name 
    validates_uniqueness_of :name 
    validates_length_of  :name, :within => 3..20 

    # Enable hash-like access to table for ease of use. 
    # Raises InvalidConfigurationSym when key isn't found. 
    # Example: 
    # Configuration[:max_age] => 80 
    def self.[](key) 
    rec = self.find_by_name(key.to_s) 
    if rec.nil? 
     raise InvalidConfigurationSym, key.to_s 
    end 
    rec.value 
    end 

    # Override self.method_missing to allow 
    # instance attribute type access to Configuration 
    # table. This helps with forms. 
    def self.method_missing(method, *args) 
    unless method.to_s.include?('find') # skip AR find methods 
     value = self[method] 
     return value unless value.nil? 
    end 
    super(method, args) 
    end 
end 

Voici comment je Utilisez-le:

class Customer < ActiveRecord::Base 
    validate :customer_is_old_enough? 

    def customer_is_old_enough? 
    min_age = Date.today << (Configuration[:min_age].to_i * 12) 
    self.errors.add(:dob, "is not old enough") unless self.dob < min_age 
    end 
end 

Une chose que je ne suis pas très heureux avec doit appeler #to_i comme dans l'échantillon, mais puisque cela fonctionne pour moi jusqu'à présent, je n'ai pas trop réfléchi à la refonte.

0

Si vous utilisez une application multi-serveur, la configuration mutable doit être enregistrée de manière centrale (à moins que vous ne me dérange pas différents serveurs ayant des configurations différentes)

Comme affiché ci-dessus, Moneta est un bon choix, bien que Je parierais que mecached est plus largement déployé aux côtés des applications Rails.

0

Voici une suggestion naïve: créer une table DB, migrer et activer le modèle ActiveRecord et traiter votre config comme n'importe quelle autre entité de la base de données, moins un contrôleur et une vue. Juste une pensée.

Peut-être mettre ces données dans memcached, et le faire expirer assez fréquemment si vous êtes trop inquiet de perturber la base de données.

+0

Doh! J'ai essentiellement reproduit la réponse de Matt Haley. Eh bien, je suppose que ma réponse est un résumé de tout le code qu'il a lancé sans dire au lecteur paresseux/occasionnel (moi) où il allait. – Roboprog

Questions connexes