На оригинальном плакате запрашивалось имя приложения rails , а не имя класса.Это две разные вещи.например, написание приложения rails может отличаться от того, что ожидает Rails, например, «test-app» вместо «test_app».
Сложно найти имя приложения Rails, записанное так, как оно было зарегистрировано , потому что это имя не сохранилось.Только параметры для session_store, похоже, содержат слегка измененную исходную строку.
Лучший способ получить имя приложения Rails:
Это будет работатьдаже если каталог вашего приложения был переименован или связан с sym!
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" иВы увидите результат выше, а не правильное имя с '-'.
То же самоеЗначение true, если вы выводите его следующим образом:
Rails.application.class.parent_name
=> "TestApp"
это имя класса, но вы не можете быть уверены, как получить имя так, как оно было написано автором.