5.1

원본: http://guides.rubyonrails.org/5_1_release_notes.html

Ruby on Rails 5.1 릴리즈 노트

레일즈 5.1 하이라이트:

  • Yarn 지원

  • 선택적 Webpack 지원

  • 기본 의존성에서 jQuery 제외

  • 시스템 테스트

  • 암호화된 시크릿

  • 메일러 매개변수

  • Direct & Resolved 라우트

  • form_forform_tagform_with으로 통합

이 릴리즈 노트에는 주요 변경점만 포함됩니다. 더 다양한 변경점과 버그 수정을 보려면 GitHub에서 Rails 메인 저장소의 커밋 목록이나 변경 로그를 확인하세요.

레일즈 5.1로 업그레이드하기

기존 애플리케이션을 업그레이드하기 전에 충분한 테스트 커버리지를 확보하는 것이 좋습니다. 애플리케이션이 레일즈 5.0로 업그레이드하지 않았다면 우선 업그레이드하고, 애플리케이션이 정상적으로 동작하는지 충분히 확인한 뒤에 레일즈 5.1로 올려주세요. 업그레이드 시 주의점에 대해서는 Ruby on Rails 업그레이드 가이드를 참고해주세요.

주요 변경점

Yarn 지원

Pull Request

레일즈 5.1에선 Yarn을 이용해 NPM에 있는 자바스크립트 의존성을 관리할 수 있어 React나 VueJS 같은 NPM 라이브러리를 사용하는 것이 쉬워졌습니다. Yarn으로 설치한 의존성들은 에셋 파이프라인에 통합되서 자연스럽게 사용할 수 있습니다.

선택적 Webpack 지원

Pull Request

레일즈 앱을 Webpacker를 사용해 쉽게 Webpack과 통합할 수 있습니다. 새로운 앱을 생성할 때 --webpack 플래그를 사용하면 자동으로 활성화됩니다.

기존 에셋 파이프라인과 완벽하게 호환되어서 이미지, 폰트, 사운드 등의 에셋을 사용하거나, 기존 에셋 파이프라인에서 관리되는 자바스크립트 코드와 웹팩으로 처리하는 코드를 함께 사용해도 문제가 없습니다. 모든 에셋이 기본적으로 Yarn을 통해 관리됩니다.

기본 의존성에서 jQuery 제외

Pull Request

