More at rubyonrails.org: More Ruby on Rails

Ruby on Rails 5.0 릴리스 노트

Rails 5.0에서 주목할 점

이 릴리스에서는 주요 변경점에 대해서만 설명합니다. 수정된 버그 및 변경점에 대해서는 Github Rails 저장소에 있는 changelog나 커밋 목록을 참고해주세요.

1 Rails 5.0로 업그레이드하기

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

2 주요 변경점

2.1 액션 케이블

Pull Request

액션 케이블은 Rails 5에서 새롭게 도입된 프레임워크로 Rails 애플리케이션에서 웹 소켓과 관련된 부분을 부드럽게 통합합니다.

액션 케이블을 도입하면, Rails 애플리케이션의 좋은 생산성과 확장 가능성을 유지하며 기존의 Rails 애플리케이션과 동일한 스타일, 방법으로 실시간 기능을 루비로 작성할 수 있습니다. 액션 케이블은 클라이언트 쪽의 자바 스크립트 프레임워크와 서버 쪽의 루비 프레임워크를 동시에 제공합니다. 액션 레코드와 같은 ORM으로 작성된 모든 도메인 모델에 접근할 수 있습니다.

자세한 설명은 액션 케이블의 개요를 참조해주세요.

2.2 API 애플리케이션

API만을 제공하는 간단한 애플리케이션을 Rails를 사용해 생성할 수 있게 되었습니다. Twitter API나 GitHub API와 같은 공용 API 서버는 물론, 그 외의 애플리케이션을 위한 API 서버를 작성할 때에도 편리합니다.

API Rails 애플리케이션을 생성하려면 다음의 명령어를 사용합니다.

$ rails new my_api --api

이 명령은 다음 3개의 동작을 실행합니다.

  • 사용하는 미들웨어를 일반적인 상황보다 적게 사용하여 서버를 실행하도록 설정합니다. 특히 브라우저용 애플리케이션에서 유용한 미들웨어(쿠키에 대한 지원 등)를 일체 사용할 수 없게 됩니다.
  • ApplicationController는 기존의 ActionController::Base 대신에 ActionController::API를 상속합니다. 미들웨어와 마찬가지로 액션컨트롤러 모듈에서 브라우저용 애플리케이션에서만 사용되는 모듈을 모두 제외합니다.
  • 제너레이터가 뷰, 헬퍼, 애셋을 생성하지 않습니다.

생성된 API 애플리케이션은 API 제공하기 위한 토대가 되며, 필요에 따라서 기능을 추가 할 수 있습니다.

자세한 설명은 Rails에서 API 전용 애플리케이션을 만들기를 참고하세요.

2.3 액티브 레코드 속성 API

모델에 type 속성을 정의합니다. 필요하다면 기존의 속성을 덮어써도 좋습니다. 이를 사용하여 모델의 속성을 SQL로 어떻게 상호변환할지를 제어할 수 있습니다. 또한 ActiveRecord::Base.where에 넘겨진 값의 동작을 변경할 수도 있습니다. 이를 통하여 구현의 세부나 몽키 패치에 의존하지 않고 액티브 레코드의 대부분에서 도메인 객체를 사용할 수 있게 됩니다.

다음과 같이 사용할 수도 있습니다.

  • 액티브 레코드에서 검출된 타입을 덮어쓸 수 있습니다.
  • 기본 동작을 지정할 수 있습니다.
  • 속성은 데이터베이스 컬럼을 요구하지 않습니다.

# db/schema.rb
create_table :store_listings, force: true do |t|
  t.decimal :price_in_cents
  t.string :my_string, default: "original 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]}

커스텀 타입 만들기:

독자적인 타입을 정의할 수 있으며, 이는 값의 타입으로 정의된 메소드에 응답하는 경우에 한해서만 가능합니다. deserialize 메소드나 cast 메소드는 작성한 타입 객체로 호출되어 데이터베이스나 컨트롤러에게 받은 실제 입력을 인자로 사용합니다. 이는 통화 변환처럼 직접 별도의 변환을 해야하는 경우에 유용합니다.

쿼리하기:

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

이를 통해서 SQL 쿼리를 실행할 때에 객체를 어떻게 변환할지를 지정할 수 있게 됩니다.

Dirty Tracking:

타입의 속성은 'Dirty Tracking'의 실행 방법을 변경할 수 있게 해줍니다.

자세한 내용은 문서를 참고해주세요.

2.4 테스트 러너

