2010-08-21 15 views

Respuesta

15

En Rails 3, a la aplicación que se genera se le asigna un espacio de nombres de módulo que coincide con el nombre de la aplicación. Entonces, si su aplicación se llamaba "Twitter", la clase de Rails.application es "Twitter :: Application".

Esto significa que se puede dividir la cadena del nombre de la clase de su aplicación Rails para obtener un nombre de aplicación como esta:

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

En nuestro ejemplo, la cadena resultante sería "Twitter".

+1

¿Hay algo similar que pueda usarse en los rieles 2.3? – nzifnab

+0

este es el nombre de la clase, y no el nombre de la aplicación como se comprueba en – Tilo

+0

@tilo Es cierto, excepto que el 97% de los casos, esto es suficiente para la mayoría de las personas que llaman a su aplicación cuidadosamente – Scott

5

Rails.application devuelve su clase MyApp::Application.

1

Utilizar el servicio de Scott, pongo el siguiente en mi archivo 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 

Luego, en mis plantillas que sólo puede hacer #{app_name} donde se necesite, lo que hace que sea mucho menos de una molestia si necesita cambiar el nombre aplicación (que tuve que hacer esta mañana).

107
Rails.application.class.parent_name 
+1

este es el nombre de la clase, y no el nombre de la aplicación como se comprueba en – Tilo

+2

Rails.application.class.parent le da la constante de módulo, que luego se puede llamar to_s o nombre sobre. – Docunext

19

El cartel original pidió el nombre de la aplicación rieles, no por el nombre de la clase. Esas son dos cosas diferentes. p.ej. la ortografía de la aplicación Rails puede ser diferente de lo que Rails espera, p. 'test-app' en lugar de 'test_app'.

Es difícil llegar al nombre de la aplicación Rails, deletreó el camino ya que se registró, porque ese nombre no se conserva. Solo las opciones para session_store parecen contener la cadena original ligeramente modificada.

La mejor manera de llegar al nombre de la aplicación Rails es:

Esto funcionará incluso si el directorio de aplicación fue renombrado o ligado sym-!

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

¿Por qué? Debido a que el autor de la aplicación podría haber escrito que es el nombre de manera diferente a lo que Rails espera ... p. con '-' caracteres en lugar de '_'; p.ej. "prueba-aplicación". Del nombre de la clase no puede garantizar que llegue a la ortografía correcta.

Utilizando esta información, usted puede hacer esto:

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

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

o simplemente agregar esto a su ./config/environment.rb:

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

que hace que estas constantes disponibles en el nivel superior de la aplicación.


Cerca, pero no puro:

Esto es casi correcta, pero aún así se producirá un error si el directorio de la aplicación se cambió el nombre (por ejemplo, durante el despliegue a ' '20121001_110512' o 'último' .. .entonces el siguiente rompería:

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

con los dos enfoques siguientes no se puede llegar a la ortografía correcta .. sólo se podía adivinar un nombre:

Esta es sub-óptimo, y puede dar resultados mal escritas:

se puede llegar a un derivado del nombre de la aplicación como esta:

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

Pero tenga en cuenta que esto no es infalible, porque alguien podría haber llamado a la aplicación "prueba-aplicación" y verá el resultado anterior, no el nombre correcto con '-'.

Lo mismo es cierto si usted deriva de esta manera:

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

este es el nombre de la clase, pero no se puede estar seguro de cómo llegar al nombre de la forma en que el autor lo explicó.

+0

Creo que debería ser 'Rails.application.class.parent_name' en la última sección pero no puedo editarlo porque mi cambio es de menos de 6 caracteres. Gracias StackOverflow. –

+0

¡gracias por señalar eso! Lo arreglé. – Tilo

+0

Esta es la respuesta correcta de Rails-y. También me gustaría señalar que la mayoría de los usuarios querrían llamar a .humanize.titleize para usarlo en una vista. – Sam

0

Usted puede encontrar esto en el archivo config.ru:

run Dinosaur::Application 

o en el Rakefile:

Dinosaur::Application.load_tasks 

El nombre antes de la "::" es el nombre de la aplicación

3

para una versión más "humanizado" (basado en la primera respuesta se puede encontrar aquí) consideran el siguiente método: se volverá Test App para su aplicación TestApp.

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