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 지원

Pull Request

Rails 5.1에서는 Yarn을 통해 npm에서 JavaScript 종속성을 관리할 수 있습니다. 이를 통해 React, VueJS 또는 npm 세계의 다른 라이브러리를 쉽게 사용할 수 있습니다. Yarn 지원은 애셋 파이프라인과 통합되어 모든 종속성이 Rails 5.1 앱에서 원활하게 작동합니다.

선택적 Webpack 지원

Pull Request

Rails 앱은 새로운 Webpacker 젬을 사용하여 Webpack, JavaScript 자산 번들러와 더 쉽게 통합할 수 있습니다. 새 애플리케이션을 생성할 때 --webpack 플래그를 사용하면 Webpack 통합이 활성화됩니다.

이는 이미지, 글꼴, 사운드 및 기타 자산에 대해 계속 사용할 수 있는 애셋 파이프라인과 완전히 호환됩니다. 일부 JavaScript 코드는 애셋 파이프라인에 의해 관리되고 다른 코드는 Webpack을 통해 처리될 수 있습니다. 이 모든 것은 기본적으로 활성화된 Yarn에 의해 관리됩니다.

jQuery가 더 이상 기본 종속성이 아님

Pull Request

이전 버전의 Rails에서는 data-remote, data-confirm 및 Rails의 다른 Unobtrusive JavaScript 기능을 제공하기 위해 jQuery가 기본적으로 필요했습니다. 이제 UJS가 일반 JavaScript를 사용하도록 다시 작성되었기 때문에 더 이상 필요하지 않습니다. 이 코드는 이제 Action View의 rails-ujs로 제공됩니다.

필요한 경우 여전히 jQuery를 사용할 수 있지만 더 이상 기본적으로 필요하지 않습니다.

시스템 테스트

Pull Request

Rails 5.1에는 Capybara 테스트를 작성하기 위한 내장 지원인 시스템 테스트가 포함되어 있습니다. 이제 Capybara와 데이터베이스 정리 전략을 구성할 필요가 없습니다. Rails 5.1은 Chrome에서 테스트를 실행하고 실패 스크린샷과 같은 추가 기능을 제공하는 래퍼를 제공합니다.

암호화된 비밀

Pull Request

Rails는 이제 sekrets 젬에서 영감을 받아 애플리케이션 비밀을 안전하게 관리할 수 있습니다.

bin/rails secrets:setup을 실행하여 새로운 암호화된 비밀 파일을 설정합니다. 이렇게 하면 마스터 키도 생성됩니다. 이 키는 리포지토리 외부에 저장해야 합니다. 그런 다음 비밀 자체를 암호화된 형태로 안전하게 버전 관리 시스템에 체크인할 수 있습니다.

프로덕션에서는 RAILS_MASTER_KEY 환경 변수 또는 키 파일에 저장된 키를 사용하여 비밀이 해독됩니다.

매개변수화된 메일러

Pull Request

메일러 클래스의 모든 메서드에 공통으로 사용되는 매개변수를 지정할 수 있도록 하여 인스턴스 변수, 헤더 및 기타 공통 설정을 공유할 수 있습니다.

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

직접 및 해결된 경로

Pull Request

Rails 5.1은 라우팅 DSL에 resolvedirect 두 가지 새로운 메서드를 추가했습니다. 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으로의 통합

Pull Request

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:configsrails: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::IntegrationTestActionController::TestCase 클래스의 #process, #get, #post, #patch, #put, #delete#head에 대한 비 키워드 인수 지원을 제거했습니다. (Commit, Commit)

  • ActionDispatch::Callbacks.to_prepareActionDispatch::Callbacks.to_cleanup를 제거했습니다. (Commit)

  • 컨트롤러 필터와 관련된 deprecated 메서드를 제거했습니다. (Commit)

  • render에서 :text:nothing에 대한 지원을 제거했습니다. (Commit, Commit)

  • ActionController::Parameters에서 HashWithIndifferentAccess 메서드를 호출하는 지원을 제거했습니다. (Commit)

사용 중단

  • config.action_controller.raise_on_unfiltered_parameters를 사용 중단했습니다. Rails 5.1에서는 더 이상 효과가 없습니다. (Commit)

주목할 만한 변경 사항

  • 라우팅 DSL에 directresolve 메서드를 추가했습니다. (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_fielddatetime_field_tagdatetime-local 필드를 생성하도록 변경했습니다. (Pull Request)

  • HTML 태그에 대한 새로운 Builder 스타일 구문(tag.div, tag.br 등) (Pull Request)

  • form_forform_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.oneactiverecord.errors.messages.restrict_dependent_destroy.many i18n 범위를 제거했습니다. (Commit)

  • 단일 및 컬렉션 연결 리더에서 강제 다시 로드 인수를 제거했습니다. (Commit)

  • #quote에 열 전달 지원을 제거했습니다. (Commit)

  • #tables에서 name 인수를 제거했습니다. (Commit)

  • #tables#table_exists?가 테이블만 반환하고 뷰는 반환하지 않도록 하는 deprecated 동작을 제거했습니다. (Commit)

  • ActiveRecord::StatementInvalid#initializeActiveRecord::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_conditionssanitize_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_onActiveJob::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_callbackskip_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_changesassert_no_changes 메서드를 도입했습니다. (Pull Request)

  • traveltravel_to 메서드가 이제 중첩 호출에서 오류를 발생시킵니다. (Pull Request)

  • DateTime#change가 usec 및 nsec를 지원하도록 업데이트했습니다. (Pull Request)

크레딧

Rails에 많은 시간을 보내 만든 많은 사람들의 전체 기여자 목록을 참조하십시오. 그들 모두에게 박수를 보냅니다.