Ruby on Rails 5.1 릴리스 노트
Rails 5.1의 주요 기능:
- Yarn 지원
- 선택적 Webpack 지원
- jQuery가 더 이상 기본 종속성이 아님
- 시스템 테스트
- 암호화된 비밀
- 매개변수화된 메일러
- 직접 및 해결된 경로
- formfor와 formtag의 form_with으로의 통합
이 릴리스 노트에서는 주요 변경 사항만 다룹니다. 다양한 버그 수정 및 변경 사항에 대해서는 변경 로그를 참조하거나 GitHub의 Rails 주 저장소에서 커밋 목록을 확인하십시오.
Rails 5.1로 업그레이드하기
기존 애플리케이션을 업그레이드하는 경우, 업그레이드 전에 충분한 테스트 커버리지를 확보하는 것이 좋습니다. 또한 먼저 Rails 5.0으로 업그레이드하고 애플리케이션이 여전히 예상대로 작동하는지 확인한 후에 Rails 5.1로 업데이트를 시도해야 합니다. Rails 5.0에서 Rails 5.1로 업그레이드할 때 주의해야 할 사항 목록은 Ruby on Rails 업그레이드 가이드에서 확인할 수 있습니다.
주요 기능
Yarn 지원
Rails 5.1에서는 Yarn을 통해 npm에서 JavaScript 종속성을 관리할 수 있습니다. 이를 통해 React, VueJS 또는 npm 세계의 다른 라이브러리를 쉽게 사용할 수 있습니다. Yarn 지원은 애셋 파이프라인과 통합되어 모든 종속성이 Rails 5.1 앱에서 원활하게 작동합니다.
선택적 Webpack 지원
Rails 앱은 새로운 Webpacker 젬을 사용하여 Webpack, JavaScript 자산 번들러와 더 쉽게 통합할 수 있습니다. 새 애플리케이션을 생성할 때 --webpack
플래그를 사용하면 Webpack 통합이 활성화됩니다.
이는 이미지, 글꼴, 사운드 및 기타 자산에 대해 계속 사용할 수 있는 애셋 파이프라인과 완전히 호환됩니다. 일부 JavaScript 코드는 애셋 파이프라인에 의해 관리되고 다른 코드는 Webpack을 통해 처리될 수 있습니다. 이 모든 것은 기본적으로 활성화된 Yarn에 의해 관리됩니다.
jQuery가 더 이상 기본 종속성이 아님
이전 버전의 Rails에서는 data-remote
, data-confirm
및 Rails의 다른 Unobtrusive JavaScript 기능을 제공하기 위해 jQuery가 기본적으로 필요했습니다. 이제 UJS가 일반 JavaScript를 사용하도록 다시 작성되었기 때문에 더 이상 필요하지 않습니다. 이 코드는 이제 Action View의 rails-ujs
로 제공됩니다.
필요한 경우 여전히 jQuery를 사용할 수 있지만 더 이상 기본적으로 필요하지 않습니다.
시스템 테스트
Rails 5.1에는 Capybara 테스트를 작성하기 위한 내장 지원인 시스템 테스트가 포함되어 있습니다. 이제 Capybara와 데이터베이스 정리 전략을 구성할 필요가 없습니다. Rails 5.1은 Chrome에서 테스트를 실행하고 실패 스크린샷과 같은 추가 기능을 제공하는 래퍼를 제공합니다.
암호화된 비밀
Rails는 이제 sekrets 젬에서 영감을 받아 애플리케이션 비밀을 안전하게 관리할 수 있습니다.
bin/rails secrets:setup
을 실행하여 새로운 암호화된 비밀 파일을 설정합니다. 이렇게 하면 마스터 키도 생성됩니다. 이 키는 리포지토리 외부에 저장해야 합니다. 그런 다음 비밀 자체를 암호화된 형태로 안전하게 버전 관리 시스템에 체크인할 수 있습니다.
프로덕션에서는 RAILS_MASTER_KEY
환경 변수 또는 키 파일에 저장된 키를 사용하여 비밀이 해독됩니다.
매개변수화된 메일러
메일러 클래스의 모든 메서드에 공통으로 사용되는 매개변수를 지정할 수 있도록 하여 인스턴스 변수, 헤더 및 기타 공통 설정을 공유할 수 있습니다.
class InvitationsMailer < ApplicationMailer before_action { @inviter, @invitee = params[:inviter], params[:invitee] } before_action { @account = params[:inviter].account } def account_invitation mail subject: "#{@inviter.name} invited you to their Basecamp (#{@account.name})" end end
InvitationsMailer.with(inviter: person_a, invitee: person_b) .account_invitation.deliver_later
직접 및 해결된 경로
Rails 5.1은 라우팅 DSL에 resolve
및 direct
두 가지 새로운 메서드를 추가했습니다. resolve
메서드를 사용하면 모델의 다형성 매핑을 사용자 정의할 수 있습니다.
resource :basket resolve("Basket") { [:basket] }
<%= form_for @basket do |form| %> <!-- basket form --> <% end %>
이렇게 하면 일반적인 /baskets/:id
대신 /basket
단일 URL이 생성됩니다.
direct
메서드를 사용하면 사용자 정의 URL 헬퍼를 만들 수 있습니다.
direct(:homepage) { "https://rubyonrails.org" } homepage_url # => "https://rubyonrails.org"
블록의 반환 값은 url_for
메서드에 대한 유효한 인수여야 합니다. 따라서 유효한 문자열 URL, 해시, 배열, Active Model 인스턴스 또는 Active Model 클래스를 전달할 수 있습니다.
direct :commentable do |model| [ model, anchor: model.dom_id ] end direct :main do { controller: 'pages', action: 'index', subdomain: 'www' } end
formfor와 formtag의 form_with으로의 통합
Rails 5.1 이전에는 HTML 폼을 처리하기 위한 두 가지 인터페이스가 있었습니다: 모델 인스턴스에 대한 form_for
와 사용자 정의 URL에 대한 form_tag
.
Rails 5.1은 이 두 인터페이스를 form_with
으로 통합하여 URL, 범위 또는 모델을 기반으로 폼 태그를 생성할 수 있습니다.
URL만 사용하기:
<%= form_with url: posts_path do |form| %> <%= form.text_field :title %> <% end %> <%# 다음과 같이 생성됩니다 %> <form action="/posts" method="post" data-remote="true"> <input type="text" name="title"> </form>
범위 추가하기:
<%= form_with scope: :post, url: posts_path do |form| %> <%= form.text_field :title %> <% end %> <%# 다음과 같이 생성됩니다 %> <form action="/posts" method="post" data-remote="true"> <input type="text" name="post[title]"> </form>
모델 사용하기:
<%= form_with model: Post.new do |form| %> <%= form.text_field :title %> <% end %> <%# 다음과 같이 생성됩니다 %> <form action="/posts" method="post" data-remote="true"> <input type="text" name="post[title]"> </form>
기존 모델로 업데이트 폼 만들기:
<%= form_with model: Post.first do |form| %> <%= form.text_field :title %> <% end %> <%# 다음과 같이 생성됩니다 %> <form action="/posts/1" method="post" data-remote="true"> <input type="hidden" name="_method" value="patch"> <input type="text" name="post[title]" value="<the title of the post>"> </form>
호환성 문제
다음과 같은 변경 사항은 업그레이드 시 즉각적인 조치가 필요할 수 있습니다.
다중 연결을 사용하는 트랜잭션 테스트
트랜잭션 테스트는 이제 모든 Active Record 연결을 데이터베이스 트랜잭션으로 래핑합니다.
테스트에서 추가 스레드를 생성하고 해당 스레드가 데이터베이스 연결을 얻는 경우, 이러한 연결은 이제 특별하게 처리됩니다:
스레드는 관리되는 트랜잭션 내에 있는 단일 연결을 공유합니다. 이를 통해 모든 스레드가 동일한 데이터베이스 상태를 볼 수 있으며, 가장 바깥쪽 트랜잭션을 무시합니다. 이전에는 이러한 추가 연결이 예를 들어 fixture 행을 볼 수 없었습니다.
스레드가 중첩 트랜잭션에 들어가면 격리를 유지하기 위해 일시적으로 연결의 독점 사용권을 얻습니다.
테스트에서 현재 별도의 트랜잭션 외부 연결을 얻는 것에 의존하는 경우, 더 명시적인 연결 관리로 전환해야 합니다.
테스트에서 스레드를 생성하고 해당 스레드가 명시적 데이터베이스 트랜잭션을 사용하면서 상호 작용하는 경우, 이 변경으로 인해 교착 상태가 발생할 수 있습니다.
이 새로운 동작에서 벗어나려면 영향을 받는 테스트 케이스에서 트랜잭션 테스트를 비활성화하는 것이 가장 쉬운 방법입니다.
Railties
자세한 변경 사항은 변경 로그를 참조하십시오.
제거
config.static_cache_control
사용 중단. (commit)config.serve_static_files
사용 중단. (commit)rails/rack/debugger
파일 제거. (commit)rails:update
,rails:template
,rails:template:copy
,rails:update:configs
및rails:update:bin
작업 제거. (commit)routes
작업에 대한CONTROLLER
환경 변수 제거. (commit)rails new
명령에서-j (--javascript)
옵션 제거. ([Pull Request](https://github.com/rails/rails/pull/네, 번역을 계속하겠습니다.
주목할 만한 변경 사항
config/secrets.yml
에 모든 환경에 로드되는 공유 섹션을 추가했습니다. (commit)config/secrets.yml
구성 파일이 이제 모든 키를 기호로 로드됩니다. (Pull Request)기본 스택에서 jquery-rails를 제거했습니다. Action View와 함께 제공되는 rails-ujs가 기본 UJS 어댑터로 포함됩니다. (Pull Request)
새 앱에 yarn 바이너리와 package.json이 포함된 Yarn 지원을 추가했습니다. (Pull Request)
--webpack
옵션을 사용하여 rails/webpacker 젬을 통해 새 앱에 Webpack 지원을 추가했습니다. (Pull Request)--skip-git
옵션을 제공하지 않는 경우 새 앱 생성 시 Git 리포지토리를 초기화합니다. (Pull Request)config/secrets.yml.enc
에 암호화된 비밀을 추가했습니다. (Pull Request)rails initializers
에서 railtie 클래스 이름을 표시합니다. (Pull Request)
Action Cable
자세한 변경 사항은 변경 로그를 참조하십시오.
주목할 만한 변경 사항
여러 애플리케이션에서 동일한 Redis 서버를 사용할 때 이름 충돌을 방지하기 위해
cable.yml
에서 Redis 및 이벤트 Redis 어댑터에channel_prefix
를 추가했습니다. (Pull Request)데이터 방송을 위한
ActiveSupport::Notifications
훅을 추가했습니다. (Pull Request)
Action Pack
자세한 변경 사항은 변경 로그를 참조하십시오.
제거
ActionDispatch::IntegrationTest
와ActionController::TestCase
클래스의#process
,#get
,#post
,#patch
,#put
,#delete
및#head
에 대한 비 키워드 인수 지원을 제거했습니다. (Commit, Commit)ActionDispatch::Callbacks.to_prepare
및ActionDispatch::Callbacks.to_cleanup
를 제거했습니다. (Commit)컨트롤러 필터와 관련된 deprecated 메서드를 제거했습니다. (Commit)
ActionController::Parameters
에서HashWithIndifferentAccess
메서드를 호출하는 지원을 제거했습니다. (Commit)
사용 중단
-
config.action_controller.raise_on_unfiltered_parameters
를 사용 중단했습니다. Rails 5.1에서는 더 이상 효과가 없습니다. (Commit)
주목할 만한 변경 사항
라우팅 DSL에
direct
및resolve
메서드를 추가했습니다. (Pull Request)애플리케이션에서 시스템 테스트를 작성할 수 있는 새로운
ActionDispatch::SystemTestCase
클래스를 추가했습니다. (Pull Request)
Action View
자세한 변경 사항은 변경 로그를 참조하십시오.
제거
ActionView::Template::Error
에서#original_exception
을 제거했습니다. (commit)strip_tags
에서encode_special_chars
옵션 오명칭을 제거했습니다. (Pull Request)
사용 중단
- Erubi에 대한 Erubis ERB 핸들러 사용 중단. (Pull Request)
주목할 만한 변경 사항
Raw 템플릿 핸들러(Rails 5의 기본 템플릿 핸들러)는 이제 HTML 안전 문자열을 출력합니다. (commit)
datetime_field
및datetime_field_tag
를datetime-local
필드를 생성하도록 변경했습니다. (Pull Request)HTML 태그에 대한 새로운 Builder 스타일 구문(
tag.div
,tag.br
등) (Pull Request)form_for
와form_tag
사용을 통합하는form_with
추가 (Pull Request)current_page?
에check_parameters
옵션 추가 (Pull Request)
Action Mailer
자세한 변경 사항은 변경 로그를 참조하십시오.
주목할 만한 변경 사항
첨부 파일이 포함되고 본문이 인라인으로 설정된 경우 사용자 정의 콘텐츠 유형을 설정할 수 있도록 허용했습니다. (Pull Request)
default
메서드에 람다를 값으로 전달할 수 있도록 허용했습니다. (Commit)메일러 작업 간에 before 필터와 기본값을 공유할 수 있도록 매개변수화된 메일러 호출을 추가했습니다. (Commit)
process.action_mailer
이벤트에서args
키 아래에 전달된 인수를 메일러 작업으로 전달했습니다. (Pull Request)
Active Record
자세한 변경 사항은 변경 로그를 참조하십시오.
제거
ActiveRecord::QueryMethods#select
에 인수와 블록을 동시에 전달하는 지원을 제거했습니다. (Commit)activerecord.errors.messages.restrict_dependent_destroy.one
및activerecord.errors.messages.restrict_dependent_destroy.many
i18n 범위를 제거했습니다. (Commit)단일 및 컬렉션 연결 리더에서 강제 다시 로드 인수를 제거했습니다. (Commit)
#quote
에 열 전달 지원을 제거했습니다. (Commit)#tables
에서name
인수를 제거했습니다. (Commit)#tables
및#table_exists?
가 테이블만 반환하고 뷰는 반환하지 않도록 하는 deprecated 동작을 제거했습니다. (Commit)ActiveRecord::StatementInvalid#initialize
및ActiveRecord::StatementInvalid#original_exception
에서original_exception
인수를 제거했습니다. (Commit)쿼리에서 클래스를 값으로 전달하는 지원을 제거했습니다. (Commit)
LIMIT에 쉼표를 사용하여 쿼리하는 지원을 제거했습니다. (Commit)
#destroy_all
에서conditions
매개변수를 제거했습니다. (Commit)#delete_all
에서conditions
매개변수를 제거했습니다. (Commit)#load_schema_for
를#load_schema
로 대체했습니다. (Commit)#raise_in_transactional_callbacks
구성을 제거했습니다. (Commit)#use_transactional_fixtures
구성을 제거했습니다. (Commit)
사용 중단
error_on_ignored_order
에 대한error_on_ignored_order_or_limit
플래그를 사용 중단했습니다. (Commit)sanitize_conditions
를sanitize_sql
로 대체했습니다. (Pull Request)연결 어댑터에서
supports_migrations?
를 사용 중단했습니다. (Pull Request)Migrator.schema_migrations_table_name
을 사용 중단했습니다. 대신SchemaMigration.table_name
을 사용하십시오. (Pull Request)인용 및 유형 캐스팅에서
#quoted_id
사용을 사용 중단했습니다. (Pull Request)#index_name_exists?
에default
인수 전달을 사용 중단했습니다. (Pull Request)
주목할 만한 변경 사항
- 기본 기본 키를 BIGINT로 변경했습니다. ([Pull Request](https://github.com/네, 번역을 계속하겠습니다.
주목할 만한 변경 사항
MySQL 5.7.5+ 및 MariaDB 5.2.0+에 대한 가상/생성된 열 지원을 추가했습니다. (Commit)
일괄 처리에서 제한을 추가했습니다. (Commit)
트랜잭션 테스트가 이제 모든 Active Record 연결을 데이터베이스 트랜잭션으로 래핑합니다. (Pull Request)
기본적으로
mysqldump
명령의 출력에서 주석을 건너뛰었습니다. (Pull Request)블록이 인수로 전달되는 경우
ActiveRecord::Relation#count
가 Ruby의Enumerable#count
를 사용하여 레코드를 계산하도록 수정했습니다. 이전에는 전달된 블록을 무시했습니다. (Pull Request)SQL 오류를 억제하지 않도록
psql
명령에"-v ON_ERROR_STOP=1"
플래그를 전달했습니다. (Pull Request)ActiveRecord::Base.connection_pool.stat
를 추가했습니다. (Pull Request)ActiveRecord::Migration
에서 직접 상속하면 오류가 발생합니다. 마이그레이션이 작성된 Rails 버전을 지정하십시오. (Commit)through
연결에 모호한 반사 이름이 있는 경우 오류가 발생합니다. (Commit)
Active Model
자세한 변경 사항은 변경 로그를 참조하십시오.
제거
ActiveModel::Errors
에서 deprecated 메서드를 제거했습니다. (commit)길이 유효성 검사기의
:tokenizer
옵션을 제거했습니다. (commit)콜백이 false를 반환할 때 중단되는 deprecated 동작을 제거했습니다. (commit)
주목할 만한 변경 사항
- 모델 속성에 할당된 원래 문자열이 더 이상 잘못 동결되지 않습니다. (Pull Request)
Active Job
자세한 변경 사항은 변경 로그를 참조하십시오.
제거
.queue_adapter
에 어댑터 클래스를 전달하는 지원을 제거했습니다. (commit)ActiveJob::DeserializationError
에서#original_exception
을 제거했습니다. (commit)
주목할 만한 변경 사항
ActiveJob::Base.retry_on
및ActiveJob::Base.discard_on
을 통한 선언적 예외 처리를 추가했습니다. (Pull Request)실패한 재시도 후에는
job.arguments
와 같은 것에 액세스할 수 있도록 작업 인스턴스를 yield합니다. (commit)
Active Support
자세한 변경 사항은 변경 로그를 참조하십시오.
제거
ActiveSupport::Concurrency::Latch
클래스를 제거했습니다. (Commit)halt_callback_chains_on_return_false
를 제거했습니다. (Commit)콜백이 false를 반환할 때 중단되는 deprecated 동작을 제거했습니다. (Commit)
사용 중단
최상위
HashWithIndifferentAccess
클래스가ActiveSupport::HashWithIndifferentAccess
로 부드럽게 사용 중단되었습니다. (Pull Request)set_callback
및skip_callback
의:if
및:unless
조건부 옵션에 문자열 전달을 사용 중단했습니다. (Commit)
주목할 만한 변경 사항
DST 변경에 걸쳐 일관된 기간 구문 분석 및 이동을 수정했습니다. (Commit, Pull Request)
Unicode를 버전 9.0.0으로 업데이트했습니다. (Pull Request)
Duration#before
및#after
를#ago
및#since
의 별칭으로 추가했습니다. (Pull Request)현재 객체에 정의되지 않은 메서드 호출을 프록시 객체로 위임하는
Module#delegate_missing_to
를 추가했습니다. (Pull Request)현재 날짜 및 시간의 전체 날을 나타내는 범위를 반환하는
Date#all_day
를 추가했습니다. (Pull Request)테스트에 대한
assert_changes
및assert_no_changes
메서드를 도입했습니다. (Pull Request)travel
및travel_to
메서드가 이제 중첩 호출에서 오류를 발생시킵니다. (Pull Request)DateTime#change
가 usec 및 nsec를 지원하도록 업데이트했습니다. (Pull Request)
크레딧
Rails에 많은 시간을 보내 만든 많은 사람들의 전체 기여자 목록을 참조하십시오. 그들 모두에게 박수를 보냅니다.