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

问题描述 投票:52回答:8

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

ruby-on-rails
8个回答
118
投票
Rails.application.class.parent_name

20
投票

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

很难获得Rails应用程序的名称,就像签到时一样拼写,因为该名称未保留。只有session_store的选项似乎包含稍微修改的原始字符串。

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

即使您的应用程序目录已重命名或符号链接,也可以使用!

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

为什么?因为应用程序的作者可能拼写了name的拼写与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"

这是类名,但是您不能确定如何使用作者的拼写方式来命名。


15
投票

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


5
投票

[Rails.application返回您的MyApp::Application类。


3
投票

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


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

0
投票

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


0
投票

用于Rails 6及更高版本

© www.soinside.com 2019 - 2024. All rights reserved.