기존 레일즈에서는 jQuery가 data-remote, data-confirm 같은 UJS(Rails' Unobtrusive JavaScript) 기능을 위해 기본적으로 요구되었습니다. 이제는 UJS가 바닐라 자바스크립트로 재작성되어서 더 이상 필요하지 않게 되었습니다. 이 코드는 액션 뷰에 rails-ujs라는 이름으로 탑재되었습니다.

시스템 테스트

Pull Request

레일즈 5.1은 시스템 테스트 형태로 Capybara 테스트를 작성을 지원합니다. 더 이상 테스트를 위한 Capybara 설정과 데이터베이스 관리 잔략을 걱정하지 않아도 됩니다. 레일즈 5.1은 Chrome에서 테스트를 실행하고 실패 스크린샷과 같은 기능을 위한 래퍼를 제공합니다.

암호화된 시크릿

Pull Request

레일즈는 이제 애플리케이션 시크릿을 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

Direct & Resolved 라우트

Pull Request

레일즈 5.1에 resolvedirect라는 라우팅 DSL이 추가되었습니다. resolve 메서드를 사용하면 모델의 다형성 매핑을 커스텀으로 지정할 수 있습니다.

resource :basket

resolve("Basket") { [:basket] }
html.erb
<%= form_for @basket do |form| %>
  <!-- basket form -->
<% end %>

이 코드는 /basket/:id 대신 /basket 단일 URL을 생성합니다.

direct 메서드로 커스텀 URL 헬퍼를 지정할 수 있습니다.

direct(:homepage) { "http://www.rubyonrails.org" }

>> homepage_url
=> "http://www.rubyonrails.org"

블록의 반환 값은 반드시 문자열 URL, 해시, 배열, 액티브 모델 인스턴스, 액티브 모델 클래스 같이 url_for 메서드의 인자로 유효한 값 이여야 합니다.

direct :commentable do |model|
  [ model, anchor: model.dom_id ]
end

direct :main do
  { controller: 'pages', action: 'index', subdomain: 'www' }
end

form_forform_tagform_with으로 통합

Pull Request

레일즈 5.1 이전에는 HTML 폼을 처리하기 위해 모델 인스턴스용 form_for와 커스텀 URL용 form_tag, 두 개의 인터페이스가 있었습니다.

레일즈 5.1은 두 개의 인터페이스를 form_with으로 합쳐서 하나의 인터페이스로 URL, 스코프, 모델 기반 폼 태그를 생성할 수 있습니다.

URL을 사용할 때:

html.erb
<%= form_with url: posts_path do |form| %>
  <%= form.text_field :title %>
<% end %>

<%# Will generate %>

<form action="/posts" method="post" data-remote="true">
  <input type="text" name="title">
</form>

스코프 접두사를 입력 필드 이름에 추가:

html.erb
<%= form_with scope: :post, url: posts_path do |form| %>
  <%= form.text_field :title %>
<% end %>

<%# Will generate %>

<form action="/posts" method="post" data-remote="true">
  <input type="text" name="post[title]">
</form>

기존 모델로 업데이트 폼을 만들고 필드 값 채우기:

html.erb
<%= form_with model: Post.first do |form| %>
  <%= form.text_field :title %>
<% end %>

<%# Will generate %>

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

비호환성

다음 변경사항들은 업그레이드할 때 바로 적용해야 합니다.

여러 연결을 이용하는 트랜잭션 테스트

트랜잭션 테스트는 이제 데이터베이스 트랜잭션 상의 모든 액티브 레코드 연결을 래핑합니다.

테스트가 추가 스레드들을 생성할 때, 이 스레드들이 확보하는 데이터베이스 연결은 이제 특수한 방식으로 처리됩니다.

스레드들이 매니지드 트랜잭션 내부의 단일 연결을 공유하므로써 모든 스레드가 같은 상태의 데이터베이스를 보게 하고, 트랜잭션 외부 영향을 무시하게 됩니다. 이전에는 추가 스레드의 연결을 통해 픽스쳐의 행을 수정할 수가 없었습니다.

이 중 스레드가 중첩 트랜잭션에 진입하면, 격리 상태를 유지하기 위해 연결을 일시적으로 독점 사용하게 됩니다.

만약 테스트가 현재 분리적이거나, 트랜잭션 바깥 영역 또는 추가 스레드를 스폰에 의존적이라면 명시적인 트랜잭션 연결 관리 방식으로 전환해야 합니다.

만약 테스트가 추가적인 스레드를 스폰하고 그 스레드에서 명시적 데이터베이스 트랜잭션을 사용하며 상호작용하고 있다면, 이 변경점이 데드락을 유발할 수 있습니다.

이 문제를 방지하는 가장 쉬운 방법은 영향을 받는 모든 테스트 케이스에서 트랜잭션 테스트를 비활성화 하는 것입니다.

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)

주요 변경점

  • config/secrets.yml 파일에 모든 환경에서 로드될 공유 섹션 추가되었습니다. (Commit)

  • 이제 config/secrets.yml 파일의 모든 키가 심볼로 로드됩니다. (Pull Request)

  • 기본 스택에서 jquery-rails가 제거되었습니다. 액션 뷰와 함께 제공되는 rails-ujs가 기본 UJS 어댑터로 포함되어있습니다. (Pull Request)

  • 새 앱에서 Yarn 지원이 추가되어 Yarn binstub과 package.json을 사용할 수 있습니다. (Pull Request)

  • 새 앱에서 --webpack 옵션으로 rails/webpacker 잼을 통해 Webpack 지원을 추가할 수 있습니다. (Pull Request)

  • config/secrets.yml.enc에 암호화된 시크릿이 추가됩니다. (Pull Request)

  • rails initializers로 이니셜라이져 클래스 이름을 표시합니다. (Pull Request)

Action Cable

자세한 변경사항은 변경로그를 참조하세요.

주요 변경점

  • 여러 애플리케이션에서 같은 레디스 서버를 사용할 때 이름 충돌을 피하기 위해 cable.yml 파일의 레디스 어댑터에 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)

  • :text:nothing 렌더링이 제거되었습니다. (Commit, Commit)

  • ActionCotroller::Parameters에서 HashWithIndifferentAccess 메서드를 더 이상 호출 할 수 없습니다. (Commit)

