Объясните мне, как работает конфиг в Rails

У меня есть приложение Rails 3, назовите его "MyApp". В моем файле config\environments\production.rb я вижу такие вещи, как

MyApp::Application.configure do
  config.log_level = :info
  config.logger = Logger.new(config.paths.log.first, 'daily')
   ...or...
  config.logger = Logger.new(Rails.root.join("log",Rails.env + ".log"),3,20*1024*1024)

Итак, вопросы сосредоточены на терминологии и что они означают... (или укажите мне на какой-нибудь сайт, который я искал, но не нашел, чтобы объяснить, как это работает.)

  1. MyApp — это модуль?
  2. MyApp::Application - это...? Что, тоже модуль?
  3. MyApp::Application.configure — это метод?
  4. конфиг это переменная? Как это увидеть в консоли?
  5. config.logger - это ???
  6. config.paths.log.first - это ...?? --в консоли я вижу "MyApp::Application.configure.config.paths.log.first", но не знаю, что это значит и как извлечь из него информацию!?!

Это слишком много для одного вопроса? :)

Я просмотрел учебник http://guides.rubyonrails.org/configuring.html, но он сразу же переходит к тому, что делать.


person rtfminc    schedule 15.07.2011    source источник


Ответы (2)


Шестисторонний вопрос! О боже. Давайте, кхм, приступим.1 Надеюсь, тогда я получу в 6 раз больше голосов? :)

<сильный>1. MyApp – это модуль?

Да, это модуль. Он действует как «контейнер» для всего, что относится к вашему приложению. Например, вы можете определить такой класс:

module MyApp
  class MyFunClass
    def my_fun_method
    end
  end
end

Тогда, если у кого-то еще есть MyFunClass, он не будет мешать вашему MyFunClass. Это просто хороший способ отделить код.

<сильный>2. MyApp::Application - это...? Что, тоже модуль?

MyApp::Application на самом деле является классом, который наследуется от Rails::Application. Это делает довольно много вещей, включая настройку объекта Rails.application, который на самом деле является экземпляром MyApp::Application, с которым вы можете делать всевозможные забавные вещи, такие как запросы к вашему приложению (в сеансе rails console или rails c). Этот код, например, сделает фиктивный запрос к корневому пути вашего приложения, возвращая массив 3-х размеров, который является просто ответом Rack:

 Rails.application.call(Rack::MockRequest.env_for("/"))

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

 Rails.application.routes

Основная цель определения MyApp::Application заключается не в этих забавных вещах, которые вы, вероятно, никогда не будете использовать, а в том, чтобы вы могли определить конфигурацию для конкретного приложения внутри config/application.rb. Например, какие параметры фильтруются, часовой пояс приложения или какие каталоги должны загружаться автоматически. Все это описано в Руководстве по настройке Rails.

<сильный>3. MyApp::Application.configure — это метод?

На самом деле это метод, и он позволяет вам добавлять дополнительные параметры конфигурации в конфигурацию вашего приложения после загрузки config/application.rb. Вы, вероятно, видели, как это используется в config/environments/development.rb или в одном из двух других файлов в этом каталоге, но в основном все они используют те же параметры, что и в этом Руководство по настройке, ссылка на которое приведена ранее.

<сильный>4. конфиг это переменная? Как это увидеть в консоли?

«Переменная» config на самом деле является методом, определенным в коде, используемом для Rails::Application, и возвращает просто объект конфигурации, в котором хранится конфигурация для приложения.

Чтобы получить к нему доступ в консоли, просто используйте Rails.application.config. Это вернет довольно большой объект Rails::Application::Configuration для вашего удовольствия.

<сильный>5. config.logger — это ???

Я предполагаю, что метод, о котором вы говорите, исходит из этой строки в config/environments/production.rb:

# Use a different logger for distributed setups
# config.logger = SyslogLogger.new

Метод в этом примере не config.logger, а скорее config.logger=, который в Ruby-land называется методом "setter". Тот, у кого нет знака равенства, называется «геттер». Этот метод устанавливает альтернативный регистратор для производственной среды в Rails, к которому затем можно получить доступ, используя Rails.logger в консоли или в самом приложении.

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

Rails.logger.info("DEBUG INFO GOES HERE")

<сильный>6. config.paths.log.first - это ...?? --в консоли я вижу "MyApp::Application.configure.config.paths.log.first", но не знаю, что это значит и как извлечь из него информацию!?!

В приложении Rails вы можете изменить расположение определенных каталогов. Таким образом, этот метод config.paths является способом отслеживания того, куда эти каталоги сопоставляются. За всю мою жизнь с Rails мне никогда не приходилось использовать или изменять эту переменную, и это может означать одно из двух:

  1. Он не часто используется программистами Rails или;
  2. Я живу не очень разнообразной жизнью.

Интерпретируйте это как хотите. Моя главная мысль заключается в том, что вы, вероятно, никогда не будете использовать его.


Я надеюсь, что они помогут вам лучше понять Rails!

1 Ужасная шутка с костями.

person Ryan Bigg    schedule 15.07.2011
comment
Спасибо за подробный ответ. У меня все работает, но я беспокоюсь и хочу знать больше, что происходит. Большое спасибо, чем больше я знаю, тем лучше мне это нравится. - person rtfminc; 16.07.2011
comment
@rtfminc: Рад помочь! Было очень интересно ответить на вопрос :) - person Ryan Bigg; 18.07.2011

  • MyApp — это модуль, это пространство имен, включающее приложение, которое вы запустите, см. следующую строку

  • MyApp::Application — это класс, и вы запускаете его экземпляры при запуске приложения Rails.

  • MyApp::Application.configure - это метод. Он передает все инструкции классу. см. ссылку

  • config — это метод или переменная экземпляра (если она установлена), которая принадлежит через наследование Rails::Application::Configuration. см. ссылку

Вы можете увидеть это в консоли: MyApp::Application.config

  • config.logger не существует, пока вы его не определите, так что это экземпляр Logger. см. ссылку

  • config.paths.log is a Rails::Paths::Path

вы можете получить к нему доступ в консоли, используя: MyApp::Application.config.paths.log

person apneadiving    schedule 15.07.2011