我如何访问Rails 3应用程序对象的名称?

我需要从Rails 3引擎中知道程序员应用程序的名称。

Rails.application.class.parent_name 

原来的海报问为rails应用程序的名称 ,而不是类名称。 那是两回事。 例如Rails应用程序的拼写可能与Rails所期望的不同,例如“test-app”而不是“test_app”。

loginRails应用程序名称很困难,因为该名称未被保存。 只有session_store的选项似乎包含稍微修改的原始string。

获得Rails应用程序名称的最佳方式是:

即使您的应用程序目录被重命名,或者sym连接,这也可以工作!

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

为什么? 因为应用程序的作者可能拼写的名称不同于Rails所期望的…例如用“ – ”字符而不是“_”; 例如“testing应用程序”。 从class级名称你不能保证得到正确的拼写。

使用这个信息,你可以这样做:

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

或者直接添加到你的./config/environment.rb

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

这使得这些常量在应用程序的顶层可用。


closures,但没有雪茄:

这几乎是正确的,但是如果应用程序目录被重命名(例如,在部署到“20121001_110512”或“最新的”期间…),则它仍将失败:

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

有以下两种方法,你不能得到正确的拼写..你只能猜测一个名字:

这是次优的,并可能给拼写错误的结果:

你可以得到这样的应用程序名称的衍生物:

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

但是请注意,这不是简单的,因为有人可以命名应用程序“testing应用程序”,你会看到上面的结果,而不是正确的名称与“ – ”。

同样的事情是真的,如果你得到这样的:

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

这是类名,但是你不能确定如何以作者拼写的方式得到名字。

在Rails 3中,生成的应用程序被赋予一个与应用程序名称匹配的模块名称空间。 所以如果您的应用程序被称为“Twitter”,则Rails.application的类是“Twitter :: Application”。

这意味着你可以拆分Rails应用程序的类名的string来获得这样的应用程序名称:

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

在我们的例子中,结果string将是“Twitter”。

Rails.application返回你的MyApp::Application类。

对于一个更“人性化”的版本(基于你可以在这里find的第一个答复),考虑以下方法:它将为TestApp应用程序返回Test App

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

使用斯科特的答案,我把我的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 

然后在我的模板中,我可以在需要的地方执行#{app_name} ,这样如果您需要重命名应用程序(今天早上我必须执行此操作),就不会麻烦了。

你可以在config.ru文件中find这个:

 run Dinosaur::Application 

或者在Rakefile中:

 Dinosaur::Application.load_tasks 

“::”之前的名称是应用程序名称