Как получить доступ к имени объекта приложения Rails 3? - PullRequest
52 голосов
/ 22 августа 2010

Мне нужно знать имя приложения для программистов из движка Rails 3.

Ответы [ 7 ]

117 голосов
/ 13 марта 2011
Rails.application.class.parent_name
19 голосов
/ 18 октября 2012

На оригинальном плакате запрашивалось имя приложения 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"

это имя класса, но вы не можете быть уверены, как получить имя так, как оно было написано автором.

15 голосов
/ 22 августа 2010

В Rails 3 генерируемому приложению дается пространство имен модуля, соответствующее имени приложения. Поэтому, если ваше приложение называется «Twitter», класс Rails.application - «Twitter :: Application».

Это означает, что вы можете разделить строку имени класса вашего Rails-приложения, чтобы получить имя приложения, подобное этому:

Rails.application.class.to_s.split("::").first

В нашем примере полученная строка будет "Twitter".

5 голосов
/ 22 августа 2010

Rails.application возвращает ваш MyApp::Application класс.

3 голосов
/ 20 января 2016

Для более «гуманизированной» версии (основываясь на первом ответе, который вы можете найти здесь) рассмотрите следующий метод: он вернет Test App для вашего TestApp приложения.

def app_name
  Rails.application.class.parent_name
    .underscore
    .humanize
    .split
    .map(&:capitalize)
    .join(' ')
end
2 голосов
/ 09 ноября 2010

Используя ответ Скотта, я поместил следующее в мой 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}, где это необходимо, что значительно облегчает задачу, если вам нужно переименовать приложение (что я должен был сделать сегодня утром).

0 голосов
/ 22 мая 2013

Вы можете найти это в файле config.ru:

run Dinosaur::Application

или в Rakefile:

Dinosaur::Application.load_tasks

Имя до "::" - это имя приложения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...