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 전용 애플리케이션을 만드는데 사용될 수 있습니다. 이는 X나 GitHub API와 같은 API를 만들고 제공하는데 유용하며, 공개용 API뿐만 아니라 커스텀 애플리케이션을 위한 API를 제공하는데도 사용할 수 있습니다.
다음과 같이 새로운 Rails API 앱을 생성할 수 있습니다:
$ rails new my_api --api
이는 다음 세 가지 주요한 작업을 수행합니다:
- 일반적인 경우보다 더 제한된 middleware 세트로 애플리케이션을 시작하도록 설정합니다. 구체적으로, 기본적으로 브라우저 애플리케이션을 위한 (쿠키 지원과 같은) middleware를 포함하지 않습니다.
ApplicationController
가ActionController::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:all
과test: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:update
와rails:template
task들이app:update
와app: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
가 로컬 변수를 사용하도록 변경되었습니다.
- production 환경에서 class autoloading을 비활성화했습니다. (commit)
4 Action Pack
자세한 변경사항은 Changelog를 참조하세요.
4.1 Removals
ActionDispatch::Request::Utils.deep_munge
가 제거되었습니다. (commit)ActionController::HideActions
가 제거되었습니다. (Pull Request)respond_to
와respond_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)assigns
와assert_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 :back
이redirect_back
으로 대체되며 폐기 예정입니다.redirect_back
은 필수fallback_location
인자를 받아RedirectBackError
발생 가능성을 제거합니다. (Pull Request)ActionDispatch::IntegrationTest
와ActionController::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::TestCase
와ActionDispatch::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_ssl
과config.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_when
과stale?
에 레코드 컬렉션을 전달하는 기능이 추가되었습니다. (Pull Request)ActionController::Live
가ActiveSupport::Concern
이 되었습니다. 이는 다른 모듈에ActiveSupport::Concern
을 확장하지 않고 단순히 include하면 프로덕션 환경에서ActionController::Live
가 작동하지 않는다는 것을 의미합니다. 일부 사용자들은ActionController::Live
를 사용할 때 생성된 스레드에서 발생하는:warden
을 미들웨어가 잡을 수 없기 때문에Warden
/Devise
인증 실패 처리 코드를 포함하는 다른 모듈을 사용할 수 있습니다. (자세한 내용은 이 이슈 참조)Response#strong_etag=
와#weak_etag=
, 그리고fresh_when
과stale?
에 대한 유사한 옵션들이 도입되었습니다. (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된
deliver
와deliver!
메서드들이 제거되었습니다. (commit)
6.2 주목할 만한 변경사항
Template lookup이 이제 default locale과 I18n fallbacks를 존중합니다. (commit)
generator를 통해 생성된 mailer에 controllers와 jobs에서 사용된 것과 같은 명명 규칙을 따라
_mailer
접미사를 추가했습니다. (Pull Request)assert_enqueued_emails
와assert_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_class
와symbolized_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_nth
에offset
인자를 전달하는 것이 deprecated 되었습니다. 대신
relation에서 offset
메서드를 대신 사용하세요.
(Pull Request)
DatabaseStatements
에서{insert|update|delete}_sql
이 Deprecated 되었습니다. 대신{insert|update|delete}
public 메서드를 사용하세요. (Pull Request)더 명확한 의미 전달을 위해
use_transactional_fixtures
가use_transactional_tests
로 Deprecated 되었습니다. (Pull Request)ActiveRecord::Connection#quote
에 column을 전달하는 것이 Deprecated 되었습니다. (commit)find_in_batches
에start
파라미터를 보완하는end
옵션이 추가되어 batch 처리를 중단할 위치를 지정할 수 있습니다. (Pull Request)
7.3 주목할 만한 변경사항
테이블 생성 시
references
에foreign_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_sources
와connection.data_source_exists?
가 추가되었습니다. 이 메소드들은 Active Record 모델의 기반이 될 수 있는 relation(일반적으로 테이블과 뷰)을 결정합니다. (Pull Request)fixture 파일에서 YAML 파일 내에 모델 클래스를 설정할 수 있게 되었습니다. (Pull Request)
데이터베이스 migration을 생성할 때 primary key로
uuid
를 기본값으로 설정하는 기능이 추가되었습니다. (Pull Request)ActiveRecord::Relation#left_joins
와ActiveRecord::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_empty
와ActiveModel::Errors#add_on_blank
가 대체 없이 지원 중단될 예정입니다. (Pull Request)
8.3 주목할만한 변경사항
어떤 validator가 실패했는지 확인할 수 있는
ActiveModel::Errors#details
를 추가했습니다. (Pull Request)ActiveRecord::AttributeAssignment
를ActiveModel::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_of
가1
외에도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_id
로ActiveJob::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.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 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_week
에same_time
옵션이 추가되었습니다. (Pull Request)Date
,Time
,DateTime
의#yesterday
와#tomorrow
에 대응되는#prev_day
와#next_day
가 추가되었습니다. (Pull Request)무작위 base58 문자열 생성을 위한
SecureRandom.base58
이 추가되었습니다. (commit)ActiveSupport::TestCase
에file_fixture
가 추가되었습니다. 테스트 케이스에서 샘플 파일에 접근할 수 있는 간단한 메커니즘을 제공합니다. (Pull Request)지정된 요소들을 제외한 enumerable의 복사본을 반환하는
Enumerable
과Array
의#without
이 추가되었습니다. (Pull Request)ActiveSupport::ArrayInquirer
와Array#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_last
와Array#third_to_last
메서드가 추가되었습니다. (Pull Request)컴포넌트와 라이브러리가 애플리케이션 코드 실행과 애플리케이션 리로딩 프로세스를 관리하고 참여할 수 있도록
ActiveSupport::Executor
와ActiveSupport::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 기여자 전체 목록을 참조하세요. 모든 분들께 찬사를 보냅니다.