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

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

Steve asked 2020-01-14T07:13:03Z
7个解决方案
117 votes
Rails.application.class.parent_name
Andrei Kulakov answered 2020-01-14T07:13:21Z
20 votes

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

很难以登录时的拼写方式获得Rails App的名称,因为该名称未保留。 只有session_store的选项似乎包含稍微修改的原始字符串。

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

即使您的应用程序目录已重命名或符号链接,它也将起作用!

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"

这是类的名称,但是您不能确定如何以作者的拼写方式获得该名称。

Tilo answered 2020-01-14T07:14:49Z
15 votes

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

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

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

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

Scott answered 2020-01-14T07:15:18Z
5 votes

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

yfeldblum answered 2020-01-14T07:15:37Z
3 votes

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

def app_name
  Rails.application.class.parent_name
    .underscore
    .humanize
    .split
    .map(&:capitalize)
    .join(' ')
end
Roxas Shadow answered 2020-01-14T07:15:57Z
2 votes

使用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},如果您需要重命名您的应用程序(今天早上我必须这样做),那么麻烦就更少了。

Peter Lyons answered 2020-01-14T07:16:22Z
0 votes

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

run Dinosaur::Application

或在Rakefile中:

Dinosaur::Application.load_tasks

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

Andrew answered 2020-01-14T07:16:50Z
translate from https://stackoverflow.com:/questions/3539148/how-do-i-access-the-name-of-the-rails-3-application-object