J'ai besoin de connaître le nom d'une application de programmation à partir d'un moteur Rails 3.
Réponses
Trop de publicités?L'affiche originale a demandé le nom de l'application rails, pas pour le nom de la classe. Ceux sont deux choses différentes. par exemple, l'orthographe de l'application rails peuvent être différentes de ce que les Rails s'attend, par exemple "test-app' au lieu de 'test_app'.
Il est difficile d'obtenir le nom de l'Application Rails orthographié de la manière qu'il a été vérifié-en, car ce nom n'est pas conservé. Seules les options pour la 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:
Cela fonctionne même si votre répertoire app a été renommé ou sym-lié!
Rails.application.config.session_options[:key].sub(/^_/,'').sub(/_session/,'')
=> "test-app"
Pourquoi? Parce que l'auteur de l'app pourrait avoir orthographié son nom différemment des Rails attend... par exemple avec les caractères '-' au lieu de '_'; par exemple "test-app". À partir du nom de la classe, vous ne pouvez pas garantie pour obtenir de l'orthographe correcte.
En utilisant cette information, vous pourriez faire ceci:
class << Rails.application
def name
Rails.application.config.session_options[:key].sub(/^_/,'').sub(/_session/,'')
end
end
Rails.application.name
=> 'test-app'
ou tout simplement les ajouter à vos ./config/environment.rb
:
APP_VERSION = '1.0.0'
APP_NAME = Rails.application.config.session_options[:key].sub(/^_/,'').sub(/_session/,'')
qui rend ces constantes disponibles sur le dessus de niveau de l'application.
À proximité, mais pas de cigare:
C'est presque correct, mais il va encore échouer si le répertoire de l'application devient renommé (par exemple lors du déploiement '"20121001_110512" ou "plus tard"... puis la suite allait se briser:
File.basename(Rails.root.to_s)
=> "test-app"
avec les deux approches suivantes vous ne pouvez pas obtenir à l'orthographe correcte.. vous ne pouvait deviner un nom:
C'est sous-optimale, et peut donner mal orthographiée résultats:
Vous pouvez obtenir à 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 puisse avoir nommé 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 dérivez comme ceci:
Rails.application.class.parent_name
=> "TestApp"
c'est le nom de la classe, mais vous ne pouvez pas être sûr de savoir comment récupérer le nom de la façon dont l'auteur orthographié.
Dans Rails 3, l'application générée se voit attribuer un espace de nom 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 comme celui-ci:
Rails.application.class.to_s.split("::").first
Dans notre exemple, la chaîne résultante serait "Twitter".
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 faire #{app_name}
chaque fois que cela est nécessaire, ce qui facilite grandement la tâche si vous devez renommer votre application (ce que je devais faire ce matin).