2010-08-21 13 views

Odpowiedz

15

W Rails 3 wygenerowana aplikacja otrzymuje przestrzeń nazw modułu pasującą do nazwy aplikacji. Więc jeśli twoja aplikacja nazywała się "Twitter", klasa Rails.application to "Twitter :: Aplikacja".

To oznacza, że ​​można podzielić ciąg nazwy klasy aplikacji Rails, aby uzyskać nazwę aplikacji tak:

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

W naszym przykładzie, otrzymany ciąg byłoby „Twitter”.

+1

Czy jest coś podobnego, co można zastosować w szynach 2.3? – nzifnab

+0

To jest nazwa klasy, a nie nazwa aplikacji, ponieważ jest ona rejestrowana. – Tilo

+0

@tilo True, z wyjątkiem tego, że w 97% przypadków jest to wystarczająco dobre dla większości osób, które starannie nazywają swoją aplikację – Scott

5

Rails.application zwraca twoją klasę MyApp::Application.

1

Korzystanie odpowiedź Scotta, umieścić następujące w moim pliku app/controllers/application_controller.rb

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

Następnie w moich szablonów mogę po prostu zrobić #{app_name} gdziekolwiek jest to potrzebne, co czyni go znacznie mniej kłopotów, jeśli chcesz zmienić nazwę aplikacja (którą musiałem zrobić dziś rano).

107
Rails.application.class.parent_name 
+1

jest to nazwa klasy, a nie nazwa aplikacji, ponieważ jest ona rejestrowana – Tilo

+2

Rails.application.class.parent daje ci stałą modułu, którą możesz następnie wywołać to_s lub nazwę. – Docunext

19

Oryginalny plakat poprosił o nazwę aplikacji szyn, nie do nazwy klasy. To są dwie różne rzeczy. na przykład pisownia aplikacji szyny może się różnić od oczekiwanej przez Railsy, ​​np. "testowa aplikacja" zamiast "test_app".

Trudno jest uzyskać nazwę nazwy aplikacji Railsa zapisanej w sposób, w jaki została ona wpisana, ponieważ ta nazwa nie jest zachowywana. Tylko opcje dla session_store wydają się zawierać oryginalny nieznacznie zmodyfikowany ciąg.

Najlepszym sposobem, aby dostać się do nazwy aplikacji Rails jest:

To będzie działać, nawet jeśli katalog aplikacja została zmieniona lub sym-linked!

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

Dlaczego? Ponieważ autor aplikacji mógł mieć inną nazwę niż nazwa niż Rails oczekuje ... ze znakami "-" zamiast "_"; na przykład "testowa aplikacja". Z nazwy klasy nie można zagwarantować prawidłowej pisowni.

Używając tej informacji, można to zrobić:

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

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

lub po prostu dodać to do Twojego ./config/environment.rb:

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

sprawia, że ​​te stałe dostępne na najwyższym poziomie aplikacji.


Blisko, ale nie cygar:

To prawie poprawne, ale to nadal nie powieść, jeśli zostanie przemianowany katalogu aplikacji (na przykład podczas wdrażania do „«20121001_110512»lub«najnowsze».. .Następnie dodaje się złamie:

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

z następujących dwóch podejść nie można dostać się do poprawnej pisowni .. można się tylko domyślać nazwę:

To jest nieoptymalne, i może dać błędnie pisane wyniki:

można dostać się do pochodnej nazwą aplikacji, takich jak ten:

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

Należy jednak pamiętać, że nie jest to głupie, ponieważ ktoś mógł nazwać aplikację "test-app" na , a zobaczysz wynik powyżej, a nie poprawną nazwę za pomocą "-".

samo jest, jeśli czerpać to tak:

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

to nazwa klasy, ale nie możesz być pewien, w jaki sposób dostać się do nazwy drogę autor orkisz go.

+0

Myślę, że powinno to być 'Rails.application.class.parent_name' w ostatniej sekcji, ale nie mogę go edytować, ponieważ moja zmiana jest mniejsza niż 6 znaków. Dzięki StackOverflow. –

+0

dziękuję za wskazanie tego! Naprawiłem to. – Tilo

+0

To jest poprawna odpowiedź Rails-y. Chciałbym również zauważyć, że większość użytkowników chciałaby wywołać funkcję .humanize.titleize w celu użycia w widoku. – Sam

0

ten można znaleźć w pliku config.ru:

run Dinosaur::Application 

lub w Rakefile:

Dinosaur::Application.load_tasks 

Nazwa poprzedzające "::" to nazwa aplikacji

3

Aby uzyskać bardziej "humanizowaną" wersję (na podstawie pierwszej odpowiedzi znajdującej się tutaj) rozważ następującą metodę: zwróci ona Test App dla twojej aplikacji TestApp.

def app_name 
    Rails.application.class.parent_name 
    .underscore 
    .humanize 
    .split 
    .map(&:capitalize) 
    .join(' ') 
end 
Powiązane problemy