2014-05-23 21 views
16

Impostazione

La nostra app Rails corrente è composta da app secondarie montate come motori. In genere questi motori sono montati su un sottodominio nel file principale routes.rb come segueI percorsi nel motore montato sul sottodominio non ereditano i vincoli

mount MySubApp::Engine => '/', as: :sub_app, constraints: {subdomain: 'sub_app'} 

il problema

rotte all'interno del file routes.rbMySubApp s' non fare ottenere il sottodominio quando si utilizzano i nominati _url aiutanti. Per esempio il seguente in apps/my_sub_app/config/routes.rb

MySubApp::Engine.routes.draw do 
    resources :foos 
end 

ci dà sub_app.foo_url(5) ma il risultato e '

http: // www .example.com/foos/5

quando vogliamo

http: // sub_app .example.com/foos/5

tl; dr

Come posso ottenere i vincoli di montaggio del motore passati ai suoi circuiti di nome?

EDIT: Una soluzione

Mentre io preferisco ancora una soluzione migliore, quanto segue funzionerà. È possibile avvolgere tutti i percorsi in ciascuna delle sub applicazioni routes.rb file che potrebbe essere montato su un sottodominio in questo modo

MySubApp::Engine.routes.draw do 
    constraints Rails.application.routes.named_routes[:sub_app].constraints do 
    resources :foos 
    end 
end 

EDIT 2: (? Dal cancellato) Una molto meno desiderabile soluzione

Un commentatore puntato fuori puoi passare un'opzione subdomain agli helper ma vorremmo evitare di dover usare sub_app.foo_url(5, {subdomain: 'sub_app'}) per ogni link cross sottodominio. Anche se abbiamo spostato il nome del sottodominio in una variabile ENV e fatto un wrapper, questo non è SECCO.

+0

Sei alla ricerca di multi-tenancy? Se è così, c'è un Railscast per questo, ma è un professionista. http: // Railscasts.com/episodi/388-multi-tenancy-con-gli ambiti? view = asciicast. Personalmente, non ho mai lavorato con loro quindi non posso aiutarti Ho appena visto questo episodio un po 'di tempo fa e lo sto seguendo se è davvero quello che stai cercando. – MCB

+0

Grazie a @MCB. Vedrò quel video quando posso e aggiornarlo se fornisce dei buoni suggerimenti. – Aaron

+0

Ho appena visto il Railscast e non è quello che stiamo cercando: /. In realtà abbiamo più app che vivono come motori all'interno di un'app Rails. Ciascuno dei motori è montato con un vincolo di sottodominio ma lo stesso vincolo non viene trasferito ai singoli file di percorso dei motori. – Aaron

risposta

0

check out il guide si dice che si può fare da

namespace :Engine do 
    resources :controller, :methods 
end 

il motore è solo il nome spaziatura il codice

+0

Grazie a @bobbdelsol ma ciò consentirà solo la spaziatura dei nomi di livello superiore. Non avrà alcun effetto sui sottodomini. – Aaron

1

@Aaron non è sicuro se mai ottenuto questo risolto, ma guardare il

config.action_dispatch.tld_length 

impostazione (sulla configurazione del motore). Non sono sicuro di come reagirà con i motori, ma nel nostro caso ci consente di gestire il caso dei sottodomini secondari per il nostro server di staging (quindi, quando utilizziamo gli aiutanti _url con il server di staging, lo fa correttamente subdomain.staging.domain.com anziché subdomain.domain.com).