1 Rails 4.2로 업그레이드하기
기존 애플리케이션을 업그레이드하는 경우, 시작하기 전에 충분한 테스트 커버리지를 확보하는 것이 좋습니다. 아직 하지 않았다면 먼저 Rails 4.1로 업그레이드하고, Rails 4.2로 업그레이드를 시도하기 전에 애플리케이션이 예상대로 작동하는지 확인해야 합니다. 업그레이드 시 주의해야 할 사항 목록은 Ruby on Rails 업그레이드하기 가이드에서 확인할 수 있습니다.
2 주요 기능
2.1 Active Job
Active Job는 Rails 4.2에서 새롭게 도입된 프레임워크입니다. Resque, Delayed Job, Sidekiq 등과 같은 queuing 시스템 상위에 있는 공통 인터페이스입니다.
Active Job API로 작성된 job은 각각의 adapter 덕분에 지원되는 모든 queue에서 실행됩니다. Active Job은 job을 즉시 실행하는 inline runner가 사전 구성되어 있습니다.
Job은 종종 Active Record 객체를 인자로 받아야 합니다. Active Job은 객체 자체를 marshalling하는 대신 URI(uniform resource identifier)로 객체 참조를 전달합니다. 새로운 Global ID 라이브러리가 URI를 생성하고 참조하는 객체를 조회합니다. 내부적으로 Global ID를 사용하여 Active Record 객체를 job 인자로 전달하는 것이 가능합니다.
예를 들어, trashable
이 Active Record 객체인 경우, 이 job은 serialization 없이도 정상적으로 실행됩니다:
class TrashableCleanupJob < ActiveJob::Base
def perform(trashable, depth)
trashable.cleanup(depth)
end
end
Active Job Basics 가이드에서 더 자세한 내용을 확인하세요.
2.2 비동기 메일
Active Job을 기반으로, Action Mailer는 이제 deliver_later
메서드를 제공합니다. 이 메서드는 queue를 통해 이메일을 전송하므로, queue가 비동기일 경우 controller나 model을 차단하지 않습니다(기본 inline queue는 차단됨).
즉시 이메일을 전송하려면 여전히 deliver_now
를 사용할 수 있습니다.
2.3 Adequate Record
Adequate Record는 일반적인 find
와 find_by
호출 및 일부 association 쿼리를 최대 2배 더 빠르게 만드는 Active Record의 성능 개선 기능입니다.
이는 일반적인 SQL 쿼리를 prepared statements로 캐싱하고 유사한 호출에서 재사용함으로써, 후속 호출에서 대부분의 쿼리 생성 작업을 건너뛸 수 있게 합니다. 자세한 내용은 Aaron Patterson의 블로그 포스트를 참조하세요.
Active Record는 사용자의 개입이나 코드 변경 없이 지원되는 작업에서 이 기능을 자동으로 활용합니다. 다음은 지원되는 작업의 예시입니다:
Post.find(1) # 첫 호출은 prepared statement를 생성하고 캐시함
Post.find(2) # 이후의 호출은 캐시된 prepared statement를 재사용함
Post.find_by_title('first post')
Post.find_by_title('second post')
Post.find_by(title: 'first post')
Post.find_by(title: 'second post')
post.comments
post.comments(true)
위 예시들이 보여주듯이, prepared statements는 메서드 호출에서 전달된 값들을 캐시하지 않고 대신 이들을 위한 플레이스홀더를 가진다는 점을 강조하는 것이 중요합니다.
다음과 같은 시나리오에서는 캐싱이 사용되지 않습니다:
- 모델이 default scope를 가지고 있는 경우
- 모델이 single table inheritance를 사용하는 경우
find
에 id 리스트를 사용하는 경우, 예:# not cached Post.find(1, 2, 3) Post.find([1,2])
find_by
에 SQL fragments를 사용하는 경우:Post.find_by('published_at < ?', 2.weeks.ago)
2.4 Web Console
Rails 4.2로 생성된 새로운 애플리케이션에는 기본적으로 Web Console gem이 포함됩니다. Web Console은 모든 에러 페이지에 대화형 Ruby 콘솔을 추가하고, console
뷰와 컨트롤러 헬퍼를 제공합니다.
에러 페이지의 대화형 콘솔을 사용하면 예외가 발생한 위치의 컨텍스트에서 코드를 실행할 수 있습니다. console
헬퍼는 뷰나 컨트롤러 어디에서 호출하든, 렌더링이 완료된 후 최종 컨텍스트로 대화형 콘솔을 실행합니다.
2.5 Foreign Key 지원
Migration DSL은 이제 foreign key의 추가와 삭제를 지원합니다. Foreign key는 schema.rb
에도 함께 덤프됩니다. 현재는 mysql
, mysql2
, postgresql
adapter만이 foreign key를 지원합니다.
# articles.author_id에 authors.id를 참조하는 foreign key를 추가
add_foreign_key :articles, :authors
# articles.author_id에 users.lng_id를 참조하는 foreign key를 추가
add_foreign_key :articles, :users, column: :author_id, primary_key: "lng_id"
# accounts.branch_id의 foreign key를 제거
remove_foreign_key :accounts, :branches
# accounts.owner_id의 foreign key를 제거
remove_foreign_key :accounts, column: :owner_id
add_foreign_key와 remove_foreign_key의 전체 설명은 API 문서를 참조하세요.
3 호환성 문제
이전에 deprecated된 기능들이 제거되었습니다. 이번 릴리스의 새로운 deprecation 사항들은 각 컴포넌트를 참조해주세요.
다음 변경 사항들은 업그레이드 시 즉각적인 조치가 필요할 수 있습니다.
3.1 String 인자를 가진 render
이전에는 controller action에서 render "foo/bar"
를 호출하는 것이 render file: "foo/bar"
와 동일했습니다. Rails 4.2에서는 이것이 render template: "foo/bar"
를 의미하도록 변경되었습니다. 파일을 render해야 하는 경우, 명시적인 형태(render file: "foo/bar"
)를 사용하도록 코드를 변경해주세요.
3.2 respond_with
/ 클래스 레벨 respond_to
respond_with
와 이에 대응하는 클래스 레벨의 respond_to
는 responders gem으로 이동되었습니다. 이를 사용하려면 Gemfile
에 gem "responders", "~> 2.0"
를 추가하세요:
# app/controllers/users_controller.rb
class UsersController < ApplicationController
respond_to :html, :json
def show
@user = User.find(params[:id])
respond_with @user # @user 객체로 응답합니다
end
end
인스턴스 레벨의 respond_to
는 영향을 받지 않습니다:
# app/controllers/users_controller.rb
class UsersController < ApplicationController
def show
@user = User.find(params[:id])
respond_to do |format|
format.html # HTML 형식으로 응답
format.json { render json: @user } # JSON 형식으로 응답
end
end
end
3.3 rails server
의 기본 Host
Rack의 변경사항으로 인해, rails server
는 이제 기본적으로 0.0.0.0
대신 localhost
에서 수신 대기합니다. http://127.0.0.1:3000과 http://localhost:3000 모두 이전처럼 자신의 컴퓨터에서 계속 작동하므로 표준 개발 워크플로우에는 거의 영향이 없을 것입니다.
하지만 이러한 변경으로 인해 다른 컴퓨터에서 Rails 서버에 접근할 수 없게 됩니다. 예를 들어 개발 환경이 가상 머신에 있고 호스트 머신에서 접근하고 싶은 경우가 이에 해당합니다. 이런 경우에는 rails server -b 0.0.0.0
으로 서버를 시작하여 이전 동작을 복원하시기 바랍니다.
이렇게 할 경우, 네트워크상의 신뢰할 수 있는 컴퓨터만 개발 서버에 접근할 수 있도록 방화벽을 적절히 구성해야 합니다.
3.4 render
의 status 옵션 심볼 변경
Rack의 변경으로 인해, render
메서드가 :status
옵션으로 받는 심볼이 변경되었습니다:
- 306:
:reserved
가 제거되었습니다. - 413:
:request_entity_too_large
가:payload_too_large
로 이름이 변경되었습니다. - 414:
:request_uri_too_long
이:uri_too_long
으로 이름이 변경되었습니다. - 416:
:requested_range_not_satisfiable
이:range_not_satisfiable
로 이름이 변경되었습니다.
알 수 없는 심볼로 render
를 호출할 경우, 응답 상태가 기본값 500으로 설정된다는 점을 유의하세요.
3.5 HTML Sanitizer
HTML sanitizer가 Loofah와 Nokogiri를 기반으로 한 새롭고 더 견고한 구현으로 교체되었습니다. 새로운 sanitizer는 더 안전하며, 그 sanitization은 더 강력하고 유연합니다.
새로운 알고리즘으로 인해, 특정 병리학적 입력에 대해 sanitize된 출력이 다를 수 있습니다.
만약 이전 sanitizer의 정확한 출력이 특별히 필요한 경우, Gemfile
에 rails-deprecated_sanitizer gem을 추가하여 이전 동작을 사용할 수 있습니다. 이 gem은 선택적으로 사용되기 때문에 deprecation 경고를 발생시키지 않습니다.
rails-deprecated_sanitizer
는 Rails 4.2에서만 지원될 것이며, Rails 5.0에서는 유지보수되지 않을 것입니다.
새로운 sanitizer의 변경사항에 대한 자세한 내용은 이 블로그 포스트를 참조하세요.
3.6 assert_select
assert_select
는 이제 Nokogiri를 기반으로 합니다. 그 결과, 이전에 유효했던 일부 selector들이 이제는 지원되지 않습니다. 애플리케이션에서 다음과 같은 표기법을 사용하고 있다면 업데이트해야 합니다:
속성 selector의 값에 영숫자가 아닌 문자가 포함되어 있다면 따옴표로 묶어야 할 수 있습니다.
# before a[href=/] a[href$=/] # now a[href="/"] a[href$="/"]
부적절하게 중첩된 요소가 있는 유효하지 않은 HTML 소스로부터 생성된 DOM이 다를 수 있습니다.
예를 들어:
# content: <div><i><p></i></div> # before: assert_select('div > i') # => true assert_select('div > p') # => false assert_select('i > p') # => true # now: assert_select('div > i') # => true assert_select('div > p') # => true assert_select('i > p') # => false
선택된 데이터에 entity가 포함된 경우, 비교에 사용되는 선택된 값이 이전에는 원시 상태(예:
AT&T
)였지만, 이제는 평가된 상태(예:AT&T
)입니다.# content: <p>AT&T</p> # before: assert_select('p', 'AT&T') # => true assert_select('p', 'AT&T') # => false # now:
assert_select('p', 'AT&T') # => true
assert_select('p', 'AT&T') # => false
또한 치환 문법이 변경되었습니다.
이제는 CSS와 유사한 :match
선택자를 사용해야 합니다:
assert_select ":match('id', ?)", 'comment_1'
id 속성이 'comment_1'과 일치하는 요소를 선택합니다.
또한 assertion이 실패할 경우 Regexp 치환이 다르게 표시됩니다.
여기서 /hello/
의 표시 방식을 살펴보세요:
assert_select(":match('id', ?)", /hello/)
ID에 'hello'가 포함된 요소를 확인합니다.
"(?-mix:hello)"
가 됩니다:
"div:match('id', "(?-mix:hello)")" 패턴과 일치하는 요소가 최소 1개 이상 있어야 하는데, 0개가 발견되었습니다.
0이 1보다 크거나 같아야 합니다.
Rails Dom Testing 문서의 assert_select
에 대한 자세한 내용은 Rails Dom Testing을 참조하세요.
4 Railties
자세한 변경 사항은 Changelog를 참조하세요.
4.1 제거된 기능
App generator에서
--skip-action-view
옵션이 제거되었습니다. (Pull Request)대체 없이
rails application
명령어가 제거되었습니다. (Pull Request)
4.2 Deprecations
Production 환경에서
config.log_level
누락을 deprecate 처리했습니다. (Pull Request)test
폴더의 모든 테스트를 실행하는rake test
로 대체되어rake test:all
을 deprecate 처리했습니다. (Pull Request)rake test:db
로 대체되어rake test:all:db
를 deprecate 처리했습니다. (Pull Request)대체 없이
Rails::Rack::LogTailer
를 deprecate 처리했습니다. (Commit)
4.3 주목할 만한 변경사항
기본 application
Gemfile
에web-console
을 도입했습니다. (Pull Request)모델 generator의 association에
required
옵션을 추가했습니다. (Pull Request)커스텀 설정 옵션을 정의하기 위한
x
namespace를 도입했습니다:# config/environments/production.rb config.x.payment_processing.schedule = :daily config.x.payment_processing.retries = 3 config.x.super_debugger = true
이러한 옵션들은 configuration 객체를 통해 사용할 수 있습니다:
Rails.configuration.x.payment_processing.schedule # => :daily Rails.configuration.x.payment_processing.retries # => 3 Rails.configuration.x.super_debugger # => true
(Commit)
현재 환경에 대한 설정을 불러오기 위한
Rails::Application.config_for
를 도입했습니다.# config/exception_notification.yml production: url: http://127.0.0.1:8080 namespace: my_app_production development: url: http://localhost:3001 namespace: my_app_development
# config/environments/production.rb Rails.application.configure do config.middleware.use ExceptionNotifier, config_for(:exception_notification) end
app generator에서 turbolinks 관련 코드를 생성하지 않도록 하는
--skip-turbolinks
옵션을 도입했습니다.
turbolinks 통합. (Commit)
애플리케이션 부트스트래핑 시 자동화된 설정 코드를 위한 규칙으로
bin/setup
스크립트를 도입했습니다. (Pull Request)development 환경에서
config.assets.digest
의 기본값을true
로 변경했습니다. (Pull Request)rake notes
를 위한 새로운 확장을 등록하는 API를 도입했습니다. (Pull Request)Rails 템플릿에서 사용할 수 있는
after_bundle
콜백을 도입했습니다. (Pull Request)Gem::Version.new(Rails.version)
를 반환하는 편의 메서드로Rails.gem_version
을 도입했습니다. (Pull Request)
5 Action Pack
자세한 변경사항은 Changelog를 참조하세요.
5.1 제거된 기능
respond_with
와 클래스 레벨의respond_to
가 Rails에서 제거되어responders
gem(버전 2.0)으로 이동되었습니다. 이 기능들을 계속 사용하려면Gemfile
에gem "responders", "~> 2.0"
를 추가하세요. (Pull Request, 자세한 내용)더 이상 사용되지 않는
AbstractController::Helpers::ClassMethods::MissingHelperError
가 제거되고AbstractController::Helpers::MissingHelperError
로 대체되었습니다. (Commit)
5.2 Deprecations
*_path
helper에서only_path
옵션이 Deprecated 되었습니다. (Commit)assert_select
사용을 권장하기 위해assert_tag
,assert_no_tag
,find_tag
,find_all_tag
가 Deprecated 되었습니다. (Commit)라우터의
:to
옵션을 "#" 문자가 포함되지 않은 심볼이나 문자열로 설정하는 것이 Deprecated 되었습니다:get '/posts', to: MyRackApp => (변경 불필요) get '/posts', to: 'post#index' => (변경 불필요) get '/posts', to: 'posts' => get '/posts', controller: :posts get '/posts', to: :index => get '/posts', action: :index
(Commit)
URL helper에서 문자열 키 사용이 Deprecated 되었습니다:
# bad root_path('controller' => 'posts', 'action' => 'index') # good root_path(controller: 'posts', action: 'index')
5.3 주목할만한 변경사항
*_filter
메소드 계열이 문서에서 제거되었습니다. 이들 대신*_action
메소드 계열의 사용이 권장됩니다:after_filter => after_action append_after_filter => append_after_action append_around_filter => append_around_action append_before_filter => append_before_action around_filter => around_action before_filter => before_action prepend_after_filter => prepend_after_action prepend_around_filter => prepend_around_action prepend_before_filter => prepend_before_action skip_after_filter => skip_after_action skip_around_filter => skip_around_action skip_before_filter => skip_before_action skip_filter => skip_action_callback
현재 애플리케이션에서 이러한 메소드들을 사용하고 있다면, 대체된
*_action
메소드들을 대신 사용해야 합니다. 이 메소드들은 향후 deprecated 될 예정이며 결국 Rails에서 제거될 것입니다.render nothing: true
또는nil
body를 렌더링할 때 더 이상 response body에 단일 공백을 추가하지 않습니다. (Pull Request)Rails가 이제 템플릿의 digest를 ETag에 자동으로 포함합니다. (Pull Request)
URL helper에 전달되는 세그먼트들이 이제 자동으로 이스케이프됩니다. (Commit)
전역적으로 허용되는 파라미터를 설정하기 위한
always_permitted_parameters
옵션이 도입되었습니다. 이 설정의 기본값은['controller', 'action']
입니다. (Pull Request)RFC 4791의 HTTP 메소드
MKCALENDAR
가 추가되었습니다. (Pull Request)*_fragment.action_controller
notification이 이제 payload에 controller와 action 이름을 포함합니다. (Pull Request)라우트 검색을 위한 퍼지 매칭으로 Routing Error 페이지가 개선되었습니다. (Pull Request)
CSRF 실패 로깅을 비활성화하는 옵션이 추가되었습니다. (Pull Request)
Rails 서버가 static assets를 제공하도록 설정되어 있을 때, 클라이언트가 지원하고 미리 생성된 gzip 파일(
.gz
)이 디스크에 있는 경우 gzip assets가 제공됩니다. 기본적으로 asset pipeline은 압축 가능한 모든 assets에 대해.gz
파일을 생성합니다. Gzip 파일을 제공하면 데이터 전송을 최소화하고 asset 요청 속도를 높일 수 있습니다. 프로덕션 환경에서 Rails 서버로 assets를 제공할 때는 항상 CDN을 사용하세요. (Pull Request)통합 테스트에서
process
헬퍼를 호출할 때 경로는 선행 슬래시가 필요합니다. 이전에는 생략할 수 있었지만 이는 구현의 부산물이었고 의도된 기능이 아니었습니다. 예:test "list all posts" do get "/posts" assert_response :success end
6 Action View
자세한 변경사항은 Changelog를 참조하세요.
6.1 Deprecations
AbstractController::Base.parent_prefixes
가 Deprecated 되었습니다. view를 찾을 위치를 변경하고 싶을 때는AbstractController::Base.local_prefixes
를 override 하세요. (Pull Request)ActionView::Digestor#digest(name, format, finder, options = {})
가 Deprecated 되었습니다. 인자는 대신 hash로 전달되어야 합니다. (Pull Request)
6.2 주목할만한 변경사항
render "foo/bar"
는 이제render file: "foo/bar"
대신render template: "foo/bar"
로 변환됩니다. (Pull Request)Form helper들은 더 이상 hidden field 주변에 인라인 CSS가 포함된
<div>
요소를 생성하지 않습니다. (Pull Request)Collection과 함께 렌더링되는 partial에서 사용할 수 있는
#{partial_name}_iteration
특별 로컬 변수가 도입되었습니다. 이는index
,size
,first?
,last?
메서드를 통해 반복의 현재 상태에 접근할 수 있게 해줍니다. (Pull Request)Placeholder I18n은
label
I18n과 동일한 규칙을 따릅니다. (Pull Request)
7 Action Mailer
자세한 변경사항은 Changelog를 참조하세요.
7.1 Deprecations
mailer에서
*_path
helper들이 deprecated 되었습니다. 대신 항상*_url
helper를 사용하세요. (Pull Request)deliver
/deliver!
가 deprecated 되었습니다. 대신deliver_now
/deliver_now!
를 사용하세요. (Pull Request)
7.2 주목할만한 변경사항
link_to
와url_for
가 템플릿에서 기본적으로 절대 URL을 생성합니다. 더 이상only_path: false
를 전달할 필요가 없습니다. (Commit)이메일을 비동기적으로 전송하기 위해 애플리케이션의 큐에 작업을 추가하는
deliver_later
가 도입되었습니다. (Pull Request)개발 환경 외에서 mailer preview를 활성화하기 위한
show_previews
구성 옵션이 추가되었습니다. (Pull Request)
8 Active Record
자세한 변경사항은 Changelog를 참조하세요.
8.1 Removals
cache_attributes
와 관련 메서드들이 제거되었습니다. 이제 모든 attributes는 캐시됩니다. (Pull Request)deprecated된 메서드
ActiveRecord::Base.quoted_locking_column
이 제거되었습니다. (Pull Request)deprecated된
ActiveRecord::Migrator.proper_table_name
이 제거되었습니다. 대신ActiveRecord::Migration
의proper_table_name
인스턴스 메서드를 사용하세요. (Pull Request)사용되지 않는
:timestamp
타입이 제거되었습니다. 모든 경우에:datetime
으로 투명하게 alias 처리됩니다. XML 직렬화와 같이 컬럼 타입이 Active Record 외부로 전송될 때 발생하는 불일치를 수정합니다. (Pull Request)
8.2 Deprecations (지원 중단)
after_commit
과after_rollback
내부의 에러 무시 기능이 지원 중단되었습니다. (Pull Request)has_many :through
연관관계에서 counter cache의 자동 감지에 대한 잘못된 지원이 중단되었습니다. 대신 through 레코드의has_many
와belongs_to
연관관계에서 counter cache를 수동으로 지정해야 합니다. (Pull Request)Active Record 객체를
.find
나.exists?
에 직접 전달하는 것이 지원 중단되었습니다. 대신 객체의id
를 먼저 호출하세요. (Commit 1, 2)시작 값을 제외하는 PostgreSQL range 값에 대한 불완전한 지원이 중단되었습니다. 현재 PostgreSQL range를 Ruby range로 매핑하고 있습니다. Ruby range는 시작 값 제외를 지원하지 않기 때문에 이 변환은 완전히 불가능합니다.
시작 값을 증가시키는 현재 해결책은 올바르지 않으며 지원이 중단되었습니다. 증가 방법을 모르는 하위 타입의 경우(succ
가 정의되지 않은 경우) 시작 값이 제외된 range에 대해 ArgumentError
가 발생합니다.
(Commit)
연결 없이
DatabaseTasks.load_schema
를 호출하는 것이 지원 중단되었습니다. 대신DatabaseTasks.load_schema_current
를 사용하세요. (Commit)sanitize_sql_hash_for_conditions
가 대체 없이 지원 중단되었습니다. 쿼리와 업데이트를 수행하는 데는Relation
을 사용하는 API가 선호됩니다. (Commit):null
옵션을 전달하지 않는add_timestamps
와t.timestamps
가 지원 중단되었습니다.null: true
의 기본값은 Rails 5에서null: false
로 변경될 예정입니다. (Pull Request)Active Record에서 더 이상 필요하지 않은
Reflection#source_macro
가 대체 없이 지원 중단되었습니다. (Pull Request)serialized_attributes
가 대체 없이 지원 중단되었습니다. (Pull Request)컬럼이 존재하지 않을 때
column_for_attribute
에서nil
을 반환하는 것이 지원 중단되었습니다. Rails 5.0에서는 null 객체를 반환할 예정입니다. (Pull Request)연관관계에서
.joins
,.preload
,.eager_load
사용이 지원 중단되었습니다.
인스턴스 상태에 의존하는(즉, argument를 받는 scope로 정의된) replacement 없이는 적용할 수 없습니다. (Commit)
8.3 주목할만한 변경사항
SchemaDumper
가create_table
에서force: :cascade
를 사용합니다. 이를 통해 foreign key가 설정되어 있을 때도 schema를 다시 로드할 수 있게 되었습니다.singular association에
:required
옵션이 추가되었습니다. 이는 association에 대한 presence validation을 정의합니다. (Pull Request)ActiveRecord::Dirty
가 이제 mutable 값의 in-place 변경을 감지합니다. Active Record 모델의 serialized 속성들은 변경되지 않았을 때 더 이상 저장되지 않습니다. 이는 string 컬럼이나 PostgreSQL의 json 컬럼과 같은 다른 타입에서도 작동합니다. (Pull Requests 1, 2, 3)현재 환경의 데이터베이스를 비우는
db:purge
Rake 태스크가 도입되었습니다. (Commit)레코드가 유효하지 않을 때
ActiveRecord::RecordInvalid
를 발생시키는ActiveRecord::Base#validate!
가 도입되었습니다. (Pull Request)valid?
의 별칭으로validate
가 도입되었습니다. (Pull Request)touch
가 이제 여러 속성을 한 번에 touch할 수 있게 되었습니다. (Pull Request)PostgreSQL adapter가 이제 PostgreSQL 9.4+ 버전의
jsonb
데이터 타입을 지원합니다. (Pull Request)PostgreSQL과 SQLite adapter가 더 이상 string 컬럼에 255자의 기본 제한을 추가하지 않습니다. (Pull Request)
PostgreSQL adapter에
citext
컬럼 타입 지원이 추가되었습니다. (Pull Request)PostgreSQL adapter에 사용자 정의 range 타입 지원이 추가되었습니다. (Commit)
sqlite3:///some/path
가 이제 절대 시스템 경로/some/path
로 해석됩니다. 상대 경로를 사용하려면 대신sqlite3:some/path
를 사용하세요. (이전에는sqlite3:///some/path
가 상대 경로some/path
로 해석되었습니다. 이 동작은 Rails 4.1에서 deprecated 되었습니다). (Pull Request)MySQL 5.6 이상 버전에서 초 단위 이하(fractional seconds) 지원이 추가되었습니다. (Pull Request 1, 2)
model을 예쁘게 출력하기 위한
ActiveRecord::Base#pretty_print
가 추가되었습니다. (Pull Request)ActiveRecord::Base#reload
가 이제m = Model.find(m.id)
와 동일하게 동작합니다. 즉, 커스텀SELECT
문에서 가져온 추가 속성들을 더 이상 유지하지 않습니다. (Pull Request)ActiveRecord::Base#reflections
가 이제 symbol 키 대신 문자열 키를 가진 hash를 반환합니다. (Pull Request)migration의
references
메서드가 이제 foreign key의 타입을 지정하기 위한type
옵션을 지원합니다(예::uuid
). (Pull Request)
9 Active Model
자세한 변경사항은 Changelog를 참조하세요.
9.1 삭제사항
- 대체 없이 deprecated된
Validator#setup
이 삭제되었습니다. (Pull Request)
9.2 지원 중단
restore_#{attribute}
를 선호하여reset_#{attribute}
를 지원 중단합니다. (Pull Request)clear_changes_information
를 선호하여ActiveModel::Dirty#reset_changes
를 지원 중단합니다. (Pull Request)
9.3 주요 변경사항
valid?
의 별칭으로validate
를 도입했습니다. (Pull Request)ActiveModel::Dirty
에서 변경된(dirty) 속성들을 이전 값으로 복원하는restore_attributes
메서드를 도입했습니다. (Pull Request 1, 2)has_secure_password
는 더 이상 기본적으로 공백 비밀번호(즉, 공백만 포함된 비밀번호)를 금지하지 않습니다. (Pull Request)has_secure_password
는 이제 유효성 검사가 활성화된 경우 주어진 비밀번호가 72자 미만인지 확인합니다. (Pull Request)
10 Active Support
자세한 변경사항은 Changelog를 참조하세요.
10.1 삭제된 기능들
더 이상 사용되지 않는
Numeric#ago
,Numeric#until
,Numeric#since
,Numeric#from_now
가 제거되었습니다. (Commit)더 이상 사용되지 않는
ActiveSupport::Callbacks
의 문자열 기반 종료자가 제거되었습니다. (Pull Request)
10.2 폐기 예정
대체 없이
Kernel#silence_stderr
,Kernel#capture
,Kernel#quietly
가 폐기 예정되었습니다. (Pull Request)Class#superclass_delegating_accessor
가 폐기 예정되었습니다. 대신Class#class_attribute
를 사용하세요. (Pull Request)ActiveSupport::SafeBuffer#prepend
가 이제 동일한 기능을 수행하므로ActiveSupport::SafeBuffer#prepend!
가 폐기 예정되었습니다. (Pull Request)
10.3 주목할 만한 변경사항
테스트 케이스가 실행되는 순서를 지정하기 위한 새로운 설정 옵션
active_support.test_order
가 도입되었습니다. 이 옵션의 기본값은 현재:sorted
이지만 Rails 5.0에서는:random
으로 변경될 예정입니다. (Commit)Object#try
와Object#try!
는 이제 블록 내에서 명시적인 receiver 없이도 사용할 수 있습니다. (Commit, Pull Request)travel_to
테스트 헬퍼가 이제usec
컴포넌트를 0으로 truncate합니다. (Commit)Object#with_options
는 이제 블록 내에서 명시적인 receiver 없이도 사용할 수 있습니다. (Pull Request)문자열을 단어 수로 자르는
String#truncate_words
가 도입되었습니다. (Pull Request)hash의 값은 변경하되 키는 그대로 유지해야 하는 일반적인 패턴을 단순화하기 위해
Hash#transform_values
와Hash#transform_values!
가 추가되었습니다. (Pull Request)humanize
inflector 헬퍼가 이제 선행 밑줄을 제거합니다. (Commit)module ClassMethods
의 대안으로Concern#class_methods
가 도입되었으며,module Foo; extend ActiveSupport::Concern; end
boilerplate를 피하기 위한Kernel#concern
도 함께 도입되었습니다. (Commit)상수 autoloading과 reloading에 대한 새로운 가이드가 추가되었습니다.
11 Credits
오늘날 Rails를 안정적이고 강력한 프레임워크로 만드는 데 많은 시간을 들인 수많은 사람들을 보려면 Rails 기여자 전체 목록을 참조하세요. 그들 모두에게 찬사를 보냅니다.