rubyonrails.org에서 더 보기:

GitHub에서 이 파일을 읽지 마세요. 가이드는 https://guides.rubyonrails.org 에서 제공됩니다.

Ruby on Rails 5.0 릴리스 노트

Rails 5.0의 주요 특징:

  • Action Cable
  • Rails API
  • Active Record Attributes API
  • Test Runner
  • Rake 대신 rails CLI의 독점적 사용
  • Sprockets 3
  • Turbolinks 5
  • Ruby 2.2.2+ 필수

이 릴리스 노트는 주요 변경 사항만을 다룹니다. 다양한 버그 수정과 변경 사항에 대해 알아보려면 변경 로그를 참조하거나 GitHub의 메인 Rails 저장소에 있는 커밋 목록을 확인하세요.

1 Rails 5.0으로 업그레이드

기존 애플리케이션을 업그레이드하는 경우, 진행하기 전에 충분한 테스트 커버리지를 확보하는 것이 좋습니다. 아직 하지 않으셨다면 먼저 Rails 4.2로 업그레이드하고 Rails 5.0으로 업데이트를 시도하기 전에 애플리케이션이 예상대로 작동하는지 확인해야 합니다. 업그레이드 시 주의해야 할 사항 목록은 Ruby on Rails 업그레이드 가이드에서 확인할 수 있습니다.

2 주요 기능

2.1 Action Cable

Action Cable은 Rails 5의 새로운 프레임워크입니다. WebSockets을 Rails 애플리케이션의 나머지 부분과 자연스럽게 통합합니다.

Action Cable을 사용하면 실시간 기능을 Rails 애플리케이션의 나머지 부분과 동일한 스타일과 형식으로 Ruby로 작성할 수 있으며, 동시에 성능과 확장성을 유지할 수 있습니다. 이는 client-side JavaScript 프레임워크와 server-side Ruby 프레임워크를 모두 제공하는 풀스택 솔루션입니다. Active Record나 선택한 ORM으로 작성된 전체 도메인 모델에 접근할 수 있습니다.

자세한 내용은 Action Cable Overview 가이드를 참조하세요.

2.2 API Applications

Rails는 이제 경량화된 API 전용 애플리케이션을 만드는데 사용될 수 있습니다. 이는 XGitHub API와 같은 API를 만들고 제공하는데 유용하며, 공개용 API뿐만 아니라 커스텀 애플리케이션을 위한 API를 제공하는데도 사용할 수 있습니다.

다음과 같이 새로운 Rails API 앱을 생성할 수 있습니다:

$ rails new my_api --api

이는 다음 세 가지 주요한 작업을 수행합니다:

  • 일반적인 경우보다 더 제한된 middleware 세트로 애플리케이션을 시작하도록 설정합니다. 구체적으로, 기본적으로 브라우저 애플리케이션을 위한 (쿠키 지원과 같은) middleware를 포함하지 않습니다.
  • ApplicationControllerActionController::Base 대신 ActionController::API를 상속하도록 합니다. middleware와 마찬가지로, 브라우저 애플리케이션에서 주로 사용되는 기능을 제공하는 Action Controller 모듈들을 제외합니다.
  • 새로운 resource를 생성할 때 view, helper, asset을 생성하지 않도록 generator를 설정합니다.

이 애플리케이션은 API를 위한 기반을 제공하며, 애플리케이션의 필요에 따라 기능을 추가하도록 구성할 수 있습니다.

자세한 내용은 API 전용 애플리케이션을 위한 Rails 사용하기 가이드를 참조하세요.

2.3 Active Record attributes API

모델에 타입이 있는 attribute를 정의합니다. 필요한 경우 기존 attribute의 타입을 재정의합니다. 이를 통해 값이 모델에 할당될 때 SQL로 변환되거나 SQL에서 변환되는 방식을 제어할 수 있습니다. 또한 ActiveRecord::Base.where에 전달되는 값의 동작도 변경하므로, 구현 세부사항이나 monkey patching에 의존하지 않고도 Active Record 전반에 걸쳐 도메인 객체를 사용할 수 있습니다.

이를 통해 달성할 수 있는 것들:

  • Active Record가 감지한 타입을 재정의할 수 있습니다.
  • 기본값을 제공할 수 있습니다.
  • attribute가 데이터베이스 컬럼에 의해 지원될 필요가 없습니다.
# db/schema.rb
create_table :store_listings, force: true do |t|
  t.decimal :price_in_cents
  t.string :my_string, default: "기본 원본"
end
# app/models/store_listing.rb 
class StoreListing < ActiveRecord::Base  
end
store_listing = StoreListing.new(price_in_cents: '10.1')

# 이전
store_listing.price_in_cents # => BigDecimal.new(10.1)
StoreListing.new.my_string # => "original default"

class StoreListing < ActiveRecord::Base
  attribute :price_in_cents, :integer # 커스텀 타입
  attribute :my_string, :string, default: "new default" # 기본값 
  attribute :my_default_proc, :datetime, default: -> { Time.now } # 기본값
  attribute :field_without_db_column, :integer, array: true  
end

# 이후
store_listing.price_in_cents # => 10
StoreListing.new.my_string # => "new default"
StoreListing.new.my_default_proc # => 2015-05-30 11:04:48 -0600
model = StoreListing.new(field_without_db_column: ["1", "2", "3"]) 
model.attributes # => {field_without_db_column: [1, 2, 3]}

사용자 정의 Type 생성하기:

데이터베이스나 컨트롤러로부터의 원시 입력값에 대해 value type에 정의된 메서드에 응답하는 한, 자신만의 custom type을 정의할 수 있습니다. deserialize 또는 cast 메서드가 당신의 type 객체에서 호출될 것입니다. 이것은 Money 데이터와 같은 사용자 정의 변환을 수행할 때 유용합니다.

쿼리하기:

ActiveRecord::Base.where가 호출되면, 모델 클래스에 의해 정의된 type을 사용하여 값을 SQL로 변환하고, type 객체의 serialize를 호출합니다.

이를 통해 객체들은 SQL 쿼리를 수행할 때 값을 변환하는 방법을 지정할 수 있습니다.

Dirty Tracking:

속성의 type은 dirty tracking이 수행되는 방식을 변경할 수 있습니다.

자세한 설명은 문서를 참조하세요.

2.4 Test Runner

Rails에서 테스트 실행 기능을 향상시키기 위한 새로운 test runner가 도입되었습니다. 이 test runner를 사용하려면 간단히 bin/rails test를 입력하면 됩니다.

Test Runner는 RSpec, minitest-reporters, maxitest 등에서 영감을 받았습니다. 다음과 같은 주목할 만한 발전 사항들을 포함하고 있습니다:

  • 테스트의 line number를 사용하여 단일 테스트 실행.
  • 테스트의 line number를 지정하여 여러 테스트 실행.
  • 실패한 테스트를 쉽게 재실행할 수 있도록 개선된 실패 메시지.
  • -f 옵션을 사용한 fail fast 기능으로, 테스트 suite가 완료될 때까지 기다리지 않고 실패 발생 시 즉시 테스트 중단.
  • -d 옵션을 사용하여 전체 테스트 실행이 끝날 때까지 테스트 출력을 지연.
  • -b 옵션을 사용하여 전체 예외 backtrace 출력.
  • minitest와의 통합으로 테스트 seed 데이터를 위한 -s, 이름으로 특정 테스트를 실행하기 위한 -n, 더 자세한 verbose 출력을 위한 -v 등의 옵션 사용 가능.
  • 컬러로 구분된 테스트 출력.

3 Railties

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

3.1 제거된 기능들

  • debugger 지원이 제거되었습니다. 대신 byebug를 사용하세요. debugger는 Ruby 2.2에서 지원되지 않습니다. (commit)

  • 더 이상 사용되지 않는 test:alltest:all:db task들이 제거되었습니다. (commit)

  • 더 이상 사용되지 않는 Rails::Rack::LogTailer가 제거되었습니다. (commit)

  • 더 이상 사용되지 않는 RAILS_CACHE 상수가 제거되었습니다. (commit)

  • 더 이상 사용되지 않는 serve_static_assets 설정이 제거되었습니다. (commit)

  • 문서화 task인 doc:app, doc:rails, 그리고 doc:guides가 제거되었습니다. (commit)

  • 기본 스택에서 Rack::ContentLength middleware가 제거되었습니다. (Commit)

3.2 Deprecations

  • config.public_file_server.headers를 위해 config.static_cache_control이 Deprecated 되었습니다. (Pull Request)

  • config.public_file_server.enabled를 위해 config.serve_static_files가 Deprecated 되었습니다. (Pull Request)

  • rails task namespace의 task들이 app namespace를 위해 Deprecated 되었습니다. (예: rails:updaterails:template task들이 app:updateapp:template로 이름이 변경되었습니다.) (Pull Request)

3.3 주목할만한 변경사항

  • Rails 테스트 러너 bin/rails test가 추가되었습니다. (Pull Request)

  • 새로 생성된 애플리케이션과 플러그인은 Markdown 형식의 README.md를 받습니다. (commit, Pull Request)

  • tmp/restart.txt를 터치하여 Rails 앱을 재시작하는 bin/rails restart 작업이 추가되었습니다. (Pull Request)

  • Rails에서 호출되는 순서대로 모든 정의된 initializer를 출력하는 bin/rails initializers 작업이 추가되었습니다. (Pull Request)

  • 개발 모드에서 캐싱을 활성화하거나 비활성화하는 bin/rails dev:cache가 추가되었습니다. (Pull Request)

  • 개발 환경을 자동으로 업데이트하는 bin/update 스크립트가 추가되었습니다. (Pull Request)

  • bin/rails를 통한 Rake 작업 프록시. (Pull Request, Pull Request)

  • Linux와 macOS에서 새로운 애플리케이션은 이벤트 기반 파일 시스템 모니터가 활성화된 상태로 생성됩니다. 생성기에 --skip-listen을 전달하여 이 기능을 비활성화할 수 있습니다. (commit, commit)

  • 환경 변수 RAILS_LOG_TO_STDOUT를 사용하여 프로덕션 환경에서 STDOUT으로 로깅하는 옵션이 있는 애플리케이션을 생성합니다. (Pull Request)

  • 새로운 애플리케이션에 대해 IncludeSubdomains 헤더가 포함된 HSTS를 활성화합니다. (Pull Request)

  • 애플리케이션 생성기가 Spring에게 추가적인 공통 파일을 감시하도록 지시하는 새로운 파일 config/spring.rb를 작성합니다. (commit)

  • 새로운 앱 생성 시 Action Mailer를 생략하는 --skip-action-mailer가 추가되었습니다. (Pull Request)

  • tmp/sessions 디렉토리와 이와 관련된 clear rake 작업이 제거되었습니다. (Pull Request)

  • scaffold 생성기로 생성된 _form.html.erb가 로컬 변수를 사용하도록 변경되었습니다.

(Pull Request)

  • production 환경에서 class autoloading을 비활성화했습니다. (commit)

4 Action Pack

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

4.1 Removals

  • ActionDispatch::Request::Utils.deep_munge가 제거되었습니다. (commit)

  • ActionController::HideActions가 제거되었습니다. (Pull Request)

  • respond_torespond_with placeholder 메서드가 제거되었습니다. 이 기능은 responders gem으로 추출되었습니다. (commit)

  • deprecated된 assertion 파일들이 제거되었습니다. (commit)

  • URL helper에서 deprecated된 string key 사용이 제거되었습니다. (commit)

  • *_path helper에서 deprecated된 only_path 옵션이 제거되었습니다. (commit)

  • deprecated된 NamedRouteCollection#helpers가 제거되었습니다. (commit)

  • #를 포함하지 않는 :to 옵션으로 라우트를 정의하는 deprecated된 지원이 제거되었습니다. (commit)

  • deprecated된 ActionDispatch::Response#to_ary가 제거되었습니다. (commit)

  • deprecated된 ActionDispatch::Request#deep_munge가 제거되었습니다. (commit)

  • deprecated된 ActionDispatch::Http::Parameters#symbolized_path_parameters가 제거되었습니다. (commit)

  • 컨트롤러 테스트에서 deprecated된 use_route 옵션이 제거되었습니다. (commit)

  • assignsassert_template이 제거되었습니다. 두 메서드 모두 rails-controller-testing gem으로 추출되었습니다. (Pull Request)

4.2 폐기 예정

  • 모든 *_filter 콜백을 *_action 콜백으로 대체하며 폐기 예정입니다. (Pull Request)

  • *_via_redirect integration test 메소드가 폐기 예정입니다. 동일한 동작을 위해서는 request 호출 후 수동으로 follow_redirect!를 사용하세요. (Pull Request)

  • AbstractController#skip_action_callback이 개별 skip_callback 메소드로 대체되며 폐기 예정입니다. (Pull Request)

  • render 메소드의 :nothing 옵션이 폐기 예정입니다. (Pull Request)

  • head 메소드의 첫 번째 파라미터로 Hash를 전달하는 것과 기본 상태 코드가 폐기 예정입니다. (Pull Request)

  • middleware 클래스 이름에 문자열이나 심볼을 사용하는 것이 폐기 예정입니다. 대신 클래스 이름을 사용하세요. (commit)

  • 상수를 통한 MIME 타입 접근(예: Mime::HTML)이 폐기 예정입니다. 대신 심볼과 함께 subscript 연산자를 사용하세요(예: Mime[:html]). (Pull Request)

  • redirect_to :backredirect_back으로 대체되며 폐기 예정입니다. redirect_back은 필수 fallback_location 인자를 받아 RedirectBackError 발생 가능성을 제거합니다. (Pull Request)

  • ActionDispatch::IntegrationTestActionController::TestCase는 위치 인자 대신 키워드 인자를 사용하도록 폐기 예정입니다. (Pull Request)

  • :controller:action path 파라미터가 폐기 예정입니다. (Pull Request)

  • controller 인스턴스의 env 메소드가 폐기 예정입니다. (commit)

  • ActionDispatch::ParamsParser가 폐기 예정이며 middleware 스택에서 제거되었습니다. 파라미터 파서를 구성하려면 ActionDispatch::Request.parameter_parsers=를 사용하세요. (commit, commit)

4.3 주목할만한 변경사항

  • 컨트롤러 액션 외부에서 임의의 템플릿을 렌더링할 수 있는 ActionController::Renderer가 추가되었습니다. (Pull Request)

  • ActionController::TestCaseActionDispatch::Integration의 HTTP 요청 메서드에서 키워드 인자 문법으로 마이그레이션했습니다. (Pull Request)

  • Action Controller에 http_cache_forever가 추가되어 만료되지 않는 응답을 캐시할 수 있게 되었습니다. (Pull Request)

  • request variants에 대한 더 친숙한 접근 방식을 제공합니다. (Pull Request)

  • 대응하는 템플릿이 없는 액션의 경우, 에러를 발생시키는 대신 head :no_content를 렌더링합니다. (Pull Request)

  • 컨트롤러의 기본 form builder를 재정의할 수 있는 기능이 추가되었습니다. (Pull Request)

  • API-only 앱에 대한 지원이 추가되었습니다. 이러한 종류의 애플리케이션을 위해 ActionController::Base를 대체하는 ActionController::API가 추가되었습니다. (Pull Request)

  • ActionController::Parameters가 더 이상 HashWithIndifferentAccess를 상속하지 않습니다. (Pull Request)

  • config.force_sslconfig.ssl_options를 시도하기 덜 위험하고 비활성화하기 쉽게 만들어 opt in이 더 쉬워졌습니다. (Pull Request)

  • ActionDispatch::Static에 임의의 헤더를 반환할 수 있는 기능이 추가되었습니다. (Pull Request)

  • protect_from_forgery의 prepend 기본값이 false로 변경되었습니다. (commit)

  • ActionController::TestCase는 Rails 5.1에서 별도의 gem으로 이동될 예정입니다. 대신 ActionDispatch::IntegrationTest를 사용하세요. (commit)

  • Rails는 기본적으로 weak ETags를 생성합니다. (Pull Request)

  • 명시적인 render 호출이 없고 해당하는 템플릿이 없는 Controller action은 에러를 발생시키는 대신 암묵적으로 head :no_content를 렌더링합니다. (Pull Request 1, 2)

  • form별 CSRF 토큰을 위한 옵션이 추가되었습니다. (Pull Request)

  • integration 테스트에 요청 인코딩과 응답 파싱이 추가되었습니다. (Pull Request)

  • controller 레벨에서 view context에 접근할 수 있도록 ActionController#helpers가 추가되었습니다. (Pull Request)

  • 폐기된 flash 메시지는 세션에 저장되기 전에 제거됩니다. (Pull Request)

  • fresh_whenstale?에 레코드 컬렉션을 전달하는 기능이 추가되었습니다. (Pull Request)

  • ActionController::LiveActiveSupport::Concern이 되었습니다. 이는 다른 모듈에 ActiveSupport::Concern을 확장하지 않고 단순히 include하면 프로덕션 환경에서 ActionController::Live가 작동하지 않는다는 것을 의미합니다. 일부 사용자들은 ActionController::Live를 사용할 때 생성된 스레드에서 발생하는 :warden을 미들웨어가 잡을 수 없기 때문에 Warden/Devise 인증 실패 처리 코드를 포함하는 다른 모듈을 사용할 수 있습니다. (자세한 내용은 이 이슈 참조)

  • Response#strong_etag=#weak_etag=, 그리고 fresh_whenstale?에 대한 유사한 옵션들이 도입되었습니다. (Pull Request)

5 Action View

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

5.1 제거된 기능

  • 더 이상 사용되지 않는 AbstractController::Base::parent_prefixes가 제거되었습니다. (commit)

  • ActionView::Helpers::RecordTagHelper가 제거되었습니다. 이 기능은 record_tag_helper gem으로 추출되었습니다. (Pull Request)

  • I18n에서 더 이상 지원하지 않기 때문에 translate 헬퍼의 :rescue_format 옵션이 제거되었습니다. (Pull Request)

5.2 주요 변경사항

  • 기본 템플릿 핸들러를 ERB에서 Raw로 변경했습니다. (commit)

  • Collection 렌더링이 여러 partial을 한 번에 캐시하고 가져올 수 있습니다. (Pull Request, commit)

  • 명시적 의존성에 와일드카드 매칭을 추가했습니다. (Pull Request)

  • submit 태그에 대해 disable_with를 기본 동작으로 만들었습니다. 이중 제출을 방지하기 위해 제출 시 버튼을 비활성화합니다. (Pull Request)

  • Partial 템플릿 이름이 더 이상 유효한 Ruby 식별자일 필요가 없습니다. (commit)

  • datetime_tag 헬퍼가 이제 datetime-local 타입의 input 태그를 생성합니다. (Pull Request)

  • render partial: 헬퍼로 렌더링할 때 블록을 사용할 수 있게 되었습니다. (Pull Request)

6 Action Mailer

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

6.1 제거사항

  • 이메일 뷰에서 deprecated된 *_path helper들이 제거되었습니다. (commit)

  • deprecated된 deliverdeliver! 메서드들이 제거되었습니다. (commit)

6.2 주목할 만한 변경사항

  • Template lookup이 이제 default locale과 I18n fallbacks를 존중합니다. (commit)

  • generator를 통해 생성된 mailer에 controllers와 jobs에서 사용된 것과 같은 명명 규칙을 따라 _mailer 접미사를 추가했습니다. (Pull Request)

  • assert_enqueued_emailsassert_no_enqueued_emails를 추가했습니다. (Pull Request)

  • mailer queue 이름을 설정하기 위한 config.action_mailer.deliver_later_queue_name 설정을 추가했습니다. (Pull Request)

  • Action Mailer views에서 fragment caching 지원을 추가했습니다. templates가 caching을 수행할지 여부를 결정하는 새로운 설정 옵션 config.action_mailer.perform_caching을 추가했습니다. (Pull Request)

7 Active Record

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

7.1 제거된 기능들

  • query 값으로 중첩된 배열을 전달할 수 있었던 deprecated 동작을 제거했습니다. (Pull Request)

  • deprecated된 ActiveRecord::Tasks::DatabaseTasks#load_schema를 제거했습니다. 이 메서드는 ActiveRecord::Tasks::DatabaseTasks#load_schema_for로 대체되었습니다. (commit)

  • deprecated된 serialized_attributes를 제거했습니다. (commit)

  • has_many :through에서 deprecated된 자동 counter cache를 제거했습니다. (commit)

  • deprecated된 sanitize_sql_hash_for_conditions를 제거했습니다. (commit)

  • deprecated된 Reflection#source_macro를 제거했습니다. (commit)

  • deprecated된 symbolized_base_classsymbolized_sti_name을 제거했습니다. (commit)

  • deprecated된 ActiveRecord::Base.disable_implicit_join_references=를 제거했습니다. (commit)

  • string accessor를 사용한 deprecated된 connection specification 접근을 제거했습니다. (commit)

  • 인스턴스 의존적인 association을 preload하는 deprecated된 지원을 제거했습니다. (commit)

  • 배타적 하한을 가진 PostgreSQL range에 대한 deprecated된 지원을 제거했습니다. (commit)

  • 캐시된 Arel이 있는 relation을 수정할 때의 deprecation을 제거했습니다. 이제 대신 ImmutableRelation 에러가 발생합니다. (commit)

  • core에서 ActiveRecord::Serialization::XmlSerializer를 제거했습니다. 이 기능은 activemodel-serializers-xml gem으로 추출되었습니다. (Pull Request)

  • core에서 레거시 mysql database adapter에 대한 지원을 제거했습니다. 대부분의 사용자는 mysql2를 사용할 수 있습니다. 유지보수할 사람을 찾으면 별도의 gem으로 전환될 예정입니다. (Pull Request 1, Pull Request 2)

  • protected_attributes gem 지원을 제거했습니다. (commit)

  • PostgreSQL 9.1 이하 버전에 대한 지원을 제거했습니다. (Pull Request)

  • activerecord-deprecated_finders gem 지원을 제거했습니다. (commit)

  • ActiveRecord::ConnectionAdapters::Column::TRUE_VALUES 상수를 제거했습니다. (commit)

7.2 Deprecations

  • query에서 class를 값으로 전달하는 것이 deprecated 되었습니다. 사용자는 대신 문자열을 전달해야 합니다. (Pull Request)

  • Active Record callback chain을 중단하는 방법으로 false를 반환하는 것이 deprecated 되었습니다. 권장되는 방법은 throw(:abort)입니다. (Pull Request)

  • ActiveRecord::Base.errors_in_transactional_callbacks=가 deprecated 되었습니다. (commit)

  • Relation#uniq가 deprecated 되었습니다. 대신 Relation#distinct를 사용하세요. (commit)

  • PostgreSQL :point 타입이 deprecated 되었습니다. 대신 Array 대신 Point 객체를 반환하는 새로운 타입을 사용하세요. (Pull Request)

  • association 메서드에 truthy 인자를 전달하여 강제로 association을 reload하는 것이 deprecated 되었습니다. (Pull Request)

  • association restrict_dependent_destroy 에러의 키들이 새로운 키 이름을 위해 deprecated 되었습니다. (Pull Request)

  • #tables의 동작이 동기화되었습니다. (Pull Request)

  • SchemaCache#tables, SchemaCache#table_exists?SchemaCache#clear_table_cache!가 새로운 data source 대응 메서드를 위해 deprecated 되었습니다. (Pull Request)

  • SQLite3와 MySQL adapter에서 connection.tables가 deprecated 되었습니다. (Pull Request)

  • #tables에 인자를 전달하는 것이 deprecated 되었습니다 - 일부 adapter(mysql2, sqlite3)의 #tables 메서드는 테이블과 뷰를 모두 반환하는 반면, 다른 adapter(postgresql)는 테이블만 반환했습니다. 동작을 일관되게 만들기 위해, #tables는 앞으로 테이블만 반환할 것입니다. (Pull Request)

  • table_exists?가 deprecated 되었습니다 - #table_exists? 메서드는 테이블과 뷰를 모두 확인했습니다. #tables와 동작을 일관되게 만들기 위해, #table_exists?는 앞으로 테이블만 확인할 것입니다. (Pull Request)

  • find_nthoffset 인자를 전달하는 것이 deprecated 되었습니다. 대신

relation에서 offset 메서드를 대신 사용하세요. (Pull Request)

  • DatabaseStatements에서 {insert|update|delete}_sql이 Deprecated 되었습니다. 대신 {insert|update|delete} public 메서드를 사용하세요. (Pull Request)

  • 더 명확한 의미 전달을 위해 use_transactional_fixturesuse_transactional_tests로 Deprecated 되었습니다. (Pull Request)

  • ActiveRecord::Connection#quote에 column을 전달하는 것이 Deprecated 되었습니다. (commit)

  • find_in_batchesstart 파라미터를 보완하는 end 옵션이 추가되어 batch 처리를 중단할 위치를 지정할 수 있습니다. (Pull Request)

7.3 주목할 만한 변경사항

  • 테이블 생성 시 referencesforeign_key 옵션이 추가되었습니다. (commit)

  • 새로운 attributes API가 추가되었습니다. (commit)

  • enum 정의에 :_prefix/:_suffix 옵션이 추가되었습니다. (Pull Request, Pull Request)

  • ActiveRecord::Relation#cache_key가 추가되었습니다. (Pull Request)

  • timestamps의 기본 null 값이 false로 변경되었습니다. (commit)

  • SecureRandom을 사용하여 모델의 속성에 대한 고유 토큰 생성을 캡슐화하기 위해 ActiveRecord::SecureToken이 추가되었습니다. (Pull Request)

  • drop_table:if_exists 옵션이 추가되었습니다. (Pull Request)

  • 데이터베이스에서 필요한 데이터만 선택하고자 할 때 모델에서 어떤 필드가 읽혔는지 빠르게 확인할 수 있는 ActiveRecord::Base#accessed_fields가 추가되었습니다. (commit)

  • WHERE 또는 HAVING 절을 결합하기 위한 OR 연산자를 사용할 수 있도록 ActiveRecord::Relation#or 메서드가 추가되었습니다. (commit)

  • 주어진 블록 동안 수신자가 저장되는 것을 방지하기 위한 ActiveRecord::Base.suppress가 추가되었습니다. (Pull Request)

  • belongs_to는 이제 기본적으로 연관관계가 존재하지 않으면 유효성 검사 오류를 발생시킵니다. 각 연관관계별로 optional: true를 사용하여 이를 비활성화할 수 있습니다. 또한 belongs_to에서 required 옵션은 optional을 선호하여 deprecated 되었습니다. (Pull Request)

  • db:structure:dump의 동작을 설정하기 위한 config.active_record.dump_schemas가 추가되었습니다. (Pull Request)

  • config.active_record.warn_on_records_fetched_greater_than 옵션이 추가되었습니다. (Pull Request)

  • MySQL에서 native JSON 데이터 타입 지원이 추가되었습니다. (Pull Request)

  • PostgreSQL에서 인덱스를 동시에 삭제하는 기능이 추가되었습니다. (Pull Request)

  • connection adapter에 #views#view_exists? 메소드가 추가되었습니다. (Pull Request)

  • Active Record에서 일부 column을 보이지 않게 만들 수 있는 ActiveRecord::Base.ignored_columns가 추가되었습니다. (Pull Request)

  • connection.data_sourcesconnection.data_source_exists?가 추가되었습니다. 이 메소드들은 Active Record 모델의 기반이 될 수 있는 relation(일반적으로 테이블과 뷰)을 결정합니다. (Pull Request)

  • fixture 파일에서 YAML 파일 내에 모델 클래스를 설정할 수 있게 되었습니다. (Pull Request)

  • 데이터베이스 migration을 생성할 때 primary key로 uuid를 기본값으로 설정하는 기능이 추가되었습니다. (Pull Request)

  • ActiveRecord::Relation#left_joinsActiveRecord::Relation#left_outer_joins가 추가되었습니다. (Pull Request)

  • after_{create,update,delete}_commit 콜백이 추가되었습니다. (Pull Request)

  • migration 클래스에 제공되는 API의 버전 관리가 도입되어, 기존 migration을 손상시키거나 deprecation 주기를 통해 재작성하도록 강요하지 않고도 파라미터 기본값을 변경할 수 있게 되었습니다. (Pull Request)

  • ApplicationRecord는 모든 앱 모델을 위한 새로운 superclass로, app controller가 ActionController::Base 대신 ApplicationController를 상속받는 것과 유사합니다. 이를 통해 앱은 앱 전체 모델 동작을 설정할 수 있는 단일 지점을 갖게 됩니다. (Pull Request)

  • ActiveRecord에 #second_to_last#third_to_last 메소드가 추가되었습니다. (Pull Request)

  • PostgreSQL & MySQL에서 데이터베이스 메타데이터에 저장된 주석으로 데이터베이스 객체(테이블, 컬럼, 인덱스)에 주석을 달 수 있는 기능이 추가되었습니다. (Pull Request)

  • mysql2 0.4.4+ 버전에서 mysql2 adapter에 prepared statements 지원이 추가되었습니다. 이전에는 deprecated된 레거시 mysql adapter에서만 지원되었습니다. 활성화하려면 config/database.yml에서 prepared_statements: true로 설정하세요. (Pull Request)

  • ActiveRecord::Relation 객체에서 update를 호출할 수 있는 기능이 추가되어 relation의 모든 객체에 대해 validation과 callback이 실행됩니다. (Pull Request)

  • timestamp를 업데이트하지 않고 레코드를 저장할 수 있도록 save 메소드에 :touch 옵션이 추가되었습니다. (Pull Request)

  • PostgreSQL에 대한 expression indexes와 operator classes 지원이 추가되었습니다. (commit)

  • 중첩된 속성의 에러에 인덱스를 추가하기 위한 :index_errors 옵션이 추가되었습니다. (Pull Request)

  • 양방향 destroy dependencies에 대한 지원이 추가되었습니다. (Pull Request)

  • 트랜잭션 테스트에서 after_commit 콜백 지원이 추가되었습니다. (Pull Request)

  • 테이블에 foreign key가 존재하는지 확인하는 foreign_key_exists? 메소드가 추가되었습니다. (Pull Request)

  • 현재 시간이 아닌 다른 시간으로 레코드를 touch할 수 있도록 touch 메소드에 :time 옵션이 추가되었습니다. (Pull Request)

  • 트랜잭션 콜백이 에러를 삼키지 않도록 변경되었습니다. 이전에는 트랜잭션 콜백 내에서 발생한 모든 에러가 rescued되어 로그에 출력되었습니다(새로 deprecated된 raise_in_transactional_callbacks = true 옵션을 사용하지 않는 한).

이제 이러한 에러들은 더 이상 rescued되지 않고 다른 콜백들의 동작과 일치하도록 상위로 전파됩니다. (commit)

8 Active Model

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

8.1 제거된 기능들

  • 더 이상 사용되지 않는 ActiveModel::Dirty#reset_#{attribute}ActiveModel::Dirty#reset_changes가 제거되었습니다. (Pull Request)

  • XML serialization이 제거되었습니다. 이 기능은 activemodel-serializers-xml gem으로 추출되었습니다. (Pull Request)

  • ActionController::ModelNaming 모듈이 제거되었습니다. (Pull Request)

8.2 지원 중단 예정

  • Active Model과 ActiveModel::Validations callback 체인을 중단하는 방법으로 false를 반환하는 것이 지원 중단될 예정입니다. 권장되는 방법은 throw(:abort)입니다. (Pull Request)

  • 일관성 없는 동작을 하는 ActiveModel::Errors#get, ActiveModel::Errors#set, ActiveModel::Errors#[]= 메서드가 지원 중단될 예정입니다. (Pull Request)

  • validates_length_of:tokenizer 옵션이 일반 Ruby를 선호하는 방향으로 지원 중단될 예정입니다. (Pull Request)

  • ActiveModel::Errors#add_on_emptyActiveModel::Errors#add_on_blank가 대체 없이 지원 중단될 예정입니다. (Pull Request)

8.3 주목할만한 변경사항

  • 어떤 validator가 실패했는지 확인할 수 있는 ActiveModel::Errors#details를 추가했습니다. (Pull Request)

  • ActiveRecord::AttributeAssignmentActiveModel::AttributeAssignment로 추출하여 포함 가능한 module로서 모든 객체에서 사용할 수 있게 했습니다. (Pull Request)

  • 모델이 저장된 후 기록된 변경사항에 더 쉽게 접근할 수 있도록 ActiveModel::Dirty#[attr_name]_previously_changed?ActiveModel::Dirty#[attr_name]_previous_change를 추가했습니다. (Pull Request)

  • valid?invalid?에서 여러 context를 한번에 검증할 수 있게 되었습니다. (Pull Request)

  • validates_acceptance_of1 외에도 true를 기본값으로 받아들이도록 변경되었습니다. (Pull Request)

9 Active Job

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

9.1 주목할 만한 변경사항

  • ActiveJob::Base.deserialize가 job 클래스에 위임됩니다. 이를 통해 job이 직렬화될 때 임의의 메타데이터를 첨부하고 실행될 때 다시 읽을 수 있습니다. (Pull Request)

  • 다른 job에 영향을 주지 않고 job별로 queue adapter를 구성할 수 있는 기능이 추가되었습니다. (Pull Request)

  • 생성된 job은 이제 기본적으로 app/jobs/application_job.rb를 상속받습니다. (Pull Request)

  • DelayedJob, Sidekiq, qu, que, queue_classic이 job id를 provider_job_idActiveJob::Base에 보고할 수 있게 되었습니다. (Pull Request, Pull Request, commit)

  • concurrent-ruby thread pool에 job을 큐잉하는 간단한 AsyncJob processor와 관련 AsyncAdapter를 구현했습니다. (Pull Request)

  • 기본 adapter를 inline에서 async로 변경했습니다. 테스트가 실수로 동기적 동작에 의존하게 되는 것을 방지할 수 있어 더 나은 기본값입니다. (commit)

10 Active Support

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

10.1 제거된 기능

  • 더 이상 사용되지 않는 ActiveSupport::JSON::Encoding::CircularReferenceError가 제거되었습니다. (commit)

  • 더 이상 사용되지 않는 메서드 ActiveSupport::JSON::Encoding.encode_big_decimal_as_string=ActiveSupport::JSON::Encoding.encode_big_decimal_as_string가 제거되었습니다. (commit)

  • 더 이상 사용되지 않는 ActiveSupport::SafeBuffer#prepend가 제거되었습니다. (commit)

  • Kernel에서 더 이상 사용되지 않는 메서드들이 제거되었습니다. silence_stderr, silence_stream, capture 그리고 quietly. (commit)

  • 더 이상 사용되지 않는 active_support/core_ext/big_decimal/yaml_conversions 파일이 제거되었습니다. (commit)

  • 더 이상 사용되지 않는 메서드 ActiveSupport::Cache::Store.instrumentActiveSupport::Cache::Store.instrument=가 제거되었습니다. (commit)

  • 더 이상 사용되지 않는 Class#superclass_delegating_accessor가 제거되었습니다. 대신 Class#class_attribute를 사용하세요. (Pull Request)

  • 더 이상 사용되지 않는 ThreadSafe::Cache가 제거되었습니다. 대신 Concurrent::Map을 사용하세요. (Pull Request)

  • Ruby 2.2에서 구현된 Object#itself가 제거되었습니다. (Pull Request)

