Ruby on Rails 3.1 릴리스 노트

Rails 3.1의 주요 변경 사항:

  • 스트리밍
  • 가역적 마이그레이션
  • 애셋 파이프라인
  • jQuery를 기본 JavaScript 라이브러리로 사용

이 릴리스 노트에서는 주요 변경 사항만 다룹니다. 다양한 버그 수정 및 변경 사항에 대해서는 변경 로그를 참조하거나 GitHub의 Rails 메인 저장소에서 커밋 목록을 확인하세요.


Rails 3.1로 업그레이드하기

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

Rails 3.1에는 최소 Ruby 1.8.7이 필요합니다

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

팁: Ruby 1.8.7 p248 및 p249에는 마샬링 버그가 있어 Rails가 충돌할 수 있습니다. 그러나 Ruby Enterprise Edition 1.8.7-2010.02 이상 버전에서는 이 문제가 해결되었습니다. 1.9.x 버전의 경우 Ruby 1.9.1은 세그먼테이션 오류가 발생하므로, 1.9.2를 사용하는 것이 안정적입니다.

애플리케이션에서 업데이트해야 할 사항

다음 변경 사항은 애플리케이션을 Rails 3.1.3, 즉 최신 3.1.x 버전의 Rails로 업그레이드하기 위한 것입니다.

Gemfile

Gemfile에 다음과 같은 변경 사항을 적용하세요.

gem "rails", "= 3.1.3"
gem "mysql2"

# 새로운 애셋 파이프라인에 필요함
group :assets do
  gem "sass-rails",   "~> 3.1.5"
  gem "coffee-rails", "~> 3.1.1"
  gem "uglifier",     ">= 1.0.3"
end

# Rails 3.1에서 jQuery가 기본 JavaScript 라이브러리
gem "jquery-rails"

config/application.rb

  • 애셋 파이프라인을 사용하려면 다음 내용을 추가해야 합니다:

    config.assets.enabled = true
    config.assets.version = '1.0'
    
  • 애플리케이션에서 “/assets” 경로를 리소스로 사용하는 경우 충돌을 방지하기 위해 애셋 접두사를 변경할 수 있습니다:

    # 기본값은 '/assets'
    config.assets.prefix = '/asset-files'
    

config/environments/development.rb

  • config.action_view.debug_rjs = true 설정을 제거합니다.

  • 애셋 파이프라인을 사용하는 경우 다음 내용을 추가합니다.

    # 애셋 압축하지 않음
    config.assets.compress = false
    
    # 로드된 애셋 라인 확장
    config.assets.debug = true
    

config/environments/production.rb

  • 아래 대부분의 변경 사항은 애셋 파이프라인과 관련됩니다. 자세한 내용은 애셋 파이프라인 가이드를 참조하세요.

    # JavaScript와 CSS 압축
    config.assets.compress = true
    
    # 사전 컴파일된 애셋이 누락된 경우 애셋 파이프라인으로 대체하지 않음
    config.assets.compile = false
    
    # 애셋 URL에 다이제스트 생성
    config.assets.digest = true
    
    # 기본값은 Rails.root.join("public/assets")
    # config.assets.manifest = YOUR_PATH
    
    # 추가로 컴파일할 애셋 (application.js, application.css, 그 외 JS/CSS는 이미 추가됨)
    # config.assets.precompile `= %w( admin.js admin.css )
    
    # 모든 접근을 SSL로 강제하고, Strict-Transport-Security와 안전한 쿠키 사용
    # config.force_ssl = true
    

config/environments/test.rb

# 테스트에서 정적 애셋 서버 구성, 성능을 위해 Cache-Control 사용
config.serve_static_assets = true
config.static_cache_control = "public, max-age=3600"