새로운 테스트 러너가 도입되어, Rails에서의 테스트 실행 기능이 강화되었습니다. bin/rails test로 명령하면 테스트 러너를 사용할 수 있습니다.

테스트 러너는 RSpec, minitest-reporters, maxitest 등으로부터 영감을 얻었습니다. 다음과 같은 많은 개선이 이루어졌습니다.

  • 테스트의 줄번호를 지정하여 한 테스트만을 실행합니다.
  • 테스트의 줄번호를 지정하여 여러 테스트를 실행합니다.
  • 실패한 경우에 보여주는 메시지가 개선되어, 실패한 테스트를 곧장 재실행할 수 있게 되었습니다.
  • -f 옵션을 사용하면 실패했을 때에 곧바로 테스트를 정지할 수 있습니다.
  • -d 옵션을 사용하면 테스트가 완료될때까지 메시지 출력을 미룰 수 있습니다.
  • -b 옵션을 사용하면 예외에 대한 전체 백트레이스를 얻을 수 있습니다.
  • Minitest와 통합되어 -s로 시드 데이터를 지정, -n으로 특정 테스트명을 지정, -v로 자세한 메시지 출력을 활성화 하는 등 다양한 옵션을 사용할 수 있게 되었습니다.
  • 테스트 출력에 색깔이 추가되었습니다.

3 Railties

자세한 변경사항은 Changelog를 참고해주세요.

3.1 제거된 것들

  • debugger를 지원하지 않습니다. debugger는 루비 2.2에서는 지원되지 않으므로 앞으로는 byebug를 사용. (commit)

  • 제거 예정이었던 test:all 태스크와 test:all:db 태스크를 제거. (commit)

  • 제거 예정이었던 Rails::Rack::LogTailer를 제거. (commit)

  • 제거 예정이었던 RAILS_CACHE 상수를 제거. (commit)

  • 제거 예정이었던 serve_static_assets 설정을 제거. (commit)

  • 문서 생성용 태스크 doc:app, doc:rails, doc:guides를 제거. (commit)

  • Rack::ContentLength 미들웨어를 기본 스택으로부터 제거. (Commit)

3.2 제거 예정

  • config.static_cache_control이 제거될 예정. 앞으로는 config.public_file_server.headers를 사용. (Pull Request)

  • config.serve_static_files가 제거될 예정. 앞으로는 config.public_file_server.enabled를 사용. (Pull Request)

  • 태스크의 네임스페이스 rails가 제거될 예정. 앞으로는 app을 사용. (e.g. rails:update 태스크나 rails:template 태스크는 app:updateapp:template로 변경됨) (Pull Request)

3.3 주요 변경점

  • Rails 테스트 러너 bin/rails test가 추가됨. (Pull Request)

  • 새 애플리케이션이나 플러그인의 README이 마크다운 형식인 README.md로 변경됨. (commit, Pull Request)

  • Rails 애플리케이션을 touch tmp/restart.txt로 재기동하는 bin/rails restart 태스크가 추가됨. (Pull Request)

  • 모든 정의된 이니셜라이져를 Rails가 실행하는 순서대로 출력하는 bin/rails initializers 태스크가 추가됨. (Pull Request)

  • development 모드에서 캐시의 활성화 여부를 지정하는 bin/rails dev:cache가 추가됨. (Pull Request)

  • developement 환경을 자동으로 업데이트하는 bin/update 스크립트가 추가됨. (Pull Request)

  • rake 태스크를 bin/rails로 사용할 수 있도록 위임함. (Pull Request, Pull Request)

  • 새로 생성된 애플리케이션은 Linux나 Mac OS X 상에서 '파일 시스템의 이벤트 감시'(evented file system monitor)가 활성화됨. --skip-listen 옵션을 사용하여 이 기능을 끌 수 있음. (commit, commit)

  • 새로 생성된 애플리케이션은 RAILS_LOG_TO_STDOUT 환경 변수를 사용해서 production 환경에서 STDOUT으로 로그를 출력하도록 지정할 수 있음. (Pull Request)

  • 새 애플리케이션에서는 HSTS(HTTP Strict Transport Security)에서 IncludeSudomains 헤더가 기본으로 true임. (Pull Request)

  • 애플리케이션 제너레이터로부터 새롭게 config/spring.rb 파일이 생성됨. 이를 사용하여 Spring의 감시 대상을 추가할 수 있음. (commit)

  • 새 애플리케이션 생성 시에 액션메일러를 생략하는 --skip-action-mailer를 추가. (Pull Request)

  • tmp/sessions 폴더와 여기에 관련된 코드를 제거. (Pull Request)

  • scaffold 제너레이터가 생성하는 _form.html.erb를 지역 변수를 사용하도록 변경. (Pull Request)

  • production 환경에서 클래스를 자동 로딩하지 않도록 변경. (commit)

