Подтвердить что ты не робот

Как получить доступ к имени объекта приложения Rails 3?

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

4b9b3361

Ответ 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

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