And*_*kov 120
Rails.application.class.parent_name
Run Code Online (Sandbox Code Playgroud)
Til*_*ilo 20
原始海报要求提供rails应用程序的名称,而不是类名.这是两件不同的事情.例如,rails应用程序的拼写可能与Rails预期的不同,例如'test-app'而不是'test_app'.
很难找到Rails应用程序的名称,因为它已签入,因为该名称不会被保留.只有session_store的选项似乎包含稍微修改的原始字符串.
获取Rails应用程序名称的最佳方法是:
即使您的app目录已重命名或sym链接,这也会有效!
Rails.application.config.session_options[:key].sub(/^_/,'').sub(/_session/,'')
=> "test-app"
Run Code Online (Sandbox Code Playgroud)
为什么?因为应用程序的作者可能拼写它的名称与Rails预期的不同...例如使用' - '字符而不是'_'; 例如"test-app".从类名称,您无法保证获得正确的拼写.
使用此信息,您可以这样做:
class << Rails.application
def name
Rails.application.config.session_options[:key].sub(/^_/,'').sub(/_session/,'')
end
end
Rails.application.name
=> 'test-app'
Run Code Online (Sandbox Code Playgroud)
或者只是将其添加到您的./config/environment.rb
:
APP_VERSION = '1.0.0'
APP_NAME = Rails.application.config.session_options[:key].sub(/^_/,'').sub(/_session/,'')
Run Code Online (Sandbox Code Playgroud)
这使得这些常量可以在应用程序的顶层使用.
关闭,但没有雪茄:
这几乎是正确的,但是如果应用程序目录被重命名(例如在部署到'"20121001_110512"或"最新"期间)它仍将失败...那么以下内容将会中断:
File.basename(Rails.root.to_s)
=> "test-app"
Run Code Online (Sandbox Code Playgroud)
使用以下两种方法无法获得正确的拼写...您只能猜出一个名字:
这是次优的,可能会给出错误的拼写结果:
你可以得到这样的应用程序名称的衍生物:
Rails.application.engine_name.gsub(/_application/,'')
=> "test_app"
Run Code Online (Sandbox Code Playgroud)
但请注意,这不是万无一失的,因为有人可能已将应用程序命名为"test-app",您将看到上面的结果,而不是带有" - "的正确名称.
如果你像这样推导它也是如此:
Rails.application.class.parent_name
=> "TestApp"
Run Code Online (Sandbox Code Playgroud)
这是类名,但你不能确定如何按照作者拼写的方式获取名称.
Sco*_*ott 15
在Rails 3中,生成的应用程序被赋予与应用程序名称匹配的模块命名空间.因此,如果您的应用程序被称为"Twitter",则Rails.application类是"Twitter :: Application".
这意味着您可以拆分Rails应用程序的类名字符串以获取如下所示的应用程序名称:
Rails.application.class.to_s.split("::").first
Run Code Online (Sandbox Code Playgroud)
在我们的示例中,结果字符串将是"Twitter".
适用于 Rails 6 及更高版本
Rails.application.class.module_parent.name
更多背景:
Module#parent
已更名为module_parent
. parent
已弃用并将在 Rails 6.1 中删除。
归档时间: |
|
查看次数: |
21304 次 |
最近记录: |