config/initializers/wrap_parameters.rb

  • 매개변수를 중첩 해시로 래핑하려면 이 파일을 추가하고 다음 내용을 입력합니다. 새 애플리케이션에서는 기본적으로 활성화되어 있습니다.

    # 서버 재시작 시 이 파일을 수정해야 합니다.
    # 이 파일에는 기본적으로 활성화된 ActionController::ParamsWrapper에 대한 설정이 포함되어 있습니다.
    
    # JSON 형식의 매개변수 래핑을 활성화합니다. 비활성화하려면 :format을 빈 배열로 설정하세요.
    ActiveSupport.on_load(:action_controller) do
      wrap_parameters :format => [:json]
    end
    
    # Active Record에서 JSON 응답의 루트 요소를 비활성화합니다.
    ActiveSupport.on_load(:active_record) do
      self.include_root_in_json = false
    end
    

뷰에서 애셋 헬퍼의 :cache와 :concat 옵션 제거

  • 애셋 파이프라인에서는 :cache와 :concat 옵션이 더 이상 사용되지 않으므로, 뷰에서 이 옵션을 삭제하세요.

Rails 3.1 애플리케이션 생성하기

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

젬 벤더링

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

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

엣지 버전 사용하기

BundlerGemfile을 사용하면 새로운 bundle 명령으로 Rails 애플리케이션을 쉽게 동결할 수 있습니다. Git 저장소에서 직접 번들링하려면 --edge 플래그를 사용하세요:

$ rails new myapp --edge

로컬에 Rails 저장소가 있고 그것을 사용하여 애플리케이션을 생성하려면 --dev 플래그를 사용하세요:

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

Rails 아키텍처 변경 사항

애셋 파이프라인

Rails 3.1의 주요 변경 사항은 애셋 파이프라인입니다. 이를 통해 CSS와 JavaScript를 코드의 일부로 취급할 수 있으며, 플러그인과 엔진에서도 사용할 수 있습니다.

애셋 파이프라인은 Sprockets로 구동되며, 애셋 파이프라인 가이드에서 자세히 다룹니다.

HTTP 스트리밍

Rails 3.1에서 새로 도입된 HTTP 스트리밍은 서버가 응답을 생성하는 동안 브라우저가 스타일시트와 JavaScript 파일을 다운로드할 수 있게 해줍니다. 이 기능은 Ruby 1.9.2를 요구하며, 옵트인 방식이며 웹 서버의 지원도 필요합니다. 그러나 NGINX와 Unicorn의 조합은 이 기능을 활용할 수 있습니다.

기본 JavaScript 라이브러리는 jQuery

Rails 3.1에서는 jQuery가 기본 JavaScript 라이브러리가 되었습니다. 그러나 Prototype을 사용하는 경우 간단히 전환할 수 있습니다.

$ rails new myapp -j prototype

아이덴티티 맵

Active Record에 Rails 3.1에서 아이덴티티 맵이 추가되었습니다. 아이덴티티 맵은 이전에 인스턴스화된 레코드를 유지하고, 다시 액세스할 때 해당 객체를 반환합니다. 아이덴티티 맵은 요청 단위로 생성되며, 요청 완료 시 플러시됩니다.

Rails 3.1에서는 아이덴티티 맵이 기본적으로 비활성화되어 있습니다.

