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

Ste*_*eve 53 ruby-on-rails

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

And*_*kov 120

Rails.application.class.parent_name
Run Code Online (Sandbox Code Playgroud)

  • 这是类名称,而不是签入的应用程序的名称 (3认同)
  • Rails.application.class.parent_name 已弃用并替换为 Rails.application.class.module_parent_name (3认同)
  • Rails.application.class.parent为您提供模块常量,然后您可以调用to_s或name. (2认同)

Til*_*ilo 20

原始海报要求提供rails应用程序的名称,而不是类名.这是两件不同的事情.例如,rails应用程序的拼写可能与Rails预期的不同,例如'test-app'而不是'test_app'.

很难找到Rails应用程序名称,因为它已签入,因为该名称不会被保留.只有session_store的选项似乎包含稍微修改的原始字符串.

获取Rails应用程序名称的最佳方法是:

即使您的app目录已重命名或sym链接,这也会有效!

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

为什么?因为应用程序的作者可能拼写它的名称与Rails预期的不同...例如使用' - '字符而不是'_'; 例如"test-app".从类名称,您无法保证获得正确的拼写.

使用此信息,您可以这样做:

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

Rails.application.name
=> 'test-app'
Run Code Online (Sandbox Code Playgroud)

或者只是将其添加到您的./config/environment.rb:

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

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


关闭,但没有雪茄:

这几乎是正确的,但是如果应用程序目录被重命名(例如在部署到'"20121001_110512"或"最新"期间)它仍将失败...那么以下内容将会中断:

File.basename(Rails.root.to_s)
=> "test-app"
Run Code Online (Sandbox Code Playgroud)

使用以下两种方法无法获得正确的拼写...您只能猜出一个名字:

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

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

Rails.application.engine_name.gsub(/_application/,'')
=> "test_app"
Run Code Online (Sandbox Code Playgroud)

但请注意,这不是万无一失的,因为有人可能已将应用程序命名为"test-app",您将看到上面的结果,而不是带有" - "的正确名称.

如果你像这样推导它也是如此:

Rails.application.class.parent_name
=> "TestApp"
Run Code Online (Sandbox Code Playgroud)

这是类名,但你不能确定如何按照作者拼写的方式获取名称.


Sco*_*ott 15

在Rails 3中,生成的应用程序被赋予与应用程序名称匹配的模块命名空间.因此,如果您的应用程序被称为"Twitter",则Rails.application类是"Twitter :: Application".

这意味着您可以拆分Rails应用程序的类名字符串以获取如下所示的应用程序名称:

Rails.application.class.to_s.split("::").first
Run Code Online (Sandbox Code Playgroud)

在我们的示例中,结果字符串将是"Twitter".


yfe*_*lum 5

Rails.application返回你的MyApp::Application班级.


Tat*_*ton 5

适用于 Rails 6 及更高版本

Rails.application.class.module_parent.name

更多背景:

Module#parent已更名为module_parent. parent已弃用并将在 Rails 6.1 中删除。