4 Action Pack

자세한 변경사항은 Changelog를 참고해주세요.

4.1 제거된 것들

  • ActionDispatch::Request::Utils.deep_munge가 제거됨. (commit)

  • ActionController::HideActions가 제거됨. (Pull Request)

  • 플레이스 홀더 메소드인 respond_torespond_withresponders gem로 추출됨. (commit)

  • 제거 예정이었던 단언(assertion) 파일들이 제거됨. (commit)

  • 제거 예정이던 URL 헬퍼에서 문자열 키를 사용하는 방식이 제거됨. (commit)

  • 제거 예정이던 only_path 옵션을 *_path 헬퍼에서 제거됨. (commit)

  • 제거 예정이던 NamedRouteCollection#helpers가 제거됨. (commit)

  • #을 포함하지 않는 :to 옵션(제거 예정)의 라우팅 정의 방법이 제거됨. (commit)

  • 제거 예정이던 ActionDispatch::Response#to_ary가 제거됨. (commit)

  • 제거 예정이던 ActionDispatch::Request#deep_munge가 제거됨. (commit)

  • 제거 예정이던 ActionDispatch::Http::Parameters#symbolized_path_parameters가 제거됨. (commit)

  • 컨트롤러 테스트로부터 제거 예정이던 use_route가 제거됨. (commit)

  • assignsassert_templaterails-controller-testing gem으로 추출됨. (Pull Request)

4.2 제거 예정

  • *_filter 콜백이 모두 제거 예정. 앞으로는 *_action 콜백을 사용. (Pull Request)

  • 통합 테스트 메소드 *_via_redirect가 제거 예정. 앞으로 동일한 동작이 필요한 상황에는 요청을 호출한 뒤, follow_redirect!를 직접 실행. (Pull Request)

  • AbstractController#skip_action_callback가 제거 예정. 앞으로는 각각의 skip_callback 메소드를 사용. (Pull Request)

  • render메소드의 :nothing 옵션이 제거 예정. (Pull Request)

  • head 메소드의 첫번째 인수를 Hash로 넘기는 방식과 기본 상태 코드를 넘기는 방식이 제거 예정. (Pull Request)

  • 미들웨어의 클래스명을 문자열이나 심볼로 표현하는 방식이 제거 예정. 앞으로는 클래스명을 그대로 사용할 것. (commit)

  • MIME 타입을 상수로 자정하여 사용하는 방식을 제거 예정(e.g. Mime::HTML). 앞으로는 대괄호로 감싼 심볼을 사용할 것(e.g. Mime[:html]) (Pull Request)

  • RedirectBackError를 피하기 위해 fallback_location를 반드시 넘겨야하는 redirect_back를 장려하기 위해 redirect_to :back가 제거 예정. (Pull Request)

  • ActionDispatch::IntegrationTestActionController::TestCase에서 순서대로 들어오는 인자를 받는 방식을 제거 예정. 앞으로는 키워드 인자를 사용. (Pull Request)

  • 경로 파라미터 :controller:action가 제거 예정. (Pull Request)

  • 컨트롤러의 인스턴스에서 env 메소드가 제거 예정. (commit)

  • ActionDispatch::ParamsParser가 제거 예정이 되고, 미들웨어 스택에서 제거됨. 앞으로 파라미터 파서가 필요한 경우에는 ActionDispatch::Request.parameter_parsers=를 사용. (commit, commit)

