Конфигурирование приложений на Rails
Это руководство раскрывает особенности конфигурирования и инициализации, доступные приложениям на Rails.
После прочтения этого руководства, вы узнаете:
- Как конфигурировать поведение ваших приложений на Rails.
- Как добавить дополнительный код, запускаемый при старте приложения.
Расположение инициализационного кода
Rails предлагает четыре стандартных места для размещения инициализационного кода:
- config/application.rb
- Конфигурационные файлы конкретных сред
- Инициализаторы
- Пост-инициализаторы
Запуск кода до Rails
В тех редких случаях, когда вашему приложению необходимо запустить некоторый код до того, как сам Rails загрузится, поместите его до вызова require 'rails/all' в config/application.rb.
Конфигурирование компонентов Rails
В целом, работа по конфигурированию Rails означает как настройку компонентов Rails, так и настройку самого Rails. Конфигурационный файл config/application.rb и конфигурационные файлы конкретных сред (такие как config/environments/production.rb) позволяют определить различные настройки, которые можно придать всем компонентам.
Например, можно добавить эту настройку в файл config/application.rb:
config.time_zone = 'Central Time (US & Canada)'
Это настройка для самого Rails. Если хотите передать настройки для отдельных компонентов Rails, это также осуществляется через объект config в config/application.rb:
config.active_record.schema_format = :ruby
Rails будет использовать эту конкретную настройку для конфигурирования Active Record.
Общие настройки Rails
Эти конфигурационные методы вызываются на объекте Rails::Railtie, таком как подкласс Rails::Engine или Rails::Application.
config.after_initializeпринимает блок, который будет запущен после того, как Rails закончит инициализацию приложения. Это включает инициализацию самого фреймворка, engine-ов и всех инициализаторов приложения изconfig/initializers. Отметьте, что этот блок будет запущен для Rake задач. Полезно для конфигурирования настроек, установленных другими инициализаторами:config.after_initialize do ActionView::Base.sanitized_allowed_tags.delete 'div' endconfig.asset_hostустанавливает хост для ассетов. Полезна, когда для хостинга ассетов используются CDN, или когда вы хотите обойти встроенную в браузеры политику ограничения домена при использовании различных псевдонимов доменов. Укороченная версияconfig.action_controller.asset_host.config.autoload_once_pathsпринимает массив путей, по которым Rails будет загружать константы, не стирающиеся между запросами. Уместна, еслиconfig.cache_classesявляетсяfalse, что является в режиме development по умолчанию. В противном случае все автозагрузки происходят только раз. Все элементы этого массива также должны быть вautoload_paths. По умолчанию пустой массив.config.autoload_pathsпринимает массив путей, по которым Rails будет автоматически загружать константы.По умолчанию все директории вapp.config.cache_classesконтролирует, будут ли классы и модули приложения перезагружены при каждом запросе. По умолчаниюfalseв режиме development и true в режимах test и production.config.action_view.cache_template_loadingконтролирует, будут ли шаблоны перезагружены при каждом запросе. Умолчания те же, что и дляconfig.cache_classes.config.beginning_of_weekустанавливает начало недели по умолчанию для приложения. Принимает символ валидного дня недели (например,:monday).config.cache_storeконфигурирует, какое хранилище кэша использовать для кэширования Rails. Опции включают один из символов:memory_store,:file_store,:mem_cache_store,:null_storeили объект, реализующий API кэша. По умолчанию:file_store.config.colorize_loggingопределяет, использовать ли коды цвета ANSI при логировании информации. По умолчаниюtrue.config.consider_all_requests_localэто флажок. Еслиtrue, тогда любая ошибка вызовет детальную отладочную информацию, которая будет выгружена в отклик HTTP, и контроллерRails::Infoпокажет контекст выполнения приложения в/rails/info/properties. По умолчаниюtrueв режимах development и test, иfalseв режиме production. Для более детального контроля, установите ее вfalseи применитеlocal_request?в контроллерах для определения, какие запросы должны предоставлять отладочную информацию при ошибках.config.consoleпозволит установить класс, который будет использован как консоль при вызовеrails console. Лучше всего запускать его в блокеconsole:console do # этот блок вызывается только при запуске консоли, # поэтому можно безопасно поместить тут pry require "pry" config.console = Pry endconfig.eager_loadкогдаtrue, лениво загружает все зарегистрированныеconfig.eager_load_namespaces. Они включают ваше приложение, engine-ы, фреймворки Rails и любые другие зарегистрированные пространства имен.config.eager_load_namespacesрегистрирует пространства имен, которые лениво загружаются, когдаconfig.eager_loadравноtrue. Все пространства имен в этом списке должны отвечать на методeager_load!.config.eager_load_pathsпринимает массив путей, из которых Rails будет нетерпеливо загружать при загрузке, если включено кэширование классов. По умолчанию каждая папка в директорииappприложения.config.enable_dependency_loading: когда true, включает автозагрузку, даже если приложение нетерпеливо загружено иconfig.cache_classesустановлена как true. По умолчанию false.config.encodingнастраивает кодировку приложения. По умолчанию UTF-8.config.exceptions_appустанавливает приложение по обработке исключений, вызываемое промежуточной программой ShowException, когда происходит исключение. По умолчаниюActionDispatch::PublicExceptions.new(Rails.public_path).config.debug_exception_response_formatустанавливает формат, используемый в откликах, когда возникают ошибки в режиме development. По умолчанию:apiдля только API приложений и:defaultдля нормальных приложений.config.file_watcherэто класс, используемый для обнаружения обновлений файлов в файловой системе, когдаconfig.reload_classes_only_on_changeравноtrue. Rails поставляется сActiveSupport::FileUpdateChecker(по умолчанию) иActiveSupport::EventedFileUpdateChecker(этот зависит от гема listen). Пользовательские классы должны соответствоватьActiveSupport::FileUpdateCheckerAPI.config.filter_parametersиспользуется для фильтрации параметров, которые не должны быть показаны в логах, такие как пароли или номера кредитных карт. По умолчанию Rails фильтрует пароли, добавляяRails.application.config.filter_parameters += [:password]вconfig/initializers/filter_parameter_logging.rb. Фильтр параметров работает как частично соответствующее регулярное выражение.config.force_sslпринуждает все запросы обслуживаться протоколом HTTPS, используя промежуточную программуActionDispatch::SSL, и устанавливаетconfig.action_mailer.default_url_optionsравным{ protocol: 'https' }. Это может быть настроено, установивconfig.ssl_options- подробнее смотрите в документации ActionDispatch::SSL.config.log_formatterопределяет форматер для логгера Rails. Эта опция по умолчанию равна экземпляруActiveSupport::Logger::SimpleFormatterдля всех режимов. Если установите значение дляconfig.logger, вы должны вручную передать значение вашего форматера для вашего логгера до того, как он будет обернут в экземплярActiveSupport::TaggedLogging, Rails не сделает это за вас.config.log_levelопределяет многословность логгера Rails. Эта опция по умолчанию:debugдля всех сред. Доступные уровни лога::debug,:info,:warn,:error,:fatal, and:unknown.config.log_tagsпринимает список: методов, на которые отвечает объектrequest, объектProc, который принимаетrequestобъект, или что-то, отвечающее наto_s. С помощью этого становится просто тегировать строчки лога отладочной информацией, такой как поддомен и id запроса - очень полезно для отладки многопользовательского приложения.config.loggerэто логгер, который будет использован дляRails.loggerи любого логирования, относящегося к Rails, такого какActiveRecord::Base.logger. По умолчанию это экземплярActiveSupport::TaggedLogging, оборачивающий экземплярActiveSupport::Logger, который пишет лог в директориюlog/. Можно предоставить произвольный логгер, чтобы получить полную совместимость, нужно следовать следующим указаниям:- Чтобы поддерживался форматер, необходимо в логгере вручную назначить форматер из значения
config.log_formatter. - Чтобы поддерживались тегированные логи, экземпляр лога должен быть обернут в
ActiveSupport::TaggedLogging. Чтобы поддерживалось глушение, логгер должен включать модули
LoggerSilenceиActiveSupport::LoggerThreadSafeLevel. КлассActiveSupport::Loggerуже включает эти модули.class MyLogger < ::Logger include ActiveSupport::LoggerThreadSafeLevel include LoggerSilence end mylogger = MyLogger.new(STDOUT) mylogger.formatter = config.log_formatter config.logger = ActiveSupport::TaggedLogging.new(mylogger)
- Чтобы поддерживался форматер, необходимо в логгере вручную назначить форматер из значения
config.middlewareпозволяет настроить промежуточные программы приложения. Это подробнее раскрывается в разделе Конфигурирование промежуточных программ ниже.config.reload_classes_only_on_changeвключает или отключает перезагрузку классов только при изменении отслеживаемых файлов. По умолчанию отслеживает все по путям автозагрузки и установленаtrue. Еслиconfig.cache_classesустановленаtrue, эта опция игнорируется.secret_key_baseиспользуется для определения ключа, позволяющего сессиям приложения быть верифицированными по известному ключу безопасности, чтобы избежать подделки. Приложения получают случайно сгенерированный ключ в test и development средах, другие среды должны устанавливать это вconfig/credentials.yml.enc.config.public_file_server.enabledконфигурирует Rails на обслуживание статичных файлов из директории public. Эта опция по умолчаниюtrue, но в среде production устанавливаетсяfalse, так как серверные программы (например, NGINX или Apache), используемые для запуска приложения, должны обслуживать статичные ресурсы вместо Rails. Если запускаете или тестируете приложение в среде production с помощью WEBrick (не рекомендуется использовать WEBrick в production), установите эту опцию вtrue. В противном случае нельзя воспользоваться кэшированием страниц и запросами файлов, существующих в директории public.config.session_storeопределяет, какой класс использовать для хранения сессии. Возможные значения:cookie_store, которое по умолчанию,:mem_cache_storeи:disabled. Последнее говорит Rails не связываться с сессиями. По умолчанию равно хранилищу куки с именем приложения в качестве ключа сессии. Произвольные хранилища сессии также могут быть определены:config.session_store :my_custom_storeЭто произвольное хранилище должно быть определено как
ActionDispatch::Session::MyCustomStore.config.time_zoneустанавливает временную зону по умолчанию для приложения и включает понимание временных зон для Active Record.
Настройка ассетов
config.assets.enabledэто флажок, контролирующий, будет ли включен файлопровод (asset pipeline). По умолчанию он устанавливаетсяtrue.config.assets.css_compressorопределяет используемый компрессор CSS. По умолчанию установленsass-rails. Единственное альтернативное значение в настоящий момент это:yui, использующее гемyui-compressor.config.assets.js_compressorопределяет используемый компрессор JavaScript. Возможные варианты:closure,:uglifierи:yuiтребуют использование гемовclosure-compiler,uglifierилиyui-compressorсоответственно.config.assets.gzipфлажок, включающий создание сжатых версий скомпилированных ассетов вместе с несжатыми ассетами. По умолчанию установленоtrue.config.assets.pathsсодержит пути, используемые для поиска ассетов. Присоединение путей к этой конфигурационной опции приведет к тому, что эти пути будут использованы в поиске ассетов.config.assets.precompileпозволяет определить дополнительные ассеты (иные, чемapplication.cssиapplication.js), которые будут предварительно компилированы при запускеrake assets:precompile.config.assets.unknown_asset_fallbackпозволяет изменить поведение файлопровода, когда ассет не в нем, если вы используете sprockets-rails 3.2.0 или новее. По умолчаниюtrue.config.assets.prefixопределяет префикс из которого будут обслуживаться ассеты. По умолчанию/assets.config.assets.manifestопределяет полный путь для использования файлом манифеста прекомпилятора ассетов. По умолчанию файл называетсяmanifest-<random>.jsonв директорииconfig.assets.prefixв папке public.config.assets.digestвключает использование меток SHA256 в именах ассетов. Установлено по умолчаниюtrue.config.assets.debugотключает объединение и сжатие ассетов. Установлено по умолчаниюtrueвdevelopment.rb.config.assets.versionопция, используемая в генерации хэша SHA256. Ее можно использовать чтобы принудительно перекомпилировать все файлы.config.assets.compile- булево значение, используемое для включения компиляции Sprockets на лету в production.config.assets.loggerпринимает логгер, соответствующий интерфейсу Log4r, или дефолтный Ruby классLogger. По умолчанию такой же, как указан вconfig.logger. Установкаconfig.assets.loggerвfalseотключает логирование сжатых ассетов.config.assets.quietотключает логирование запросов к ассетам. Установленоtrueпо умолчанию вdevelopment.rb.
Конфигурирование генераторов
Rails позволяет изменить, какие генераторы следует использовать, с помощью метода config.generators. Этот метод принимает блок:
config.generators do |g|
g.orm :active_record
g.test_framework :test_unit
end
Полный перечень методов, которые можно использовать в этом блоке, следующий:
assetsпозволяет создавать ассеты при генерации скаффолда. По умолчаниюtrue.force_pluralпозволяет имена моделей во множественном числе. По умолчаниюfalse.helperопределяет, генерировать ли хелперы. По умолчаниюtrue.integration_toolопределяет интеграционный инструмент, используемый для генерации интеграционных тестов. По умолчаниюtest_unit.javascriptsвключает в генераторах хук для файлов JavaScript. Используется в Rails при запуске генератораscaffold. По умолчаниюtrue.javascript_engineконфигурирует используемый движок (например, coffee) при генерации ассетов. По умолчаниюjs.ormопределяет используемую orm. По умолчаниюfalseи используется Active Record.resource_controllerопределяет используемый генератор для генерация контроллера при использованииrails generate resource. По умолчанию:controller.resource_routeопределяет нужно ли генерировать определение ресурсного маршрута или нет. По умолчаниюtrue.scaffold_controller, отличающийся отresource_controller, определяет используемый генератор для генерации скаффолдингового контроллера при использованииrails generate scaffold. По умолчанию:scaffold_controller.stylesheetsвключает в генераторах хук для таблиц стилей. Используется в Rails при запуске генератораscaffold, но этот хук также может использоваться в других генераторах. По умолчаниюtrue.stylesheet_engineконфигурирует используемый при генерации ассетов движок CSS (например, sass). По умолчанию:css.scaffold_stylesheetсоздаетscaffold.cssпри генерации скаффолдингового ресурса. По умолчаниюtrue.test_frameworkопределяет используемый тестовый фреймворк. По умолчаниюfalse, и используется Minitest.template_engineопределяет используемый движок шаблонов, такой как ERB или Haml. По умолчанию:erb.
(configuring-middleware) Конфигурирование промежуточных программ (middleware)
Каждое приложение Rails имеет стандартный набор промежуточных программ, используемых в следующем порядке в среде development:
ActionDispatch::SSLпринуждает каждый запрос быть обслуженным с помощью HTTPS. Включен, еслиconfig.force_sslустановленаtrue. Передаваемые сюда опции могут быть настроены с помощьюconfig.ssl_options.ActionDispatch::Staticиспользуется для обслуживания статичных ассетов. Отключено, еслиconfig.public_file_server.enabledравнаfalse. Установитеconfig.public_file_server.index_nameесли вам нужно обслуживать индексный файл статичной директории, который называется неindex. Например, для обслуживанияmain.htmlвместоindex.htmlдля запросов, установитеconfig.public_file_server.index_nameв"main".ActionDispatch::Executorпозволяет тредобезопасную перезагрузку кода. Отключено, еслиconfig.allow_concurrencyустановленаfalse, что загружаетRack::Lock.Rack::Lockоборачивает приложение в mutex, таким образом оно может быть вызвано только в одном треде одновременно.ActiveSupport::Cache::Strategy::LocalCacheслужит простым кэшем в памяти. Этот кэш не является тредобезопасным и предназначен только как временное хранилище кэша для отдельного треда.Rack::Runtimeустанавливает заголовокX-Runtime, содержащий время (в секундах), затраченное на выполнение запроса.Rails::Rack::Loggerпишет в лог, что начался запрос. После выполнения запроса сбрасывает логи.ActionDispatch::ShowExceptionsловит исключения, возвращаемые приложением, и рендерит прекрасные страницы исключения, если запрос локальный или еслиconfig.consider_all_requests_localустановленаtrue. Еслиconfig.action_dispatch.show_exceptionsустановленаfalse, исключения будут вызваны несмотря ни на что.ActionDispatch::RequestIdсоздает уникальный заголовок X-Request-Id, доступный для отклика, и включает методActionDispatch::Request#uuid.ActionDispatch::RemoteIpпроверяет на атаки с ложных IP и получает валидныйclient_ipиз заголовков запроса. Конфигурируется с помощью настроекconfig.action_dispatch.ip_spoofing_checkиconfig.action_dispatch.trusted_proxies.Rack::Sendfileперехватывает отклики, чьи тела были обслужены файлом, и заменяет их специфичным для сервером заголовком X-Sendfile. Конфигурируется с помощьюconfig.action_dispatch.x_sendfile_header.ActionDispatch::Callbacksзапускает подготовленные колбэки до обслуживания запроса.ActionDispatch::Cookiesустанавливает куки для каждого запроса.ActionDispatch::Session::CookieStoreответственно за хранение сессии в куки. Для этого может использоваться альтернативная промежуточная программа, при измененииconfig.action_controller.session_storeна альтернативное значение. Кроме того, переданные туда опции могут быть сконфигурированыconfig.action_controller.session_options.ActionDispatch::Flashнастраивает ключиflash. Доступно только если уconfig.action_controller.session_storeустановлено значение.Rack::MethodOverrideпозволяет методу быть переопределенным, если установленparams[:_method]. Это промежуточная программа, поддерживающая типы методов HTTP PATCH, PUT и DELETE.Rack::Headпреобразует запросы HEAD в запросы GET и обслуживает их соответствующим образом.
Кроме этих полезных промежуточных программ можно добавить свои, используя метод config.middleware.use:
config.middleware.use Magical::Unicorns
Это поместит промежуточную программу Magical::Unicorns в конец стека. Можно использовать insert_before, если желаете добавить промежуточную программу перед другой.
config.middleware.insert_before Rack::Head, Magical::Unicorns
Или можно вставить промежуточную программу на конкретное место с помощью индексов. Например, если хотите вставить промежуточную программу Magical::Unicorns наверх стека, это можно сделать так:
config.middleware.insert_before 0, Magical::Unicorns
Также есть insert_after, который вставляет промежуточную программу после другой:
config.middleware.insert_after Rack::Head, Magical::Unicorns
Промежуточные программы также могут быть полностью переставлены и заменены другими:
config.middleware.swap ActionController::Failsafe, Lifo::Failsafe
Они также могут быть убраны из стека полностью:
config.middleware.delete Rack::MethodOverride
Конфигурирование i18n
Все эти конфигурационные опции делегируются в библиотеку I18n.
config.i18n.available_localesвносит в белый лист доступные локали приложения. По умолчанию все ключи локалей, обнаруженные в файлах локалей, обычно только:enдля нового приложения.config.i18n.default_localeустанавливает локаль по умолчанию для приложения, используемого для интернационализации. По умолчанию:en.config.i18n.enforce_available_localesобеспечивает, что все локали, переданные из i18n, должны быть объявлены в спискеavailable_locales, вызывая исключениеI18n::InvalidLocaleпри установке недоступной локали. По умолчаниюtrue. Рекомендуется не отключать эту опцию, если этого не сильно требуется, так как она работает в качестве меры безопасности от установки неверной локали на основе пользовательских данных.config.i18n.load_pathустанавливает путь, используемый Rails для поиска файлов локали. По умолчаниюconfig/locales/*.{yml,rb}.config.i18n.fallbacksустанавливает поведение фолбэка для отсутствующих переводов. Вот 3 примера использования этой опции:Можно установить опции
trueдля использования локали по умолчанию в качестве фолбэка следующим образом:config.i18n.fallbacks = trueИли можно установить массив локалей в качестве фолбэка так:
config.i18n.fallbacks = [:tr, :en]Или можно установить различные фолбэки для различных локалей. Например, если хотите использовать
:trдля:azи:de,:enдля:daв качестве фолбэков, можно сделать так:config.i18n.fallbacks = { az: :tr, da: [:de, :en] } # или config.i18n.fallbacks.map = { az: :tr, da: [:de, :en] }
Конфигурирование Active Record
config.active_record включает ряд конфигурационных опций:
config.active_record.loggerпринимает логгер, соответствующий интерфейсу Log4r или дефолтного класса Ruby Logger, который затем передается на любые новые сделанные соединения с базой данных. Можете получить этот логгер, вызвавloggerили на любом классе модели Active Record, или на экземпляре модели Active Record. Установите его в nil, чтобы отключить логирование.config.active_record.primary_key_prefix_typeпозволяет настроить именование столбцов первичного ключа. По умолчанию Rails полагает, что столбцы первичного ключа именуютсяid(и эта конфигурационная опция не нуждается в установке). Есть два возможных варианта::table_nameсделает первичный ключ для класса Customer какcustomerid:table_name_with_underscoreсделает первичный ключ для класса Customer какcustomer_id
config.active_record.table_name_prefixпозволяет установить глобальную строку, добавляемую в начало имен таблиц. Если установить ее равнымnorthwest_, то класс Customer будет искать таблицуnorthwest_customers. По умолчанию это пустая строка.config.active_record.table_name_suffixпозволяет установить глобальную строку, добавляемую в конец имен таблиц. Если установить ее равным_northwest, то класс Customer будет искать таблицуcustomers_northwest. По умолчанию это пустая строка.config.active_record.schema_migrations_table_nameпозволяет установить строку, которая будет использоваться как имя таблицы для миграций схемы.config.active_record.pluralize_table_namesопределяет, должен Rails искать имена таблиц базы данных в единственном или множественном числе. Если установленоtrue(по умолчанию), то класс Customer будет использовать таблицуcustomers. Если установитьfalse, то класс Customers будет использовать таблицуcustomer.config.active_record.default_timezoneопределяет, использоватьTime.local(если установлено:local) илиTime.utc(если установлено:utc) для считывания даты и времени из базы данных. По умолчанию:utc.config.active_record.schema_formatрегулирует формат для выгрузки схемы базы данных в файл. Опции следующие::ruby(по умолчанию) для независимой от типа базы данных версии, зависимой от миграций, или:sqlдля набора (потенциально зависимого от типа БД) выражений SQL.config.active_record.error_on_ignored_orderопределяет, должна ли быть вызвана ошибка, если во время порционного (batch) запроса была проигнорирована сортировка или лимит. Опцией может быть либоtrue(вызывается ошибка), либоfalse(предупреждение). По умолчаниюfalse.config.active_record.timestamped_migrationsрегулирует, должны ли миграции нумероваться серийными номерами или временными метками. По умолчаниюtrueдля использования временных меток, которые более предпочтительны если над одним проектом работают несколько разработчиков.config.active_record.lock_optimisticallyрегулирует, должен ли Active Record использовать оптимистичную блокировку. По умолчаниюtrue.config.active_record.cache_timestamp_formatуправляет форматом значения временной метки в ключе кэширования. По умолчанию:nsec.config.active_record.record_timestampsэто булево значение, управляющее, должна ли происходить временная метка операций моделиcreateиupdate. Значение по умолчаниюtrue.config.active_record.partial_writesэто булево значение, управляющее, должны ли использоваться частичные записи (т.е. обновления только тех атрибутов, которые помечены dirty). Отметьте, что при использовании частичной записи также можно использовать оптимистичную блокировкуconfig.active_record.lock_optimistically, так как конкурентные обновления могут записывать атрибуты, основываясь на возможном устаревшем статусе чтения. Значение по умолчаниюtrue.config.active_record.maintain_test_schemaэто булево значение, управляющее, должен ли Active Record пытаться сохранять вашу тестовую базу данных актуальной сdb/schema.rb(илиdb/structure.sql) при запуске тестов. По умолчаниюtrue.config.active_record.dump_schema_after_migrationэто флажок, управляющий, должен ли происходить дамп схемы (db/schema.rbилиdb/structure.sql) при запуске миграций. Он установленfalseвconfig/environments/production.rb, генерируемом Rails. Значение по умолчаниюtrue, если эта конфигурация не установлена.config.active_record.dump_schemasуправляет, какие схемы баз данных будут дампиться при вызовеdb:structure:dump. Опции::schema_search_path(по умолчанию), при которой дампится любая схема, перечисленная вschema_search_path,:all, при которой дампятся все схемы, независимо отschema_search_path, или строки со схемами, разделенными через запятую.config.active_record.belongs_to_required_by_defaultэто булево значение и управляет, будет ли валидация записи падать, если отсутствует связьbelongs_to.config.active_record.warn_on_records_fetched_greater_thanпозволяет установить порог для предупреждения для итогового размера запроса. Если количество возвращаемых записей в запросе будет превышать пороговое значение, запишется предупреждение. Это может быть полезным для выявления запросов, которые могут быть причиной увеличения требуемой памяти.config.active_record.index_nested_attribute_errorsпозволяет ошибкам для вложенных отношенийhas_manyтакже быть отраженными с индексом. По умолчаниюfalse.config.active_record.use_schema_cache_dumpпозволяет пользователям получить информацию о кэше схемы изdb/schema_cache.yml(сгенерированного с помощьюbin/rails db:schema:cache:dump), вместо отправления запроса в базу данных для получения этой информации. По умолчаниюtrue.
Адаптер MySQL добавляет дополнительную конфигурационную опцию:
ActiveRecord::ConnectionAdapters::Mysql2Adapter.emulate_booleansрегулирует, должен ли Active Record рассматривать все столбцыtinyint(1)как boolean. По умолчаниюtrue.
Адаптер SQLite3Adapter добавляет еще одну опцию конфигурации:
ActiveRecord::ConnectionAdapters::SQLite3Adapter.represent_boolean_as_integerуказывает, хранятся ли булевые значения в базах данных sqlite3 как 1 и 0 или 't' и 'f'. Выходное значениеActiveRecord::ConnectionAdapters::SQLite3Adapter.represent_boolean_as_integer, установленное в false устарело. Базы данных SQLite использовали 't' и 'f' для сериализации булевых значений, и следует преобразовать старые данные в 1 и 0 (их нативную булевую сериализацию), прежде чем устанавливать этот флаг в true. Преобразование может быть выполнено с помощью настройки Rake задачи, которая запускаетExampleModel.where("boolean_column = 't'").update_all(boolean_column: 1) ExampleModel.where("boolean_column = 'f'").update_all(boolean_column: 0)для всех моделей и всех булевых столбцов, после чего флаг должен быть установлен в true с помощью добавления следующего в файл application.rb:
Rails.application.config.active_record.sqlite3.represent_boolean_as_integer = true
Дампер схемы добавляет дополнительную конфигурационную опцию:
ActiveRecord::SchemaDumper.ignore_tablesпринимает массив таблиц, которые не должны быть включены в любой генерируемый файл схемы. Эта настройка будет проигнорирована в любом случае, кромеActiveRecord::Base.schema_format == :ruby.
Конфигурирование Action Controller
config.action_controller включает несколько конфигурационных настроек:
config.action_controller.asset_hostустанавливает хост для ассетов. Полезна, когда для хостинга ассетов используются CDN, или когда вы хотите обойти встроенную в браузеры политику ограничения домена при использовании различных псевдонимов доменов.config.action_controller.perform_cachingконфигурирует, должно ли приложение выполнять возможность кэширования, предоставленную компонентом Action Controller. Установленоfalseв режиме development,trueв production.config.action_controller.default_static_extensionконфигурирует расширение, используемое для кэшированных страниц. По умолчанию.html.config.action_controller.include_all_helpersустанавливает, должны ли быть все хелперы вьюх доступны везде или только в соответствующем контроллере. Если установленfalse, методыUsersHelperбудут доступны только во вьюхах, рендерящихся как частьUsersController. Еслиtrue, методыUsersHelperбудут доступны везде. Поведением настройки по умолчанию (когда этой опции явно не установленоtrueилиfalse) является то, что все хелперы вьюх доступны в каждом контроллере.config.action_controller.loggerпринимает логгер, соответствующий интерфейсу Log4r или дефолтного класса Ruby Logger, который затем используется для логирования информации от Action Controller. Установите его вnil, чтобы отключить логирование.config.action_controller.request_forgery_protection_tokenустанавливает имя параметра токена для RequestForgery. Вызовprotect_from_forgeryпо умолчанию устанавливает его в:authenticity_token.config.action_controller.allow_forgery_protectionвключает или отключает защиту от CSRF. По умолчаниюfalseв режиме тестирования иtrueв остальных режимах.config.action_controller.forgery_protection_origin_checkнастраивает,должен ли сверяться заголовок HTTPOriginс доменом сайта в качестве дополнительной защиты от подделки межсайтовых запросов.config.action_controller.per_form_csrf_tokensнастраивает, должны ли токены CSRF быть валидными только для метода/экшна, для которого они сгенерированы.config.action_controller.default_protect_from_forgeryопределяет, будет ли добавлена защита от подделки вActionController:Base. Значением по умолчанию является false. Стоит отметить, что это включено по умолчанию при загрузке значений для Rails 5.2.config.action_controller.relative_url_rootможет использоваться, что бы сообщить Rails, деплой происходит в субдиректорию. По умолчаниюENV['RAILS_RELATIVE_URL_ROOT'].config.action_controller.permit_all_parametersустанавливает все параметры для массового назначения как разрешенные по умолчанию. Значение по умолчаниюfalse.config.action_controller.action_on_unpermitted_parametersвключает логирование или вызов исключения, если обнаружены параметры, которые не разрешены явно. Чтобы включить, установите:logили:raise. По умолчанию:logв средах development и test, иfalseво всех остальных средах.config.action_controller.always_permitted_parametersустанавливает белый список параметров, разрешенных по умолчанию. Значениями по умолчанию являются['controller', 'action'].config.action_controller.enable_fragment_cache_loggingопределяет, нужно ли логировать чтение и запись в кэш фрагментов в следующем расширенном формате:Read fragment views/v1/2914079/v1/2914079/recordings/70182313-20160225015037000000/d0bdf2974e1ef6d31685c3b392ad0b74 (0.6ms) Rendered messages/_message.html.erb in 1.2 ms [cache hit] Write fragment views/v1/2914079/v1/2914079/recordings/70182313-20160225015037000000/3b4e249ac9d168c617e32e84b99218b5 (1.1ms) Rendered recordings/threads/_thread.html.erb in 1.5 ms [cache miss]По умолчанию установлено
false, что выводит результаты следующим образом:Rendered messages/_message.html.erb in 1.2 ms [cache hit] Rendered recordings/threads/_thread.html.erb in 1.5 ms [cache miss]
Конфигурирование Action Dispatch
config.action_dispatch.session_storeустанавливает имя хранилища данных сессии. По умолчанию:cookie_store; другие валидные опции включают:active_record_store,:mem_cache_storeили имя вашего собственного класса.config.action_dispatch.default_headersэто хэш с заголовками HTTP, которые по умолчанию устанавливаются для каждого отклика. По умолчанию определены как:config.action_dispatch.default_headers = { 'X-Frame-Options' => 'SAMEORIGIN', 'X-XSS-Protection' => '1; mode=block', 'X-Content-Type-Options' => 'nosniff' }config.action_dispatch.default_charsetуказывает кодировку по умолчанию для всех рендеров. По умолчаниюnil.config.action_dispatch.tld_lengthустанавливает длину TLD (домена верхнего уровня) для приложения. По умолчанию1.config.action_dispatch.ignore_accept_headerиспользуется для определения, нужно ли игнорировать заголовки accept запроса. По умолчаниюfalse.config.action_dispatch.x_sendfile_headerопределяет специфичный для сервера заголовок X-Sendfile.Это полезно для ускоренной отдачи файлов с сервера. Например, можно установить 'X-Sendfile' для Apache.config.action_dispatch.http_auth_saltустанавливает значение соли HTTP Auth. По умолчанию'http authentication'.config.action_dispatch.signed_cookie_saltустанавливает значение соли для подписанных куки. По умолчанию'signed cookie'.config.action_dispatch.encrypted_cookie_saltустанавливает значение соли для зашифрованных куки. По умолчанию'encrypted cookie'.config.action_dispatch.encrypted_signed_cookie_saltустанавливает значение соли для подписанных зашифрованных куки. По умолчанию'signed encrypted cookie'.config.action_dispatch.authenticated_encrypted_cookie_saltустанавливает значение соли для аутентификационных зашифрованных куки. По умолчанию'authenticated encrypted cookie'.config.action_dispatch.encrypted_cookie_cipherустанавливает алгоритм шифрования, который будет использоваться для зашифрованных куки. По умолчанию"aes-256-gcm".config.action_dispatch.signed_cookie_digestустанавливает хэш-функцию, которая будет использоваться для подписанных куки. По умолчанию"SHA1".config.action_dispatch.cookies_rotationsпозволяет чередовать секреты, шифры и хэш-функции для зашифрованных и подписанных куки.config.action_dispatch.perform_deep_mungeконфигурирует, должен ли применяться методdeep_mungeна параметрах. Подробнее смотрите в Руководстве по безопасности. По умолчаниюtrue.config.action_dispatch.rescue_responsesконфигурирует, какие исключения назначаются статусу HTTP. Он принимает хэш и можно указать пары исключение/статус. По умолчанию он определен как:config.action_dispatch.rescue_responses = { 'ActionController::RoutingError' => :not_found, 'AbstractController::ActionNotFound' => :not_found, 'ActionController::MethodNotAllowed' => :method_not_allowed, 'ActionController::UnknownHttpMethod' => :method_not_allowed, 'ActionController::NotImplemented' => :not_implemented, 'ActionController::UnknownFormat' => :not_acceptable, 'ActionController::InvalidAuthenticityToken' => :unprocessable_entity, 'ActionController::InvalidCrossOriginRequest' => :unprocessable_entity, 'ActionDispatch::Http::Parameters::ParseError' => :bad_request, 'ActionController::BadRequest' => :bad_request, 'ActionController::ParameterMissing' => :bad_request, 'Rack::QueryParser::ParameterTypeError' => :bad_request, 'Rack::QueryParser::InvalidParameterError' => :bad_request, 'ActiveRecord::RecordNotFound' => :not_found, 'ActiveRecord::StaleObjectError' => :conflict, 'ActiveRecord::RecordInvalid' => :unprocessable_entity, 'ActiveRecord::RecordNotSaved' => :unprocessable_entity }Любое ненастроенное исключение приведет к 500 Internal Server Error.
ActionDispatch::Callbacks.beforeпринимает блок кода для запуска до запроса.ActionDispatch::Callbacks.afterпринимает блок кода для запуска после запроса.
Конфигурирование Action View
config.action_view включает несколько конфигурационных настроек:
config.action_view.field_error_procпредоставляет генератор HTML для отображения ошибок, приходящих от Active Model. По умолчанию:Proc.new do |html_tag, instance| %Q(<div class="field_with_errors">#{html_tag}</div>).html_safe endconfig.action_view.default_form_builderговорит Rails, какой form builder использовать по умолчанию. По умолчанию этоActionView::Helpers::FormBuilder. Если хотите, чтобы после инициализации загружался ваш класс form builder (и, таким образом, перезагружался с каждым запросом в development), можно передать его как строку.config.action_view.loggerпринимает логгер, соответствующий интерфейсу Log4r или классу Ruby по умолчанию Logger, который затем используется для логирования информации от Action View. Установитеnilдля отключения логирования.config.action_view.erb_trim_modeзадает режим обрезки, который будет использоваться ERB. По умолчанию'-', которая включает обрезку висячих пробелов и новых строчек при использовании<%= -%>или<%= =%>. Подробнее смотрите в документации по Erubis.config.action_view.embed_authenticity_token_in_remote_formsпозволяет установить поведение по умолчанию дляauthenticity_tokenв формах сremote: true. По умолчанию установленfalse, что означает, что remote формы не включаютauthenticity_token, что полезно при фрагментарном кэшировании формы. Remote формы получают аутентификацию из тегаmeta, поэтому встраивание бесполезно, если, конечно, вы не поддерживаете браузеры без JavaScript. В противном случае можно либо передатьauthenticity_token: trueкак опцию для формы, либо установить эту настройку вtrue.config.action_view.prefix_partial_path_with_controller_namespaceопределяет должны ли партиалы искаться в поддиректории шаблонов для контроллеров в пространстве имен, или нет. Например, рассмотрим контроллер с именемAdmin::ArticlesController, который рендерит этот шаблон:<%= render @article %>
Настройка по умолчанию true, что использует партиал в /admin/articles/_article.erb. Установка значение в false будет рендерить /articles/_article.erb, что является тем же поведением, что и рендеринг из контроллера не в пространстве имен, такого как ArticlesController.
config.action_view.raise_on_missing_translationsопределяет, должно ли быть вызвано исключение для отсутствующих переводов.config.action_view.automatically_disable_submit_tagопределяет, должен лиsubmit_tagавтоматически отключаться при клике, это по умолчаниюtrue.config.action_view.debug_missing_translationопределяет, должны ли ключи отсутствующих переводов оборачиваться в тег<span>. Это по умолчаниюtrue.config.action_view.form_with_generates_remote_formsопределяет, должны лиform_withгенерировать remote формы или нет. Это по умолчаниюtrue.
(configuring-action-mailer) Конфигурирование Action Mailer
Имеется несколько доступных настроек ActionMailer::Base:
config.action_mailer.loggerпринимает логгер, соответствующий интерфейсу Log4r или класса Ruby по умолчанию Logger, который затем используется для логирования информации от Action Mailer. Установите его вnil, чтобы отключить логирование.config.action_mailer.smtp_settingsпозволяет детально сконфигурировать метод доставки:smtp. Она принимает хэш опций, который может включать любые из следующих::address- Позволяет использовать удаленный почтовый сервер. Просто измените его значение по умолчанию "localhost".:port- В случае, если ваш почтовый сервер не работает с портом 25, можете изменить это.:domain- Если нужно определить домен HELO, это делается здесь.:user_name- Если почтовый сервер требует аутентификацию, установите имя пользователя этой настройкой.:password- Если почтовый сервер требует аутентификацию, установите пароль этой настройкой.:authentication- Если почтовый сервер требует аутентификацию, здесь необходимо установить тип аутентификации. Это должен быть один из символов:plain,:login,:cram_md5.:enable_starttls_auto- Определяет, включен ли STARTTLS на вашем сервере SMTP и начинает его использовать. По умолчаниюtrue.:openssl_verify_mode- При использовании TLS, можно установить, как OpenSSL проверяет сертификат. Это полезно, если необходимо валидировать самоподписанный и/или wildcard сертификат. Это может быть одна из констант проверки OpenSSL,:noneили:peer-- или сама константаOpenSSL::SSL::VERIFY_NONEилиOpenSSL::SSL::VERIFY_PEER, соответственно.:ssl/:tls- Позволяет соединению SMTP использовать SMTP/TLS (SMTPS: SMTP поверх прямого соединения TLS).
config.action_mailer.sendmail_settingsПозволяет детально сконфигурировать метод доставкиsendmail. Она принимает хэш опций, который может включать любые из этих опций::location- Размещение исполняемого файла sendmail. По умолчанию/usr/sbin/sendmail.:arguments- Аргументы командной строки. По умолчанию-i.
config.action_mailer.raise_delivery_errorsопределяет, должна ли вызываться ошибка, если доставка письма не может быть завершена. По умолчаниюtrue.config.action_mailer.delivery_methodопределяет метод доставки, по умолчанию:smtp. За подробностями обращайтесь к разделу по настройке в руководстве по Action Mailerconfig.action_mailer.perform_deliveriesопределяет, должна ли почта фактически доставляться. По умолчаниюtrue; удобно установить ееfalseпри тестировании.config.action_mailer.default_optionsконфигурирует значения по умолчанию Action Mailer. Используется для установки таких опций, какfromилиreply_toдля каждого рассыльщика. Эти значения по умолчанию следующие:mime_version: "1.0", charset: "UTF-8", content_type: "text/plain", parts_order: ["text/plain", "text/enriched", "text/html"]Присвойте хэш для установки дополнительных опций:
config.action_mailer.default_options = { from: "[email protected]" }config.action_mailer.observersрегистрирует обсерверы, которые будут уведомлены при доставке почты.config.action_mailer.observers = ["MailObserver"]config.action_mailer.interceptorsрегистрирует перехватчики, которые будут вызваны до того, как почта будет отослана.config.action_mailer.interceptors = ["MailInterceptor"]config.action_mailer.preview_pathопределяет расположение превью рассыльщика.config.action_mailer.preview_path = "#{Rails.root}/lib/mailer_previews"config.action_mailer.show_previewsвключает или отключает превью рассыльщика. По умолчаниюtrueв development.config.action_mailer.show_previews = falseconfig.action_mailer.deliver_later_queue_nameуказывает название очереди для рассыльщиков. По умолчаниюmailers.config.action_mailer.perform_cachingуказывает, должно ли выполняться кэширование фрагментов для шаблонов рассыльщиков. Это по умолчаниюfalseво всех средах.
(configuring-active-support) Конфигурирование Active Support
Имеется несколько конфигурационных настроек для Active Support:
config.active_support.bareвключает или отключает загрузкуactive_support/allпри загрузке Rails. По умолчаниюnil, что означает, чтоactive_support/allзагружается.config.active_support.test_orderустанавливает порядок, в котором выполняются тестовые случаи. Возможные значения:randomи:sorted. По умолчанию:random.config.active_support.escape_html_entities_in_jsonвключает или отключает экранирование сущностей HTML в сериализации JSON. По умолчаниюtrue.config.active_support.use_standard_json_time_formatвключает или отключает сериализацию дат в формат ISO 8601. По умолчаниюtrue.config.active_support.time_precisionустанавливает точность значений времени, кодируемого в JSON. По умолчанию3.ActiveSupport::Logger.silencerустанавливаютfalse, чтобы отключить возможность silence logging в блоке. По умолчаниюtrue.ActiveSupport::Cache::Store.loggerопределяет логгер, используемый в операциях хранения кэша.ActiveSupport::Deprecation.behaviorальтернативный сеттер дляconfig.active_support.deprecation, конфигурирующий поведение предупреждений об устаревании в Rails.ActiveSupport::Deprecation.silenceпринимает блок, в котором все предупреждения об устаревании умалчиваются.ActiveSupport::Deprecation.silencedустанавливает, отображать ли предупреждения об устаревании.
Конфигурирование Active Job
config.active_job предоставляет следующие конфигурационные опции:
config.active_job.queue_adapterустанавливает адаптер для бэкенда очередей. По умолчанию адаптер:async. Актуальный список встроенных адаптеров смотрите в документации ActiveJob::QueueAdapters API.# Убедитесь, что гем адаптера есть в вашем Gemfile # и следуйте определенным инструкция по установке # и деплою. config.active_job.queue_adapter = :sidekiqconfig.active_job.default_queue_nameможет быть использована для того, чтобы изменить название очереди по умолчанию. По умолчанию это"default".config.active_job.default_queue_name = :medium_priorityconfig.active_job.queue_name_prefixпозволяет установить опциональный непустой префикс к названию очереди для всех заданий. По умолчанию пустой и не используется.Со следующей настройкой задания будут добавляться в очередь
production_high_priority, при запуске в production:config.active_job.queue_name_prefix = Rails.envclass GuestsCleanupJob < ActiveJob::Base queue_as :high_priority #.... endconfig.active_job.queue_name_delimiterимеет значение по умолчанию'_'. Еслиqueue_name_prefixустановлена, тогдаqueue_name_delimiterсоединяет префикс и название очереди без префикса.Со следующей настройкой задания будут добавлять в очередь
video_server.low_priority:# префикс должен быть установлен для использования разделителя config.active_job.queue_name_prefix = 'video_server' config.active_job.queue_name_delimiter = '.'class EncoderJob < ActiveJob::Base queue_as :low_priority #.... endconfig.active_job.loggerпринимает логгер, соответствующий интерфейсу Log4r или дефолтного класса Ruby Logger, который затем используется для логирования информации от Action Job. Вы можете получить этот логгер вызвавloggerв классе Active Job или экземпляре Active Job. Установите его вnil, чтобы отключить логирование.
Конфигурация Action Cable
config.action_cable.urlпринимает строку с URL, на котором размещается ваш сервер Action Cable. Следует использовать эту опцию, если вы запускаете серверы Action Cable отдельно от основного приложения.config.action_cable.mount_pathпринимает строку, куда монтировать Action Cable, как часть процесса основного сервера. По умолчанию/cable. Ей можно указать nil, чтобы не монтировать Action Cable как часть вашего обычного сервера Rails.
Конфигурирование базы данных
Почти каждое приложение на Rails взаимодействует с базой данных. Можно подключаться к базе данных с помощью установки переменной окружения ENV['DATABASE_URL'] или с помощью использования файла config/database.yml.
При использовании файла config/database.yml можно указать всю информацию, необходимую для доступа к базе данных:
development:
adapter: postgresql
database: blog_development
pool: 5
Это будет подключаться к базе данных по имени blog_development при помощи адаптера postgresql. Та же самая информация может быть сохранена в URL и предоставлена с помощью переменной среды следующем образом:
> puts ENV['DATABASE_URL']
postgresql://localhost/blog_development?pool=5
Файл config/database.ymlсодержит разделы для трех различных сред, в которых по умолчанию может быть запущен Rails:
- Среда
developmentиспользуется на вашем компьютере для разработки или локальном компьютере для того, чтобы вы могли взаимодействовать с приложением. - Среда
testиспользуется при запуске автоматических тестов. - Среда
productionиспользуется, когда вы развертываете свое приложения во всемирной сети для использования.
Если хотите, можно указать URL внутри config/database.yml
development:
url: postgresql://localhost/blog_development?pool=5
Файл config/database.yml может содержать теги ERB <%= %>. Все внутри тегов будет вычислено как код Ruby. Это можно использовать для вставки данных из переменных среды или для выполнения вычислений для генерации необходимой информации о соединении.
TIP: Вам не нужно обновлять конфигурации баз данных вручную. Если взглянете на опции генератора приложения, то увидите, что одна из опций называется --database. Эта опция позволяет выбрать адаптер из списка наиболее часто используемых реляционных баз данных. Можно даже запускать генератор неоднократно: cd .. && rails new blog —database=mysql. После того, как подтвердите перезапись config/database.yml, ваше приложение станет использовать MySQL вместо SQLite. Подробные примеры распространенных соединений с базой данных указаны ниже.
Предпочтение соединения
Так как существует два способа настройки соединения (с помощью config/database.yml или с помощью переменной среды), важно понять, как они могут взаимодействовать.
Если имеется пустой файл config/database.yml, но существует ENV['DATABASE_URL'], Rails соединится с базой данных с помощью переменной среды:
$ cat config/database.yml
$ echo $DATABASE_URL
postgresql://localhost/my_database
Если имеется config/database.yml, но нет ENV['DATABASE_URL'], тогда для соединения с базой данных будет использован этот файл:
$ cat config/database.yml
development:
adapter: postgresql
database: my_database
host: localhost
$ echo $DATABASE_URL
Если имеется и config/database.yml, и ENV['DATABASE_URL'], Rails будет объединять конфигурации вместе. Чтобы лучше понять, обратимся к примерам.
При дублирующей информации о соединении, приоритет имеет переменная среды:
$ cat config/database.yml
development:
adapter: sqlite3
database: NOT_my_database
host: localhost
$ echo $DATABASE_URL
postgresql://localhost/my_database
$ bin/rails runner 'puts ActiveRecord::Base.connections'
{"development"=>{"adapter"=>"postgresql", "host"=>"localhost", "database"=>"my_database"}}
Здесь адаптер, хост и база данных соответствуют информации в ENV['DATABASE_URL'].
Если предоставлена недублирующая информация, вы получите все уникальные значения, в случае любых конфликтов переменная среды также имеет приоритет.
$ cat config/database.yml
development:
adapter: sqlite3
pool: 5
$ echo $DATABASE_URL
postgresql://localhost/my_database
$ bin/rails runner 'puts ActiveRecord::Base.connections'
{"development"=>{"adapter"=>"postgresql", "host"=>"localhost", "database"=>"my_database", "pool"=>5}}
Поскольку pool не содержится в предоставленной информации о соединении в ENV['DATABASE_URL'], его информация объединяется. Так как adapter дублирован, информация о соединении взята из ENV['DATABASE_URL'].
Единственных способ явно не использовать информацию о соединении из ENV['DATABASE_URL'], это определить явный URL соединения с использованием ключа "url":
$ cat config/database.yml
development:
url: sqlite3:NOT_my_database
$ echo $DATABASE_URL
postgresql://localhost/my_database
$ bin/rails runner 'puts ActiveRecord::Base.configurations'
{"development"=>{"adapter"=>"sqlite3", "database"=>"NOT_my_database"}}
Тут игнорируется информация о соединении из ENV['DATABASE_URL'].
Так как возможно встроить ERB в config/database.yml, хорошей практикой является явно показать, что вы используете ENV['DATABASE_URL'] для соединения с вашей базой данных. Это особенно полезно в production, так как вы не должны показывать секретные данные, такие как пароль от базы данных, в системе управления версиями (такой как Git).
$ cat config/database.yml
production:
url: <%= ENV['DATABASE_URL'] %>
Теперь поведение понятное, что мы используем только информацию о соединении из ENV['DATABASE_URL'].
Конфигурирование базы данных SQLite3
В Rails есть встроенная поддержка SQLite3, являющейся легким несерверным приложением по управлению базами данных. Хотя нагруженная среда production может перегрузить SQLite, она хорошо работает для разработки и тестирования. Rails при создании нового проекта использует базу данных SQLite, но вы всегда можете изменить это позже.
Вот раздел дефолтного конфигурационного файла (config/database.yml) с информацией о соединении для среды development:
development:
adapter: sqlite3
database: db/development.sqlite3
pool: 5
timeout: 5000
NOTE: В этом руководстве мы используем базу данных SQLite3 для хранения данных, поскольку эта база данных работает с нулевыми настройками. Rails также поддерживает MySQL (включая MariaDB) и PostgreSQL "из коробки", и имеет плагины для многих СУБД. Если вы уже используете базу данных в работе, в Rails скорее всего есть адаптер для нее.
Конфигурирование базы данных MySQL или MariaDB
Если вы выбрали MySQL или MariaDB вместо SQLite3, ваш config/database.yml будет выглядеть немного по другому. Вот раздел development:
development:
adapter: mysql2
encoding: utf8
database: blog_development
pool: 5
username: root
password:
socket: /tmp/mysql.sock
Если в вашей базе для разработки есть пользователь root с пустым паролем, эта конфигурация у вас заработает. В противном случае измените username и password в разделе development на правильные.
Конфигурирование базы данных PostgreSQL
Если вы выбрали PostgreSQL, ваш config/database.yml будет модифицирован для использования базы данных PostgreSQL:
development:
adapter: postgresql
encoding: unicode
database: blog_development
pool: 5
Prepared Statements по умолчанию включены в PostgreSQL. Их можно отключить, установив prepared_statements в false:
production:
adapter: postgresql
prepared_statements: false
Если включены, Active Record по умолчанию создаст до 1000 prepared statements на соединение с базой данных. Чтобы изменить это поведение, можно установить statement_limit в другое значение:
production:
adapter: postgresql
statement_limit: 200
Чем больше используется prepared statements, тем больше нужно памяти вашей базе данных. Если ваша база данных PostgreSQL достигает лимитов памяти, попробуйте снизить statement_limit или отключить prepared statements.
Конфигурирование базы данных SQLite3 для платформы JRuby
Если вы выбрали SQLite3 и используете JRuby, ваш config/database.yml будет выглядеть немного по-другому. Вот раздел development:
development:
adapter: jdbcsqlite3
database: db/development.sqlite3
Конфигурирование базы данных MySQL или MariaDB для платформы JRuby
Если вы выбрали MySQL или MariaDB и используете JRuby, ваш config/database.yml будет выглядеть немного по-другому. Вот раздел development:
development:
adapter: jdbcmysql
database: blog_development
username: root
password:
Конфигурирование базы данных PostgreSQL для платформы JRuby
Если вы выбрали PostgreSQL и используете JRuby, ваш config/database.yml будет выглядеть немного по-другому. Вот раздел development:
development:
adapter: jdbcpostgresql
encoding: unicode
database: blog_development
username: blog
password:
Измените username и password в разделе development на правильные.
(creating-rails-environments) Создание сред Rails
По умолчанию Rails поставляется с тремя средами: "development", "test" и "production". Хотя в большинстве случаев их достаточно, бывают условия, когда нужно больше сред.
Представим, что у вас есть сервер, отражающий среду production, но используемый только для тестирования. Такой сервер обычно называется "staging server". Для определения среды с именем "staging" для этого сервера, просто создайте файл с именем config/environments/staging.rb. В качестве исходного содержимого используйте любой файл, существующий в config/environments, а затем сделайте в нем необходимые изменения.
Эта среда ничем не отличается от одной из стандартных, сервер запускается с помощью rails server -e staging, консоль с помощью rails console staging, работает Rails.env.staging?, и т.д.
(Deploy to a subdirectory relative url root) Деплой в поддиректорию (относительно корневого url)
По умолчанию Rails ожидает, что ваше приложение запускается в корне (т.е. /). Этот раздел объяснит, как запустить ваше приложение внутри директории.
Допустим, мы хотим задеплоить наше приложение в "/app1". Rails необходимо знать эту директорию для генерации подходящих маршрутов:
config.relative_url_root = "/app1"
альтернативно можно установить переменную среды RAILS_RELATIVE_URL_ROOT.
Теперь Rails будет добавлять "/app1" в начало каждой сгенерированной ссылки.
Использование Passenger
В Passenger запустить приложение в поддиректории просто. Подходящую конфигурацию можно найти в руководстве по Passenger.
Использование обратного прокси
Размещение вашего приложения с использованием обратного прокси имеет определенные преимущества перед традиционным размещением. Они позволяют больше контролировать ваш сервер, располагая по слоям компоненты, требуемые вашему приложению.
Многие веб-серверы могут быть использованы в качестве прокси сервера для балансировки сторонних элементов, таких как кэширующие сервера или сервера приложений.
Одним из таких серверов приложений является Unicorn, запущенный за обратным прокси.
В этом случае необходимо настроить прокси сервер (NGINX, Apache и т.д.) принимать соединения из вашего сервера приложения (Unicorn). По умолчанию Unicorn будет слушать соединения TCP на 8080 порту, но можно изменить порт, или настроить использование сокетов.
Можно найти подробности в Unicorn readme и понять лежащую в основе философию.
Как только вы настроили сервер приложения, необходимо проксировать запросы к нему, настроив надлежащим образом веб-сервер. Например, ваш конфиг NGINX может включать:
upstream application_server {
server 0.0.0.0:8080;
}
server {
listen 80;
server_name localhost;
root /root/path/to/your_app/public;
try_files $uri/index.html $uri.html @app;
location @app {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://application_server;
}
# прочая конфигурация
}
Прочитайте актуальную информацию в документации NGINX.
Настройка среды Rails
Некоторые части Rails также могут быть сконфигурированы извне, предоставив переменные среды. Следующие переменные среды распознаются различными частями Rails:
ENV["RAILS_ENV"]определяет среду Rails (production, development, test и так далее), под которой будет запущен Rails.ENV["RAILS_RELATIVE_URL_ROOT"]используется кодом роутинга для распознания URL при деплое вашего приложение в поддиректории.ENV["RAILS_CACHE_ID"]иENV["RAILS_APP_VERSION"]используются для генерация расширенных ключей кэша в коде кэширования Rails. Это позволит иметь несколько отдельных кэшей в одном и том же приложении.
(initialization) Использование файлов инициализаторов
После загрузки фреймворка и любых гемов в вашем приложении, Rails приступает к загрузке инициализаторов. Инициализатор это любой файл с кодом ruby, хранящийся в /config/initializers вашего приложения. Инициализаторы могут использоваться для хранения конфигурационных настроек, которые должны быть выполнены после загрузки фреймворков и гемов, таких как опции для конфигурирования настроек для этих частей.
NOTE: Можно использовать подпапки для организации ваших инициализаторов, если нужно, так как Rails смотрит файловую иерархию в целом в папке initializers и ниже.
TIP: Если имеется какая-либо зависимость от порядка в ваших инициализаторах, можно контролировать порядок загрузки с помощью именования. Инициализационные файлы загружаются в алфавитном порядке их путей. Например, 01_critical.rb будет загружен до 02_normal.rb.
События инициализации
В Rails имеется 5 событий инициализации, которые могут быть встроены в разные моменты (отображено в порядке запуска):
before_configuration: Это запустится как только константа приложения унаследуется отRails::Application. Вызовыconfigбудут вычислены до того, как это произойдет.before_initialize: Это запустится непосредственно перед процессом инициализации с помощью инициализатора:bootstrap_hook, расположенного рядом с началом процесса инициализации Rails.to_prepare: Запустится после того, как инициализаторы будут запущены для всех Railties (включая само приложение), но до нетерпеливой загрузки и построения стека промежуточных программ. Что еще более важно, запустится после каждого запроса вdevelopment, но только раз (при загрузке) вproductionиtest.before_eager_load: Это запустится непосредственно после нетерпеливой загрузки, что является поведением по умолчанию для средыproduction, но неdevelopment.after_initialize: Запустится сразу после инициализации приложения, после запуска инициализаторов приложения изconfig/initializers.
Чтобы определить событие для них, используйте блочный синтаксис в подклассе Rails::Application, Rails::Railtie или Rails::Engine:
module YourApp
class Application < Rails::Application
config.before_initialize do
# тут идет инициализационный код
end
end
end
Это можно сделать также с помощью метода config на объекте Rails.application:
Rails.application.config.before_initialize do
# тут идет инициализационный код
end
WARNING: Некоторые части вашего приложения, в частности роутинг, пока еще не настроены в месте, где вызывается блок after_initialize.
Rails::Railtie#initializer
В Rails имеется несколько инициализаторов, выполняющихся при запуске, все они определены с использованием метода initializer из Rails::Railtie. Вот пример инициализатора initialize_whiny_nils из Action Controller:
initializer "action_controller.set_helpers_path" do |app|
ActionController::Helpers.helpers_path = app.helpers_paths
end
Метод initializer принимает три аргумента: имя инициализатора, хэш опций (здесь не показан) и блок. В хэше опций может быть определен ключ :before для указания, перед каким инициализатором должен быть запущен новый инициализатор, и ключ :after определяет, после какого инициализатора запустить этот.
Инициализаторы, определенные методом initializer, будут запущены в порядке, в котором они определены, за исключением тех, в которых использованы методы :before или :after.
WARNING: Можно помещать свои инициализаторы до или после других инициализаторов в цепочки, пока это логично. Скажем, имеется 4 инициализатора, названные от "one" до "four" (определены в этом порядке), и вы определяете "four" идти before "four", но after "three", это не логично, и Rails не сможет установить ваш порядок инициализаторов.
Блочный аргумент метода initializer это экземпляр самого приложение, таким образом, можно получить доступ к его конфигурации, используя метод config, как это сделано в примере.
Поскольку Rails::Application унаследован от Rails::Railtie (опосредованно), можно использовать метод initializer в config/application.rb для определения инициализаторов для приложения.
(initializers) Инициализаторы
Ниже приведен полный список всех инициализаторов, присутствующих в Rails в порядке, в котором они определены (и, следовательно, запущены, если не указано иное).
load_environment_hook: Служит плейсхолдером, так что:load_environment_configможет быть определено для запуска до него.load_active_support: Требуетactive_support/dependencies, настраивающий основу для Active Support. Опционально требуетactive_support/all, еслиconfig.active_support.bareне истинно, что является значением по умолчанию.initialize_logger: Инициализирует логгер (объектActiveSupport::Logger) для приложения и делает его доступным какRails.logger, если до него другой инициализатор не определитRails.logger.initialize_cache: ЕслиRails.cacheеще не установлен, инициализирует кэш, обращаясь к значениюconfig.cache_storeи сохраняя результат какRails.cache. Если этот объект отвечает на методmiddleware, его промежуточная программа вставляется доRack::Runtimeв стеке промежуточных программ.set_clear_dependencies_hook: Этот инициализатор - запускающийся только еслиcache_classesустановленаfalse- используетActionDispatch::Callbacks.afterдля удаления констант, на которые ссылались на протяжении запроса от пространства объекта, так что они могут быть перезагружены в течение следующего запроса.initialize_dependency_mechanism: Еслиconfig.cache_classestrue, конфигурируетActiveSupport::Dependencies.mechanismтребовать (require) зависимости, а не загружать (load) их.bootstrap_hook: Запускает все сконфигурированные блокиbefore_initialize.i18n.callbacks: В среде development, настраивает колбэкto_prepare, вызывающийI18n.reload!, если любая из локалей изменилась с последнего запроса. В режиме production этот колбэк запускается один раз при первом запросе.active_support.deprecation_behavior: Настраивает отчеты об устаревании для сред, по умолчанию:logдля development,:notifyдля production и:stderrдля test. Если дляconfig.active_support.deprecationне установлено значение, то инициализатор подскажет пользователю сконфигурировать эту строчку в файлеconfig/environmentsтекущей среды. Можно установить массив значений.active_support.initialize_time_zone: Устанавливает для приложения временную зону по умолчанию, основываясь на настройкеconfig.time_zone, которая по умолчанию равна "UTC".active_support.initialize_beginning_of_week: Устанавливает начало недели по умолчанию для приложения, основываясь на настройкеconfig.beginning_of_week, которая по умолчанию:monday.active_support.set_configs: Настраивает Active Support с помощью настроек вconfig.active_supportпосылая имена методов в качестве сеттеров вActiveSupportи передавая им значения.action_dispatch.configure: КонфигурируетActionDispatch::Http::URL.tld_lengthбыть равным значениюconfig.action_dispatch.tld_length.action_view.set_configs: Устанавливает, чтобы Action View использовал настройки вconfig.action_view, посылая имена методов черезsendкак сеттер вActionView::Baseи передавая в него значения.action_controller.assets_config: Инициализируетconfig.actions_controller.assets_dirдиректорией public приложения, если не сконфигурирована явно.action_controller.set_helpers_path: Устанавливает helpers_path у Action Controller равным helpers_path приложения.action_controller.parameters_config: Конфигурирует опции strong parameters дляActionController::Parameters.action_controller.set_configs: Устанавливает, чтобы Action Controller использовал настройки вconfig.action_controller, посылая имена методов черезsendкак сеттер вActionController::Baseи передавая в него значения.action_controller.compile_config_methods: Инициализирует методы для указанных конфигурационных настроек, чтобы доступ к ним был быстрее.active_record.initialize_timezone: УстанавливаетActiveRecord::Base.time_zone_aware_attributestrue, а такжеActiveRecord::Base.default_timezoneUTC. Когда атрибуты считываются из базы данных, они будут конвертированы во временную зону с использованиемTime.zone.active_record.logger: УстанавливаетActiveRecord::Base.logger- если еще не установлен - какRails.logger.active_record.migration_error: Конфигурирует промежуточную программу для проверки невыполненных миграций.active_record.check_schema_cache_dump: Загружает кэш дампа схемы, если настроен и доступен.active_record.warn_on_records_fetched_greater_than: Включает предупреждения, когда запросы возвращают большое количество записей.active_record.set_configs: Устанавливает, чтобы Active Record использовал настройки вconfig.active_record, посылая имена методов черезsendкак сеттер вActiveRecord::Baseи передавая в него значения.active_record.initialize_database: Загружает конфигурацию базы данных (по умолчанию) изconfig/database.ymlи устанавливает соединение для текущей среды.active_record.log_runtime: ВключаетActiveRecord::Railties::ControllerRuntime, ответственный за отчет в логгер по времени, затраченному вызовом Active Record для запроса.active_record.set_reloader_hooks: Сбрасывает все перезагружаемые соединения к базе данных, еслиconfig.cache_classesустановленаfalse.active_record.add_watchable_files: Добавляет файлыschema.rbиstructure.sqlв отслеживаемые.active_job.logger: УстанавливаетActiveRecord::Base.logger- если еще не установлен - какRails.logger.active_job.set_configs: Устанавливает, чтобы Active Job использовал настройкиconfig.active_job, посылая имена методов черезsendкак сеттер вActiveRecord::Baseи передавая в него значения.action_mailer.logger: УстанавливаетActionMailer::Base.logger- если еще не установлен - какRails.logger.action_mailer.set_configs: Устанавливает, чтобы Action Mailer использовал настройки вconfig.action_mailer, посылая имена методов черезsendкак сеттер вActionMailer::Baseи передавая в него значения.action_mailer.compile_config_methods: Инициализирует методы для указанных конфигурационных настроек, чтобы доступ к ним был быстрее.set_load_path: Этот инициализатор запускается передbootstrap_hook. Добавляет пути, определенныеconfig.load_paths, и пути автозагрузки к$LOAD_PATH.set_autoload_paths: Этот инициализатор запускается передbootstrap_hook. Добавляет все поддиректорииappи пути, определенныеconfig.autoload_paths,config.eager_load_pathsиconfig.autoload_once_pathsвActiveSupport::Dependencies.autoload_paths.add_routing_paths: Загружает (по умолчанию) все файлыconfig/routes.rb(в приложении и railties, включая engine-ы) и настраивает маршруты для приложения.add_locales: Добавляет файлы вconfig/locales(из приложения, railties и engine-ов) вI18n.load_path, делая доступными переводы в этих файлах.add_view_paths: Добавляет директориюapp/viewsиз приложения, railties и engine-ов в путь поиска файлов вьюх приложения.load_environment_config: Загружает файлconfig/environmentsдля текущей среды.prepend_helpers_path: Добавляет директориюapp/helpersиз приложения, railties и engine-ов в путь поиска файлов хелперов приложения.load_config_initializers: Загружает все файлы Ruby изconfig/initializersв приложении, railties и engine-ах. Файлы в этой директории могут использоваться для хранения конфигурационных настроек, которые нужно сделать после загрузки всех фреймворков.engines_blank_point: Предоставляет точку инициализации для хука, если нужно что-то сделать до того, как загрузятся engine-ы. После этой точки будут запущены все инициализаторы railties и engine-ов.add_generator_templates: Находит шаблоны для генераторов вlib/templatesприложения, railties и engine-ов, и добавляет их в настройкуconfig.generators.templates, что делает шаблоны доступными для всех ссылающихся генераторов.ensure_autoload_once_paths_as_subset: Убеждается, чтоconfig.autoload_once_pathsсодержит пути только изconfig.autoload_paths. Если она содержит другие пути, будет вызвано исключение.add_to_prepare_blocks: Блок для каждого вызоваconfig.to_prepareв приложении, railtie или engine добавляется в колбэкto_prepareдля Action Dispatch, который будет запущен при каждом запросе в development или перед первым запросом в production.add_builtin_route: Если приложение запускается в среде development, то в маршруты приложения будет добавлен маршрут дляrails/info/properties. Этот маршрут предоставляет подробную информацию, такую как версию Rails и Ruby дляpublic/index.htmlв приложении Rails по умолчанию.build_middleware_stack: Создает стек промежуточных программ для приложения, возвращает объект, у которого есть методcall, принимающий объект среды Rack для запроса.eager_load!: Еслиconfig.eager_loadtrue, запускает хукиconfig.before_eager_load, а затем вызываетeager_load!, загружающий всеconfig.eager_load_namespaces.finisher_hook: Представляет хук после завершения процесса инициализации приложения, а также запускает все блокиconfig.after_initializeдля приложения, railties и engine-ов.set_routes_reloader: Конфигурирует Action Dispatch, перезагружая файл маршрутов с использованиемActiveSupport::Callbacks.to_run.disable_dependency_loading: Отключает автоматическую загрузку зависимостей, еслиconfig.eager_loadустановлена true.
Настройка пула подключений к базе данных
Соединения с базой данных Active Record управляются с помощью ActiveRecord::ConnectionAdapters::ConnectionPool, который обеспечивает, что пул подключений синхронизирует количество тредов, получающих доступ, с ограниченным количеством подключений к базе данных. Этот лимит по умолчанию 5, и может быть настроен в database.yml.
development:
adapter: sqlite3
database: db/development.sqlite3
pool: 5
timeout: 5000
Поскольку управление пулом подключений по умолчанию происходит внутри Active Record, все серверы приложения (Thin, Puma, Unicorn и т.д.) должны вести себя так же. В самом начале пул подключений к базе данных пуст. По мере роста запросов на дополнительные подключения, он будет создавать их, пока не достигнет ограничения на подключения.
Каждый новый запрос займет подключение, как только он впервые запросит доступ в базу данных. В конце запроса он освободит подключение. Это означает, что дополнительный слот подключения будет снова доступен для следующего запроса в очереди.
Если попытаться использовать больше соединений, чем доступно, Active Record заблокируется и подождет соединение из пула. Если он не сможет получить соединение, будет вызвана следующая ошибка таймаута.
ActiveRecord::ConnectionTimeoutError - could not obtain a database connection within 5.000 seconds (waited 5.000 seconds)
Если вы получаете вышеприведенную ошибку, можно попытаться увеличить размер пула соединений, увеличив опцию pool в database.yml
NOTE: Если вы запускаете мультитредовую среду, есть вероятность, что несколько тредов могут получить доступ к нескольким подключениям одновременно. Поэтому, в зависимости от текущей загрузки, вы можете легко получить несколько тредов, претендующих на ограниченное количество подключений.
Произвольные настройки
Можно настроить свой собственный код с помощью конфигурационного объекта Rails с произвольными настройками или в пространстве имен config.x, либо непосредственно в config. Ключевой разницей между этими двумя вариантами является то, что необходимо использовать config.x, если вы определяете вложенную конфигурацию (например, config.x.nested.nested.hi), и просто config для одноуровневой конфигурации (например, config.hello).
config.x.payment_processing.schedule = :daily
config.x.payment_processing.retries = 3
config.super_debugger = true
Эти конфигурационные настройки доступны с помощью конфигурационного объекта:
Rails.configuration.x.payment_processing.schedule # => :daily
Rails.configuration.x.payment_processing.retries # => 3
Rails.configuration.x.payment_processing.not_set # => nil
Rails.configuration.super_debugger # => true
Также можно использовать Rails::Application.config_for для загрузки целых конфигурационных файлов:
# config/payment.yml:
production:
environment: production
merchant_id: production_merchant_id
public_key: production_public_key
private_key: production_private_key
development:
environment: sandbox
merchant_id: development_merchant_id
public_key: development_public_key
private_key: development_private_key
# config/application.rb
module MyApp
class Application < Rails::Application
config.payment = config_for(:payment)
end
end
Rails.configuration.payment['merchant_id'] # => production_merchant_id or development_merchant_id
Индексирование поисковыми движками
Иногда вы можете захотеть, чтобы некоторые страницы вашего приложения не были видимыми для поисковых сайтов, таких как Google, Bing, Yahoo или Duck Duck Go. Роботы, которые индексируют для этих сайтов, сначала анализируют файл http://your-site.com/robots.txt, который знает, какие страницы доступны для индексации.
Rails создает этот файл для вас внутри папки /public. По умолчанию все страницы вашего приложения доступны для индексации поисковыми движками. Если бы хотите запретить индексировать все страницы вашего приложения, используйте следующее:
User-agent: *
Disallow: /
Чтобы запретить только определенные страницы, необходимо использовать более сложный синтаксис. Изучите его в официальной документации.
Монитор событийной файловой системы
Если загружен гем listen, Rails использует монитор событийной файловой системы для обнаружения изменений, когда config.cache_classes равен false:
group :development do
gem 'listen', '>= 3.0.5', '< 3.2'
end
В противном случае, в каждом запросе Rails проходит по дереву приложения для проверки, не было ли что-то изменено.
Для Linux и macOS не нужны дополнительные гемы, но требуются для *BSD и для Windows.
Отметьте, что некоторые настройки не поддерживаются.