Deprecations

  • config.action_controller.raise_on_unfiltered_parameters가 Deprecated 되었습니다. Rails 5.1에선 아무 영향이 없습니다. (Commit)

주요 변경점

  • directresolve 메서드가 라우팅 DSL에 추가되었습니다. (Pull Request)

  • 애플리케이션 시스템 테스트 작성을 위한 ActionDispatch::SystemTestCase 클래스가 새로 추가되었습니다. (Pull Request)

Action View

자세한 변경사항은 변경로그를 참하세요.

제거된 것

  • ActionView::Template::Error에서 #original_exception이 제거되었습니다. (Commit)

  • strip_tags에서 잘못 명명된 encode_special_chars 옵션이 제거되었습니다. (Pull Request)

Deprecations

  • ERB 핸들러로 Erubis 대신 Erubi를 사용합니다. (Pull Request)

주요 변경점

  • 원시 템플릿 핸들러(레일즈 5의 기본 템플릿 핸들러)는 이제 HTML-safe한 문자열을 출력합니다. (commit)

  • datetime_fielddatetime_field_tagdatetime-local 필드를 생성하도록 변경되었습니다. (Pull Request)

  • HTML 태그를 위한 빌더 스타일 문법이 추가되었습니다. (tag.div, tag.br 등) (Pull Request)

  • form_tagform_for 사용법이 통합된 form_with이 추가되었습니다. (Pull Request)

  • current_page?check_parameters 옵션이 추가되었습니다. (Pull Request)

Action Mailer

자세한 변경사항은 변경로그를 참고하세요.