4.3 주요 변경점

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

  • ActionController::TestCaseActionDispatch::Integration의 HTTP 요청 메소드에 키워드 인자 구문이 통합됨. (Pull Request)

  • 만료 기한이 없는 응답을 캐싱하는 http_cache_forever가 액션컨트롤러에 추가됨. (Pull Request)

  • 요청의 variant에 알기 쉬운 지정 방식이 추가됨. (Pull Request)

  • 대응하는 템플릿이 없는 경우에는 에러 대신 head :no_content를 랜더링하게됨. (Pull Request)

  • 컨트롤러의 기본 폼 빌더를 덮어쓰는 기능이 추가됨. (Pull Request)

  • API 전용의 애플리케이션에 대한 지원 기능을 추가. 이러한 경우에는 ActionController::Base 대신에 ActionController::API가 사용됨. (Pull Request)

  • ActionController::Parameters는 앞으로 HashWithIndifferentAccess를 상속하지 않음. (Pull Request)

  • 보다 안전한 SSL을 실험하거나 쉽게 비활성화할 수 있도록 config.force_sslconfig.ssl_options를 사용하기 쉽게 만듬. (Pull Request)

  • ActionDispatch::Static에 임의의 헤더를 반환하는 기능이 추가됨. (Pull Request)

  • protect_from_forgery의 prepend의 기본값이 false로 변경됨. (commit)

  • ActionController::TestCase는 Rails 5.1에서 gem으로 추출될 예정. 앞으로는 ActionDispatch::IntegrationTest를 사용. (commit)

  • Rails에서 ETag이 '약한' 방식을 기본으로 사용함. (Pull Request)

  • 컨트롤러 액션에서 render가 명시적으로 호출되지 않고, 대응하는 템플릿도 없는 경우, 에러 대신에 head :no_content를 암묵적으로 호출하게 됨. (Pull Request 1, 2)

  • 폼마다 CSRF 토큰을 생성할 수 있는 옵션이 추가됨. (Pull Request)

  • 요청의 인코딩과 응답을 해석하는 부분이 통합 테스트에 추가됨. (Pull Request)

  • 컨트롤러 레벨에서 뷰 컨텍스트에 접근하는 ActionController#helpers가 추가됨. (Pull Request)

  • 버려진 플래시 메시지를 세션에 저장하지 않고 제거하게 됨. (Pull Request)

  • fresh_whenstale?에 레코드의 컬렉션을 넘기는 기능이 추가됨. (Pull Request)

  • ActionController::LiveActiveSupport::Concern로 변경됨. ActiveSupport::Concern에서 확장하지 않은 다른 모듈에는 포함되지 않음. 그리고 ActionController::Live는 production 환경에서는 사용되지 않는다. 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)

  • translate:rescue_format에 대한 i18n 지원이 중지됨에 따라 해당 옵션을 제거함. (Pull Request)

5.2 주요 변경점

  • 기본 템플릿 핸들러가 ERB에서 Raw로 변경됨. (commit)

  • 컬렉션 렌더링에서 여러 부분(파셜) 템플릿의 캐싱을 한번에 처리할 수 있게 됨. (Pull Request, commit)

  • 명시적인 의존 관계 지정 시에 와일드 카드를 사용하는 매칭 방식을 추가. (Pull Request)

  • disable_with를 submit 태그의 기본 동작으로 설정. 이를 통해 전송시에 버튼의 동작을 무시하여 이중 전송을 예방함. (Pull Request)

  • 부분(파셜) 템플릿 이름에서 유효하지 않은 루비 식별자가 허용됨. (commit)

  • datetime_tag 헬퍼에서 datetime-local를 지정한 input 태그를 생성할 수 있게 됨. (Pull Request)

  • render partial:을 사용하여 랜더링하는 경우에 블록을 넘길 수 있도록 변경. (Pull Request)

6 Action Mailer

자세한 변경사항은 Changelog를 참고해주세요.

6.1 제거된 것들

  • 제거 예정이었던 *_path 헬퍼를 email 뷰로부터 제거. (commit)

  • 제거 예정이었던 deliver 메소드와 deliver!를 제거. (commit)

6.2 주요 변경점

  • 템플릿을 검색할 때에 기본 로케일과 i18n 폴백을 사용하게 됨. (commit)

  • 제너레이터로 생성된 메일러에 _mailer 접미자가 추가됨. 컨트롤러나 잡과 동일한 명명 규칙을 따름. (Pull Request)

  • assert_enqueued_emailsassert_no_enqueued_emails가 추가됨. (Pull Request)

  • 메일러 큐 이름을 설정하기 위한 config.action_mailer.deliver_later_queue_name 옵션이 추가됨. (Pull Request)

  • Action Mailer 뷰에서 조각 캐시를 지원. 템플릿에서 케시가 유효한지를 확인하기 위한 config.action_mailer.perform_caching 옵션이 추가. (Pull Request)

7 Active Record

자세한 변경사항은 Changelog를 참고해주세요.

