rubyonrails.org에서 더 보기:

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는 일반적인 findfind_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_keyremove_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_toresponders gem으로 이동되었습니다. 이를 사용하려면 Gemfilegem "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가 LoofahNokogiri를 기반으로 한 새롭고 더 견고한 구현으로 교체되었습니다. 새로운 sanitizer는 더 안전하며, 그 sanitization은 더 강력하고 유연합니다.

새로운 알고리즘으로 인해, 특정 병리학적 입력에 대해 sanitize된 출력이 다를 수 있습니다.

만약 이전 sanitizer의 정확한 출력이 특별히 필요한 경우, Gemfilerails-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&amp;T)였지만, 이제는 평가된 상태(예: AT&T)입니다.

    # content: <p>AT&amp;T</p>
    
    # before:
    assert_select('p', 'AT&amp;T')  # => true
    assert_select('p', 'AT&T')      # => false
    
    # now:
    
assert_select('p', 'AT&T')      # => true
assert_select('p', 'AT&amp;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 Gemfileweb-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
    

    (Pull Request)

  • 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)으로 이동되었습니다. 이 기능들을 계속 사용하려면 Gemfilegem "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')
    

    (Pull Request)

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에서 제거될 것입니다.

    (Commit 1, 2)

  • 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_tourl_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::Migrationproper_table_name 인스턴스 메서드를 사용하세요. (Pull Request)

  • 사용되지 않는 :timestamp 타입이 제거되었습니다. 모든 경우에 :datetime으로 투명하게 alias 처리됩니다. XML 직렬화와 같이 컬럼 타입이 Active Record 외부로 전송될 때 발생하는 불일치를 수정합니다. (Pull Request)

8.2 Deprecations (지원 중단)

  • after_commitafter_rollback 내부의 에러 무시 기능이 지원 중단되었습니다. (Pull Request)

  • has_many :through 연관관계에서 counter cache의 자동 감지에 대한 잘못된 지원이 중단되었습니다. 대신 through 레코드의 has_manybelongs_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_timestampst.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 주목할만한 변경사항

  • SchemaDumpercreate_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#tryObject#try!는 이제 블록 내에서 명시적인 receiver 없이도 사용할 수 있습니다. (Commit, Pull Request)

  • travel_to 테스트 헬퍼가 이제 usec 컴포넌트를 0으로 truncate합니다. (Commit)

  • identity 함수로서 Object#itself가 도입되었습니다. (Commit 1, 2)

  • Object#with_options는 이제 블록 내에서 명시적인 receiver 없이도 사용할 수 있습니다. (Pull Request)

  • 문자열을 단어 수로 자르는 String#truncate_words가 도입되었습니다. (Pull Request)

  • hash의 값은 변경하되 키는 그대로 유지해야 하는 일반적인 패턴을 단순화하기 위해 Hash#transform_valuesHash#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 기여자 전체 목록을 참조하세요. 그들 모두에게 찬사를 보냅니다.



맨 위로