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

时间:2010-08-21 21:51:58

标签: ruby-on-rails

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

8 个答案:

答案 0 :(得分:117)

Rails.application.class.parent_name

答案 1 :(得分:19)

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

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

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

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

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

为什么呢?因为该应用的作者可以拼写它的名称与Rails预期的不同...例如用' - '字符代替'_';例如“测试应用程序”。从班级名称来看,你无法保证拼写正确。

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

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/,'')

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


关闭,但没有雪茄:

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

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

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

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

您可以像这样获得应用程序名称的衍生物:

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

但请注意,这不是万无一失的,因为有人可能已经命名了应用程序 “test-app”,你会看到上面的结果,而不是' - '的正确名称。

如果你这样推导出来也是如此:

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

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

答案 2 :(得分:15)

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

这意味着你可以拆分Rails应用程序的类名字符串,以获得这样的应用程序名称:

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

在我们的示例中,结果字符串将是“Twitter”。

答案 3 :(得分:5)

Rails.application会返回您的MyApp::Application课程。

答案 4 :(得分:3)

更多&#34;人性化&#34;版本(基于您在此处可以找到的第一个回复)考虑以下方法:它将为您的Test App应用返回TestApp

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

答案 5 :(得分:2)

使用Scott的回答,我将以下内容放在我的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}进行操作,如果您需要重命名您的应用程序(我今天早上必须这样做),这样可以减轻麻烦。

答案 6 :(得分:0)

您可以在config.ru文件中找到:

run Dinosaur::Application

或在Rakefile中:

Dinosaur::Application.load_tasks

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

答案 7 :(得分:0)

用于Rails 6及更高版本

Rails.application.class.module_parent.name

更多上下文:

Module#parent已重命名为module_parentparent已过时,将在Rails 6.1中删除。

相关问题