Мне нужно знать имя приложения-программиста из механизма Rails 3.
Как получить доступ к имени объекта приложения Rails 3?
Ответ 1
Rails.application.class.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"
Почему? Потому что автор приложения мог бы написать имя иначе, чем 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"
это имя класса, но вы не можете быть уверены, как добраться до имени так, как автор написал его.
Ответ 3
В Rails 3 для создаваемого приложения задано пространство имен модулей, соответствующее имени приложения. Поэтому, если ваше приложение было названо "Twitter", класс Rails.application будет "Twitter:: Application".
Это означает, что вы можете разделить строку имени класса вашего приложения Rails, чтобы получить имя приложения, подобное этому:
Rails.application.class.to_s.split("::").first
В нашем примере результирующая строка будет "Twitter".
Ответ 4
Rails.application
возвращает класс MyApp::Application
.
Ответ 5
Для более "очеловеченной" версии (на основе первого ответа, который вы можете найти здесь) рассмотрите следующий метод: он вернет Test App
для вашего приложения TestApp
.
def app_name
Rails.application.class.parent_name
.underscore
.humanize
.split
.map(&:capitalize)
.join(' ')
end
Ответ 6
Используя ответ Скотта, я поместил следующее в мой 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}
везде, где это необходимо, что делает его гораздо менее сложным, если вам нужно переименовать свое приложение (что я должен был сделать этим утром).
Ответ 7
Вы можете найти это в файле config.ru:
run Dinosaur::Application
или в файле Rakefile:
Dinosaur::Application.load_tasks
Имя до "::" - это имя приложения