2010-06-01 2 views
1

Je lance un site Web Ruby on Rails qui a plusieurs noms de domaine. J'ai une table "site Web" dans la base de données qui stocke les valeurs de configuration liées à chaque nom de domaine:Une configuration par nom de domaine sur la même application. Comment accéder facilement aux valeurs de configuration des modèles?

Site
- domaine
- Nom
- tagline
- admin_email
- etc .. .

en ce moment, je charger l'objet d'un site Web au début de chaque demande (before_filter) dans mon ApplicationController:

@website = Website.find_by_domain (request.host)

Le problème est quand j'ai besoin d'accéder à l'objet @website de méthodes de mon modèle. Je voudrais éviter d'avoir à passer @website partout. La meilleure solution serait d'avoir quelque chose de similaire à APP_CONFIG mais par nom de domaine.

def sample_model_property
- - "! #{@website.name} est un grand site Web"
fin

Comment voulez-vous faire?

Répondre

0

S'il s'agit d'une variable d'instance de contrôleur, vous devez avoir accès à @website partout où vous en avez besoin, à la fois dans les domaines Contrôleur et Vue. Si vous devez pousser quelque chose dans l'espace Modèle dans la même capacité, vous devez soit le passer, soit le pirater via quelque chose comme la méthode model_helper.

Qu'est-ce que vous pourriez faire à la place est d'utiliser une sorte de méthode singleton de votre classe de site Web, par exemple:

class Website < ActiveRecord::Base 
    cattr_accessor :current_website 
end 

Ensuite, dans le contrôleur que vous pouvez faire des choses comme:

before_filter :load_current_website 

def load_current_website 
    Website.current_website = Website.find_by_domain(request.host) 
end 

De cette façon vous pouvez vous référer à Website.current_website n'importe où dans l'espace objet et les choses devraient être synchronisées. Notez que ceci peut ne pas être entièrement thread-safe et devrait être testé intensivement dans un environnement de production avant de l'utiliser.

+0

Est-ce que Website.current_website ne pointerait pas vers le même objet sur tous mes sites si je cours sur la même application? – Aymeric

+0

Cela correspond à mon commentaire "thread safe". Dans un seul processus, l'environnement d'un seul thread, vous pouvez utiliser une variable globale comme celle-ci avec peu de risques. Si vous avez plusieurs demandes traitées simultanément cela ne fonctionnera pas. C'est en partie pourquoi le passage à chaque fois est la méthode la plus sûre, aussi agaçante que cela puisse être. – tadman

Questions connexes