Ruby on Rails 3.0 릴리스 노트

Rails 3.0은 무지개와 유니콘입니다! 당신의 저녁 식사를 준비하고 세탁을 해줄 것입니다. 이것이 도착하기 전에는 삶이 어떻게 가능했는지 궁금해할 것입니다. 이것은 우리가 지금까지 만든 최고의 Rails 버전입니다!

하지만 진지하게 말하자면, 이것은 정말 좋은 것들입니다. Merb 팀이 합류하면서 가져온 프레임워크 무관심, 더 슬림하고 빠른 내부, 그리고 맛있는 API들의 좋은 아이디어들이 모두 포함되어 있습니다. Merb 1.x에서 Rails 3.0으로 오시는 분들은 많은 것을 알아볼 것입니다. Rails 2.x에서 오시는 분들도 좋아하실 것입니다.

내부 정리에 대해 전혀 관심이 없다고 해도, Rails 3.0은 여러분을 기쁘게 할 것입니다. 우리는 새로운 기능과 향상된 API들을 많이 가지고 있습니다. Rails 개발자가 되기에 지금보다 더 좋은 때는 없습니다. 몇 가지 주요 사항은 다음과 같습니다:

  • RESTful 선언에 중점을 둔 새로운 라우터
  • Action Controller를 모델로 한 새로운 Action Mailer API (이제 다중 파트 메시지 보내는 고통이 없습니다!)
  • 관계대수 위에 구축된 새로운 Active Record 체인 가능 쿼리 언어
  • Prototype, jQuery 등의 드라이버가 있는 비침투적 JavaScript 헬퍼(인라인 JS의 종말)
  • Bundler를 통한 명시적 종속성 관리

이 모든 것 위에, 우리는 오래된 API를 좋은 경고와 함께 사용하지 않도록 최선을 다했습니다. 즉, 기존 애플리케이션을 Rails 3로 이동시킬 때 즉시 모든 오래된 코드를 최신 모범 사례로 다시 작성할 필요가 없습니다.

이 릴리스 노트는 주요 업그레이드를 다루지만, 모든 작은 버그 수정과 변경 사항은 포함하지 않습니다. Rails 3.0은 250명 이상의 저자가 작성한 약 4,000개의 커밋으로 구성됩니다! 모든 것을 보려면 GitHub의 메인 Rails 리포지토리에서 커밋 목록을 확인하세요.


Rails 3를 설치하려면:

# 설정에 따라 sudo가 필요할 수 있습니다
$ gem install rails

Rails 3로 업그레이드하기

기존 애플리케이션을 업그레이드하는 경우, Rails 3로 이동하기 전에 좋은 테스트 커버리지를 가지는 것이 좋습니다. 또한 먼저 Rails 2.3.5로 업그레이드하고 애플리케이션이 여전히 예상대로 실행되는지 확인한 후에 Rails 3로 업데이트해야 합니다. 그런 다음 다음과 같은 변경 사항에 유의하세요:

Rails 3는 최소 Ruby 1.8.7을 요구합니다

Rails 3.0은 Ruby 1.8.7 이상을 요구합니다. 이전 Ruby 버전에 대한 지원은 공식적으로 중단되었으며 가능한 빨리 업그레이드해야 합니다. Rails 3.0은 Ruby 1.9.2와도 호환됩니다.

팁: Ruby 1.8.7 p248 및 p249에는 Rails 3.0을 중단시키는 마샬링 버그가 있습니다. 그러나 Ruby Enterprise Edition 1.8.7-2010.02 버전부터는 이 문제가 해결되었습니다. 1.9 버전에서는 Ruby 1.9.1이 Rails 3.0에서 세그먼테이션 오류가 발생하므로, Rails 3를 사용하려면 1.9.2로 전환해야 합니다.

Rails 애플리케이션 객체

동일한 프로세스에서 여러 Rails 애플리케이션을 실행할 수 있도록 지원하기 위한 기반 작업의 일환으로, Rails 3에서는 애플리케이션 객체라는 개념이 도입되었습니다. 애플리케이션 객체는 모든 애플리케이션별 구성을 보유하며, 이전 버전의 Rails에서 config/environment.rb와 매우 유사한 성격을 가집니다.

각 Rails 애플리케이션에는 해당 애플리케이션 객체가 있어야 합니다. 애플리케이션 객체는 config/application.rb에 정의됩니다. 기존 애플리케이션을 Rails 3로 업그레이드하는 경우, 이 파일을 추가하고 config/environment.rb에서 적절한 구성을 config/application.rb로 이동해야 합니다.

