2010-06-04 20 views
1

J'ai beaucoup d'observateurs de modèles, donc je veux les organiser dans un sous-répertoire sous le dossier modèle.Syntaxe de chargement des observateurs (dans un sous-répertoire model) dans environment.rb?

model --> observer --> user_observer.rb, activity_observer.rb, etc. 

Avant de placer dans le sous-répertoire, je chargeais les observateurs comme ceci:

Rails::Initializer.run do |config| 
    config.active_record.observers = :user_observer, :activity_observer 
end 

Maintenant, quand je tente de lancer le serveur, je reçois l'erreur suivante:

`load_missing_constant': Expected /Users/cscairns/source/myapp/app/models/observer/user_observer.rb to define UserObserver (LoadError) 

Quelle syntaxe dois-je utiliser dans environment.rb maintenant que les observateurs ressemblent?

Observer::UserObserver < ActiveRecord::Observer 

Répondre

1

On dirait que la réponse peut être trouvée ici: http://handyrailstips.com/tips/4-loading-observers-automatically-from-their-own-folder.


Contenu Copié à partir web.archive.org, archivé sur 2009-05-25 19:36:17

Observateurs Chargement automatique de leur propre dossier

par gavin

Observateurs sont un excellent moyen de nettoyer et de sécher vos modèles. Je les utilise beaucoup pour traiter l'envoi de mails, la consignation de messages et tout ce qui n'est pas strictement la responsabilité du modèle.

Une chose qui m'embête depuis que j'ai découvert les observateurs, c'est qu'ils ne sont pas invoqués par défaut. Au lieu de cela, vous devez indiquer explicitement quels observateurs doivent être chargés (généralement dans environment.rb)

Si vous prévoyez de charger tous vos observateurs depuis l'environnement lorsque votre application est démarrée (ce qui est probable), vous pouvez ajouter les éléments suivants à votre fichier environment.rb pour les charger automatiquement lorsque vous démarrez votre application:

# config/environment.rb 
Dir.chdir("#{Rails.root}/app/models") do 
    config.active_record.observers = Dir["*_observer.rb"].collect {|ob_name| ob_name.split(".").first} 
end 

Cela semble un peu compliqué, mais tout ce que vous faites ici est simplement de trouver les noms de tous les fichiers d'observateurs dans le dossier modèles et configurer votre application pour charger chacun d'entre eux avec

config.active_record.observers = 

Une autre chose qui me dérange à propos des observateurs c'est qu'ils sont stockés dans le dossier models par défaut. Si vous construisez une grande application avec plusieurs modèles et plusieurs observateurs, cela peut devenir assez encombré et déroutant. Pour contourner cela, je crée généralement un nouveau dossier dans l'app/appelé 'observateurs'. Je déplace ensuite tous les observateurs que je crée dans ce dossier.

Pour vous assurer que ce dossier est chargé au démarrage ajouter ce qui suit à environment.rb

config.load_paths += "#{Rails.root}/app/observers" 

simple!

Si vous décidez d'utiliser ce ainsi que la pointe précédente sur le chargement des observateurs automatiquement, vous devrez changer le nom du répertoire que vous êtes à la recherche depuis modèles à observateurs:

# config/environment.rb 
Dir.chdir("#{Rails.root}/app/observers") do 
    config.active_record.observers = Dir["*_observer.rb"].collect {|ob_name| ob_name.split(".").first} 
end 

Rappelez-vous de redémarrer votre application après avoir créé un nouvel observateur ou d'apporter des modifications à environment.rb

+3

Pouvez-vous poster la réponse ici sur le SO? La page que vous liez n'est plus là ... –

+0

http://web.archive.org/web/20090525193617/http://handyrailstips.com/tips/4-loading-observers-automatically-from-their- propre dossier – batkuip

0

par la réponse de keruilin, la page n'existe plus, mais son code déclaré:

# config/environment.rb 
Dir.chdir("#{Rails.root}/app/models") do 
    config.active_record.observers = Dir["*_observer.rb"].collect {|ob_name|   ob_name.split(".").first} 
end 

et pour ceux qui préfèrent une «app/OBSERVATEURS niveau racine dossier:

# config/environment.rb 
config.load_paths += "#{Rails.root}/app/observers" 

Dir.chdir("#{Rails.root}/app/observers") do 
    config.active_record.observers = Dir["*_observer.rb"].collect {|ob_name| ob_name.split(".").first} 
end