64 votes

Comment accéder au nom de l'objet d'application Rails 3?

J'ai besoin de connaître le nom d'une application de programmation à partir d'un moteur Rails 3.

138voto

Andrei Kulakov Points 547
Rails.application.class.parent_name

22voto

Tilo Points 13833

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é.

16voto

Scott Lowe Points 9412

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".

5voto

yfeldblum Points 42613

Rails.application renvoie votre classe MyApp::Application .

2voto

Peter Lyons Points 47794

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).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X