2012-08-30 9 views
5

Per impostazione predefinita, Rails può trovare opinioni con il formato, localizzazione e lingua modello nel nome del file (in modo da poter creare index.de.json.erb)variabile personalizzati in Rails visualizzare il nome del file

E 'possibile aggiungere un altro, parametro personalizzato alla vista del nome del file?

desidero passare il sottodominio corrente, così http://foo.example.com/ renderebbe index.foo.html.erb e http://bar.example.com/ renderebbe index.bar.html.erb (entrambi con index.html.erb fallback).

risposta

8

Il modello di risoluzione utilizzato per cercare le viste può contenere solo variabili registrate con la classe ActionView::LookupContext. Il primo passo è quindi registrare una nuova variabile (subdomain) con la classe LookupContext. Si dovrebbe fare questo in un inizializzatore:

ActionView::LookupContext.register_detail(:subdomain) do 
    ['default_subdomain'] 
end 

Ora il LookupContext sa circa la subdomain, può essere incluso nel modello risolvere. Per ulteriori dettagli sulla modifica del modello per risolvere, vedere la ActionView::FileSystemResolver documentation, ma in sostanza si dovrebbe includere quanto segue, anche in un inizializzatore:

ActionController::Base.view_paths = ActionView::FileSystemResolver.new(
    Rails.root.join('app', 'views'), 
    ':prefix/:action{.:locale,}{.:subdomain,}{.:formats,}{.:handlers,}' 
) 

Questo modello è poi passato a Dir.glob (dopo le variabili :* sono stati sostituiti). Il modello glob {.:subdomain,} significa "o .:subdomain o nulla", che fornisce il fallback a un file di visualizzazione senza sottodominio se non si trova il file con un sottodominio.

Il passo finale è quello di aggiornare il tuo ApplicationController per passare il sottodominio al LookupContext:.

class ApplicationController < ActionController::Base 
    def details_for_lookup 
    {:subdomain => [request.subdomain]} 
    end 
end 

(La risposta è stata per lo più capito leggendo il codice sorgente, alcune di queste caratteristiche non sono documentate Era testato con Rails 3.2.5)

+0

grazie! quello era _exacly_ ciò di cui avevo bisogno. – user1105595

+0

Contento di aver potuto aiutare, e benvenuti a Stack Overflow. Se una risposta risolve il tuo problema, devi contrassegnarlo come accettato, maggiori informazioni su come e perché qui: http://meta.stackexchange.com/a/5235 – georgebrock

1

Non penso che sia necessario un gestore personalizzato qui. Non esegui alcuna pre-elaborazione dei tuoi modelli, ma hai solo bisogno che i tuoi modelli diventino specifici del dominio.

vorrei prendere in considerazione fare qualcosa di simile:

# in ApplicationController: 
    before_filter :set_view_paths 

    def set_view_paths 
    self.class.view_paths = Rails.root.join('app', 'views', controller_name, request.subdomain) 
    end 

Poi si deve mettere i modelli per il dominio foo in foo cartelle di ogni percorso views/controller_name.

Controllare anche append/prepend_view_path documentation per consentire i valori predefiniti in caso di assenza di una vista dominio.

Problemi correlati