2010-08-21 9 views

risposta

15

In Rails 3, all'applicazione generata viene assegnato uno spazio dei nomi modulo che corrisponde al nome dell'applicazione. Quindi se la tua applicazione è stata chiamata "Twitter", la classe di Rails.application è "Twitter :: Applicazione".

Questo significa che è possibile dividere la stringa del nome della classe della vostra applicazione Rails per ottenere un nome di un'applicazione come questa:

Rails.application.class.to_s.split("::").first 

Nel nostro esempio, la stringa risultante sarebbe "Twitter".

+1

C'è qualcosa di simile che può essere usato nei binari 2.3? – nzifnab

+0

questo è il nome della classe, e non il nome dell'applicazione come è archiviato – Tilo

+0

@tilo Vero, tranne che per il 97% dei casi, questo è abbastanza buono per la maggior parte delle persone che nominano la loro app con attenzione – Scott

5

Rails.application restituisce la classe MyApp::Application.

1

Utilizzando la risposta di Scott, ho messo il seguente nel mio app/controllers/application_controller.rb file di

class ApplicationController < ActionController::Base 
    protect_from_forgery 
    helper_method :app_name 
    private 
    def app_name 
     Rails.application.class.to_s.split("::").first 
    end 

Poi nei miei modelli posso solo fare #{app_name} ovunque sia necessario, che lo rende molto meno di una seccatura se avete bisogno di rinominare la app (che dovevo fare stamattina).

107
Rails.application.class.parent_name 
+1

questo è il nome della Classe, e non il nome dell'Applicazione come è stato effettuato il check-in – Tilo

+2

Rails.application.class.parent fornisce la costante del modulo, che può quindi chiamare to_s o name su. – Docunext

19

Il manifesto originale chiesto il nome della app rotaie, non per il nome della classe. Queste sono due cose diverse. per esempio. l'ortografia dell'app rails può essere diversa da quella attesa da Rails, ad es. 'test-app' invece di 'test_app'.

E 'difficile arrivare alla nome di App Rails farro il modo in cui è stata verificata in, perché quel nome non è conservato. Solo le opzioni per lo session_store sembrano contenere la stringa originale leggermente modificata.

Il modo migliore per arrivare al nome dell'applicazione Rails è:

Ciò funzionerà anche se la vostra cartella app è stato rinominato, o sim-legata!

Rails.application.config.session_options[:key].sub(/^_/,'').sub(/_session/,'') 
=> "test-app" 

Perché? Perché l'autore dell'app potrebbe aver scritto che è nome in modo diverso rispetto a Rails si aspetta ... ad es. con caratteri '-' invece di '_'; per esempio. "Test-app". Dal nome della classe non è possibile garantire l'ortografia corretta.

Utilizzando queste informazioni, si potrebbe fare questo:

class << Rails.application 
    def name 
    Rails.application.config.session_options[:key].sub(/^_/,'').sub(/_session/,'') 
    end 
end 

Rails.application.name 
=> 'test-app' 

o semplicemente aggiungere questo alla tua ./config/environment.rb:

APP_VERSION = '1.0.0' 
APP_NAME = Rails.application.config.session_options[:key].sub(/^_/,'').sub(/_session/,'') 

che rende queste costanti sul livello superiore dell'app.


Vicino, ma non sigari:

Questo è quasi corretta, ma sarà ancora fallire se la directory dell'applicazione viene rinominato (ad esempio, durante la distribuzione di ' '20121001_110512' o 'ultimo' .. .allora quanto segue si spezzasse:

File.basename(Rails.root.to_s) 
=> "test-app" 

con i seguenti due approcci non si può arrivare a l'ortografia corretta .. si poteva solo immaginare un nome:

Questo è sub-ottimale, e in grado di dare risultati in modo non corretto di farro:

È possibile arrivare a un derivato del nome dell'applicazione in questo modo:

Rails.application.engine_name.gsub(/_application/,'') 
=> "test_app" 

Ma per favore nota che questo non è infallibile, perché qualcuno potrebbe aver chiamato l'app "test-app" e vedrai il risultato sopra, non il nome corretto con '-'.

stessa cosa vale se si deriva in questo modo:

Rails.application.class.parent_name 
=> "TestApp" 

questo è il nome della classe, ma non si può essere sicuri come raggiungere il nome il modo in cui l'autore farro esso.

+0

Penso che dovrebbe essere 'Rails.application.class.parent_name' nell'ultima sezione ma non posso modificarlo perché la mia modifica è inferiore a 6 caratteri. Grazie StackOverflow. –

+0

grazie per avermelo fatto notare! L'ho riparato. – Tilo

+0

Questa è la risposta corretta di Rails-y. Vorrei anche notare che la maggior parte degli utenti vorrebbe chiamare .humanize.titleize su questo per l'uso in una vista. – Sam

0

È possibile trovare questo nel file config.ru:

run Dinosaur::Application 

o nel Rakefile:

Dinosaur::Application.load_tasks 

Il nome prima della "::" è il nome dell'app

3

Per una versione più "umanizzata" (basata sulla prima risposta che puoi trovare qui), considera il seguente metodo: restituirà Test App per l'applicazione TestApp.

def app_name 
    Rails.application.class.parent_name 
    .underscore 
    .humanize 
    .split 
    .map(&:capitalize) 
    .join(' ') 
end 
Problemi correlati