Railties

  • jQuery가 새로운 기본 JavaScript 라이브러리가 되었습니다.

  • jQuery와 Prototype은 더 이상 내장되지 않으며, jquery-railsprototype-rails 젬을 통해 제공됩니다.

  • 애플리케이션 생성기는 -j 옵션을 받으며, 임의의 문자열을 사용할 수 있습니다. “foo"를 전달하면 "foo-rails” 젬이 Gemfile에 추가되고, 애플리케이션 JavaScript 매니페스트에서 “foo"와 "foo_ujs"를 요구합니다. 현재 "prototype-rails"와 "jquery-rails"만 존재하며 애셋 파이프라인을 통해 해당 파일을 제공합니다.

  • 애플리케이션이나 플러그인을 생성하면 bundle install이 실행됩니다. 단, --skip-gemfile 또는 --skip-bundle 옵션을 지정하면 제외됩니다.

  • 컨트롤러와 리소스 생성기는 이제 자동으로 애셋 스텁을 생성합니다(–skip-assets 옵션으로 비활성화할 수 있음). 이 스텁은 CoffeeScript와 Sass를 사용합니다.

  • 스캐폴드와 앱 생성기는 Ruby 1.9 스타일 해시를 사용합니다. 이전 스타일의 해시를 생성하려면 --old-style-hash 옵션을 전달할 수 있습니다.

  • 스캐폴드 컨트롤러 생성기는 XML 대신 JSON 형식의 블록을 생성합니다.

  • Active Record 로깅이 STDOUT으로 전송되며 콘솔에 인라인으로 표시됩니다.

  • config.force_ssl 구성을 추가하여 Rack::SSL 미들웨어를 로드하고 모든 요청을 HTTPS 프로토콜로 강제할 수 있습니다.

  • rails plugin new 명령을 추가하여 젬 사양, 테스트, 테스트용 더미 애플리케이션이 포함된 Rails 플러그인을 생성할 수 있습니다.

  • Rack::EtagRack::ConditionalGet이 기본 미들웨어 스택에 추가되었습니다.

  • Rack::Cache가 기본 미들웨어 스택에 추가되었습니다.

  • 엔진이 크게 업데이트되었습니다 - 어떤 경로에서든 마운트할 수 있고, 애셋을 활성화하고, 생성기를 실행할 수 있습니다.

Action Pack

Action Controller

  • CSRF 토큰 인증을 확인할 수 없는 경우 경고가 발생합니다.

  • 특정 컨트롤러에서 force_ssl을 지정하면 브라우저가 해당 컨트롤러의 데이터를 HTTPS 프로네, 번역을 계속하겠습니다.

Action Pack

Action Controller

  • 특정 컨트롤러에서 force_ssl을 지정하면 브라우저가 해당 컨트롤러의 데이터를 HTTPS 프로토콜로 전송하도록 강제됩니다. 특정 액션에만 적용하려면 :only 또는 :except 옵션을 사용할 수 있습니다.

  • config.filter_parameters에 지정된 민감한 쿼리 문자열 매개변수가 이제 로그에서 필터링됩니다.

  • to_paramnil을 반환하는 URL 매개변수는 이제 쿼리 문자열에서 제거됩니다.

  • ActionController::ParamsWrapper를 추가하여 매개변수를 중첩 해시로 래핑할 수 있으며, 새 애플리케이션에서 JSON 요청에 대해 기본적으로 활성화됩니다. 이는 config/initializers/wrap_parameters.rb에서 사용자 정의할 수 있습니다.

  • config.action_controller.include_all_helpers를 추가했습니다. 기본적으로 ActionController::Base에서 helper :all이 수행되어 모든 헬퍼가 포함됩니다. include_all_helpersfalse로 설정하면 applicationhelper와 해당 컨트롤러의 헬퍼(예: foohelper for foo_controller)만 포함됩니다.

  • url_for 및 명명된 URL 헬퍼에 :subdomain:domain 옵션이 추가되었습니다.

  • Base.http_basic_authenticate_with를 추가하여 단일 클래스 메서드 호출로 간단한 HTTP 기본 인증을 수행할 수 있습니다.

    class PostsController < ApplicationController
      USER_NAME, PASSWORD = "dhh", "secret"
    
      before_filter :authenticate, :except => [ :index ]
    
      def index
        render :text => "Everyone can see me!"
      end
    
      def edit
        render :text => "I'm only accessible if you know the password"
      end
    
      private
        def authenticate
          authenticate_or_request_with_http_basic do |user_name, password|
            user_name == USER_NAME && password == PASSWORD
          end
        end
    end
    

    이를 다음과 같이 작성할 수 있습니다:

    class PostsController < ApplicationController
      http_basic_authenticate_with :name => "dhh", :password => "secret", :except => :index
    
      def index
        render :text => "Everyone can see me!"
      end
    
      def edit
        render :text => "I'm only accessible if you know the password"
      end
    end
    
  • 스트리밍 지원이 추가되었습니다. 다음과 같이 활성화할 수 있습니다:

    class PostsController < ActionController::Base
      stream
    end
    

    :only 또는 :except를 사용하여 일부 액션에만 제한할 수 있습니다. 자세한 내용은 ActionController::Streaming 문서를 참조하세요.

  • 리디렉션 경로 메서드에 URL의 일부만 변경하는 옵션 해시나 호출 가능한 객체를 전달할 수 있어, 리디렉션을 재사용할 수 있습니다.

