Comment accéder au nom de l’object d’application Rails 3?

J’ai besoin de connaître le nom d’une application de programmation depuis un moteur Rails 3.

Rails.application.class.parent_name 

L’affiche originale demandait le nom de l’application rails , pas pour le nom de la classe. Ce sont deux choses différentes. Par exemple, l’orthographe de l’application rails peut être différente de celle attendue par Rails, par exemple “test-app” au lieu de “test_app”.

Il est difficile de connaître le nom de l’application Rails telle qu’elle a été archivée , car ce nom n’est pas conservé. Seules les options de session_store semblent contenir la chaîne d’origine légèrement modifiée.

La meilleure façon d’obtenir le nom de l’application Rails est la suivante:

Cela fonctionnera même si le répertoire de votre application a été renommé ou lié par un lien symbolique!

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

Pourquoi? Parce que l’auteur de l’application aurait pu épeler son nom différemment que Rails attend … par exemple avec des caractères ‘-‘ au lieu de ‘_’; par exemple “test-app”. Du nom de la classe, vous ne pouvez pas garantir que vous obtenez l’orthographe correcte.

En utilisant cette information, vous pouvez faire ceci:

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

ou ajoutez simplement ceci à votre ./config/environment.rb :

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

Cela rend ces constantes disponibles au plus haut niveau de l’application.


Fermez, mais pas de cigare:

Ceci est presque correct, mais il échouera quand le répertoire de l’application sera renommé (par exemple pendant le déploiement vers «20121001_110512» ou «latest»… alors ce qui suit se briserait:

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

Avec les deux approches suivantes, vous ne pouvez pas obtenir l’orthographe correcte. Vous ne pouvez deviner qu’un nom:

Ceci est sous-optimal et peut donner des résultats mal orthographiés:

Vous pouvez accéder à un dérivé du nom de l’application comme ceci:

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

Mais s’il vous plaît noter que ce n’est pas infaillible, parce que quelqu’un aurait pu appeler l’application “test-app” et vous verrez le résultat ci-dessus, pas le nom correct avec ‘-‘.

La même chose est vraie si vous la dérivez comme ceci:

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

c’est le nom de la classe, mais vous ne pouvez pas savoir comment obtenir le nom tel que l’auteur l’a orthographié.

Dans Rails 3, l’application générée reçoit un espace de noms de module correspondant au nom de l’application. Donc, si votre application s’appelait “Twitter”, la classe de Rails.application est “Twitter :: Application”.

Cela signifie que vous pouvez diviser la chaîne du nom de classe de votre application Rails pour obtenir un nom d’application tel que celui-ci:

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

Dans notre exemple, la chaîne résultante serait “Twitter”.

Rails.application renvoie votre classe MyApp::Application .

Pour une version plus “humanisée” (basée sur la première réponse que vous pouvez trouver ici), considérez la méthode suivante: elle renverra Test App pour votre application TestApp .

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

En utilisant la réponse de Scott, je mets ce qui suit dans mon fichier 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 

Ensuite, dans mes modèles, je peux simplement faire #{app_name} partout où cela est nécessaire, ce qui le rend moins compliqué si vous devez renommer votre application (ce que je devais faire ce matin).

Vous pouvez le trouver dans le fichier config.ru:

 run Dinosaur::Application 

ou dans le Rakefile:

 Dinosaur::Application.load_tasks 

Le nom précédant le “::” est le nom de l’application