7.1 제거된 것들

  • 제거 예정이었던 중첩된 배열을 쿼리로 넘기는 기능이 제거됨. (Pull Request)

  • 제거 예정이었던 ActiveRecord::Tasks::DatabaseTasks#load_schema이 제거됨. 이 메소드는 ActiveRecord::Tasks::DatabaseTasks#load_schema_for로 대체되어 있음. (commit)

  • 제거 예정이었던 serialized_attributes이 제거됨. (commit)

  • 제거 예정이었던 has_many :through의 자동 카운터 캐시가 제거됨. (commit)

  • 제거 예정이었던 sanitize_sql_hash_for_conditions가 제거됨. (commit)

  • 제거 예정이었던 Reflection#source_macro가 제거됨. (commit)

  • 제거 예정이었던 symbolized_base_classsymbolized_sti_name가 제거됨. (commit)

  • 제거 예정이었던 ActiveRecord::Base.disable_implicit_join_references=가 제거됨. (commit)

  • 제거 예정이었던 문자열 접근자에 의한 커넥션에 접근하는 방식이 제거됨. (commit)

  • 제거 예정이었던 인스턴스에 의존하는 미리 읽기 기능에 대한 지원이 제거됨. (commit)

  • 제거 예정이었던 PostgreSQL에서만 사용되는 배타 하한치가 제거됨. (commit)

  • 제거 예정이었던 캐시된 Arel과의 관계를 변경했을 시의 동작이 제거됨. 앞으로는 ImmutableRelation 에러가 발생. (commit)

  • ActiveRecord::Serialization::XmlSerializer이 제거됨. 이 기능은 activemodel-serializers-xml gem으로 추출됨. (Pull Request)

  • 오래된 mysql 데이터베이스 어댑터에 대한 지원이 제거됨. 앞으로는 mysql2를 사용. 오래된 어댑터에 대한 유지 보수 담당자가 정해지면 해당 어댑터는 별도의 gem으로 분리될 예정. (Pull Request 1, Pull Request 2)

  • protected_attributes 잼 지원이 종료됨. (commit)

  • PostgreSQL 9.1 이하 지원이 종료. (Pull Request)

  • activerecord-deprecated_finders 잼 지원이 종료됨. (commit)

  • ActiveRecord::ConnectionAdapters::Column::TRUE_VALUES 상수가 제거됨. (commit)

7.2 제거 예정

  • 쿼리로 클래스를 값으로 넘기는 기능이 제거 예정. 사용자는 문자열을 넘길 것. (Pull Request)

  • Active Record의 콜백 체인을 멈추기 위해 false를 반환하는 방식을 제거 예정. 대신 throw(:abort)의 사용을 권장. (Pull Request)

  • ActiveRecord::Base.errors_in_transactional_callbacks=이 제거 예정. (commit)

  • Relation#uniq이 제거 예정. 앞으로는 Relation#distinct를 사용. (commit)

  • PostgreSQL의 :point 타입이 제거 예정. 앞으로는 Array가 아닌 Point 객체를 반환하는 새 타입을 사용. (Pull Request)

  • true가 되는 인자를 관계용 메소드에 넘겨서 관계된 객체들을 강제적으로 새로고침하는 방법이 제거 예정. (Pull Request)

  • 관계 restrict_dependent_destroy 에러의 키를 제거 예정. 앞으로는 새로운 키 이름을 사용. (Pull Request)

  • #tables의 동작을 통일. (Pull Request)

  • SchemaCache#tables, SchemaCache#table_exists?, SchemaCache#clear_table_cache!이 제거 예정. 앞으로는 새로운 데이터 소스를 사용. (Pull Request)

  • SQLite3 어댑터와 MySQL 어댑터의 connection.tables가 제거 예정. (Pull Request)

  • #tables에 인자를 넘기는 방식이 제거 예정. 일부 어댑터(mysql2, sqlite3)의 #tables 메소드는 테이블과 뷰를 모두 반환하지만, 다른 어뎁터는 테이블만을 반환함. 동작을 통일하기 위해서, 앞으로는 #tables는 테이블 만을 반환할 예정. (Pull Request)

  • table_exists?가 제거 예정. #table_exists? 메소드에서 테이블과 뷰가 확인되는 경우가 있기 때문에. #tables의 동작을 통일하기 위해서, 앞으로 #table_exists?는 테이블만을 체크할 예정. (Pull Request)

  • find_nthoffset을 인자로 넘기는 방식이 제거 예정. 앞으로 관계에서는 offset 메소드를 사용. (Pull Request)

  • DatabaseStatements{insert|update|delete}_sql가 제거 예정. 앞으로는 {insert|update|delete} 공개 메소드를 사용. (Pull Request)

  • use_transactional_fixtures가 제거 예정. 앞으로는 좀 더 명확한 use_transactional_tests를 사용. (Pull Request)

  • ActiveRecord::Connection#quote에 컬럼을 넘기는 방식이 제거 예정. (commit)

  • start 파라미터를 보완하며 어느 시점에서 배치 처리를 중단할 지 지정하는 end 옵션을 find_in_batches에 추가. (Pull Request)

