【发布时间】:2021-12-01 23:36:16
【问题描述】:
我需要知道 Rails 3 引擎中的程序员应用程序的名称。
【问题讨论】:
-
您想获得应用程序名称,当您执行“rails new your-application”时,您是如何创建它的,还是只是类名称?
标签: ruby-on-rails
我需要知道 Rails 3 引擎中的程序员应用程序的名称。
【问题讨论】:
标签: ruby-on-rails
导轨
Rails.application.class.parent_name
Rails 6.1 及更高版本
Rails.application.class.module_parent_name
【讨论】:
原始发帖人要求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.application.engine_name.gsub(/_application$/,'') 使用该解决方案,以防用户在应用程序名称中的某处使用了“_application”。
在 Rails 3 中,生成的应用程序被赋予与应用程序名称匹配的模块命名空间。因此,如果您的应用程序被称为“Twitter”,那么 Rails.application 的类就是“Twitter::Application”。
这意味着您可以拆分 Rails 应用程序的类名字符串以获得如下应用程序名称:
Rails.application.class.to_s.split("::").first
在我们的示例中,结果字符串将是“Twitter”。
【讨论】:
Rails.application 返回您的 MyApp::Application 类。
【讨论】:
适用于 Rails 6 及更高版本
Rails.application.class.module_parent.name
更多上下文:
Module#parent 已重命名为 module_parent。 parent 已弃用,将在 Rails 6.1 中删除。
【讨论】:
对于更“人性化”的版本(基于您可以在此处找到的第一个回复),请考虑以下方法:它将为您的 TestApp 应用程序返回 Test App。
def app_name
Rails.application.class.parent_name
.underscore
.humanize
.split
.map(&:capitalize)
.join(' ')
end
【讨论】:
使用 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},这样如果您需要重命名您的应用(我今天早上必须这样做),这将大大减少麻烦。
【讨论】:
您可以在 config.ru 文件中找到它:
run Dinosaur::Application
或在 Rakefile 中:
Dinosaur::Application.load_tasks
“::”之前的名称是应用名称
【讨论】: