2011-09-28 11 views
8

Ho bisogno di sapere, dall'interno di un layout di un motore montabile, su quale percorso è attualmente montato. Quale sarebbe il modo di farlo?Quale percorso è un motore montabile montato su

E.g. la mia routes.rb contiene la seguente riga:

mount BackendCore::Engine => "/backend" 

Dall'interno del BackendCore, ho bisogno di accesso al valore di "/ backend".

+0

possibile duplicato del [Reverse binari di routing: trova il nome dell'azione dall'URL] (http://stackoverflow.com/questions/3481731/reverse-rails-routing-find-the-the-action-name-from-the-url) –

+1

Il link che fornisci fa non aiuta molto, in quanto non ha riferimenti ai motori, anche se dà una direzione per cercare dentro. – mxgrn

risposta

8

AGGIORNAMENTO: probabilmente si applica solo a Rails 3!

ho trovato la soluzione:

Rails.application.routes.named_routes[:backend_core].path #=> "/backend" 
+1

Grazie amico, questo mi ha davvero aiutato :) –

9

Se il motore è mouted :as => un nome diverso, l'interrogazione named_routes non sarà sufficiente. Questa patch scimmia farà:

class Rails::Engine 
    def self.mounted_path 
    route = Rails.application.routes.routes.detect do |route| 
     route.app == self 
    end 
    route && route.path 
    end 
end 

Ora chiamano mounted_path sul motore:

BackendCore::Engine.mounted_path => "/backend" 

Nota: attenzione, in modalità di produzione, le classi nel tuo motore vengono valutate prima le rotte del l'applicazione principale sono caricati Chiamare questo metodo nelle macro di classe potrebbe non funzionare!

+0

Utilizzando questa tecnica in Rails 4 Motori. Grazie! – RailinginDFW

3

La valutazione dei percorsi per ottenere il percorso di montaggio può dare risultati imprevisti quando i motori vengono montati all'interno di altri motori.

Quando si dà un'occhiata a https://github.com/rails/rails/pull/5008 è possibile leggere il commento di José Valim:

Inoltre, un motore può essere montato all'interno di un altro motore, quindi è improbabile che questo vi darà il risultato corretto. L'opzione migliore è probabilmente quella di avere un'opzione di configurazione in cui lo sviluppatore imposterà il percorso.

Per risultati coerenti, ora sto utilizzando un accessorio sul motore.

Ad esempio:

# APP/initializers/backend_core_engine.rb 
BackendCore::Engine.mount_path = "/backend" 

# APP/config/routes.rb 
mount BackendCore::Engine => BackendCore::Engine.mount_path 

# ENGINE/backend_core/lib/engine.rb 
module BackendCore 
    class Engine < ::Rails::Engine 
    cattr_accessor :mount_path 
    end 
end 
-1

si può semplicemente utilizzare il seguente codice per dire che cosa motore di percorso è il monte verso l'interno un controller del motore/Vista:

env["SCRIPT_NAME"] # => "/backend" 
+0

Solo curiosità, perché questo è downvoted? –

+0

non lo so: (nessun feedback e ho avuto un downvote :( –

+0

Non dovrebbe essere possibile ottenere un downvote senza alcuna spiegazione. Come posso fidarmi se quel downgrade ha senso o no? –

Problemi correlati