7.3 주요 변경점

  • 테이블 생성 중에 foreign_key 옵션을 references에 추가. (commit)

  • 새 속성 API. (commit)

  • enum의 정의에 :_prefix/:_suffix 옵션을 추가. (Pull Request, Pull Request)

  • ActiveRecord::Relation#cache_key를 추가. (Pull Request)

  • timestamps의 기본 null 값을 false로 변경. (commit)

  • ActiveRecord::SecureToken을 추가. SecureRandom을 사용하여 유일한 토큰을 생성하는 작업을 캡슐화. (Pull Request)

  • drop_table:if_exists 옵션을 추가. (Pull Request)

  • ActiveRecord::Base#accessed_fields을 추가. 데이터베이스에 필요한 데이터만을 가져오고 싶은 경우에, 참조한 모델에서 어떤 필드가 접근되었는지를 쉽게 확인할 수 있음. (commit)

  • ActiveRecord::Relation#or 메소드를 추가. WHERE절이나 HAVING절을 결합. (commit)

  • ActiveRecord::Base.suppress을 추가. 지정 블럭을 실행 중에 수신자가 저장되지 않도록 함. (Pull Request)

  • 관계가 존재하지 않는 경우 belongs_to에서 검증 에러가 발생하게 됨. 이는 관계 마다 optional: true를 사용해서 비활성화 할 수 있음. 또한 belongs_torequired 옵션이 제거 예정. 앞으로는 optional을 사용. (Pull Request)

  • db:structure:dump의 동작을 정의하는 config.active_record.dump_schemas를 추가. (Pull Request)

  • config.active_record.warn_on_records_fetched_greater_than 옵션을 추가. (Pull Request)

  • MySQL에서 네이티브 JSON 데이터 형식을 지원. (Pull Request)

  • PostgreSQL에서의 인덱스 삭제를 병렬로 실행할 수 있도록 지원. (Pull Request)

  • 커넥션 어댑터에 #views 메소드와 #view_exists? 메소드가 추가. (Pull Request)

  • ActiveRecord::Base.ignored_columns를 추가. 컬럼의 일부를 Active Record에서는 보이지 않게 함. (Pull Request)

  • connection.data_sourcesconnection.data_source_exists?. Active Record 모델 뒤에서 어떤 것(일반적으로는 테이블이나 뷰)을 사용할지 지정할 수 있음. (Pull Request)

  • 픽스쳐 파일을 사용하여 모델의 클래스를 YAML 파일 내에서 그 자체를 정의할 수 있게 됨. (Pull Request)

  • 데이터베이스 마이그레이션 생성시에 uuid를 기본키로 지정할 수 있는 기능을 추가. (Pull Request)

  • ActiveRecord::Relation#left_joinsActiveRecord::Relation#left_outer_joins를 추가. (Pull Request)

  • after_{create,update,delete}_commit 콜백을 추가. (Pull Request)

  • 마이그레이션 클래스에 출현하는 API 버전을 관리하고, 제거 예정인 것과 관계 있더라도 기존의 마이그레이션에 영향을 주지 않고 파라미터를 변경하거나 제거하기 위해 버전을 강제적으로 적용할 수 있게 됨. (Pull Request)

  • ActionController::Base 대신에 ApplicationController를 상속하는 것처럼 ApplicationRecord가 애플리케이션의 모든 모델의 부모 클래스로서 추가됨. 이 변경으로 애플리케이션 모델 전체에 영향을 미치는 동작을 한 곳에서 관리 가능해짐. (Pull Request)

  • ActiveRecord에 #second_to_last 메소드와 #third_to_last 메소드를 추가. (Pull Request)

  • 데이터베이스 객체(테이블, 컬럼, 인덱스)에 코멘트를 추가하여, PostgreSQL이나 MySQL의 데이터베이스 메타 데이터로 저장하는 기능을 추가. (Pull Request)

  • Prepared Statement를 mysql2 어댑터에 추가(mysql2 0.4.4 이후 적용). 기존의 오래된 mysql 어댑터에서만 지원되었었음. config/database.yml에 prepared_statements: true를 추가하면 사용할 수 있게됨. (Pull Request)

  • ActionRecord::Relation#update를 추가. 관계 객체에 대해서 해당 관계에 있는 모든 객체의 콜백에 대해서 검증을 실행할 수 있음. (Pull Request)

  • save 메소드에 :touch 옵션이 추가됨. 타임 스탬프를 변경하지 않고 레코드를 저장할 수 있음. (Pull Request)

  • PostgreSQL를 위한 식 인덱스와 연산자 클래스 지원을 추가. (commit)

  • 중첩된 속성의 에러에 인덱스를 추가하는 :index_errors 옵션을 추가. (Pull Request)

  • 양방향 의존 관계 삭제를 할 수 있는 기능을 추가. (Pull Request)

  • 트랜잭션 테스트에서 after_commit 콜백 지원을 추가. (Pull Request)

  • foreign_key_exists? 메소드를 추가. 테이블에 외래키가 존재하는지를 확인할 수 있음. (Pull Request)

  • touch 메소드에 :time 옵션을 추가. 레코드에 현재 시각 이외의 시각을 지정할 수 있음. (Pull Request)

