From c6c9652cb8611e90a0dffabee7a57ea017171b3c Mon Sep 17 00:00:00 2001 From: Yauheni Dakuka Date: Mon, 21 May 2018 16:16:40 +0300 Subject: [PATCH 1/2] Update 21.05 --- .yaspellerrc | 1 + source/3_0_release_notes.md | 2 +- source/4_0_release_notes.md | 2 +- source/5_2_release_notes.md | 2 + source/action_controller_overview.md | 28 +-- source/action_view_overview.md | 4 +- source/active_record_migrations.md | 22 ++- source/active_record_postgresql.md | 2 +- source/active_storage_overview.md | 143 ++++++++++++++- source/active_support_core_extensions.md | 22 +++ source/active_support_instrumentation.md | 2 +- source/api_app.md | 3 +- source/asset_pipeline.md | 2 +- source/association_basics.md | 16 +- source/autoloading_and_reloading_constants.md | 4 +- source/configuring.md | 6 + source/contributing_to_ruby_on_rails.md | 2 +- source/getting_started.md | 5 +- source/i18n.md | 18 +- source/index.yml | 164 +++++++++--------- source/maintenance_policy.md | 8 +- source/routing.md | 12 +- source/security.md | 14 +- source/testing.md | 40 +++-- source/upgrading_ruby_on_rails.md | 9 +- source/working_with_javascript_in_rails.md | 4 +- 26 files changed, 351 insertions(+), 186 deletions(-) diff --git a/.yaspellerrc b/.yaspellerrc index a520d840..b39ed39c 100644 --- a/.yaspellerrc +++ b/.yaspellerrc @@ -99,6 +99,7 @@ "масштабируемост(и|ь|ей|ью|ям|ях|ями)", "междоменн(ая|ое|ой|ую|ые|ым|ый|ых|ого|ыми)", "межсайтов(ая|ое|ой|ом|ую|ые|ым|ый|ых|ого|ыми)", + "местозаполнител(и|ь|ей|я|ям|ях|ями)", "метатег(а|е|и|у|ах|ов|ом|ами|)", "минимизатор(ы|а|ов|у|ам|е|ах|)", "минификатор(ы|а|ов|у|ам|е|ах|)", diff --git a/source/3_0_release_notes.md b/source/3_0_release_notes.md index 042d875c..db843356 100644 --- a/source/3_0_release_notes.md +++ b/source/3_0_release_notes.md @@ -230,7 +230,7 @@ Action Pack Подробнее: * [Render Options in Rails 3](https://www.engineyard.com/blog/render-options-in-rails-3) -* [Three reasons to love ActionController::Responder](http://weblog.rubyonrails.org/2009/8/31/three-reasons-love-responder) +* [Three reasons to love ActionController::Responder](https://weblog.rubyonrails.org/2009/8/31/three-reasons-love-responder) ### Action Dispatch diff --git a/source/4_0_release_notes.md b/source/4_0_release_notes.md index 9c71e868..4fd51323 100644 --- a/source/4_0_release_notes.md +++ b/source/4_0_release_notes.md @@ -47,7 +47,7 @@ $ ruby /path/to/rails/railties/bin/rails new myapp --dev Основные особенности -------------------- -[![Rails 4.0](/images/rails4_features.png)](/images/rails4_features.png) +[![Rails 4.0](/images/4_0_release_notes/rails4_features.png)](/images/4_0_release_notes/rails4_features.png) ### Апгрейд diff --git a/source/5_2_release_notes.md b/source/5_2_release_notes.md index 517f06ec..e648bf10 100644 --- a/source/5_2_release_notes.md +++ b/source/5_2_release_notes.md @@ -45,6 +45,8 @@ Rails 5.2 поддерживает [HTTP/2 Early Hints](https://tools.ietf.org/h Добавлен файл `config/credentials.yml.enc` для хранения секретов (secrets) приложения в production. Это разрешает сохранять любые учетные данные аутентификации для сторонних сервисов напрямую в репозиторий, зашифрованный с помощью ключа в файле `config/master.key` или переменной среды `RAILS_MASTER_KEY`. Это в конечном итоге заменит `Rails.application.secrets` и зашифрованные секреты, представленные в Rails 5.1. Кроме того, Rails 5.2 [открывает API соответствующие учетным данным](https://github.com/rails/rails/pull/30940), поэтому можно легко справиться с другими зашифрованными конфигурациями, ключами и файлами. +Подробнее об этом можно узнать в руководстве [Безопасность приложений на Rails](/ruby-on-rails-security-guide#nastraivaemye-uchetnye-dannye). + ### Политика защиты контента [Pull Request](https://github.com/rails/rails/pull/31162) diff --git a/source/action_controller_overview.md b/source/action_controller_overview.md index b297e7a3..6f120d17 100644 --- a/source/action_controller_overview.md +++ b/source/action_controller_overview.md @@ -399,14 +399,16 @@ class LoginsController < ApplicationController end ``` -Чтобы убрать что-то из сессии, присвойте этому ключу `nil`: +Чтобы убрать что-то из сессии, удалите пару ключ/значение: ```ruby class LoginsController < ApplicationController # "Удаляем" логин (при выходе пользователя) def destroy # Убираем id пользователя из сессии - @_current_user = session[:current_user_id] = nil + session.delete(:current_user_id) + # Очистить мемоизацию текущего пользователя + @_current_user = nil redirect_to root_url end end @@ -425,7 +427,7 @@ Flash - это специальная часть сессии, которая о ```ruby class LoginsController < ApplicationController def destroy - session[:current_user_id] = nil + session.delete(:current_user_id) flash[:notice] = "You have successfully logged out." redirect_to root_url end @@ -1084,22 +1086,4 @@ NOTE: Некоторые исключения перехватываемы то Навязывание протокола HTTPS --------------------------- -Иногда хочется навязать определенному контроллеру быть доступным только через протокол HTTPS по причинам безопасности. Можно использовать в контроллере метод `force_ssl` для принуждения к этому: - -```ruby -class DinnerController - force_ssl -end -``` - -Подобно фильтру, можно также передать `:only` и `:except` для обеспечения безопасного соединения только определенным экшнам. - -```ruby -class DinnerController - force_ssl only: :cheeseburger - # или - force_ssl except: :cheeseburger -end -``` - -Пожалуйста, отметьте, что если добавить `force_ssl` во многие контроллеры, то, возможно, вместо этого можно заставить все приложение использовать HTTPS. В этом случае можно установить `config.force_ssl` в файле окружения. +Если необходимо обеспечить доступ к определенному контроллеру только через HTTPS, нужно сделать это, включив промежуточную программу `ActionDispatch::SSL` через `config.force_ssl` в конфигурациях среды. diff --git a/source/action_view_overview.md b/source/action_view_overview.md index fe99e915..f8a3ca6f 100644 --- a/source/action_view_overview.md +++ b/source/action_view_overview.md @@ -1252,8 +1252,8 @@ password_field_tag 'pass' Создает радиокнопку; используйте группу радиокнопок с одинаковым именем, чтобы пользователи могли выбирать из группы опций. ```ruby -radio_button_tag 'gender', 'male' -# => +radio_button_tag 'favorite_color', 'maroon' +# => ``` #### select_tag diff --git a/source/active_record_migrations.md b/source/active_record_migrations.md index 7d656e30..5408ade3 100644 --- a/source/active_record_migrations.md +++ b/source/active_record_migrations.md @@ -733,17 +733,15 @@ end ### Для чего нужны файлы схемы? -Миграции, какими бы не были они мощными, не являются авторитетным источником для вашей схемы базы данных. Это роль достается или файлу `db/schema.rb`, или файлу SQL, которые генерирует Active Record при исследовании базы данных. Они разработаны не для редактирования, они всего лишь отражают текущее состояние базы данных. +Миграции, какими бы не были они мощными, не являются авторитетным источником для схемы базы данных. База данных остается авторитетным источником. По умолчанию Rails генерирует `db/schema.rb`, которая пытается охватить текущее состояние схемы базы данных. -Не нужно (это может привести к ошибке) развертывать новый экземпляр приложения, применяя всю историю миграций. Намного проще и быстрее загрузить в базу данных описание текущей схемы. +Она имеет тенденцию быть более быстрой и менее подверженной ошибкам, связанных с созданием нового экземпляра базы данных приложения, загружая файл схемы через `rails db:schema:load`, чем при повторном воспроизведении всей истории миграций. Старые миграции могут работать неправильно, если эти миграции используют изменения внешних зависимостей или полагаются на код приложения, который развивается отдельно от этих миграций. -Например, как создается тестовая база данных: текущая рабочая база данных выгружается (или в `db/schema.rb`, или в `db/structure.sql`), а затем загружается в тестовую базу данных. - -Файлы схемы также полезны, если хотите быстро взглянуть, какие атрибуты есть у объекта Active Record. Эта информация не содержится в коде модели и часто размазана по нескольким миграциям, но собрана воедино в файле схемы. Имеется гем [annotate_models](https://github.com/ctran/annotate_models), который автоматически добавляет и обновляет комментарии в начале каждой из моделей, составляющих схему, если хотите такую функциональность. +Файлы схемы также полезны, если хотите быстро взглянуть, какие атрибуты есть у объекта Active Record. Эта информация не содержится в коде модели и часто размазана по нескольким миграциям, но собрана воедино в файле схемы. ### Типы выгрузок схемы -Есть два способа выгрузить схему. Они устанавливаются в `config/environment.rb` в свойстве `config.active_record.schema_format`, которое может быть или `:sql`, или `:ruby`. +Формат выгрузки схемы, сгенерированный Rails, управляется настройкой `config.active_record.schema_format` в `config/application.rb`. Форматом по умолчанию является `:ruby`, но также он может быть установлен в `:sql`. Если выбрано `:ruby`, тогда схема хранится в `db/schema.rb`. Посмотрев в этот файл, можно увидеть, что он очень похож на одну большую миграцию: @@ -765,19 +763,19 @@ ActiveRecord::Schema.define(version: 20080906171750) do end ``` -Во многих случаях этого достаточно. Этот файл создается с помощью проверки базы данных и описывает свою структуру, используя `create_table`, `add_index` и так далее. Так как он не зависит от типа базы данных, он может быть загружен в любую базу данных, поддерживаемую Active Record. Это очень полезно, если Вы распространяете приложение, которое может быть запущено на разных базах данных. +Во многих случаях этого достаточно. Этот файл создается с помощью проверки базы данных и описывает свою структуру, используя `create_table`, `add_index` и так далее. -NOTE: `db/schema.rb` не может описать специфичные элементы базы данных, такие как триггеры, последовательности, хранимые процедуры, ограничения `CHECK` и так далее. Отметьте, в то время, как в миграциях вы можете выполнить произвольные выражения SQL, эти выражения не смогут быть воспроизведены выгрузчиком схемы. Если вы используете подобные особенности, нужно установить формат схемы `:sql`. +`db/schema.rb` не может описать все, что может поддерживать база данных, например триггеры, последовательности, хранимые процедуры, ограничения `CHECK` и так далее. Отметьте, в то время, как в миграциях вы можете выполнить произвольные выражения SQL, эти выражения не смогут быть воспроизведены выгрузчиком схемы. Если вы используете подобные особенности, нужно установить формат схемы `:sql`. В то время как миграции могут использовать `execute` для создания конструкций базы данных, которые не поддерживаются миграциями Ruby DSL, эти конструкции, возможно, не смогут быть восстановлены с помощью выгрузчика схемы. Если используете подобные особенности, нужно установить формат схемы как `:sql`, чтобы получить точный файл схемы, который будет полезен для создания новых экземпляров базы данных. -Вместо использования выгрузчика схемы Active Records, структура базы данных будет выгружена с помощью инструмента, предназначенного для этой базы данных (с помощью задачи rails `db:structure:dump`) в `db/structure.sql`. Например, для PostgreSQL используется утилита `pg_dump`. Для MySQL и MariaDB этот файл будет содержать результат `SHOW CREATE TABLE` для разных таблиц. +Когда формат схемы установлен в `: sql`, структура базы данных будет выгружена с помощью инструмента, предназначенного для этой базы данных в `db/structure.sql`. Например, для PostgreSQL используется утилита `pg_dump`. Для MySQL и MariaDB этот файл будет содержать результат `SHOW CREATE TABLE` для разных таблиц. -Загрузка таких схем это просто выполнение содержащихся в них выражений SQL. По определению создастся точная копия структуры базы данных. Использование формата `:sql` схемы, однако, предотвращает загрузку схемы в СУБД иную, чем использовалась при ее создании. +Чтобы загрузить схему из `db / structure.sql`, запустите `rails db: structure: load`. Загрузка этого файла осуществляется путем выполнения содержащихся в нем выражений SQL. По определению создастся точная копия структуры базы данных. ### Выгрузки схем и контроль исходного кода -Поскольку выгрузки схем это авторитетный источник для вашей схемы базы данных, очень рекомендовано включать их в контроль исходного кода. +Поскольку файлы схемы обычно используются для создания новых баз данных, настоятельно рекомендуется проверить файл схемы в контроле исходного кода. -`db/schema.rb` содержит число текущей версии базы данных. Это обеспечивает возникающие конфликты в случае слияния двух веток, каждая из которых затрагивала схему. Когда такое случится, исправьте конфликты вручную, оставив наибольшее число версии. +Конфликты слияния могут возникать в файле схемы, когда две ветки модифицируют схему. Для разрешения этих конфликтов, запустите `rails db:migrate`, чтобы восстановить файл схемы. (Active Record and Referential Integrity) Active Record и ссылочная целостность ------------------------------------------------------------------------------- diff --git a/source/active_record_postgresql.md b/source/active_record_postgresql.md index 6efd9090..ae37cde5 100644 --- a/source/active_record_postgresql.md +++ b/source/active_record_postgresql.md @@ -342,7 +342,7 @@ create_table :users, force: true do |t| t.column :settings, "bit(8)" end -# app/models/device.rb +# app/models/user.rb class User < ApplicationRecord end diff --git a/source/active_storage_overview.md b/source/active_storage_overview.md index 08afbd4e..60bab7c7 100644 --- a/source/active_storage_overview.md +++ b/source/active_storage_overview.md @@ -262,6 +262,33 @@ end @message.images.attached? ``` +### Прикрепление объектов File/IO + +Иногда необходимо прикрепить файл, который не поступает через HTTP-запрос. Например, может понадобиться прикрепить файл, сгенерированный на диске, или загрузить файл из введенного пользователем URL. Также можно захотеть прикрепить файл фикстур в тесте модели. Чтобы сделать это, предоставьте хэш, содержащий хотя бы открытый объект IO и имя файла: + +```ruby +@message.image.attach(io: File.open('/path/to/file'), filename: 'file.pdf') +``` + +Когда это возможно, предоставьте тип содержимого. Active Storage пытается определить тип содержимого файла по его данным. Если он не может этого сделать, он возвращает тип содержимого, которое предоставляется. + +```ruby +@message.image.attach(io: File.open('/path/to/file'), filename: 'file.pdf', content_type: 'application/pdf') +``` + +Можно пропустить определение типа содержимого из данных, передав `identify: false` вместе с `content_type`. + +```ruby +@message.image.attach( + io: File.open('/path/to/file'), + filename: 'file.pdf', + content_type: 'application/pdf' + identify: false +) +``` + +Если не предоставляется тип содержимого и Active Storage не может автоматически определить тип содержимого файла, по умолчанию используется application/octet-stream. + Удаление прикрепленных файлов ----------------------------- @@ -290,22 +317,52 @@ url_for(user.avatar) rails_blob_path(user.avatar, disposition: "attachment") ``` +Если необходимо создать ссылку из-за пределов содержимого контроллера/вьюхи (фоновые задания, задания Cron и т.д.), можно получить доступ к rails_blob_path следующим образом: + +``` +Rails.application.routes.url_helpers.rails_blob_path(user.avatar, only_path: true) +``` + +Скачивание файлов +----------------- + +Иногда необходимо обработать blob после его загрузки - например, чтобы преобразовать его в другой формат. Используйте `ActiveStorage::Blob#download` для чтения двоичных данных blob в памяти: + +```ruby +binary = user.avatar.download +``` + +Возможно, может понадобиться загрузить blob в файл на диске, чтобы внешняя программа могла работать с ним (например, антивирусный сканер или медиатранскодер). Используйте `ActiveStorage::Blob#open`, чтобы загрузить blob в tempfile на диске: + +```ruby +message.video.open do |file| + system '/path/to/virus/scanner', file.path + # ... +end +``` + Преобразование изображений -------------------------- -Чтобы создать вариацию изображения, следует вызвать `variant` на Blob. -Также возможно передать любое преобразование, поддерживаемое [MiniMagick](https://github.com/minimagick/minimagick), методу. +Чтобы создать вариацию изображения, следует вызвать `variant` на Blob. Также возможно передать любое преобразование методу, поддерживаемому процессором. Процессором по умолчанию является [MiniMagick](https://github.com/minimagick/minimagick), но также можно использовать [Vips](http://www.rubydoc.info/gems/ruby-vips/Vips/Image). -Чтобы включить варианты, добавьте `mini_magick` в `Gemfile`: +Чтобы включить варианты, добавьте гем `image_processing` в `Gemfile`: ```ruby -gem 'mini_magick' +gem 'image_processing', '~> 1.2' ``` Когда браузер обращается к URL варианта, Active Storage будет лениво преобразовывать исходный blob в указанный формат и перенаправлять его к новому месту расположения сервиса. ```erb -<%= image_tag user.avatar.variant(resize: "100x100") %> +<%= image_tag user.avatar.variant(resize_to_fit: [100, 100]) %> +``` + +Чтобы переключиться на процессор Vips, необходимо добавить следующее в `config/application.rb`: + +```ruby +# Используйте Vips для обработки вариантов. +config.active_storage.variant_processor = :vips ``` Предварительный просмотр файлов @@ -317,7 +374,7 @@ gem 'mini_magick' @@ -462,6 +519,80 @@ input[type=file][data-direct-upload-url][disabled] { } ``` +### Интеграция с библиотеками или фреймворками + +Если необходимо использовать особенность прямой загрузки из фреймворка JavaScript или необходима интеграция собственных решений перетаскивания (drag-and-drop), для этой цели можно использовать класс `DirectUpload`. Получив файл из выбранной библиотеки, создайте экземпляр DirectUpload и вызовите его метод create. Этот метод принимает колбэк для вызова, когда загрузка завершена. + +```js +import { DirectUpload } from "activestorage" + +const input = document.querySelector('input[type=file]') + +// Привязка к отбрасыванию (drop) файла - используйте ondrop на родительском элементе или используйте библиотеку, такую как Dropzone +const onDrop = (event) => { + event.preventDefault() + const files = event.dataTransfer.files; + Array.from(files).forEach(file => uploadFile(file)) +} + +// Привязка к обычному выбору файла +input.addEventListener('change', (event) => { + Array.from(input.files).forEach(file => uploadFile(file)) + // можно очистить выбранные файлы из поля ввода + input.value = null +}) + +const uploadFile = (file) { + // форма требует file_field direct_upload: true, который предоставляет data-direct-upload-url + const url = input.dataset.directUploadUrl + const upload = new DirectUpload(file, url) + + upload.create((error, blob) => { + if (error) { + // Обрабатываем ошибку + } else { + // Добавьте соответствующим образом названное скрытое поле в форму со значением blob.signed_id, чтобы идентификаторы blob были переданы в обычном потоке загрузки + const hiddenField = document.createElement('input') + hiddenField.setAttribute("type", "hidden"); + hiddenField.setAttribute("value", blob.signed_id); + hiddenField.name = input.name + document.querySelector('form').appendChild(hiddenField) + } + }) +} +``` + +Если необходимо отслеживать ход загрузки файла, можно передать третий параметр в конструктор `DirectUpload`. Во время загрузки DirectUpload вызовет метод `directUploadWillStoreFileWithXHR` объекта. Затем можно привязать свой собственный обработчик прогресса на XHR. + +```js +import { DirectUpload } from "activestorage" + +class Uploader { + constructor(file, url) { + this.upload = new DirectUpload(this.file, this.url, this) + } + + upload(file) { + this.upload.create((error, blob) => { + if (error) { + // Обрабатываем ошибку + } else { + // Добавьте соответствующим образом названное скрытое поле в форму со значением of blob.signed_id + } + }) + } + + directUploadWillStoreFileWithXHR(request) { + request.upload.addEventListener("progress", + event => this.directUploadDidProgress(event)) + } + + directUploadDidProgress(event) { + // Используйте event.loaded и event.total, чтобы обновить индикатор процесса + } +} +``` + Очистка файлов сохраненных во время системных тестов ---------------------------------------------------- diff --git a/source/active_support_core_extensions.md b/source/active_support_core_extensions.md index a6315a90..66fa71de 100644 --- a/source/active_support_core_extensions.md +++ b/source/active_support_core_extensions.md @@ -769,6 +769,14 @@ delegate :size, to: :attachment, prefix: :avatar В предыдущем примере макрос генерирует `avatar_size`, а не `size`. +Опция `:private` изменяет область видимости методов: + +```ruby +delegate :date_of_birth, to: :profile, private: true +``` + +Делегированные методы являются публичными по умолчанию. Передайте `private: true`, чтобы изменить это. + NOTE: Определено в `active_support/core_ext/module/delegation.rb` #### `delegate_missing_to` @@ -2010,6 +2018,20 @@ WARNING. Ключи, как правило, должны быть уникаль NOTE: Определено в `active_support/core_ext/enumerable.rb`. +### `index_with` + +Метод `index_with` генерирует хэш с элементами перечисления в качестве ключей. Значение является либо переданным по умолчанию, либо возвращенным в блоке. + +```ruby +%i( title body created_at ).index_with { |attr_name| public_send(attr_name) } +# => { title: "hey", body: "what's up?", … } + +WEEKDAYS.index_with([ Interval.all_day ]) +# => { monday: [ 0, 1440 ], … } +``` + +NOTE: Defined in `active_support/core_ext/enumerable.rb`. + ### `many?` Метод `many?` это сокращение для `collection.size > 1`: diff --git a/source/active_support_instrumentation.md b/source/active_support_instrumentation.md index 43484134..28f949d2 100644 --- a/source/active_support_instrumentation.md +++ b/source/active_support_instrumentation.md @@ -167,7 +167,7 @@ INFO. Дополнительные ключи могут быть добавле ### send_data.action_controller -`ActionController` не имеет какой-либо конкретной информации при загрузке. Все опции передаются через полезную нагрузку (payload). +`ActionController` не добавляет какой-либо конкретной информации при загрузке. Все опции передаются через полезную нагрузку (payload). ### redirect_to.action_controller diff --git a/source/api_app.md b/source/api_app.md index 8859e567..7cf2a29d 100644 --- a/source/api_app.md +++ b/source/api_app.md @@ -17,7 +17,7 @@ С приходом клиентских фреймворков многие разработчики используют Rails для создания бэкенда, общего для их веб-приложений и других нативных приложений. -Например, Twitter использует свой [публичный API](https://dev.twitter.com) в своем веб-приложении, который создан как статичный сайт, потребляющий ресурсы JSON. +Например, Twitter использует свой [публичный API](https://developer.twitter.com/) в своем веб-приложении, который создан как статичный сайт, потребляющий ресурсы JSON. Вместо использования Rails для генерации HTML, взаимодействующего с сервером с помощью форм и ссылок, многие разработчики трактуют их веб-приложения как всего лишь клиент API, созданный из HTML с помощью JavaScript, обращающегося к JSON API. @@ -274,7 +274,6 @@ API-приложение (использующее `ActionController::API`) по - `ActionController::ConditionalGet`: Поддержка для `stale?`. - `ActionController::BasicImplicitRender`: Убеждается, что возвращен пустой отклик, если нет явного. - `ActionController::StrongParameters`: Поддержка для белых списков параметров в сочетании с массовым назначением Active Model. -- `ActionController::ForceSSL`: Поддержка для `force_ssl`. - `ActionController::DataStreaming`: Поддержка для `send_file` и `send_data`. - `AbstractController::Callbacks`: Поддержка для `before_action` и подобных хелперов. - `ActionController::Rescue`: Поддержка для `rescue_from`. diff --git a/source/asset_pipeline.md b/source/asset_pipeline.md index 0124fdbd..f585791e 100644 --- a/source/asset_pipeline.md +++ b/source/asset_pipeline.md @@ -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-randomhex.json` (где `randomhex` - это 16-байтовая случайная шестнадцатеричная строка), который содержит список всех ваших ассетов и соответствующие им метки. Это используется методами хелпера Rails, чтобы избежать направления запроса в Sprockets. Обычный файл манифеста выглядит так: ```ruby {"files":{"application-aee4be71f1288037ae78b997df388332edfd246471b533dcedaa8f9fe156442b.js":{"logical_path":"application.js","mtime":"2016-12-23T20:12:03-05:00","size":412383, diff --git a/source/association_basics.md b/source/association_basics.md index e91b9439..3ef29bcf 100644 --- a/source/association_basics.md +++ b/source/association_basics.md @@ -92,7 +92,7 @@ class Book < ApplicationRecord end ``` -![Диаграмма для связи belongs_to](/images/belongs_to.png) +![Диаграмма для связи belongs_to](/images/association_basics/belongs_to.png) NOTE: связи `belongs_to` _обязаны_ использовать единственное число. Если использовать множественное число в вышеприведенном примере для связи `author` в модели `Book`, вам будет сообщено "uninitialized constant Book::Authors". Это так, потому что Rails автоматически получает имя класса из имени связи. Если в имени связи неправильно использовано число, то получаемый класс также будет неправильного числа. @@ -125,7 +125,7 @@ class Supplier < ApplicationRecord end ``` -![Диаграмма для связи has_one](/images/has_one.png) +![Диаграмма для связи has_one](/images/association_basics/has_one.png) Соответствующая миграция может выглядеть так: @@ -167,7 +167,7 @@ end NOTE: Имя другой модели указывается во множественном числе при объявлении связи `has_many`. -![Диаграмма для связи has_many](/images/has_many.png) +![Диаграмма для связи has_many](/images/association_basics/has_many.png) Соответствующая миграция может выглядеть так: @@ -209,7 +209,7 @@ class Patient < ApplicationRecord end ``` -![Диаграмма для связи has_many :through](/images/has_many_through.png) +![Диаграмма для связи has_many :through](/images/association_basics/has_many_through.png) Соответствующая миграция может выглядеть так: @@ -291,7 +291,7 @@ class AccountHistory < ApplicationRecord end ``` -![Диаграмма для связи has_one :through](/images/has_one_through.png) +![Диаграмма для связи has_one :through](/images/association_basics/has_one_through.png) Соответствующая миграция может выглядеть так: @@ -332,7 +332,7 @@ class Part < ApplicationRecord end ``` -![Диаграмма для связи has_and_belongs_to_many](/images/habtm.png) +![Диаграмма для связи has_and_belongs_to_many](/images/association_basics/habtm.png) Соответствующая миграция может выглядеть так: @@ -486,7 +486,7 @@ class CreatePictures < ActiveRecord::Migration[5.0] end ``` -![Диаграмма для полиморфной связи](/images/polymorphic.png) +![Диаграмма для полиморфной связи](/images/association_basics/polymorphic.png) ### Присоединение к себе @@ -497,7 +497,7 @@ class Employee < ApplicationRecord has_many :subordinates, class_name: "Employee", foreign_key: "manager_id" - belongs_to :manager, class_name: "Employee" + belongs_to :manager, class_name: "Employee", optional: true end ``` diff --git a/source/autoloading_and_reloading_constants.md b/source/autoloading_and_reloading_constants.md index 361eefd7..606f0fa4 100644 --- a/source/autoloading_and_reloading_constants.md +++ b/source/autoloading_and_reloading_constants.md @@ -190,7 +190,9 @@ Admin.name # => "Admin" WARNING. Контекст выполнения блока, переданного в `Class.new` или `Module.new`, не полностью эквивалентен контексту тела определений с помощью ключевых слов `class` и `module`. Но обе идиомы приводят к одинаковому назначению константы. -Таким образом, когда кто-то говорит "класс `String`", в реальности это означает: объект класса, хранимого в константе с именем "String" в объекте класса, хранимого в константе `Object`. С другой стороны, `String` — это обычная константа Ruby, и к ней применяется все, относящееся к константам, например применяемые к ней алгоритмы резолюции. +Таким образом, когда кто-то говорит "класс `String`", технически это означает объект класса, хранимого в константе с именем "String". Эта константа, в свою очередь, принадлежит объекту класса, хранящемуся в константе, называемой "Object". + +`String` — это обычная константа, и к ней применяется все, относящееся к константам, например применяемые к ней алгоритмы резолюции. Более того, в контроллере diff --git a/source/configuring.md b/source/configuring.md index cf8b9a5c..bee5bf04 100644 --- a/source/configuring.md +++ b/source/configuring.md @@ -400,6 +400,8 @@ config.middleware.delete Rack::MethodOverride * `ActiveRecord::SchemaDumper.ignore_tables` принимает массив таблиц, которые _не_ должны быть включены в любой генерируемый файл схемы. +* `ActiveRecord::SchemaDumper.fk_ignore_pattern` позволяет настроить другое регулярное выражение, которое будет использоваться для определения того, следует ли выгружать имя внешнего ключа из db/schema.rb или нет. По умолчанию имена внешних ключей, начинающиеся с `fk_rails_`, не экспортируются в выгрузку схемы базы данных. По умолчанию используется `/^fk_rails_[0-9a-f]{10}$/`. + ### Конфигурирование Action Controller `config.action_controller` включает несколько конфигурационных настроек: @@ -565,6 +567,8 @@ config.middleware.delete Rack::MethodOverride * `config.action_view.default_enforce_utf8` определяет, генерируются ли формы со скрытым тегом, который заставляет старые версии Internet Explorer отправлять формы, закодированные в UTF-8. Это по умолчанию `false`. +* `config.action_view.finalize_compiled_template_methods` определяет, должны ли методы в `ActionView::CompiledTemplates` сами удалять собранные шаблоны, когда экземпляры шаблонов уничтожаются сборщиком мусора. Это помогает предотвратить утечку памяти в режиме разработки, но для больших тестовых набов отказ этой опции в тестовой среде может повысить производительность. Это по умолчанию `true`. + ### (configuring-action-mailer) Конфигурирование Action Mailer Имеется несколько доступных настроек `ActionMailer::Base`: @@ -727,6 +731,8 @@ config.middleware.delete Rack::MethodOverride `config.active_storage` предоставляет следующие опции конфигурации: +* `config.active_storage.variant_processor` принимает символ `:mini_magick` или `:vips`, указывая, будут ли варианты преобразования выполняться с помощью MiniMagick или ruby-vips. По умолчанию это `:mini_magick`. + * `config.active_storage.analyzers` принимает массив классов, указывающий анализаторы, доступные для blobs в Active Storage. По умолчанию используется `[ActiveStorage::Analyzer::ImageAnalyzer, ActiveStorage::Analyzer::VideoAnalyzer]`. Первый может извлекать ширину и высоту blob изображения; последний может извлекать ширину, высоту, длительность, угол и соотношение сторон blob видео. * `config.active_storage.previewers` принимает массив классов, указывающий на предпросмотрщики изображений, доступные для blobs в Active Storage. По умолчанию используется `[ActiveStorage::Previewer::PDFPreviewer, ActiveStorage::Previewer::VideoPreviewer]`. Первый может генерировать миниатюру из первой страницы blob PDF; последний из соответствующего кадра blob видео. diff --git a/source/contributing_to_ruby_on_rails.md b/source/contributing_to_ruby_on_rails.md index 403b71f8..743466fa 100644 --- a/source/contributing_to_ruby_on_rails.md +++ b/source/contributing_to_ruby_on_rails.md @@ -348,7 +348,7 @@ CHANGELOG — это важная часть каждого релиза. Он end end - You can continue after the code example and you can attach issue number. GH#1234 + You can continue after the code example and you can attach issue number. Fixes #1234. *Your Name* ``` diff --git a/source/getting_started.md b/source/getting_started.md index 3d1b71b7..99c00915 100644 --- a/source/getting_started.md +++ b/source/getting_started.md @@ -56,7 +56,7 @@ ruby 2.5.0 Rails требует, чтобы был установлен Ruby версии 2.4.1 или новее. Если номер версии меньше этой, нужно будет установить новую копию Ruby. -TIP: Существует ряд инструментов для помощи в быстрой установке Ruby и Ruby on Rails в вашей системе. Пользователи Windows могут использовать [Rails Installer](http://railsinstaller.org), а пользователи macOS могут использовать [Tokaido](https://github.com/tokaido/tokaidoapp). Больше методов для установки для большинства операционных систем можно увидеть на [ruby-lang.org](https://www.ruby-lang.org/en/documentation/installation/). +TIP: Чтобы быстро установить Ruby и Ruby on Rails в системе пользователи Windows могут использовать [Rails Installer](http://railsinstaller.org). Дополнительные методы установки для большинства операционных систем можно увидеть на [ruby-lang.org](https://www.ruby-lang.org/en/documentation/installation/). Если работаете в Windows, необходимо установить [Ruby Installer Development Kit](https://rubyinstaller.org/downloads/). @@ -122,6 +122,7 @@ $ cd blog |public/ |Единственная папка, которая доступна извне как есть. Содержит статичные файлы и скомпилированные ассеты.| |Rakefile |Этот файл находит и загружает задачи, которые могут быть запущены в командной строке. Определенная задача доступна во всех компонентах Rails. Вместо изменения `Rakefile`, можно добавить свои собственные задачи, добавив файлы в директорию `lib/tasks` приложения.| |README.md |Это вводный мануал для вашего приложения. Его следует отредактировать, чтобы рассказать остальным, что ваше приложение делает, как его настроить, и т.п.| +|storage/|Файлы Active Storage для сервиса Disk. Это раскрывается в руководстве [Обзор Active Storage](/active_storage_overview).| |test/ |Юнит-тесты, фикстуры и прочий аппарат тестирования. Это раскрывается в руководстве [Тестирование приложений на Rails](/a-guide-to-testing-rails-applications)| |tmp/ |Временные файлы (такие как файлы кэша и pid)| |vendor/ |Место для кода сторонних разработчиков. В типичном приложении на Rails включает внешние гемы.| @@ -538,7 +539,7 @@ private end ``` -TIP: За подробностями обратитесь к [этой статье по Strong Parameters](http://weblog.rubyonrails.org/2012/3/21/strong-parameters/). +TIP: За подробностями обратитесь к [этой статье по Strong Parameters](https://weblog.rubyonrails.org/2012/3/21/strong-parameters/). ### Отображение статей diff --git a/source/i18n.md b/source/i18n.md index 12c3e0f2..29f660af 100644 --- a/source/i18n.md +++ b/source/i18n.md @@ -807,14 +807,14 @@ NOTE: Автоматическое преобразование в HTML-безо en: activerecord: models: - user: Dude + user: Customer attributes: user: login: "Handle" # переводит атрибут "login" у User как "Handle" ``` -Тогда `User.model_name.human` возвратит "Dude", а `User.human_attribute_name("login")` возвратит "Handle". +Тогда `User.model_name.human` возвратит "Customer", а `User.human_attribute_name("login")` возвратит "Handle". Для имен модели также можно установить множественное число, добавив следующее: @@ -823,11 +823,11 @@ en: activerecord: models: user: - one: Dude - other: Dudes + one: Customer + other: Customers ``` -Тогда `User.model_name.human(count: 2)` возвратит "Dudes". С `count: 1` или без параметров возвратит "Dude". +Тогда `User.model_name.human(count: 2)` возвратит "Customers". С `count: 1` или без параметров возвратит "Customer". В случае необходимости получить доступ к вложенным атрибутам модели, следует показать эту вложенность в виде `model/attribute` на уровне модели в файле переводов: @@ -835,12 +835,12 @@ en: en: activerecord: attributes: - user/gender: - female: "Female" - male: "Male" + user/role: + admin: "Admin" + contributor: "Contributor" ``` -Тогда `User.human_attribute_name("gender.female")` возвратит "Female". +Тогда `User.human_attribute_name("role.admin")` возвратит "Admin". NOTE: Если используется класс, включающий `ActiveModel`, но не наследованный от `ActiveRecord::Base`, замените `activerecord` на `activemodel` в вышеприведенных путях ключей. diff --git a/source/index.yml b/source/index.yml index 9559ab67..d1d53f3a 100644 --- a/source/index.yml +++ b/source/index.yml @@ -15,152 +15,152 @@ pages: - title: Rails для начинающих path: getting-started-with-rails file: getting_started.md - revision: aa8f51b97c262edbf4f020250613e27f51e83bf8 - date: 17/03/2018 + revision: 258670244dae39616a50ec1116f52e91b6f0bc62 + date: 09/05/2018 - title: Основы Active Record path: active-record-basics file: active_record_basics.md - revision: e08e7453457395680607726a56c97e8a01f3bcd0 - date: 24/01/2018 + revision: 258670244dae39616a50ec1116f52e91b6f0bc62 + date: 09/05/2018 - title: Миграции Active Record path: rails-database-migrations file: active_record_migrations.md - revision: f1b14944841ab4890dacb755dcae627dae101d67 - date: 12/03/2018 + revision: 258670244dae39616a50ec1116f52e91b6f0bc62 + date: 09/05/2018 - title: Валидации Active Record path: active-record-validations file: active_record_validations.md - revision: 0ce768168610e97d4a726aa77aae748777e69465 - date: 09/01/2018 + revision: 258670244dae39616a50ec1116f52e91b6f0bc62 + date: 09/05/2018 - title: Колбэки Active Record path: active-record-callbacks file: active_record_callbacks.md - revision: 5645149d3a27054450bd1130ff5715504638a5f5 - date: 15/02/2018 + revision: 258670244dae39616a50ec1116f52e91b6f0bc62 + date: 09/05/2018 - title: Связи (ассоциации) Active Record path: active-record-associations file: association_basics.md - revision: cb8da7aca4d426058d3c67b8f206224e5856770e - date: 26/01/2018 + revision: 258670244dae39616a50ec1116f52e91b6f0bc62 + date: 09/05/2018 - title: Интерфейс запросов Active Record path: active-record-query-interface file: active_record_querying.md - revision: 20bb26a428b84ae4f7b09bec284152325b0334f6 - date: 04/12/2017 + revision: 258670244dae39616a50ec1116f52e91b6f0bc62 + date: 09/05/2018 - title: Active Record для PostgreSQL path: active-record-postgresql file: active_record_postgresql.md - revision: ccf66ab383184a1b3a8a120298ce143ddfeb1f15 - date: 04/03/2018 + revision: 378daaa6afcdd872bab855404658e27163b0926c + date: 06/05/2018 - title: Основы Active Model path: active-model-basics file: active_model_basics.md - revision: de2afdc457d63ee628b5cac4e7bb73812e016e38 - date: 06/10/2017 + revision: 258670244dae39616a50ec1116f52e91b6f0bc62 + date: 09/05/2018 - title: Обзор Action View path: action-view-overview file: action_view_overview.md - revision: f1b14944841ab4890dacb755dcae627dae101d67 - date: 12/03/2018 + revision: 258670244dae39616a50ec1116f52e91b6f0bc62 + date: 09/05/2018 - title: Макеты и рендеринг в Rails path: layouts-and-rendering-in-rails file: layouts_and_rendering.md - revision: 264f4a6b1456d8ab66bd444a1f8d96ebd44d17f3 - date: 26/12/2017 + revision: 258670244dae39616a50ec1116f52e91b6f0bc62 + date: 09/05/2018 - title: Хелперы форм в Action View path: rails-form-helpers file: form_helpers.md - revision: 53593a66362550367561507e12576a876a0cbb6c - date: 13/12/2017 + revision: 258670244dae39616a50ec1116f52e91b6f0bc62 + date: 09/05/2018 - title: Обзор Action Controller path: action-controller-overview file: action_controller_overview.md - revision: 2273f5228acb1bb32454cbb7f8affeff25e83336 - date: 25/03/2018 + revision: 258670244dae39616a50ec1116f52e91b6f0bc62 + date: 09/05/2018 - title: Роутинг в Rails path: rails-routing file: routing.md - revision: 7bede102d2fb279204665cb5c80249eace486021 - date: 12/03/2018 + revision: 258670244dae39616a50ec1116f52e91b6f0bc62 + date: 09/05/2018 - title: Расширения ядра Active Support path: active-support-core-extensions file: active_support_core_extensions.md - revision: acbcec8ea869849f98213fea5e554bb3a82fea61 - date: 03/03/2018 + revision: 429f15ff7ffbd3f8d1647e5a337daa939f10944b + date: 21/05/2018 - title: Инструметарий Active Support path: active-support-instrumentation file: active_support_instrumentation.md - revision: 19e9e1492e22fde731bf41276fbd2c7c54e51f7a - date: 11/12/2017 + revision: 258670244dae39616a50ec1116f52e91b6f0bc62 + date: 09/05/2018 - title: API интернационализации Rails (I18n) path: rails-internationalization-i18n-api file: i18n.md - revision: fc55c34bea1a499a201b0516b8493d0596e01934 - date: 09/03/2018 + revision: 258670244dae39616a50ec1116f52e91b6f0bc62 + date: 09/05/2018 - title: Основы Action Mailer path: action-mailer-basics file: action_mailer_basics.md - revision: 4c9c3ffc2e80155f31dbcf80591618ed1c858685 - date: 22/03/2018 + revision: 258670244dae39616a50ec1116f52e91b6f0bc62 + date: 09/05/2018 - title: Основы Active Job path: active_job_basics file: active_job_basics.md - revision: cdfecb800cf21ee988db8d47634c45a85a834e3c - date: 15/03/2018 + revision: 258670244dae39616a50ec1116f52e91b6f0bc62 + date: 09/05/2018 - title: Тестирование приложений на Rails path: a-guide-to-testing-rails-applications file: testing.md - revision: a713fdae4eb4f7ccd34932edc61561a96b8d9f35 - date: 17/02/2018 + revision: 258670244dae39616a50ec1116f52e91b6f0bc62 + date: 09/05/2018 - title: Безопасность приложений на Rails path: ruby-on-rails-security-guide file: security.md - revision: 8b26de85e84ab5acfed087b4b2b1b31a6f6b96a7 - date: 19/03/2018 + revision: 258670244dae39616a50ec1116f52e91b6f0bc62 + date: 09/05/2018 - title: Отладка приложений на Rails path: debugging-rails-applications file: debugging_rails_applications.md - revision: df497cf08590c9451b6ac1cf6d6ee86e304c0adf - date: 21/08/2017 + revision: 258670244dae39616a50ec1116f52e91b6f0bc62 + date: 09/05/2018 - title: Конфигурирование приложений на Rails path: configuring-rails-applications file: configuring.md - revision: c8a22bb9eef2654c87a0fdb9139d868caf482ec0 - date: 14/03/2018 + revision: 258670244dae39616a50ec1116f52e91b6f0bc62 + date: 09/05/2018 - title: Командная строка Rails path: a-guide-to-the-rails-command-line file: command_line.md - revision: d4eb0dc89ee6b476e2e10869dc282a96f956c6c7 - date: 18/02/2018 + revision: 258670244dae39616a50ec1116f52e91b6f0bc62 + date: 09/05/2018 - title: 'Кэширование с Rails: Обзор' path: caching-with-rails-an-overview file: caching_with_rails.md - revision: a6b82a37797bad04ef32b2ec500ad1a2107ea5f0 - date: 17/03/2018 + revision: 258670244dae39616a50ec1116f52e91b6f0bc62 + date: 09/05/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: 0ce768168610e97d4a726aa77aae748777e69465 - date: 09/01/2018 + revision: e3fcd96dc4b3e51e9b1260a85fe477c2a8901a75 + date: 14/04/2018 - title: Engine для начинающих path: engines file: engines.md - revision: fdd76b7370a38bc7ac047d424d7b8e7e0a0eaf83 - date: 31/12/2017 + revision: 258670244dae39616a50ec1116f52e91b6f0bc62 + date: 09/05/2018 - title: Процесс инициализации в Rails path: initialization @@ -189,8 +189,8 @@ pages: - title: Автозагрузка и перезагрузка констант path: constant_autoloading_and_reloading file: autoloading_and_reloading_constants.md - revision: 27e5c76a77cbca90836ad4fc3a861d9c47cf8588 - date: 12/02/2018 + revision: 5c7656d9a568fda855e6e558b7e44b1ba51425be + date: 06/05/2018 - title: Обзор Action Cable path: action-cable-overview @@ -201,32 +201,32 @@ pages: - title: Основы создания плагинов Rails path: plugins file: plugins.md - revision: de2afdc457d63ee628b5cac4e7bb73812e016e38 - date: 06/10/2017 + revision: 258670244dae39616a50ec1116f52e91b6f0bc62 + date: 09/05/2018 - title: Rails on Rack path: rails-on-rack file: rails_on_rack.md - revision: 54bb2f74b5156b4251582842b0edc8e216958e01 - date: 31/01/2018 + revision: 258670244dae39616a50ec1116f52e91b6f0bc62 + date: 09/05/2018 - title: Создание и настройка генераторов и шаблонов Rails path: generators file: generators.md - revision: 60863eed51a6c9523522e59c024400003ab16903 - date: 21/08/2017 + revision: 258670244dae39616a50ec1116f52e91b6f0bc62 + date: 09/05/2018 - title: Использование Rails для API-приложений path: api-app file: api_app.md - revision: 597b941930af87a4bfe9d1cdb05578091eb83735 - date: 15/12/2017 + revision: 258670244dae39616a50ec1116f52e91b6f0bc62 + date: 09/05/2018 - title: Вносим вклад в Ruby on Rails path: contributing_to_ruby_on_rails file: contributing_to_ruby_on_rails.md - revision: 97e9331317a15dbd4a865daaa1d5255a0820597e - date: 24/01/2018 + revision: 258670244dae39616a50ec1116f52e91b6f0bc62 + date: 09/05/2018 - title: Рекомендации по документированию API path: api_documentation_guidelines @@ -249,8 +249,8 @@ pages: - title: Апгрейд Ruby on Rails path: upgrading-ruby-on-rails file: upgrading_ruby_on_rails.md - revision: c8a22bb9eef2654c87a0fdb9139d868caf482ec0 - date: 14/03/2018 + revision: f3c71ff1e18369bf15ab9b51e448644ea2c2c349 + date: 02/05/2018 - title: Шаблоны приложения Rails path: rails-application-templates @@ -261,8 +261,8 @@ pages: - title: Заметки о релизе Ruby on Rails 3.0 path: 3_0_release_notes file: 3_0_release_notes.md - revision: e17b5fd572618fd9ac9257a05103e0b5fad714ab - date: 11/01/2018 + revision: 258670244dae39616a50ec1116f52e91b6f0bc62 + date: 09/05/2018 - title: Заметки о релизе Ruby on Rails 3.1 path: 3_1_release_notes @@ -279,8 +279,8 @@ pages: - title: Заметки о релизе Ruby on Rails 4.0 path: 4_0_release_notes file: 4_0_release_notes.md - revision: de2afdc457d63ee628b5cac4e7bb73812e016e38 - date: 06/10/2017 + revision: e5bd4adce9a564302bede02ac93dc967e69df73c + date: 31/03/2018 - title: Заметки о релизе Ruby on Rails 4.1 path: 4_1_release_notes @@ -297,26 +297,26 @@ pages: - title: Заметки о релизе Ruby on Rails 5.0 path: 5_0_release_notes file: 5_0_release_notes.md - revision: de2afdc457d63ee628b5cac4e7bb73812e016e38 - date: 06/10/2017 + revision: 258670244dae39616a50ec1116f52e91b6f0bc62 + date: 09/05/2018 - title: Заметки о релизе Ruby on Rails 5.1 path: 5_1_release_notes file: 5_1_release_notes.md - revision: ee7fb923d484f1dfe19e10210e7bde0a753ff2f5 - date: 23/12/2017 + revision: 258670244dae39616a50ec1116f52e91b6f0bc62 + date: 09/05/2018 - title: Заметки о релизе Ruby on Rails 5.2 path: 5_2_release_notes file: 5_2_release_notes.md - revision: 8b26de85e84ab5acfed087b4b2b1b31a6f6b96a7 - date: 19/03/2018 + revision: b72dc84ba5fa810e73800843eac2c49085d38ee2 + date: 06/04/2018 - title: Политика поддержки (версий) path: maintenance-policy file: maintenance_policy.md - revision: 5c0d00072d1309dbc77bb5d97e42956bac3e8684 - date: 20/03/2017 + revision: 457d2ab97b73d6e59735aa8946d9e7b46ea211f9 + date: 11/04/2018 - title: Треды и выполнение кода в Rails path: threading_and_code_execution @@ -327,8 +327,8 @@ pages: - title: Обзор Active Storage path: active_storage_overview file: active_storage_overview.md - revision: c1600009b2bbb3b67db20ddb14fef34d4cfa82bc - date: 19/03/2018 + revision: d7edb8ecd0552635ea9631666abe910199ccf7c1 + date: 18/05/2018 plan: [] diff --git a/source/maintenance_policy.md b/source/maintenance_policy.md index 73aac5ff..1a1657da 100644 --- a/source/maintenance_policy.md +++ b/source/maintenance_policy.md @@ -33,7 +33,7 @@ Rails придерживается смещения версий [semver](http:/ В особых случаях, когда кто-то из Core Team соглашается поддерживать больше серий, они включаются в список поддерживаемых серий. -**В настоящее время поддерживаются серии:** `5.1.Z`. +**В настоящее время поддерживаются серии:** `5.2.Z`. Проблемы безопасности --------------------- @@ -42,14 +42,14 @@ Rails придерживается смещения версий [semver](http:/ Эти релизы создаются через применения патчей безопасности в последнюю выпущенную версию. Затем патчи включаются в конец ветки x-y-stable. Например, теоретический релиз безопасности 1.2.3 будет построен из 1.2.2, а затем добавлен в конец 1-2-stable. Это означает, что релизы безопасности легко апгрейдить, если использовать последнюю версию Rails. -**В настоящее время поддерживаются серии:** `5.1.Z`, `5.0.Z`. +**В настоящее время поддерживаются серии:** `5.2.Z`, `5.1.Z`. Серьезные проблемы безопасности ------------------------------- -Для серьезных проблем с безопасностью создаются вышеуказанные новые версии, а также последние главные релизы серий будут содержать патчи и новые версии. Классификация проблем безопасности оценивается Core Team. +Для серьезных проблем с безопасностью все релизы в текущей главной серии, а также последние главные релизы серий будут содержать патчи и новые версии. Классификация проблем безопасности оценивается Core Team. -**В настоящее время поддерживаются серии:** `5.1.Z`, `5.0.Z`, `4.2.Z`. +**В настоящее время поддерживаются серии:** `5.2.Z`, `5.1.Z`, `5.0.Z`, `4.2.Z`. Неподдерживаемые серии релизов ------------------------------ diff --git a/source/routing.md b/source/routing.md index e16c9dd9..1d59bb14 100644 --- a/source/routing.md +++ b/source/routing.md @@ -32,6 +32,8 @@ get '/patients/:id', to: 'patients#show' то запрос будет направлен в контроллер `patients` в экшн `show` с `{ id: '17' }` в `params`. +NOTE: Rails здесь использует именование в snake_case для имен контроллера, если имя контроллера состоит из несколько слов, то например `MonsterTrucksController`, необходимо использовать как `monster_trucks#show`. + ### Создание URL из кода Также можно генерировать пути и URL. Если вышеуказанный маршрут изменить на: @@ -1121,10 +1123,10 @@ resources :videos, param: :identifier ``` ``` - videos GET /videos(.:format) videos#index - POST /videos(.:format) videos#create - new_videos GET /videos/new(.:format) videos#new -edit_videos GET /videos/:identifier/edit(.:format) videos#edit + videos GET /videos(.:format) videos#index + POST /videos(.:format) videos#create + new_video GET /videos/new(.:format) videos#new +edit_video GET /videos/:identifier/edit(.:format) videos#edit ``` ```ruby @@ -1141,7 +1143,7 @@ class Video < ApplicationRecord end video = Video.find_by(identifier: "Roman-Holiday") -edit_videos_path(video) # => "/videos/Roman-Holiday" +edit_video_path(video) # => "/videos/Roman-Holiday/edit" ``` Осмотр и тестирование маршрутов diff --git a/source/security.md b/source/security.md index 1d69324b..b94ff31c 100644 --- a/source/security.md +++ b/source/security.md @@ -67,7 +67,7 @@ config.force_ssl = true * Часто межсайтовый скриптинг (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). +Основная цель большинства злоумышленников это сделать деньги. Подпольные цены за краденную банковскую учетную запись варьируются в пределах 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). ### Указания по сессии @@ -154,7 +154,7 @@ NOTE: _Другой тип атак, которого следует опаса NOTE: _Кроме кражи ID сессии пользователя, злоумышленник может исправить ID сессии на известный ему. Это называется фиксацией сессии._ -![Фиксация сессии](/images/session_fixation.png) +![Фиксация сессии](/images/security/session_fixation.png) Эта атака сосредоточена на ID сессии пользователя, известному злоумышленнику, и принуждению браузера пользователя использовать этот ID. После этого злоумышленнику не нужно воровать ID сессии. Вот как эта атака работает: @@ -209,7 +209,7 @@ delete_all "updated_at < '#{time.ago.to_s(:db)}' OR Этот метод атаки работает через включение вредоносного кода или ссылки на страницу, которая обращается к веб-приложению, на котором предполагается, что пользователь аутентифицирован. Если сессия для того веб-приложения не истекла, злоумышленник сможет выполнить несанкционированные команды. -![csrf](/images/csrf.png) +![csrf](/images/security/csrf.png) В [главе про сессии](#sessions) мы узнали, что большинство приложений на Rails используют сессии, основанные на куки. Либо они хранят ID сессии в куки и имеют хэш сессии на сервере, либо весь хэш сессии на клиенте. В любом случае, браузер автоматически пошлет куки с каждым запросом к домену, если он найдет куки для этого домена. Спорный момент в том, что он также пошлет куки, если запрос идет с сайта другого домена. Давайте рассмотрим пример: @@ -793,7 +793,7 @@ _Чтобы понять сегодняшние атаки на веб-прил 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/myspace/tech.html). Этот червь автоматически рассылал предложение дружбы с Samy (злоумышленником), просто посетив его профиль. В течение нескольких часов он сделал свыше 1 миллиона запросов дружбы, но создал так много трафика, что MySpace ушел в оффлайн. Ниже следует техническое объяснение червя. MySpace блокировал много тегов, но позволял CSS. Поэтому автор червя поместил JavaScript в CSS следующим образом: @@ -1100,6 +1100,12 @@ Rails.application.config.content_security_policy_nonce_generator = -> request { <% end -%> ``` +Это также работает с `javascript_include_tag`: + +```html+erb +<%= javascript_include_tag "script", nonce: true %> +``` + Используйте хелпер [`csp_meta_tag`](http://api.rubyonrails.org/classes/ActionView/Helpers/CspHelper.html#method-i-csp_meta_tag) для создания метатега "csp-nonce" со значением nonce для каждой сессии, чтобы разрешить встроенные теги `