Action Dispatch

  • config.action_dispatch.x_sendfile_header의 기본값이 nil로 변경되었으며, config/environments/production.rb에서 특정 값을 설정하지 않습니다. 이를 통해 서버에서 X-Sendfile-Type을 설정할 수 있습니다.

  • ActionDispatch::MiddlewareStack이 상속 대신 구성을 사용하도록 변경되었으며, 더 이상 배열이 아닙니다.

  • ActionDispatch::Request.ignore_accept_header를 추가하여 accept 헤더를 무시할 수 있습니다.

  • 기본 스택에 Rack::Cache가 추가되었습니다.

  • etag 책임이 ActionDispatch::Response에서 미들웨어 스택으로 이동했습니다.

  • Rack::Session 저장소 API를 사용하도록 변경되어 Ruby 세계의 더 많은 호환성을 제공합니다. 이는 역호환되지 않는데, Rack::Session#get_session이 4개의 인수를 받고 #destroy_session 대신 #destroy를 요구하기 때문입니다.

  • 템플릿 조회 순서가 상속 체인을 따르도록 변경되었습니다.

Action View

  • form_tag:authenticity_token 옵션을 추가하여 토큰을 사용자 정의하거나 :authenticity_token => false로 토큰을 생략할 수 있습니다.

  • ActionView::Renderer를 생성하고 ActionView::Context의 API를 지정했습니다.

  • SafeBuffer의 제자리 변경이 Rails 3.1에서 금지되었습니다.

  • HTML5 button_tag 헬퍼를 추가했습니다.

  • file_field가 자동으로 포함 폼에 :multipart => true를 추가합니다.

  • 태그 헬퍼에서 :data 옵션 해시의 데이터-* 속성을 생성하는 편의 기능을 추가했습니다:

    tag("div", :data => {:name => 'Stephen', :city_state => %w(Chicago IL)})
    # => <div data-name="Stephen" data-city-state="[&quot;Chicago&quot;,&quot;IL&quot;]" />
    

    키는 대시로 구분되며, 값은 문자열과 기호의 경우 그대로, 그 외에는 JSON으로 인코딩됩니다.

  • csrf_meta_tagcsrf_meta_tags로 이름이 변경되었으며, 이전 이름에 대한 별칭이 제공됩니다.

  • 이전 템플릿 핸들러 API가 deprecate되었으며, 새 API는 템플릿 핸들러가 call에 응답하기만 하면 됩니다.

  • rhtml과 rxml 템플릿 핸들러가 제거되었습니다.

  • config.action_view.cache_template_loading이 다시 도입되어 템플릿 캐싱 여부를 결정할 수 있습니다.

  • 제출 폼 헬퍼가 더 이상 "objectnameid” ID를 생성하지 않습니다.

  • FormHelper#form_for에서 :method 옵션을 :html 해시 내부가 아닌 직접 지정할 수 있습니다. form_for(@post, remote: true, method: :delete)와 같이 사용할 수 있습니다.

  • JavaScriptHelper#j()JavaScriptHelper#escape_javascript()의 별칭으로 제공했습니다. 이를 통해 JSON 젬이 템플릿에 추가하는 Object#j() 메서드를 대체할 수 있습니다.

  • 날짜 및 시간 선택기에 AM/PM 형식을 지원합니다.

  • auto_link가 Rails에서 제거되었으며 rails_autolink 젬으로 추출되었습니다.