8 Active Model

자세한 변경사항은 Changelog를 참고해주세요.

8.1 제거된 것들

8.2 제거 예정

  • Active Model의 콜백 체인을 멈추기 위해서 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 주요 변경점

  • 어떤 검증자가 실패했는지 확인하는 ActiveModel::Errors#details를 추가. (Pull Request)

  • ActiveRecord::AttributeAssignmentActiveModel::AttributeAssignment로 추출하여 include 가능한 모듈로 만듬. 이를 통해 어디서든 include하여 사용할 수 있음. (Pull Request)

  • ActiveModel::Dirty#[attr_name]_previously_changed?ActiveModel::Dirty#[attr_name]_previous_change를 추가. 모델을 저장된 이후에 기록된 변경점에 간단하게 접근할 수 있음. (Pull Request)

  • valid?invalid?에서 다양한 컨텍스트를 한번에 검증하는 기능이 추가. (Pull Request)

  • validates_acceptance_of의 기본 값으로 1 대신에 true를 지정할 수 있게 변경. (Pull Request)

9 Active Job

자세한 변경사항은 Changelog를 참고해주세요.

9.1 주요 변경점

  • ActiveJob::Base.deserialize를 잡 클래스로 위임. 이를 통해 잡이 직렬화되었을 때나 잡 실행시에 다시 로딩될 때에 잡에 임의의 메타 데이터를 붙일 수 있게 됨. (Pull Request)

  • 큐 어댑터를 잡 단위로 구성하는 기능을 추가. 잡들이 서로 영향을 주지 않도록 구성할 수 있음. (Pull Request)

  • 제터레이터의 잡이 기본으로 app/jobs/application_job.rb를 상속. (Pull Request)

  • DelayedJob, Sidekiq, qu, que, queue_classic에서 잡 ID를 provider_job_id로 하여 ActiveJob::Base에 반환하는 기능을 추가. (Pull RequestPull Requestcommit)

  • 잡을 concurrent-ruby 스레드 풀에 큐잉하는 간단한 AsyncJob 프로세서와, 이와 관련된 AsyncAdapter를 구현. (Pull Request)

  • 기본의 어뎁터를 인라인에서 비동기로 변경. 테스트 환경에서 동기적인 상황에 의존하지 않도록 해줌. (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.instrument 메소드와 ActiveSupport::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 제거 예정

  • MissingSourceFile가 제거 예정. 앞으로는 LoadError를 사용. (commit)

  • alias_method_chain가 제거 예정. 앞으로는 Ruby 2.0에서 도입된 Module#prepend를 사용. (Pull Request)

  • ActiveSupport::Concurrency::Latch가 제거 예정. 앞으로는 concurrent-rubyConcurrent::CountDownLatch를 사용. (Pull Request)

  • number_to_human_size:prefix 옵션이 제거 예정. 대체 예정 없음. (Pull Request)

  • Module#qualified_const_가 제거 예정. 앞으로는 내정된 Module#const_ 메소드를 사용. (Pull Request)

  • 콜백 정의에 문자열을 넘기는 기능이 제거 예정. (Pull Request)

  • ActiveSupport::Cache::Store#namespaced_key, ActiveSupport::Cache::MemCachedStore#escape_key, ActiveSupport::Cache::FileStore#key_file_path이 제거 예정. 앞으로는 normalize_key를 사용.

  • ActiveSupport::Cache::LocaleCache#set_cache_value가 제거 예정. 앞으로는 write_cache_value를 사용. (Pull Request)

  • assert_nothing_raised에 인자를 넘기는 방식이 제거 예정. (Pull Request)

  • Module.local_constants가 제거 예정. 앞으로는 Module.constants(false)를 사용. (Pull Request)

10.3 주요 변경점

  • ActiveSupport::MessageVerifier#verified 메소드와 #valid_message? 메소드가 추가됨. (Pull Request)

  • 콜백 체인을 정지하는 방법이 변경. 앞으로는 명시적으로 throw(:abort)로 멈추는 것을 추천. (Pull Request)

  • 새로운 설정 옵션 config.active_support.halt_callback_chains_on_return_false 이 추가. ActiveRecord, ActiveModel, ActiveModel::Validations의 콜백 체인을 'before' 콜벡에서 false를 반환할 때 멈출지를 지정. (Pull Request)

  • 기본 테스트 실행 순서가 :sorted에서 :random로 변경. (commit)

  • #on_weekend?, #on_weekday?, #next_weekday, #prev_weekday 메소드가 Date, Time, DateTime에 추가됨. (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)

  • file_fixtureActiveSupport::TestCase에 추가. 테스트 케이스에서 샘플 파일에 접근하는 간단한 기능을 제공. (Pull Request)

  • EnumerableArray#without을 추가. 지정한 요소를 제외한 사본을 반환. (Pull Request)

  • ActiveSupport::ArrayInquirerArray#inquiry를 추가. (Pull Request)

  • 지정한 타임존으로 시각을 해석하는 ActiveSupport::TimeZone#strptime을 추가. (commit)

  • Integer#zero?에 더불어 Integer#positive?Integer#negative? 메소드를 추가. (commit)

  • ActiveSupport::OrderedOptions에 파괴적인 get 메소드가 추가. 값이 .blank?인 경우에는 KeyError가 발생. (Pull Request)

  • 지정한 년도의 일수를 반환하는 Time.days_in_year가 추가. 인자가 없는 경우는 현재 년도를 사용. (commit)

  • 파일의 이벤트 감시 기능이 추가. 애플리케이션의 소스 코드, 라우팅, 로케일 등의 변경을 비동기적으로 검출. (Pull Request)

  • 스레드마다 클래스 변수나 모듈 변수를 선언하는 메소드 군 thread_m/cattr_accessor/reader/writer을 추가. (Pull Request)

  • Array#second_to_lastArray#third_to_last 메소드가 추가. (Pull Request)

  • ActiveSupport::Executor API와 ActiveSupport::Reloader API를 공개. 애플리케이션 코드 실행이나 애플리케이션의 리로딩 프로세스에서 컴포넌트나 라이브러리로 관리하거나 추가할 수 있게 됨. (Pull Request)

  • ActiveSupport::Duration에서 ISO8601 형식의 형식 및 해석을 지원. (Pull Request)

  • parse_json_times이 유효한 경우, ActiveSupport::JSON.decode에서 ISO8601 형식의 로컬 시각을 지원. (Pull Request)

  • ActiveSupport::JSON.decode가 날짜 문자열이 아닌 Date 객체를 반환하게 됨. (Pull Request)

  • TaggedLogging를 로거에 추가. 로거 인스턴스를 복수 생성하여 태그가 로거간에 공유되지 않도록 함. (Pull Request)

11 크레딧 표기

Rails를 견고하고 안정적인 프레임워크로 만들기 위해 많은 시간을 사용해주신 많은 개발자들에 대해서는 Rails 기여자 목록을 참고해주세요. 이 분들에게 경의를 표합니다.

피드백

이 가이드의 질을 향상시키기 위한 도움을 기다리고 있습니다.

수정이 필요한 오타나 에러를 발견하면 기여해주세요. 이를 위해서 기여 가이드를 읽어주세요.

미완성된 내용이나 업데이트되지 않은 내용이 있을 수 있습니다. 누락된 문서를 추가해 주시기 바랍니다. 최신 가이드나 마스터 브랜치를 참고하여 이미 고쳐지지 않았는지 확인하세요. 문서작성시 참고해야할 스타일과 규칙은 Ruby on Rails Guides Guidelines를 확인하시기 바랍니다.

어떤 이유에서든지, 수정이 필요한 부분을 직접 변경할 수 없는 경우에는 open an issue로 접속하여 문제점을 제출해 주시기 바랍니다.

마지막으로, 루비온레일스 문서화에 관련된 논의가 필요한 사항은 rubyonrails-docs mailing list에서 해 주시기 바랍니다.

문서생성일

최종 생성일 : 2017-03-09 01:43:00 +0000