script/* 디렉토리가 script/rails로 대체됨

새로운 script/rails는 이전에 script 디렉토리에 있던 모든 스크립트를 대체합니다. 그러나 script/rails를 직접 실행하지는 않습니다. rails 명령어가 Rails 애플리케이션의 루트에서 실행되고 있음을 감지하고 스크립트를 실행합니다. 사용법은 다음과 같습니다:

$ rails console                      # script/console 대신
$ rails g scaffold post title:string # script/generate scaffold post title:string 대신

rails --help를 실행하면 모든 옵션 목록을 볼 수 있습니다.

종속성 및 config.gem

config.gem 메서드가 제거되었으며 bundlerGemfile을 사용하도록 대체되었습니다. 자세한 내용은 아래 Vendoring Gems 섹션을 참조하세요.

업그레이드 프로세스

업그레이드 프로세스를 돕기 위해 Rails Upgrade 플러그인이 생성되었습니다.

플러그인을 설치한 후 rake rails:upgrade:check를 실행하여 업데이트해야 할 부분(정보 링크 포함)을 확인할 수 있습니다. 또한 현재 config.gem 호출을 기반으로 Gemfile을 생성하고 현재 라우트 파일에서 새 라우트 파일을 생성하는 작업도 제공합니다. 플러그인을 가져오려면 다음을 실행하세요:

$ ruby script/plugin install git://github.com/rails/rails_upgrade.git

Rails Upgrade is now an Official Plugin에서 이 작업의 예를 볼 수 있습니다.

Rails Upgrade 도구 외에도 더 많은 도움이 필요한 경우 IRC와 rubyonrails-talk에 있는 사람들이 같은 문제를 겪고 있을 수 있습니다. 업그레이드 경험을 블로그에 공유하여 다른 사람들이 혜택을 받을 수 있도록 하세요!

Rails 3.0 애플리케이션 만들기

# 'rails' RubyGem이 설치되어 있어야 합니다
$ rails new myapp
$ cd myapp

Vendoring Gems

Rails는 이제 애플리케이션 루트의 Gemfile을 사용하여 애플리케이션에 필요한 gem을 결정합니다. 이 GemfileBundler에 의해 처리되며, 모든 종속성을 설치합니다. 심지어 시스템 gem에 의존하지 않고 로컬에 종속성을 설치할 수도 있습니다.

자세한 내용: - bundler 홈페이지

엣지 버전 사용하기

BundlerGemfile을 사용하면 새로운 전용 bundle 명령어로 Rails 애플리케이션을 쉽게 동결할 수 있으므로 더 이상 rake freeze가 관련이 없어지고 삭제되었습니다.

Git 리포지토리에서 직접 번들링하려면 --edge 플래그를 전달할 수 있습니다:

$ rails new myapp --edge

Rails 리포지토리의 로컬 체크아웃을 사용하여 애플리케이션을 생성하려면 --dev 플래그를 전달하세요:

$ ruby /path/to/rails/bin/rails new myapp --dev

Rails 아키텍처 변경 사항

Rails에는 6가지 주요 아키텍처 변경 사항이 있습니다.

Railties 재구성

Railties는 전체 Rails 프레임워크에 대한 일관된 플러그인 API를 제공하고 생성기와 Rails 바인딩을 완전히 다시 작성하여, 개발자가 이제 생성기와 애플리케이션 프레임워크의 모든 중요한 단계에 일관되고 정의된 방식으로 연결할 수 있습니다.

모든 Rails 핵심 구성 요소가 분리됨

Merb와 Rails의 병합으로 인해 Rails 핵심 구성 요소 간의 강한 결합을 제거하는 큰 작업이 있었습니다. 이제 이 작업이 완료되었으며, 모든 Rails 핵심 구성 요소가 플러그인 개발에 사용할 수 있는 동일한 API를 사용하고 있습니다. 즉, 만든 모든 플러그인이나 핵심 구성 요소 대체(DataMapper 또는 Sequel 등)가 Rails 핵심 구성 요소가 액세스할 수 있는 모든 기능에 액세스하고 확장 및 향상시킬 수 있습니다.

자세한 내용: - The Great Decoupling

Active Model 추상화

핵심 구성 요소 분리의 일부로, Action Pack에서 Active Record에 대한 모든 연결을 추출했습니다. 이제 완료되었습니다. 새로운 ORM 플러그인은 이제 Active Model 인터페이스만 구현하면 Action Pack과 seamlessly 작동합니다.

자세한 내용: - Make Any Ruby Object Feel Like ActiveRecord

컨트롤러 추상화

핵심 구성 요소 분리의 또 다른 큰 부분은 보기 렌더링 등의 개념을 처리하기 위해 HTTP 개념에서 분리된 기본 슈퍼클래스를 만드는 것이었습니다. AbstractController의 생성으로 ActionControllerActionMailer가 크게 단순화되었습니다.

자세한 정보: - Rails Edge Architecture

Arel 통합

Arel(또는 Active Relation)은 Active Record의 기반으로 채택되었으며 이제 Rails에 필수적입니다. Arel은 Active Record를 단순화하고 Active Record의 관계 기능을 위한 기반을 제공하는 SQL 추상화를 제공합니다.

자세한 내용: - Why I wrote Arel

메일 추출

Action Mailer는 시작 이래로 몽키 패치, 사전 구문 분석기 및 배달 및 수신 에이전트를 가지고 있었으며, TMail이 소스 트리에 포함되어 있었습니다. 버전 3에서는 모든 네, 번역을 계속하겠습니다.

메일 추출

Action Mailer는 시작 이래로 몽키 패치, 사전 구문 분석기 및 배달 및 수신 에이전트를 가지고 있었으며, TMail이 소스 트리에 포함되어 있었습니다. 버전 3에서는 모든 이메일 메시지 관련 기능이 Mail gem으로 추상화되었습니다. 이를 통해 Action Mailer와 이메일 구문 분석기 간의 코드 중복이 줄어들고 명확한 경계가 생겼습니다.

자세한 내용: - New Action Mailer API in Rails 3

문서화

Rails 트리의 문서화는 모든 API 변경 사항을 반영하여 업데이트되고 있으며, Rails Edge Guides도 Rails 3.0의 변경 사항을 반영하여 하나씩 업데이트되고 있습니다. 그러나 guides.rubyonrails.org의 가이드는 안정 버전인 2.3.5 버전을 계속 포함할 것입니다.

자세한 정보: - Rails Documentation Projects

국제화

Rails 3에서는 최신 I18n gem이 제공하는 많은 속도 향상을 포함하여 I18n 지원에 많은 작업이 이루어졌습니다.

  • 모든 객체에 대한 I18n - ActiveModel::TranslationActiveModel::Validations를 포함하여 I18n 동작을 모든 객체에 추가할 수 있습니다. errors.messages 폴백도 있습니다.
  • 속성에 기본 번역을 지정할 수 있습니다.
  • 폼 제출 태그는 객체 상태에 따라 올바른 상태(생성 또는 업데이트)를 자동으로 가져와 올바른 번역을 가져옵니다.
  • 속성 이름만 전달하면 I18n으로 레이블이 작동합니다.

자세한 정보: - Rails 3 I18n changes

Railties

핵심 Rails 프레임워크의 분리로 Railties가 큰 개선을 받았으며, 프레임워크, 엔진 또는 플러그인을 연결하는 것이 가능한 한 쉽고 확장 가능하도록 만들었습니다:

  • 각 애플리케이션에는 자체 네임스페이스가 있으며, 애플리케이션은 YourAppName.boot로 시작됩니다. 예를 들어 다른 애플리케이션과 상호 작용하기가 훨씬 쉬워졌습니다.
  • Rails.root/app 아래의 모든 것이 이제 로드 경로에 추가되므로 app/observers/user_observer.rb를 만들고 Rails가 수정 없이 로드할 수 있습니다.
  • Rails 3.0은 이제 Rails.config 객체를 제공하여 Rails 전체 구성 옵션의 중앙 저장소 역할을 합니다.

    애플리케이션 생성에는 test-unit, Active Record, Prototype 및 Git 설치를 건너뛸 수 있는 추가 플래그가 있습니다. 또한 --dev 플래그가 추가되어 애플리케이션을 사용자의 Rails 체크아웃을 가리키는 Gemfile로 설정합니다(Rails 바이너리 경로로 결정됨). 자세한 내용은 rails --help를 참조하세요.

Railties 생성기에는 많은 관심이 쏟아졌습니다:

  • 생성기가 완전히 다시 작성되어 이전 버전과 호환되지 않습니다.
  • Rails 템플릿 API와 생성기 API가 병합되었습니다(이전과 동일).
  • 생성기는 더 이상 특수 경로에서 로드되지 않고 Ruby 로드 경로에서 찾습니다. 따라서 rails generate foo를 호출하면 generators/foo_generator를 찾습니다.
  • 새 생성기에는 후크가 있어 템플릿 엔진, ORM, 테스트 프레임워크 등이 쉽게 연결될 수 있습니다.
  • 새 생성기를 통해 Rails.root/lib/templates에 복사본을 배치하여 템플릿을 재정의할 수 있습니다.
  • Rails::Generators::TestCase도 제공되므로 자체 생성기를 만들고 테스트할 수 있습니다.

또한 Railties 생성기가 생성한 뷰에도 일부 개선 사항이 있습니다:

  • 뷰에서는 p 태그 대신 div 태그를 사용합니다.
  • 생성된 스캐폴드는 편집 및 새 뷰에 중복된 코드 대신 _form 부분 템플릿을 사용합니다.
  • 스캐폴드 폼은 전달된 객체 상태에 따라 “Create ModelName” 또는 “Update ModelName"을 반환하는 f.submit을 사용합니다.

마지막으로 rake 작업에 몇 가지 향상 사항이 추가되었습니다:

  • rake db:forward가 추가되어 개별적으로 또는 그룹으로 마이그레이션을 앞으로 이동할 수 있습니다.
  • rake routes CONTROLLER=x가 추가되어 한 컨트롤러의 라우트만 볼 수 있습니다.

Railties는 이제 다음을 사용하지 않도록 권장합니다:

  • RAILS_ROOT 대신 Rails.root,
  • RAILS_ENV 대신 Rails.env, 그리고
  • RAILS_DEFAULT_LOGGER 대신 Rails.logger.

PLUGIN/rails/tasksPLUGIN/tasks는 더 이상 로드되지 않으며, 모든 작업은 이제 PLUGIN/lib/tasks에 있어야 합니다.

자세한 정보:

Action Pack

Action Pack에는 중요한 내부 및 외부 변경 사항이 있었습니다.

Abstract Controller

Abstract Controller는 Action Controller의 일반적인 부분을 재사용 가능한 모듈로 추출했습니다. 이 추상화를 통해 ActionMailer::Base가 이제 AbstractController에서 상속받고 Mail gem에 Rails DSL을 래핑할 수 있게 되었습니다.

또한 Action Controller의 코드를 단순화할 수 있는 기회를 제공했습니다.

그러나 Abstract Controller는 사용자 대상 API가 아니며 일상적인 Rails 사용에서 직접 접하지 않을 것입니다.

자세한 정보: - Rails Edge Architecture

Action Controller

  • application_controller.rbprotect_from_forgery가 기본적으로 켜져 있습니다.
  • cookie_verifier_secret이 deprecated되었으며, 대신 Rails.application.config.cookie_secret에 할당되고 config/initializers/cookie_verification_secret.rb라는 별도의 파일로 이동했습니다.
  • session_storeActionController::Base.session에서 구성되었으며, 이제 Rails.application.config.session_store로 이동했습니다. 기본값은 config/initializers/session_store.rb에 설정됩니다.
  • cookies.secure를 사용하면 cookie.secure[:key] => value와 같이 암호화된 쿠키 값을 설정할 수 있습니다.
  • cookies.permanent를 사용하면 cookie.permanent[:key] => value와 같이 영구 쿠키 값을 설정할 수 있으며, 확인 실패 시 예외를 발생시킵니다.
  • format 호출 내에서 :notice => 'This is a flash message' 또는 :alert => 'Something went wrong'을 전달할 수 있습니다. flash[] 해시는 이전과 같이 작동합니다.
  • respond_with 메서드가 추가되어 컨트롤러의 응답 생성을 단순화합니다.
  • ActionController::Responder가 추가되어 응답 생성의 유연성을 높였습니다.

Deprecations:

  • filter_parameter_loggingconfig.filter_parameters << :password로 대체되었습니다.

자세한 정보:

Action Dispatch

Action Dispatch는 Rails 3.0의 새로운 기능이며 라우팅에 대한 새롭고 깨끗한 구현을 제공합니다.

  • 라우터의 큰 정리 및 재작성, Rails 라우터는 이제 Rails DSL이 있는 rack_mount입니다. 독립형 소프트웨어입니다.
  • 각 애플리케이션의 정의된 경로가 이제 애플리케이션 모듈 내에 네임스페이스화됩니다. 즉:

    # 대신:
    
    ActionController::Routing::Routes.draw do |map|
      map.resources :posts
    end
    
    # 다음과 같이 합니다:
    
    AppName::Application.routes do
      resources :posts
    end
    
  • 라우터에 match 메서드가 추가되었으며 모든 Rack 애플리케이션을 일치하는 경로에 전달할 수 있습니다.

  • 라우터에 constraints 메서드가 추가되어 정의된 제약 조건으로 라우터를 보호할 수 있습니다.

  • 라우터에 scope 메서드가 추가되어 다른 언어나 다른 작업에 대한 경로를 네임스페이스화할 수 있습니다. 예를 들어:

    scope 'es' do
      resources :projects, :path_names => { :edit => 'cambiar' }, :path => 'proyecto'
    end
    
    # /es/proyecto/1/cambiar 경로를 제공합니다
    
  • 라우터에 root 메서드가 추가되어 match '/', :to => path의 단축 방식을 제공합니다.

  • 일치하는 세그먼트를 선택적으로 전달할 수 있습니다. 예: match "/:controller(/:action(/:id))(.:format)", 각 괄호로 묶인 세그먼트는 선택 사항입니다.

  • 블록을 통해 경로를 표현할 수 있습니다. 예를 들어 controller :home { match '/:action' }을 호출할 수 있습니다.

참고. 이전 스타일의 map 명령은 이전과 같이 작동하지만 호환성 계층이 제공되며 Rails 3.1 릴리스에서 제거될 것입니다.

Deprecations

  • 비 REST 애플리케이션에 대한 캐치 올 경로(/:controller/:action/:id)가 이제 주석 처리되었습니다.
  • 경로 :path_prefix가 더 이상 존재하지 않으며 :name_prefix에 자동으로 ”_“가 추가됩니다.

자세한 정보: * The Rails 3 Router: Rack it Up * Revamped Routes in Rails 3 * Generic Actions in Rails 3

Action View

비침투적 JavaScript

Action View 헬퍼에 대한 주요 재작성이 수행되었으며, 비침투적 JavaScript(UJS) 후크를 구현하고 이전의 인라인 AJAX 명령을 제거했습니다. 이를 통해 Rails에서 모든 호환네, 번역을 계속하겠습니다.

Action View

비침투적 JavaScript

Action View 헬퍼에 대한 주요 재작성이 수행되었으며, 비침투적 JavaScript(UJS) 후크를 구현하고 이전의 인라인 AJAX 명령을 제거했습니다. 이를 통해 Rails에서 모든 호환 가능한 UJS 드라이버를 사용하여 UJS 후크를 구현할 수 있습니다.

이는 이전의 remote_<method> 헬퍼가 Rails 코어에서 제거되고 Prototype Legacy Helper에 배치되었음을 의미합니다. UJS 후크를 HTML에 삽입하려면 이제 :remote => true를 전달합니다. 예:

form_for @post, :remote => true

다음과 같이 생성됩니다:

<form action="http://host.com" id="create-post" method="post" data-remote="true">

블록이 있는 헬퍼

form_for 또는 div_for와 같이 블록에서 콘텐츠를 삽입하는 헬퍼는 이제 <%=를 사용합니다:

<%= form_for @post do |f| %>
  ...
<% end %>

자체 헬퍼도 문자열을 반환해야 하며, 출력 버퍼에 직접 추가하지 않아야 합니다.

cache 또는 content_for와 같이 다른 작업을 수행하는 헬퍼는 이전과 같이 &lt;%를 사용해야 합니다.

기타 변경 사항

  • h(string)을 호출하여 HTML 출력을 이스케이프할 필요가 더 이상 없습니다. 이제 기본적으로 모든 뷰 템플릿에서 활성화되어 있습니다. 이스케이프되지 않은 문자열을 원하는 경우 raw(string)을 호출하세요.
  • 기본적으로 HTML5 출력이 생성됩니다.
  • 폼 레이블 헬퍼는 이제 단일 값에서 I18n을 가져오므로 f.label :name:name 번역을 가져옵니다.
  • I18n 선택 레이블은 이제 :en.helpers.select여야 하며 :en.support.select가 아닙니다.
  • ERB 템플릿 내부의 Ruby 보간 끝에 마이너스 기호를 배치할 필요가 더 이상 없습니다.
  • grouped_collection_select 헬퍼가 Action View에 추가되었습니다.
  • content_for?가 추가되어 뷰에 콘텐츠가 존재하는지 확인할 수 있습니다.
  • 폼 헬퍼에 :value => nil을 전달하면 필드의 value 속성이 nil로 설정됩니다(기본값 사용 안 함).
  • 폼 헬퍼에 :id => nil을 전달하면 해당 필드에 id 속성이 렌더링되지 않습니다.
  • image_tag:alt => nil을 전달하면 img 태그에 alt 속성이 렌더링되지 않습니다.

Active Model

Active Model은 Rails 3.0의 새로운 기능입니다. Action Pack과 seamlessly 작동할 수 있도록 모든 ORM 라이브러리가 Active Model 인터페이스를 구현할 수 있는 추상화 계층을 제공합니다.

ORM 추상화 및 Action Pack 인터페이스

핵심 구성 요소 분리의 일부로 Action Pack에서 Active Record에 대한 모든 연결을 추출했습니다. 이제 완료되었습니다. 새로운 ORM 플러그인은 이제 Active Model 인터페이스만 구현하면 Action Pack과 seamlessly 작동합니다.

자세한 내용: - Make Any Ruby Object Feel Like ActiveRecord

유효성 검사

유효성 검사가 Active Record에서 Active Model로 이동되었으며, Rails 3에서 ORM 라이브러리 전반에 걸쳐 작동하는 유효성 검사 인터페이스를 제공합니다.

  • validates :attribute, options_hash 단축 메서드가 있어 모든 validates 클래스 메서드에 대한 옵션을 전달할 수 있습니다. 하나의 validate 메서드에 여러 옵션을 전달할 수 있습니다.
  • validates 메서드에는 다음과 같은 옵션이 있습니다:
    • :acceptance => Boolean.
    • :confirmation => Boolean.
    • :exclusion => { :in => Enumerable }.
    • :inclusion => { :in => Enumerable }.
    • :format => { :with => Regexp, :on => :create }.
    • :length => { :maximum => Fixnum }.
    • :numericality => Boolean.
    • :presence => Boolean.
    • :uniqueness => Boolean.

참고: Rails 버전 2.3의 모든 유효성 검사 메서드는 Rails 3.0에서도 계속 지원됩니다. 새로운 validates 메서드는 모델 유효성 검사에 대한 추가 지원을 제공하기 위한 것이며 기존 API를 대체하기 위한 것은 아닙니다.

유효성 검사기 객체를 전달할 수도 있으며, 이를 Active Model을 사용하는 객체 간에 재사용할 수 있습니다:

class TitleValidator < ActiveModel::EachValidator
  Titles = ['Mr.', 'Mrs.', 'Dr.']
  def validate_each(record, attribute, value)
    unless Titles.include?(value)
      record.errors[attribute] << 'must be a valid title'
    end
  end
end
class Person
  include ActiveModel::Validations
  attr_accessor :title
  validates :title, :presence => true, :title => true
end

# 또는 Active Record의 경우

class Person < ActiveRecord::Base
  validates :title, :presence => true, :title => true
end

내부 조사도 지원됩니다:

User.validators
User.validators_on(:login)

자세한 정보:

Active Record

Active Record는 Active Model으로의 추상화, Arel을 사용한 쿼리 인터페이스 전체 업데이트, 유효성 검사 업데이트 및 많은 향상 및 수정 사항을 포함하여 Rails 3.0에서 많은 관심을 받았습니다. Rails 2.x API는 호환성 계층을 통해 계속 사용할 수 있으며, 3.1 버전까지 지원되고 3.2 버전에서 제거될 것입니다.

쿼리 인터페이스

Arel을 통해 Active Record의 핵심 메서드는 이제 관계를 반환합니다. Rails 2.3.x의 기존 API는 계속 지원되며 Rails 3.1까지 사용할 수 있지만 더 이상 사용되지 않고 Rails 3.2에서 제거될 것입니다. 그러나 새로운 API는 다음과 같은 새로운 메서드를 제공하며, 이 메서드들은 모두 관계를 반환하여 연결할 수 있습니다:

  • where - 관계에 대한 조건을 제공합니다(반환되는 내용).
  • select - 반환할 모델 속성을 선택합니다.
  • group - 속성으로 관계를 그룹화합니다.
  • having - 그룹 관계를 제한하는 표현식을 제공합니다(GROUP BY 제약 조건).
  • joins - 다른 테이블에 관계를 조인합니다.
  • clause - 조인 관계를 제한하는 표현식을 제공합니다(JOIN 제약 조건).
  • includes - 사전 로드된 다른 관계를 포함합니다.
  • order - 제공된 표현식에 따라 관계를 정렬합니다.
  • limit - 관계를 지정된 레코드 수로 제한합니다.
  • lock - 반환된 레코드를 잠급니다.
  • readonly - 데이터의 읽기 전용 복사본을 반환합니다.
  • from - 둘 이상의 테이블에서 관계를 선택할 수 있는 방법을 제공합니다.
  • scope - (이전의 named_scope) 관계를 반환하며 다른 관계 메서드와 연결할 수 있습니다.
  • with_scope - 및 with_exclusive_scope도 이제 관계를 반환하므로 연결할 수 있습니다.
  • default_scope도 관계와 작동합니다.

자세한 정보:

향상 사항

  • Active Record 객체에 :destroyed?가 추가되었습니다.
  • Active Record 연결에 :inverse_of가 추가되어 이미 로드된 연결 인스턴스를 데이터베이스 호출 없이 가져올 수 있습니다.

패치 및 Deprecations

또한 Active Record 브랜치에 많은 수정 사항이 있었습니다:

  • SQLite 2 지원이 SQLite 3로 대체되었습니다.
  • MySQL에 대한 열 순서 지원이 추가되었습니다.
  • PostgreSQL 어댑터의 TIME ZONE 지원이 수정되어 잘못된 값을 더 이상 삽입하지 않습니다.
  • PostgreSQL에 대한 다중 스키마 테이블 이름 지원이 추가되었습니다.
  • PostgreSQL에 대한 XML 데이터 유형 열 지원이 추가되었습니다.
  • table_name이 이제 캐시됩니다.
  • Oracle 어댑터에도 많은 버그 수정이 있었습니다.

다음과 같은 Deprecations도 있습니다:

  • Active Record 클래스의 named_scope가 deprecated되었으며 scope로 이름이 변경되었습니다.
  • scope 메서드에서는 :conditions => {}의 찾기 메서드 대신 관계 메서드를 사용해야 합니다. 예: scope :since, lambda {|time| where("created_at > ?", time) }.
  • save(false)가 deprecated되었으며 save(:validate => false)를 사용해야 합니다.
  • Active Record에 대한 I18n 오류 메시지는 :en.activerecord.errors.template에서 :en.errors.template로 변경되어야 합니다.
  • model.errors.on이 deprecated되었으며 model.errors[]를 사용해야 합니다.
  • validates_presence_ofvalidates... :presence => true로 대체됩니다.
  • ActiveRecord::Base.colorize_loggingconfig.active_record.colorize_logging이 deprecated되었으며 Rails::LogSubscriber.colorize_logging 또는 config.colorize_logging을 사용해야 합니다.

참고: Active Record 엣지에 상태 머신 구현이 몇 달 동안 있었지만 Rails 3.0 릴리스에서는 제거되었습니다.

Active Resource

Active Resource도 Active Model으로 추출되어 Action Pack과 seamlessly 작동하는 Active Resource 객체를 사용할 수 있습니다.

  • Active Model을 통한 유효성 검사가 추가되었습니다.
  • 관찰 후크가 추가되었습니다.
  • HTTP 프록시 지원이 추가되었습니다.
  • 다이제스트 인증 지원이 추가되었습니다.
  • 모델 명명이 Active Model으로 이동되었습니다.
  • Active Resource 속성이 인디퍼런트 액세스 해시로 변경되었습니다.
  • first, lastall에 대한 별칭이 해당 찾기 범위에 추가되었습니다.
  • find_every가 아무것도 반환되지 않으면 ResourceNotFound 오류를 더 이상 발생시키지 않습니다.
  • 객체가 valid?가 네, 번역을 계속하겠습니다.

Active Resource

Active Resource도 Active Model으로 추출되어 Action Pack과 seamlessly 작동하는 Active Resource 객체를 사용할 수 있습니다.

  • Active Model을 통한 유효성 검사가 추가되었습니다.
  • 관찰 후크가 추가되었습니다.
  • HTTP 프록시 지원이 추가되었습니다.
  • 다이제스트 인증 지원이 추가되었습니다.
  • 모델 명명이 Active Model으로 이동되었습니다.
  • Active Resource 속성이 인디퍼런트 액세스 해시로 변경되었습니다.
  • first, lastall에 대한 별칭이 해당 찾기 범위에 추가되었습니다.
  • find_every가 아무것도 반환되지 않으면 ResourceNotFound 오류를 더 이상 발생시키지 않습니다.
  • save!가 추가되어 객체가 valid?가 아닌 경우 ResourceInvalid를 발생시킵니다.
  • update_attributeupdate_attributes가 Active Resource 모델에 추가되었습니다.
  • exists?가 추가되었습니다.
  • SchemaDefinitionSchema로, define_schemaschema로 이름이 변경되었습니다.
  • 원격 오류를 로드하는 데 Active Resources의 format을 사용하고 content-type을 사용하지 않습니다.
  • 스키마 블록에 instance_eval을 사용합니다.
  • ActiveResource::ConnectionError#to_s@responsecode 또는 message에 응답하지 않는 경우 Ruby 1.9 호환성을 처리하도록 수정되었습니다.
  • JSON 형식의 오류 지원이 추가되었습니다.
  • 숫자 배열을 로드할 때 load가 작동하도록 수정되었습니다.
  • 원격 리소스가 삭제된 경우 410 응답을 인식하도록 수정되었습니다.
  • Active Resource 연결에 SSL 옵션을 설정할 수 있는 기능이 추가되었습니다.
  • 연결 시간 초과 설정이 Net::HTTP open_timeout에도 영향을 미칩니다.

Deprecations:

  • save(false)가 deprecated되었으며 save(:validate => false)를 사용해야 합니다.
  • Ruby 1.9.2: URI.parse.decode가 deprecated되었으며 더 이상 라이브러리에서 사용되지 않습니다.

Active Support

Active Support에서는 다양한 핵심 구성 요소를 선택적으로 사용할 수 있도록 하는 데 많은 노력이 기울여졌습니다. 즉, 전체 Active Support 라이브러리를 요구하지 않고도 해당 부분을 사용할 수 있습니다. 이를 통해 Rails의 다양한 핵심 구성 요소를 더 슬림하게 실행할 수 있습니다.

Active Support의 주요 변경 사항은 다음과 같습니다:

  • 라이브러리 전체에서 사용되지 않는 메서드를 제거하는 등 대규모 정리가 이루어졌습니다.
  • Active Support는 더 이상 TZInfo, Memcache Client 및 Builder의 벤더 버전을 제공하지 않습니다. 이러한 것들은 모두 종속성으로 포함되어 bundle install 명령을 통해 설치됩니다.
  • ActiveSupport::SafeBuffer에 안전한 버퍼가 구현되었습니다.
  • Array.uniq_byArray.uniq_by!가 추가되었습니다.
  • Array#rand가 제거되었고 Ruby 1.9의 Array#sample이 백포트되었습니다.
  • TimeZone.seconds_to_utc_offset의 버그가 수정되어 잘못된 값을 반환하지 않습니다.
  • ActiveSupport::Notifications 미들웨어가 추가되었습니다.
  • ActiveSupport.use_standard_json_time_format이 기본적으로 true로 설정되었습니다.
  • ActiveSupport.escape_html_entities_in_json이 기본적으로 false로 설정되었습니다.
  • Integer#multiple_of?가 인수로 zero를 허용하며, 수신기가 zero가 아닌 경우 false를 반환합니다.
  • string.charsstring.mb_chars로 이름이 변경되었습니다.
  • ActiveSupport::OrderedHash가 이제 YAML을 통해 역직렬화될 수 있습니다.
  • LibXML 및 Nokogiri를 사용하는 SAX 기반 파서가 XmlMini에 추가되었습니다.
  • Object#presence가 추가되어 #present?이면 객체를 반환하고 그렇지 않으면 nil을 반환합니다.
  • String#exclude? 코어 확장이 추가되어 #include?의 반대를 반환합니다.
  • DateTimeto_i가 추가되어 모델의 DateTime 속성에 대한 to_yaml이 올바르게 작동합니다.
  • Enumerable#exclude?가 추가되어 Enumerable#include?와 대칭성을 유지하고 !x.include?를 피할 수 있습니다.
  • XSS 이스케이프가 기본적으로 켜졌습니다.
  • ActiveSupport::HashWithIndifferentAccess에 깊은 병합 지원이 추가되었습니다.
  • Enumerable#sum이 이제 :size에 응답하지 않는 모든 열거형에서 작동합니다.
  • 길이가 0인 기간의 inspect가 빈 문자열 대신 ‘0 seconds'를 반환합니다.
  • elementcollectionModelName에 추가되었습니다.
  • String#to_timeString#to_datetime이 소수 초를 처리합니다.
  • 전후 필터 객체에 대한 새 콜백 지원이 추가되었습니다.
  • ActiveSupport::OrderedHash#to_a 메서드가 순서가 지정된 배열 집합을 반환합니다. Ruby 1.9의 Hash#to_a와 일치합니다.
  • MissingSourceFile이 상수로 존재하지만 이제 LoadError와 동일합니다.
  • 하위 클래스에 의해 재정의 및 상속될 수 있는 클래스 수준 속성을 선언할 수 있는 Class#class_attribute가 추가되었습니다.
  • 마침내 ActiveRecord::AssociationsDeprecatedCallbacks가 제거되었습니다.
  • Object#metaclass가 Ruby와 일치하도록 Kernel#singleton_class로 변경되었습니다.

다음 메서드는 Ruby 1.8.7 및 1.9에서 이제 사용 가능하므로 제거되었습니다:

  • Integer#even?Integer#odd?
  • String#each_char
  • String#start_with?String#end_with?(3인칭 별칭은 유지됨)
  • String#bytesize
  • Object#tap
  • Symbol#to_proc
  • Object#instance_variable_defined?
  • Enumerable#none?

REXML에 대한 보안 패치는 Ruby 1.8.7의 초기 패치 수준에서도 여전히 필요하므로 Active Support에 남아 있습니다. Active Support는 적용해야 하는지 여부를 알고 있습니다.

다음 메서드는 더 이상 프레임워크에서 사용되지 않아 제거되었습니다:

  • Kernel#daemonize
  • Object#remove_subclasses_of Object#extend_with_included_modules_from, Object#extended_by
  • Class#remove_class
  • Regexp#number_of_captures, Regexp.unoptionalize, Regexp.optionalize, Regexp#number_of_captures

Action Mailer

Action Mailer에 새로운 API가 도입되었으며, TMail이 새로운 Mail 이메일 라이브러리로 대체되었습니다. Action Mailer 자체가 거의 완전히 재작성되었으며, 거의 모든 코드 행이 수정되었습니다. 그 결과 Action Mailer는 이제 Abstract Controller를 상속받고 Mail gem을 Rails DSL으로 래핑합니다. 이를 통해 Action Mailer의 코드와 다른 라이브러리의 중복이 크게 줄었습니다.

  • 모든 메일러는 이제 기본적으로 app/mailers에 있습니다.
  • attachments, headersmail의 세 가지 메서드를 사용하여 새 API로 이메일을 보낼 수 있습니다.
  • Action Mailer에 attachments.inline 메서드를 사용한 인라인 첨부 파일에 대한 기본 지원이 추가되었습니다.
  • Action Mailer 이메일 메서드가 이제 Mail::Message 객체를 반환하며, 이 객체에 deliver 메시지를 보내 자체 전송할 수 있습니다.
  • 모든 배달 방법이 이제 Mail gem으로 추상화되었습니다.
  • mail 배달 메서드는 유효한 메일 헤더 필드와 해당 값 쌍의 해시를 허용할 수 있습니다.
  • mail 배달 메서드는 Action Controller의 respond_to와 유사한 방식으로 작동하며, 명시적으로 또는 암시적으로 템플릿을 렌더링할 수 있습니다. Action Mailer는 필요에 따라 이메일을 다중 파트로 변환합니다.
  • format.mime_type 호출 내에서 프로시저를 전달하고 명시적으로 특정 유형의 텍스트를 렌더링하거나 레이아웃 또는 다른 템플릿을 추가할 수 있습니다. 프로시저 내부의 render 호출은 Abstract Controller에서 제공되며 동일한 옵션을 지원합니다.
  • 메일러 단위 테스트가 기능 테스트로 이동되었습니다.
  • Action Mailer는 이제 Mail Gem에 모든 자동 헤더 필드 및 본문 인코딩을 위임합니다.
  • Action Mailer는 이메일 본문과 헤더를 자동으로 인코딩합니다.

Deprecations:

  • :charset, :content_type, :mime_version, :implicit_parts_order가 모두 ActionMailer.default :key => value 스타일 선언으로 deprecated되었습니다.
  • 메일러 동적 create_method_namedeliver_method_name이 deprecated되었으며, method_name을 호출하면 Mail::Message 객체가 반환됩니다.
  • ActionMailer.deliver(message)가 deprecated되었으며, message.deliver를 호출하면 됩니다.
  • template_root가 deprecated되었으며, format.mime_type 메서드 내부의 render 호출에 옵션을 전달하세요.
  • 인스턴스 변수를 정의하는 body 메서드가 deprecated되었습니다(body {:ivar => value}). 대신 메서드에 직접 인스턴스 변수를 선언하면 뷰에서 사용할 수 있습니다.
  • 메일러가 app/models에 있는 것이 deprecated되었으며 app/mailers를 사용해야 합니다.

자세한 정보:

크레딧

Rails에 많은 시간을 보내 기여한 모든 사람들의 전체 기여자 목록을 참조하세요. 그들 모두에게 박수를 보냅니다.

Rails 3.0 릴리스 노트는 Mikel Lindsaar가 작성했습니다.