Active Record

  • pluralize_table_names 클래스 메서드를 추가하여 개별 모델의 테이블 이름을 단수화/복수화할 수 있습니다. 이전에는 ActiveRecord::Base.pluralize_table_names를 통해 전역적으로만 설정할 수 있었습니다.

    class User < ActiveRecord::Base
      self.pluralize_table_names = false
    end
    
  • 단일 연관 관계에 대한 블록 설정을 추가했습니다. 블록은 인스턴스 초기화 후에 호출됩니다.

    class User < ActiveRecord::Base
      has_one :account
    end
    
    user.build_account{ |a| a.credit_limit = 100.0 }
    
  • ActiveRecord::Base.attribute_names를 추가하여 속성 이름 목록을 반환합니다. 모델이 추상 클래스이거나 테이블이 존재하지 않는 경우 빈 배열을 반환합니다.

  • CSV 픽스처가 deprecate되었으며 Rails 3.2.0에서 지원이 중단될 예정입니다.

  • ActiveRecord#new, ActiveRecord#create, ActiveRecord#update_attributes에 역할 기반 속성 할당을 위한 옵션 해시를 추가했습니다. 이는 Active Model의 새로운 대량 할당 기능을 기반으로 합니다:

    class Post < ActiveRecord::Base
      attr_accessible :title
      attr_accessible :title, :published_at, :as => :admin
    end
    
    Post.new(params[:post], :as => :admin)
    
  • default_scope에 블록, 람다 또는 호출 가능한 객체를 전달하여 지연 평가를 할 수 있습니다.

  • 기본 스코프는 이제 가능한 늦게 평가되어, 기본 스코프가 포함된 스코프를 만들고 이를 Model.unscoped로 제거하는 문제를 방지합니다.

  • PostgreSQL 어댑터는 PostgreSQL 버전 8.2 이상만 지원합니다.

  • ConnectionManagement 미들웨어가 변경되어 래크 본문이 플러시된 후 연결 풀을 정리합니다.

  • update_column 메서드가 Active Record에 추가되었습니다. 이 새로운 메서드는 유효성 검사와 콜백을 건너뛰고 지정된 속성을 업데이트합니다. 콜백을 실행하지 않고 updated_at 열을 수정해야 하는 경우에만 사용해야 합니다. 새 레코드에서는 호출하면 안 됩니다.

  • :through 옵션이 있는 연관 관계에서 through 또는 source 연관 관계로 모든 연관 관계를 사용할 수 있게 되었습니다. 여기에는 :through 옵션이 있는 다른 연관 관계와 has_and_belongs_to_many 연관 관계도 포함됩니다.

  • 현재 데이터베이스 연결에 대한 구성은 ActiveRecord::Base.connection_config를 통해 액세스할 수 있습니다.

  • 제한과 오프셋이 둘 다 제공되지 않는 한 COUNT 쿼리에서 제거됩니다.

    People.limit(1).count           # => 'SELECT COUNT(*) FROM people'
    People.offset(1).count          # => 'SELECT COUNT(*) FROM people'
    People.limit(1).offset(1).count # => 'SELECT COUNT(*) FROM people LIMIT 1 OFFSET 1'
    
  • ActiveRecord::Associations::AssociationProxy가 분할되었습니다. 이제 연관 관계를 처리하는 Association 클래스(및 하위 클래스)와 컬렉션 연관 관계를 래핑하는 별도의 얇은 래퍼인 CollectionProxy가 있습니다. 이를 통해 네임스페이스 오염을 방지하고 관심사를 분리하며, 향후 리팩토링을 용이하게 합니다.

  • 단일 연관 관계(has_one, belongs_to)는 더 이상 프록시가 아니며, 연관 레코드나 nil을 직접 반환합니다. 따라서 문서화되지 않은 메서드 bob.mother.create를 사용해서는 안 되며, bob.create_mother를 사용해야 합니다.

  • has_many :through 연관 관계에 :dependent 옵션을 지원합니다. 역사적 및 실용적 이유로 인해 association.delete(*records)의 기본 삭제 전략은 :nullify가 아닌 :delete_all입니다. 또한 소스 리플렉션이 belongs_to인 경우에만 작동합니다. 다른 상황에서는 through 연관 관계를 직접 수정해야 합니다.

  • has_and_belongs_to_manyhas_many :through에 대한 association.destroy의 동작이 변경되었습니다. 이제 연관 관계에서 ‘파괴’ 또는 ‘삭제'는 '링크를 제거하는 것'을 의미하며, '연관 레코드를 제거하는 것'은 아닙니다.

  • 이전에는 has_and_belongs_to_many.destroy(*records)가 레코드 자체를 파괴했습니다. 이제는 네, 번역을 계속하겠습니다.

