2010-07-05 7 views
18

Sto eseguendo il porting di un'app 2.x rails su rails3; lo chiameremo foo-app. Foo-app è una sezione di un'app più grande e vive in main_rails_app.com/foo-app. In precedenza abbiamo appena istituito il seguente nel nostro foo-app config di produzione per assicurare che i nostri percorsi foo-app funzionato correttamente:Qual è la sostituzione di ActionController :: Base.relative_url_root?

ActionController::Base.relative_url_root = "/foo-app" 

Tuttavia, con Rails3, io ora ottenere:

DEPRECATION WARNING: ActionController::Base.relative_url_root is ineffective. Please stop using it. 

ho allora è cambiato l'ingresso di configurazione al seguente:

config.action_controller.relative_url_root = "/foo-app" 

Questo funziona per lo più in che tutte le chiamate a risorse esterne (javascript/css/images) utilizzerà/foo-app. Tuttavia, nessuno dei miei percorsi cambia in modo appropriato, o in un altro modo, foo-app root_path mi dà '/' quando mi aspetterei '/ foo-app'.

due domande:

  1. Qual è la sostituzione per ActionController :: Base.relative_url_root
  2. se è config.action_controller.relative_url_root, allora perché sono le mie vie non riflettono il valore relative_url_root ho impostato?
+2

Vuol config.action_controller.relative_url_root funziona ancora per voi negli ultimi 3 rotaie finale di rilascio? Sembra spezzato per me. – raidfive

+0

Manca "do" scope "/ context_root" do ... fine – Dejan

risposta

18

Dovresti essere in grado di gestire tutto ciò all'interno del file routes.rb. Avvolgi tutti i tuoi percorsi correnti nell'ambito; per esempio.

scope "/context_root" do 
    resources :controller 
    resources :another_controller 
    match 'welcome/', :to => "welcome#index" 
    root :to => "welcome#index" 
end 

È quindi possibile verificare il tuo percorso attraverso il rake routes dovrebbero mostrare i percorsi di conseguenza, tra cui il contesto di root (relative_url_root)

+0

Hey Dax, grazie per la risposta. Ho trovato la stessa soluzione un paio di giorni prima che la postassi sul 7-21, ma il tuo post conferma che ho trovato/trovato la soluzione giusta. Grazie. – ynkr

+1

Questo è utile, ma come si applica in modo diverso per l'ambiente di sviluppo rispetto all'ambiente di produzione? Il mio ambiente di sviluppo non deve essere dietro un proxy inverso come lo è l'ambiente di produzione. – tobinjim

+14

@tobinjim Ho scoperto che avevo bisogno di impostare la variabile di ambiente 'RAILS_RELATIVE_URL_ROOT' oltre a includere le mie rotte in un ambito.Ho quindi usato 'scope ENV ['RAILS_RELATIVE_URL_ROOT'] || '/' do' in modo che localhost: 3000 funzioni ancora in sviluppo senza il/context_root. – aNoble

12

Se si distribuisce via passeggeri, utilizzare la direttiva RackBaseURI: http://www.modrails.com/documentation/Users%20guide%20Apache.html#RackBaseURI

In caso contrario, è possibile racchiudere l'istruzione run nel proprio config.ru con il seguente blocco:

map ActionController::Base.config.relative_url_root || "/" do 
    run FooApp::Application 
end 

Quindi è sufficiente impostare la variabile di ambiente RAILS_RELATIVE_URL_ROOT su "/ foo-app". Questo si applicherà anche alle rotte impostate in gemme o plugin.

Attenzione: non mescolare queste due soluzioni.

4

Mi sento come se dovessi complicarmi troppo e/o mancare qualcosa, ma questo problema mi ha frustrato per un po 'ora, e qui ci sono i miei appunti.

Sommario

Ci sono due questioni separate con due punti ciascuno per le rotte statiche e dinamiche:

  1. Come arrivare di routing per abbinare correttamente un URL in ingresso
    • per le rotte
    • per file statici
  2. come generare URL che includere il relative_root
    • via aiutanti URL
    • per le attività statiche

Un modo per risolvere tutti i quattro punti:

  • Configura Nginx a striscia la relative_root porzione
    • Questo risolve la corrispondenza del percorso; Basta scrivere percorsi attesa URL a / come sviluppo
    • anche file statici sono serviti nello sviluppo
  • Impostare RAILS_RELATIVE_URL_ROOT ambiente variabili aiutanti di attivi statici
    • Questo risolve generato
  • Utilizzare i ScriptName middleware sotto (modificarlo per utilizzare il valore dall'ambiente)
    • Ciò risolve gli helper dell'URL generati, ad es. users_path

Avvolgere l'applicazione Rails in rack :: URLMap a config.ru (risposta di Christoph)

# config.ru 
map '/relative_root' do 
    run Myapp::Application 
end 
  • richiede URL in ingresso contiene il relative_url_root (Nginx può essere configurato per rimuovere o mantenere questo; vedere di seguito)
  • Il rack accoda la relativa_url_root al Rack env SCRIPT_NAMErack/urlmap.rb:62
  • Rails aggiunge del SCRIPT_NAME richiesta corrente a url_for opzioni metal/url_for.rb:41 url_for
  • Rails' antepone il nome dello script durante la generazione di percorsi routing/url_for.rb:133

In modo che copre URL generati dagli helper URL, ad esempio dato UserController, users_path sarà preceduto dalla radice url relativa.

Set SCRIPT_NAME nel middleware

# config.ru 
class ScriptName 
    def initialize(app, name) 
    @app = app 
    @name = name 
    end 

    def call(env) 
    env['SCRIPT_NAME'] += @name 
    @app.call(env) 
    end 
end 

use ScriptName, '/relative_root' 
run Rails.application 
  • ha lo stesso effetto come sopra, ma
  • Richiede che URL in ingresso non contiene il relative_url_root

Impostazione RAILS_RELATIVE_URL_ROOT

  • v alore viene salvato in app.config.relative_url_rootconfiguration.rb:41
  • che a sua volta influisce percorsi di asset asset_url_helper.rb:137
  • ma questo è tutto quanto vedo
  • particolare non influisce aiutanti URL

Impostazione config.action_controller.relative_url_root

  • ?? Può influire sulla compilazione delle risorse?
  • Sostituzioni RAILS_RELATIVE_URL_ROOT env var?

esplicitamente la definizione di tutte le rotte sotto /relative_root (risposta di rizzah)

# config/routes.rb 
Myapp::Application.routes.draw do 
    scope '/relative_root' do 
    ... 
    end 
end 
  • aiutanti Url genereranno URL corretti
  • URL in ingresso deve contenere la radice URL relativo (sensibile alla configurazione Nginx, vedere di seguito), altre eccezioni "nessuna route corrisponde"
  • URL che richiedono risorse statiche, ad es. /relative_root/images/logo.png genererà eccezioni "nessuna corrispondenza di percorso". Questo potrebbe non essere un problema se nginx sta comunque servendo asset statici.

Nginx config

Data una configurazione simile a questo:

upstream myapp { 
    server localhost:3000; 
} 

server { 
    ... 
    location /relative_root { 
    proxy_pass http://myapp/; 
    } 
} 

Nginx eliminerà il /relative_root, e l'applicazione Rails non lo vedrà. Se è necessario l'applicazione Rails in modo da vedere, in un modo è quello di cambiare la linea proxy_pass:

... 
    proxy_pass http://myapp/relative_root/; 
... 
+1

Per evitare di rimuovere'/relativa_root' da Nginx, puoi anche usare 'proxy_pass http:// myapp; '(mancanza di barra finale). – ciastek