10.2 Deprecations (지원 중단)

  • LoadError를 위해 MissingSourceFile를 지원 중단했습니다. (commit)

  • Ruby 2.0에서 도입된 Module#prepend를 위해 alias_method_chain를 지원 중단했습니다. (Pull Request)

  • concurrent-ruby의 Concurrent::CountDownLatch를 위해 ActiveSupport::Concurrency::Latch를 지원 중단했습니다. (Pull Request)

  • number_to_human_size:prefix 옵션을 대체 없이 지원 중단했습니다. (Pull Request)

  • 내장된 Module#const_ 메서드를 위해 Module#qualified_const_를 지원 중단했습니다. (Pull Request)

  • callback을 정의하기 위한 문자열 전달을 지원 중단했습니다. (Pull Request)

  • ActiveSupport::Cache::Store#namespaced_key, ActiveSupport::Cache::MemCachedStore#escape_key, 그리고 ActiveSupport::Cache::FileStore#key_file_path를 지원 중단했습니다. 대신 normalize_key를 사용하세요. (Pull Request, commit)

  • write_cache_value를 위해 ActiveSupport::Cache::LocaleCache#set_cache_value를 지원 중단했습니다. (Pull Request)

  • assert_nothing_raised에 인자 전달을 지원 중단했습니다. (Pull Request)

  • Module.constants(false)를 위해 Module.local_constants를 지원 중단했습니다. (Pull Request)

10.3 주목할만한 변경사항

  • ActiveSupport::MessageVerifier#verified#valid_message? 메서드가 추가되었습니다. (Pull Request)

  • callback 체인을 중단하는 방식이 변경되었습니다. 앞으로는 callback 체인을 중단하는 권장 방법은 명시적으로 throw(:abort)를 사용하는 것입니다. (Pull Request)

  • 새로운 설정 옵션 config.active_support.halt_callback_chains_on_return_false가 추가되어 ActiveRecord, ActiveModel, ActiveModel::Validations callback 체인이 'before' callback에서 false를 반환하여 중단될 수 있는지를 지정할 수 있습니다. (Pull Request)

  • 기본 테스트 순서가 :sorted에서 :random으로 변경되었습니다. (commit)

  • Date, Time, DateTime#on_weekend?, #on_weekday?, #next_weekday, #prev_weekday 메서드가 추가되었습니다. (Pull Request, Pull Request)

  • Date, Time, DateTime#next_week#prev_weeksame_time 옵션이 추가되었습니다. (Pull Request)

  • Date, Time, DateTime#yesterday#tomorrow에 대응되는 #prev_day#next_day가 추가되었습니다. (Pull Request)

  • 무작위 base58 문자열 생성을 위한 SecureRandom.base58이 추가되었습니다. (commit)

  • ActiveSupport::TestCasefile_fixture가 추가되었습니다. 테스트 케이스에서 샘플 파일에 접근할 수 있는 간단한 메커니즘을 제공합니다. (Pull Request)

  • 지정된 요소들을 제외한 enumerable의 복사본을 반환하는 EnumerableArray#without이 추가되었습니다. (Pull Request)

  • ActiveSupport::ArrayInquirerArray#inquiry가 추가되었습니다. (Pull Request)

  • 주어진 timezone에서와 같이 시간을 파싱할 수 있도록 ActiveSupport::TimeZone#strptime이 추가되었습니다. (commit)

  • Integer#zero?와 비슷한 방식으로 Integer#positive?Integer#negative? 쿼리 메서드가 추가되었습니다. (commit)

  • ActiveSupport::OrderedOptions에 값이 .blank?일 때 KeyError를 발생시키는 bang 버전의 get 메서드가 추가되었습니다. (Pull Request)

  • 주어진 연도 또는 인자가 없는 경우 현재 연도의 일 수를 반환하는 Time.days_in_year가 추가되었습니다. (commit)

  • 애플리케이션 소스 코드, routes, locales 등의 변경사항을 비동기적으로 감지하는 이벤트 기반 파일 감시자가 추가되었습니다. (Pull Request)

  • 스레드별로 존재하는 클래스 및 모듈 변수를 선언하기 위한 thread_m/cattr_accessor/reader/writer 메서드 모음이 추가되었습니다. (Pull Request)

  • Array#second_to_lastArray#third_to_last 메서드가 추가되었습니다. (Pull Request)

  • 컴포넌트와 라이브러리가 애플리케이션 코드 실행과 애플리케이션 리로딩 프로세스를 관리하고 참여할 수 있도록 ActiveSupport::ExecutorActiveSupport::Reloader API가 공개되었습니다. (Pull Request)

  • ActiveSupport::Duration이 이제 ISO8601 형식 지정과 구문 분석을 지원합니다. (Pull Request)

  • ActiveSupport::JSON.decode가 이제 parse_json_times가 활성화된 경우 ISO8601 로컬 시간 구문 분석을 지원합니다. (Pull Request)

  • ActiveSupport::JSON.decode가 이제 날짜 문자열에 대해 Date 객체를 반환합니다. (Pull Request)

  • TaggedLogging이 로거들이 서로 태그를 공유하지 않도록 여러 번 인스턴스화될 수 있는 기능이 추가되었습니다. (Pull Request)

11 Credits

Rails를 안정적이고 견고한 프레임워크로 만들기 위해 많은 시간을 투자한 수많은 사람들을 보려면 Rails 기여자 전체 목록을 참조하세요. 모든 분들께 찬사를 보냅니다.



맨 위로