Active Record

  • 이전에는 has_and_belongs_to_many.destroy(*records)가 레코드 자체를 파괴했습니다. 이제는 조인 테이블의 레코드만 삭제합니다.

  • 이전에는 has_many_through.destroy(*records)가 레코드 자체와 조인 테이블의 레코드를 모두 파괴했습니다. [참고: 이전 Rails 버전에서는 레코드 자체만 삭제했습니다.] 이제는 조인 테이블의 레코드만 파괴합니다.

  • 이 변경 사항은 일부 호환성이 깨질 수 있지만, 이를 deprecate하고 변경하는 방법이 없었습니다. 이 변경은 다양한 유형의 연관 관계에서 '파괴’ 또는 ‘삭제'의 의미를 일관성 있게 하기 위해 이루어졌습니다. 레코드 자체를 파괴하려면 records.association.each(&:destroy)를 사용할 수 있습니다.

  • change_table:bulk => true 옵션을 추가하여 블록에 정의된 모든 스키마 변경을 단일 ALTER 문으로 수행할 수 있습니다.

    change_table(:users, :bulk => true) do |t|
      t.string :company_name
      t.change :birthdate, :datetime
    end
    
  • has_and_belongs_to_many 조인 테이블의 속성에 대한 액세스를 제거했습니다. has_many :through를 사용해야 합니다.

  • has_onebelongs_to 연관 관계에 create_association! 메서드를 추가했습니다.

  • 마이그레이션이 가역적이 되었습니다. 즉, Rails가 마이그레이션을 어떻게 되돌릴지 알아서 처리합니다. 가역적 마이그레이션을 사용하려면 change 메서드를 정의하면 됩니다.

    class MyMigration < ActiveRecord::Migration
      def change
        create_table(:horses) do |t|
          t.column :content, :text
          t.column :remind_at, :datetime
        end
      end
    end
    
  • 자동으로 되돌릴 수 없는 일부 작업이 있습니다. 이를 어떻게 되돌릴지 알고 있다면 updown을 마이그레이션에 정의해야 합니다. change에서 되돌릴 수 없는 작업을 정의하면 내려갈 때 IrreversibleMigration 예외가 발생합니다.

  • 마이그레이션이 이제 클래스 메서드 대신 인스턴스 메서드를 사용합니다:

    class FooMigration < ActiveRecord::Migration
      def up # 더 이상 self.up이 아님
        # ...
      end
    end
    
  • 모델 및 구성적 마이그레이션 생성기(예: addnameto_users)에서 생성된 마이그레이션 파일은 가역적 마이그레이션의 change 메서드를 사용합니다. 이전 스타일의 updown 메서드는 더 이상 사용되지 않습니다.

  • 연관 관계의 문자열 SQL 조건 보간을 제거했습니다. 대신 프로시저를 사용해야 합니다.

    has_many :things, :conditions => 'foo = #{bar}'          # 이전
    has_many :things, :conditions => proc { "foo = #{bar}" } # 이후
    

    프로시저 내부에서 self는 연관 관계의 소유자 객체이며, 연관 관계를 eager loading하는 경우 self는 연관 관계가 포함된 클래스입니다.

    일반적인 조건을 프로시저 내부에 사용할 수 있습니다:

    has_many :things, :conditions => proc { ["foo = ?", bar] }
    
  • 이전에는 has_and_belongs_to_many 연관 관계의 :insert_sql:delete_sql에서 '레코드'를 호출할 수 있었습니다. 이제 인수로 전달됩니다.

  • ActiveRecord::Base#has_secure_password(via ActiveModel::SecurePassword)를 추가하여 BCrypt 암호화와 솔트를 사용하는 간단한 비밀번호 사용을 캡슐화했습니다.

    # 스키마: User(name:string, password_digest:string, password_salt:string)
    class User < ActiveRecord::Base
      has_secure_password
    end
    
  • 모델 생성 시 belongs_to 또는 references 열에 대해 기본적으로 add_index가 추가됩니다.

  • belongs_to 객체의 ID를 설정하면 해당 객체에 대한 참조가 업데이트됩니다.

  • ActiveRecord::Base#dupActiveRecord::Base#clone의 의미가 일반 Ruby의 dup와 clone 의미에 더 가깝게 변경되었습니다.

  • ActiveRecord::Base#clone을 호출하면 레코드의 얕은 복사본이 생성되며, 동결 상태도 복사됩니다. 콜백은 호출되지 않습니다.

  • ActiveRecord::Base#dup를 호출하면 레코드가 복제되며, 초기화 후 훅이 호출됩니다. 동결 상태는 복사되지 않으며, 모든 연관 관계가 지워집니다. 복제된 레코드는 new_record?true를 반환하고, id 필드가 nil이며, 저장할 수 있습니다.

  • 쿼리 캐시가 이제 준비된 문을 사용하도록 변경되었습니다. 애플리케이션에 변경이 필요하지 않습니다.

