【问题标题】:How do I access the name of the Rails 3 application object?如何访问 Rails 3 应用程序对象的名称?
【发布时间】:2021-12-01 23:36:16
【问题描述】:

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

【问题讨论】:

  • 您想获得应用程序名称,当您执行“rails new your-application”时,您是如何创建它的,还是只是类名称?

标签: ruby-on-rails


【解决方案1】:

导轨

Rails.application.class.parent_name

Rails 6.1 及更高版本

Rails.application.class.module_parent_name

【讨论】:

  • 这是类名,而不是签入时应用程序的名称
  • Rails.application.class.parent 为您提供模块常量,然后您可以在其上调用 to_s 或命名。
  • Rails.application.class.parent_name 已被弃用并替换为 Rails.application.class.module_parent_name
【解决方案2】:

原始发帖人要求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"

这是类名,但您无法确定如何按照作者的拼写方式获得该名称。

【讨论】:

  • 我认为最后一部分应该是Rails.application.class.parent_name,但我无法编辑它,因为我的更改少于 6 个字符。感谢 StackOverflow。
  • 这是正确的 Rails-y 答案。我还要注意,大多数用户都希望为此调用 .humanize.titleize 以在视图中使用。
  • 如果用户用'-'来命名他们的 Rails 应用程序,这不是 Rails-y :) 他们可以用它来打自己的脚。当没有下划线时,Rails 会坚持有一个下划线。发生在我身上:P
  • 我建议 Rails.application.engine_name.gsub(/_application$/,'') 使用该解决方案,以防用户在应用程序名称中的某处使用了“_application”。
【解决方案3】:

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

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

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

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

【讨论】:

  • 是否有类似的东西可以在 rails 2.3 中使用?
  • 这是类名,而不是签入时应用程序的名称
  • @tilo 是的,除了 97% 的情况,这对于大多数仔细命名应用的人来说已经足够了
  • @ScottLowe 真的!我刚刚添加了我的答案,因为我有一个需要真实应用名称的案例..
  • @Tilo 是的...这是一个不错的选择。我只是脾气暴躁。哈哈!
【解决方案4】:

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

【讨论】:

    【解决方案5】:

    适用于 Rails 6 及更高版本

    Rails.application.class.module_parent.name

    更多上下文:

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

    【讨论】:

      【解决方案6】:

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

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

      【讨论】:

        【解决方案7】:

        使用 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},这样如果您需要重命名您的应用(我今天早上必须这样做),这将大大减少麻烦。

        【讨论】:

          【解决方案8】:

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

          run Dinosaur::Application
          

          或在 Rakefile 中:

          Dinosaur::Application.load_tasks
          

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-06-15
            • 2023-01-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-06-09
            相关资源
            最近更新 更多