주요 변경점

  • 첨부파일이 포함되어있고 본문이 인라인으로 설정된 경우 커스텀 컨텐츠 타입을 설정할 수 있습니다. (Pull Request)

  • default 메서드의 인자로 람다를 사용할 수 있습니다. (Commit)

  • 여러 메일러 액션에서 before 필터와 default를 공유하기 위한 매개변수화된 호출이 지원됩니다. (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에 column 전달 기능이 제거되었습니다. (Commit)

  • #tables에서 name 인자가 제거되었습니다. (Commit)

  • 테이블과 뷰를 반환하던 #tables, #table_exists?가 테이블만 반환하도록 변경되었습니다. (Commit)

  • ActiveRecord::StatementInvalid#initializeActiveRecord::StatementInvalid#original_exception에서 original_exception 인자가 제거되었습니다. (Commit)

  • 이제 쿼리에서 클래스를 값으로 전달할 수 없습니다. (Commit)

  • 이제 LIMIT 쿼리에서 쉼표를 사용할 수 없습니다. (Commit)

  • #destroy_all에서conditions 매개변수가 제거되었습니다. (Commit)

  • #delete_all에서 conditions 매개변수가 제거되었습니다. (Commit)

  • #load_schema_for 메서드가 제거되었습니다. (Commit)

  • #rails_in_transactional_callbacks 구성이 제거되었습니다. (Commit)

  • #use_transactional_fixtures 구성이 제거되었습니다. (Commit)

Deprecations

  • error_on_ignored_order_or_limit 플래그가 Deprecated 되었습니다. (Commit

  • sanitize_conditions가 Deprecated 되었습니다. (Pull Request)

  • 연결 어댑터의 support_migrations?가 Deprecated 되었습니다. (Pull Request)

  • Migrator.schema_migrations_table_name이 Deprecated 되었습니다. SchemaMigration.table_name을 대신 사용하세요. (Pull Request)

  • Quoting과 형변환에서 #quoted_id 사용이 Deprecated 되었습니다. (Pull Request)

  • #index_name_exists?default 인자가 Deprecated 되었습니다. (Pull Request)

주요 변경점

  • 기본 키의 기본 형식이 BIGINT로 변경되었습니다. (Pull Request)

  • MySQL 5.7.5+, MariaDB 5.2.0+의 가상 컬럼이 지원됩니다. (Commit)

  • 배치 프로세싱에서 limit이 지원됩니다. (Commit)

  • 이제 트랜잭션 테스트가 데이터베이스 트랜잭션의 모든 액티브 레코드 연결을 래핑합니다. (Pull Request)

  • 기본적으로 mysqldump 명령의 출력에서 주석을 건더뜁니다. (Pull Request)

  • ActiveRecord::Relation#count에 블록이 전달됐을 때, 블록을 무시하는 대신 루비의 Enumerable#count를 사용하도록 수정됐습니다. (Pull Request)

  • psql 커맨드에 "-v ON_ERROR_STOP=1" 플래그를 사용해서 SQL 에러가 표시되지 않도록 할 수 있습니다. (Pull Request)

  • ActiveRecord::Base.connection_pool.stat이 추가되었습니다. (Pull Request)

  • ActiveRecord::Migration 클래스를 직접 상속하면 에러를 일으킵니다. 마이그레이션 작성에 사용한 레일즈 버전을 지정하세요. (Commit)

  • through 관계에서 모호한 리플렉션 이름을 사용하면 에러를 일으킵니다. (Commit)

Active Model

자세한 변경사항은 변경로그를 참고하세요.

제거된 것

  • ActiveModel::Errors에서 Deprecated 되었던 메서드들이 제거되었습니다. (Commit)

  • lenght 밸리데이터의 :tokenizer 옵션이 제거되었습니다. (Commit)

  • 반환 값이 false인 경우 콜백을 중단시키는 동작이 제거되었습니다. (Commit)

주요 변경점

  • 모델 속성에 할당된 원본 문자열이 더 이상 froze 되는 방식을 올바르게 수정했습니다. (Commit)

Active Job

자세한 변경사항은 변경로그를 참고하세요.

제거된 것

  • .queue_adapter 매개변수로 어댑터 클래스 전달할 수 없게 되었습니다. (Commit)

  • ActiveJob::DeserializationError에서 #original_exception을 제거했습니다. (Commit)

주요 변경점

  • ActiveJob::Base.retry_onActiveJob::Base.discard_on을 통한 선언적 예외 처리가 추가되었습니다. (Pull Request)

  • 모든 재시도가 실패한 후, 잡 인스턴스를 Yield 하도록 변경했습니다. 커스텀 로직에서 job.arguments 같은 것들에 접근할 수 있습니다. (Commit)

Active Support

자세한 변경사항은 변경로그를 참고하세요.

제거된 것

  • ActiveSupport::Concurrency::Latch 클래스가 제거되었습니다. (Commit)

  • halt_callback_chains_on_return_false가 제거되었습니다. (Commit)

  • 반환 값이 false인 경우 콜백을 중단시키는 동작이 제거되었습니다. (Commit)

Deprecations

  • ActiveSupport::HashWithIndifferentAccess 사용법 중, 탑 레벨 HashWithIndifferentAccess 클래스가 Softly Deprecated 되었습니다. (Pull Request)

  • set_callbackskip_callback에서 :if, :unless 조건식 옵션에 문자열을 전달하는 방식이 Deprecated 되었습니다. (Commit)

주요 변경점

  • 구간 분석과 Traveling이 DST 변경 전반에 더 일관성 있게 적용되도록 수정하였습니다. (Commit, Pull Request)

  • 유니코드 버전을 9.0.0로 업데이트 했습니다. (Pull Request)

  • Duration#ago, #since의 별칭 #before, #after를 추가했습니다. (Pull Request)

  • Module#delegate_missing_to를 추가했습니다. 현재 객체에 대해 정의되지 않은 메서드 호출을 프록시 객체에 위임할 수 있습니다. (Pull Request)

  • 현재 날짜/시간이 포함된 일자 전체를 range로 반환하는 Date#all_day를 추가했습니다. (Pull Request)

  • 테스트를 위한 assert_changes, assert_no_changes 메서드를 추가했습니다. (Pull Request)

  • traveltravel_to가 이제 중첩된 호출에서 에러를 일으킵니다. (Pull Request)

  • DateTime#change가 usec와 nsec를 지원합니다. (Pull Request)

크레딧

레일즈를 견고하고 안정적인 프레임워크로 만들기 위해 많은 시간을 사용해주신 많은 개발자들을 레일즈 기여자 목록에서 확인할 수 있습니다. 이 분들에게 경의를 표합니다.

Last updated