Active Model

  • attr_accessible에 역할을 지정하는 :as 옵션이 추가되었습니다.

  • InclusionValidator, ExclusionValidator, FormatValidator에 프로시저, 람다 또는 호출 가능한 객체를 받는 옵션이 추가되었습니다. 이 옵션은 현재 레코드를 인수로 받아 include?에 응답하는 객체를 반환합니다(InclusionValidatorExclusionValidator의 경우), 또는 정규 표현식 객체를 반환합니다(FormatValidator의 경우).

  • ActiveModel::SecurePassword를 추가하여 BCrypt 암호화와 솔트를 사용하는 간단한 비밀번호 사용을 캡슐화했습니다.

  • ActiveModel::AttributeMethods를 통해 속성을 요구 시 정의할 수 있습니다.

  • 옵저버를 선택적으로 활성화/비활성화할 수 있는 지원이 추가되었습니다.

Active Resource

  • 기본 형식이 모든 요청에 대해 JSON으로 변경되었습니다. XML을 계속 사용하려면 클래스에서 self.format = :xml로 설정해야 합니다. 예:

    class User < ActiveResource::Base
      self.format = :xml
    end
    

Active Support

  • ActiveSupport::Dependenciesload_missing_constant에서 NameError를 발생시키도록 변경되었습니다.

  • Kernel#quietly를 추가하여 STDOUTSTDERR를 모두 침묵시킬 수 있습니다.

  • String#inquiry를 추가하여 문자열을 StringInquirer 객체로 변환하는 편의 메서드를 제공했습니다.

  • 객체가 다른 객체에 포함되어 있는지 테스트하는 Object#in?을 추가했습니다.

  • LocalCache 전략이 이제 실제 미들웨어 클래스이며, 더 이상 익명 클래스가 아닙니다.

  • ActiveSupport::Dependencies::ClassCache 클래스가 리로드 가능한 클래스에 대한 참조를 보유하기 위해 도입되었습니다.

  • ActiveSupport::Dependencies::Reference가 새로운 ClassCache를 직접 활용하도록 리팩토링되었습니다.

  • Ruby 1.8에 Range#cover?를 백포트했습니다.

  • weeks_agoprev_week를 Date/DateTime/Time에 추가했습니다.

  • before_remove_const 콜백을 ActiveSupport::Dependencies.remove_unloadable_constants!에 추가했습니다.

Deprecations:

  • ActiveSupport::SecureRandom이 Ruby 표준 라이브러리의 SecureRandom으로 deprecate되었습니다.

크레딧

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

Rails 3.1 릴리스 노트는 Vijay Dev가 작성했습니다.