Sono in procinto di aggiornare un'applicazione Rails 3 per utilizzare Rails 3.1 e, come parte di questo, sto facendo uso della nuova pipeline di asset. Finora, ho tutto a parte un problema piuttosto fastidioso che non riesco a risolvere.Risorse precompilate interrotte in Rails 3.1 durante la distribuzione su un URI secondario
L'applicazione e tutti i suoi asset funzionano correttamente nello sviluppo, ma in produzione viene distribuita a un sub-URI utilizzando Passenger (http://the-host/sub-uri/
). Il problema con questo è che le risorse sono precompilate durante l'implementazione e uno dei miei file CSS (beh, è un file .css.scss
) utilizza l'helper . Dal momento che durante il processo di pre-compilazione, i percorsi sono hard-coded nel file CSS precompilato, il sub-uri non è presa in considerazione:
Nel mio file .css.scss
:
body { background-image: image-url("bg.png"); }
Il risultato nel compilato application-<md5-hash-here>.css
di file:
body { background-image: url(/assets/bg.png); }
quello che dovrebbe essere per farlo funzionare correttamente:
body { background-image: url(/sub-uri/assets/bg.png); }
Questo scenario richiede troppo? Se è così, dovrò tornare al vecchio modo non asset-pipeline e servirmi solo le mie immagini e i CSS da public
. Tuttavia sembra qualcosa che avrebbe dovuto essere pensato e risolto ...? Mi manca la soluzione?
Edit 1: Vorrei sottolineare che con il erb solution produce invece lo stesso risultato, come ci si aspetterebbe.
Edit 2: in risposta al commento di Benoit Garret
No, il problema non è legato alla config.assets.prefix
. Ho provato a impostare quello (a /sub-uri/assets
anziché il valore predefinito di /assets
) ma è risultato che era la cosa sbagliata da fare: sembra che questa impostazione sia già in relazione con la radice dell'app Rails, non con il server. La rimozione (e quindi il ritorno al default) ha risolto tutti i problemi strani che hanno causato (e ce ne sono stati molti, tutti gli asset sono finiti nello /sub-uri/sub-uri/assets
- era tutto molto strano). L'unico problema è che l'helper e gli amici image-url
non raccolgono l'URI secondario quando sono precompilati. Inutile dire che questo è logico dal momento che, quando è precompilato, non può sapere che quando è in esecuzione su Passenger, verrà configurato in questo modo. La mia domanda è come informarla di questo e quindi finire con i percorsi corretti nel risultato precompilato. Se davvero si può fare.
La mia soluzione attuale consiste nel fare riferimento all'liamge nel CSS in questo modo: url(../images/bg.png)
e posizionarlo nella posizione public/images
non in pipeline. Difficilmente ideale in quanto non beneficia delle impronte digitali e di tutto ciò che fornisce la pipeline.
Hai provato questo? http://stackoverflow.com/questions/7295744/how-to-deploy-rails-3-1-app-in-a-subdirectory –
L'app stessa viene distribuita correttamente (utilizza il metodo RailsBaseURI poiché è ciò che i passeggeri i documenti raccomandano). Tutte le risorse collegate da all'interno dell'applicazione in esecuzione come le immagini che usano 'image_tag' e così via vanno bene. l'unico problema sono le immagini a cui si fa riferimento all'interno del CSS - non conosce il sub-URI al momento della pre-compilazione delle risorse. È quello per cui ho bisogno di una soluzione se ce n'è una. –
Quindi il tuo problema è che l'helper 'image-uri' non rileva' config.assets.prefix'? –