我如何访问Rails 3应用程序对象的名称?
我需要从Rails 3引擎中知道程序员应用程序的名称。
Rails.application.class.parent_name
原来的海报问为rails应用程序的名称 ,而不是类名称。 那是两回事。 例如Rails应用程序的拼写可能与Rails所期望的不同,例如“test-app”而不是“test_app”。
loginRails应用程序的名称很困难,因为该名称未被保存。 只有session_store的选项似乎包含稍微修改的原始string。
获得Rails应用程序名称的最佳方式是:
即使您的应用程序目录被重命名,或者sym连接,这也可以工作!
Rails.application.config.session_options[:key].sub(/^_/,'').sub(/_session/,'') => "test-app"
为什么? 因为应用程序的作者可能拼写的名称不同于Rails所期望的…例如用“ – ”字符而不是“_”; 例如“testing应用程序”。 从class级名称你不能保证得到正确的拼写。
使用这个信息,你可以这样做:
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/,'')
这使得这些常量在应用程序的顶层可用。
closures,但没有雪茄:
这几乎是正确的,但是如果应用程序目录被重命名(例如,在部署到“20121001_110512”或“最新的”期间…),则它仍将失败:
File.basename(Rails.root.to_s) => "test-app"
有以下两种方法,你不能得到正确的拼写..你只能猜测一个名字:
这是次优的,并可能给拼写错误的结果:
你可以得到这样的应用程序名称的衍生物:
Rails.application.engine_name.gsub(/_application/,'') => "test_app"
但是请注意,这不是简单的,因为有人可以命名应用程序“testing应用程序”,你会看到上面的结果,而不是正确的名称与“ – ”。
同样的事情是真的,如果你得到这样的:
Rails.application.class.parent_name => "TestApp"
这是类名,但是你不能确定如何以作者拼写的方式得到名字。
在Rails 3中,生成的应用程序被赋予一个与应用程序名称匹配的模块名称空间。 所以如果您的应用程序被称为“Twitter”,则Rails.application的类是“Twitter :: Application”。
这意味着你可以拆分Rails应用程序的类名的string来获得这样的应用程序名称:
Rails.application.class.to_s.split("::").first
在我们的例子中,结果string将是“Twitter”。
Rails.application
返回你的MyApp::Application
类。
对于一个更“人性化”的版本(基于你可以在这里find的第一个答复),考虑以下方法:它将为TestApp
应用程序返回Test App
。
def app_name Rails.application.class.parent_name .underscore .humanize .split .map(&:capitalize) .join(' ') end
使用斯科特的答案,我把我的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文件中find这个:
run Dinosaur::Application
或者在Rakefile中:
Dinosaur::Application.load_tasks
“::”之前的名称是应用程序名称