rubyonrails.org에서 더 보기:

GitHub에서 이 파일을 읽지 마세요. 가이드는 https://guides.rubyonrails.org 에서 제공됩니다.

Ruby on Rails 3.2 릴리스 노트

Rails 3.2의 주요 특징:

  • 더 빠른 Development 모드
  • 새로운 Routing 엔진
  • 자동 쿼리 설명
  • Tagged Logging

이 릴리스 노트는 주요 변경사항만을 다룹니다. 다양한 버그 수정과 변경사항에 대해 알아보시려면 changelog를 참고하시거나 GitHub의 Rails 메인 저장소에 있는 커밋 목록을 확인해주세요.

1 Rails 3.2로 업그레이드하기

기존 애플리케이션을 업그레이드하는 경우, 업그레이드 전에 충분한 테스트 커버리지를 확보하는 것이 좋습니다. 아직 하지 않으셨다면 먼저 Rails 3.1로 업그레이드하고 Rails 3.2로 업그레이드를 시도하기 전에 애플리케이션이 예상대로 작동하는지 확인해야 합니다. 그리고 다음 변경사항들에 주의를 기울이세요:

1.1 Rails 3.2는 최소 Ruby 1.8.7이 필요합니다

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

Ruby 1.8.7 p248과 p249에는 Rails를 중단시키는 marshalling 버그가 있다는 점에 유의하세요. Ruby Enterprise Edition은 1.8.7-2010.02 릴리스부터 이 문제가 해결되었습니다. 1.9 계열에서는 Ruby 1.9.1이 완전히 segfault를 일으키기 때문에 사용할 수 없으므로, 1.9.x를 사용하려면 원활한 사용을 위해 1.9.2나 1.9.3으로 넘어가세요.

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

  • Gemfile을 다음 버전으로 업데이트하세요

    • rails = 3.2.0
    • sass-rails ~> 3.2.3
    • coffee-rails ~> 3.2.1
    • uglifier >= 1.0.3
  • Rails 3.2에서는 vendor/plugins가 deprecated 되었으며 Rails 4.0에서는 완전히 제거됩니다. 이러한 plugin들을 gem으로 추출하여 Gemfile에 추가하는 방식으로 대체할 수 있습니다. gem으로 만들지 않기로 선택한 경우에는 lib/my_plugin/*와 같은 곳으로 옮기고 config/initializers/my_plugin.rb에 적절한 initializer를 추가할 수 있습니다.

  • config/environments/development.rb에 추가해야 할 새로운 설정 변경사항이 몇 가지 있습니다:

    # Active Record 모델에 대한 mass assignment 보호 예외 발생
    config.active_record.mass_assignment_sanitizer = :strict
    
    # 지정된 시간보다 오래 걸리는 쿼리의 실행 계획을 기록
    # (SQLite, MySQL, PostgreSQL에서 작동)
    config.active_record.auto_explain_threshold_in_seconds = 0.5
    

    mass_assignment_sanitizer 설정은 config/environments/test.rb에도 추가되어야 합니다:

    # Active Record 모델에 대한 mass assignment 보호 예외 발생
    config.active_record.mass_assignment_sanitizer = :strict
    

1.3 Engine 에서 업데이트할 내용

script/rails 파일의 코멘트 아래 코드를 다음 내용으로 교체하세요:

ENGINE_ROOT = File.expand_path('../..', __FILE__)
ENGINE_PATH = File.expand_path('../../lib/your_engine_name/engine', __FILE__)

# 모든 Rails 기능을 불러옵니다
require "rails/all"
# Rails engine 명령어를 불러옵니다
require "rails/engine/commands"

2 Rails 3.2 애플리케이션 생성하기

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

2.1 Gem 벤더링

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

자세한 정보: Bundler 홈페이지

2.2 Edge판 Rails 사용하기

BundlerGemfile은 새로운 bundle 명령어를 통해 Rails 애플리케이션을 매우 쉽게 버전을 고정할 수 있게 해줍니다. Git 저장소에서 직접 번들링하고 싶다면, --edge 플래그를 사용하면 됩니다:

$ rails new myapp --edge

Rails repository를 로컬에 체크아웃했고 이를 사용해서 애플리케이션을 생성하려는 경우, --dev 플래그를 전달할 수 있습니다:

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

3 주요 기능

3.1 더 빠른 Development Mode & Routing

Rails 3.2는 눈에 띄게 빨라진 development mode를 제공합니다. Active Reload에서 영감을 받아, Rails는 파일이 실제로 변경될 때만 클래스를 다시 로드합니다. 대규모 애플리케이션에서는 성능 향상이 극적으로 나타납니다. 새로운 Journey 엔진 덕분에 route 인식도 훨씬 빨라졌습니다.

3.2 Automatic Query Explains

Rails 3.2에는 Arel에 의해 생성된 query를 설명하는 좋은 기능이 있습니다. ActiveRecord::Relation에 정의된 explain 메서드를 통해 이용할 수 있습니다. 예를 들어, puts Person.active.limit(5).explain와 같이 실행하면 Arel이 생성한 query에 대한 설명을 볼 수 있습니다. 이를 통해 적절한 index와 추가 최적화가 필요한지 확인할 수 있습니다.

실행하는 데 0.5초 이상 걸리는 query는 development 모드에서 자동으로 설명됩니다. 물론 이 기준값은 변경할 수 있습니다.

3.3 Tagged Logging

여러 사용자와 계정을 가진 애플리케이션을 실행할 때, 누가 무엇을 했는지 로그를 필터링할 수 있다면 큰 도움이 됩니다. Active Support의 TaggedLogging은 서브도메인, request id 그리고 그 외 디버깅에 도움이 되는 정보들로 로그 라인에 태그를 달아주어 이를 가능하게 합니다.

4 Documentation

Rails 3.2부터 Rails 가이드는 Kindle과 iPad, iPhone, Mac, Android 등을 위한 무료 Kindle Reading Apps에서 이용할 수 있습니다.

5 Railties

  • 의존성 파일이 변경된 경우에만 클래스를 다시 로드하여 개발 속도를 향상시킵니다. 이는 config.reload_classes_only_on_change를 false로 설정하여 비활성화할 수 있습니다.

  • 새로운 애플리케이션은 환경 설정 파일에서 config.active_record.auto_explain_threshold_in_seconds 플래그를 받습니다. development.rb에서는 0.5 값을, production.rb에서는 주석 처리되어 있으며, test.rb에는 언급되지 않습니다.

  • 예외가 발생했을 때 ShowException 미들웨어에 의해 호출되는 예외 애플리케이션을 설정하는 config.exceptions_app을 추가했습니다. 기본값은 ActionDispatch::PublicExceptions.new(Rails.public_path)입니다.

  • ShowExceptions 미들웨어에서 추출된 기능들을 포함하는 DebugExceptions 미들웨어를 추가했습니다.

  • rake routes에서 마운트된 엔진의 라우트를 표시합니다.

  • 다음과 같이 config.railties_order로 railties의 로딩 순서를 변경할 수 있습니다:

    config.railties_order = [Blog::Engine, :main_app, :all]
    
  • Scaffold는 콘텐츠가 없는 API 요청에 대해 204 No Content를 반환합니다. 이를 통해 scaffold가 jQuery와 즉시 작동합니다.

  • Rails::Rack::Logger 미들웨어를 업데이트하여 config.log_tags에 설정된 모든 태그를 ActiveSupport::TaggedLogging에 적용합니다. 이를 통해 서브도메인과 request id와 같은 디버그 정보로 로그 라인에 태그를 달 수 있으며, 이는 다중 사용자 프로덕션 애플리케이션을 디버깅하는 데 매우 도움이 됩니다.

  • rails new의 기본 옵션을 ~/.railsrc에 설정할 수 있습니다. 홈 디렉토리의 .railsrc 설정 파일에서 rails new를 실행할 때마다 사용될 추가 명령줄 인수를 지정할 수 있습니다.

  • destroy에 대한 별칭 d를 추가했습니다. 이는 엔진에서도 작동합니다.

  • scaffold와 model 생성기의 속성은 기본적으로 string입니다. 이를 통해 다음과 같은 사용이 가능합니다: bin/rails g scaffold Post title body:text author

  • scaffold/model/migration 생성기가 "index"와 "uniq" 수정자를 받아들일 수 있습니다. 예를 들어,

    $ bin/rails g scaffold Post title:string:index author:uniq price:decimal{7,2}
    

    이는 titleauthor에 대한 인덱스를 생성하며, 후자는 고유 인덱스가 됩니다. decimal과 같은 일부 타입은 사용자 정의 옵션을 받습니다. 예제에서 price는 precision이 7이고 scale이 2인 decimal 컬럼이 됩니다.

  • Turn gem이 기본 Gemfile에서 제거되었습니다.

  • 이전 플러그인 생성기 rails generate pluginrails plugin new 명령어를 위해 제거되었습니다.

  • 이전 config.paths.app.controller API를 제거하고 config.paths["app/controller"]를 사용하도록 변경되었습니다.

5.1 Deprecations

  • Rails::Plugin은 deprecated 되었으며 Rails 4.0에서 제거될 예정입니다. vendor/plugins에 플러그인을 추가하는 대신 gems나 path 또는 git dependencies를 사용하는 bundler를 사용하세요.

6 Action Mailer

  • mail 버전을 2.4.0으로 업그레이드했습니다.

  • Rails 3.0 이후로 deprecated된 이전 Action Mailer API를 제거했습니다.

7 Action Pack

7.1 Action Controller

  • benchmark 메서드를 컨트롤러 컨텍스트에서 다시 사용할 수 있도록 ActiveSupport::BenchmarkableActionController::Base의 기본 모듈로 만들었습니다.

  • caches_page:gzip 옵션이 추가되었습니다. 기본 옵션은 page_cache_compression을 통해 전역으로 설정할 수 있습니다.

  • :only:except 조건으로 레이아웃을 지정하고 이러한 조건이 실패할 때, Rails는 이제 기본 레이아웃(예: "layouts/application")을 사용합니다.

    class CarsController
      layout 'single_car', :only => :show
    end
    

    Rails는 :show 액션에 대한 요청이 들어오면 layouts/single_car를 사용하고, 다른 액션에 대한 요청이 들어오면 layouts/application(또는 존재하는 경우 layouts/cars)을 사용합니다.

  • form_for가 변경되어 :as 옵션이 제공될 때 #{action}_#{as}를 CSS 클래스와 id로 사용합니다. 이전 버전에서는 #{as}_#{action}을 사용했습니다.

  • Active Record 모델의 ActionController::ParamsWrapper는 이제 attr_accessible 속성이 설정된 경우에만 해당 속성을 래핑합니다. 설정되지 않은 경우, 클래스 메서드 attribute_names가 반환하는 속성만 래핑됩니다. 이는 중첩된 속성을 attr_accessible에 추가하여 래핑하는 문제를 해결합니다.

  • before 콜백이 중단될 때마다 "Filter chain halted as CALLBACKNAME rendered or redirected"를 로깅합니다.

  • ActionDispatch::ShowExceptions가 리팩토링되었습니다. 컨트롤러가 예외 표시 여부를 결정합니다. 컨트롤러에서 show_detailed_exceptions?를 오버라이드하여 어떤 요청에서 디버깅 정보를 제공할지 지정할 수 있습니다.

  • Responders는 이제 응답 본문이 없는 API 요청에 대해 204 No Content를 반환합니다(새로운 scaffold처럼).

  • ActionController::TestCase cookies가 리팩토링되었습니다. 테스트 케이스의 쿠키 할당은 이제 cookies[]를 사용해야 합니다.

    cookies[:email] = 'user@example.com'
    get :index
    assert_equal 'user@example.com', cookies[:email]
    

    쿠키를 지우려면 clear를 사용하세요.

    cookies.clear
    get :index
    assert_nil cookies[:email]
    

    이제 더 이상 HTTP_COOKIE를 작성하지 않으며 쿠키 저장소는 요청 간에 지속됩니다. 따라서 테스트를 위해 환경을 조작해야 하는 경우 쿠키 저장소가 생성되기 전에 수행해야 합니다.

  • send_file은 이제 :type이 제공되지 않은 경우 파일 확장자에서 MIME 타입을 추측합니다.

  • PDF, ZIP 및 기타 형식에 대한 MIME 타입 항목이 추가되었습니다.

  • fresh_when/stale?가 옵션 해시 대신 레코드를 받을 수 있도록 변경되었습니다.

  • CSRF 토큰 누락에 대한 경고의 로그 레벨을 :debug에서 :warn으로 변경했습니다.

  • Assets는 기본적으로 request 프로토콜을 사용하거나, request가 없는 경우 상대 경로를 기본값으로 사용해야 합니다.

7.1.1 Deprecations

  • 부모 컨트롤러에 명시적 layout이 설정된 경우 자식 컨트롤러의 암시적 layout 조회가 deprecated 되었습니다:

    class ApplicationController
      layout "application"
    end
    
    class PostsController < ApplicationController
    end
    

    위 예시에서 PostsController는 더 이상 posts layout을 자동으로 찾지 않습니다. 이 기능이 필요한 경우 ApplicationController에서 layout "application"을 제거하거나 PostsController에서 명시적으로 nil로 설정할 수 있습니다.

  • AbstractController::ActionNotFound를 위해 ActionController::UnknownAction이 deprecated 되었습니다.

  • AbstractController::DoubleRenderError를 위해 ActionController::DoubleRenderError가 deprecated 되었습니다.

  • 누락된 액션에 대해 method_missing 대신 action_missing이 deprecated 되었습니다.

  • ActionController#rescue_action, ActionController#initialize_template_class, ActionController#assign_shortcuts가 deprecated 되었습니다.

7.2 Action Dispatch

  • ActionDispatch::Response의 기본 문자셋을 설정하기 위한 config.action_dispatch.default_charset을 추가했습니다.

  • ActionDispatch::RequestId middleware를 추가했습니다. 이는 응답에서 고유한 X-Request-Id 헤더를 사용할 수 있게 하고 ActionDispatch::Request#uuid 메서드를 활성화합니다. 이를 통해 스택의 end-to-end 요청을 추적하고 Syslog와 같은 혼합 로그에서 개별 요청을 식별하기 쉬워집니다.

  • ShowExceptions middleware는 이제 애플리케이션이 실패할 때 예외를 렌더링하는 역할을 하는 예외 애플리케이션을 받아들입니다. 이 애플리케이션은 env["action_dispatch.exception"]의 예외 복사본과 함께 상태 코드로 다시 작성된 PATH_INFO와 함께 호출됩니다.

  • rescue 응답을 config.action_dispatch.rescue_responses처럼 railtie를 통해 설정할 수 있도록 했습니다.

7.2.1 Deprecations

  • 컨트롤러 레벨에서 기본 문자셋을 설정하는 기능은 Deprecated 되었습니다. 대신 새로운 config.action_dispatch.default_charset를 사용하세요.

7.3 Action View

  • button_tagActionView::Helpers::FormBuilder 지원이 추가되었습니다. 이 지원은 submit_tag의 기본 동작을 모방합니다.

    <%= form_for @post do |f| %>
      <%= f.button %>
    <% end %>
    
  • Date helper들은 새로운 옵션 :use_two_digit_numbers => true를 받을 수 있게 되었습니다. 이는 해당 값을 변경하지 않고 월과 일 선택 상자를 앞에 0을 붙여 렌더링합니다. 예를 들어, '2011-08-01'과 같은 ISO 8601 형식의 날짜를 표시할 때 유용합니다.

  • form의 id 속성 유일성을 보장하기 위해 namespace를 제공할 수 있습니다. namespace 속성은 생성된 HTML id에 밑줄로 접두사가 붙습니다.

    <%= form_for(@offer, :namespace => 'namespace') do |f| %>
      <%= f.label :version, 'Version' %>:
      <%= f.text_field :version %>
    <% end %>
    
  • select_year의 옵션 수를 1000개로 제한합니다. :max_years_allowed 옵션을 전달하여 자신만의 제한을 설정할 수 있습니다.

  • content_tag_fordiv_for가 이제 record 컬렉션을 받을 수 있습니다. 블록에서 수신 인자를 설정하면 첫 번째 인자로 record를 yield할 수도 있습니다. 따라서 다음과 같이 할 필요 없이:

    @items.each do |item|
      content_tag_for(:li, item) do
        Title: <%= item.title %>
      end
    end
    

    다음과 같이 할 수 있습니다:

    content_tag_for(:li, @items) do |item|
      Title: <%= item.title %>
    end
    
  • public/fonts에 있는 font 애셋의 경로를 계산하는 font_path helper 메서드가 추가되었습니다.

7.3.1 Deprecations

  • render :template과 그 관련 메서드에 format이나 handler를 전달하는 것(render :template => "foo.html.erb" 같은 방식)은 deprecated되었습니다. 대신 :handlers와 :formats를 직접 옵션으로 제공할 수 있습니다: render :template => "foo", :formats => [:html, :js], :handlers => :erb.

7.4 Sprockets

  • Sprockets 로깅을 제어하기 위한 설정 옵션 config.assets.logger가 추가되었습니다. 로깅을 끄려면 false로, Rails.logger를 기본값으로 사용하려면 nil로 설정하세요.

8 Active Record

  • 'on'과 'ON' 값을 가진 Boolean 컬럼들이 true로 타입캐스팅됩니다.

  • timestamps 메서드가 created_atupdated_at 컬럼을 생성할 때, 기본적으로 non-nullable로 만듭니다.

  • ActiveRecord::Relation#explain 구현되었습니다.

  • ActiveRecord::Base.silence_auto_explain이 구현되어 블록 내에서 자동 EXPLAIN을 선택적으로 비활성화할 수 있습니다.

  • 느린 쿼리에 대한 자동 EXPLAIN 로깅이 구현되었습니다. 새로운 설정 파라미터 config.active_record.auto_explain_threshold_in_seconds는 어떤 쿼리를 느린 쿼리로 간주할지 결정합니다. 이를 nil로 설정하면 이 기능이 비활성화됩니다. 개발 모드에서는 0.5가 기본값이며, 테스트와 프로덕션 모드에서는 nil이 기본값입니다. Rails 3.2는 SQLite, MySQL (mysql2 adapter), PostgreSQL에서 이 기능을 지원합니다.

  • 간단한 단일 컬럼 key/value 저장소를 선언하기 위한 ActiveRecord::Base.store가 추가되었습니다.

    class User < ActiveRecord::Base
      store :settings, accessors: [ :color, :homepage ]
    end
    
    u = User.new(color: 'black', homepage: '37signals.com')
    u.color                          # Accessor stored attribute
    u.settings[:country] = 'Denmark' # Any attribute, even if not specified with an accessor
    
  • 주어진 scope에 대해서만 마이그레이션을 실행할 수 있는 기능이 추가되었습니다. 이를 통해 하나의 engine에서만 마이그레이션을 실행할 수 있습니다(예: 제거되어야 하는 engine의 변경사항을 되돌리기 위해).

    rake db:migrate SCOPE=blog
    
  • engine에서 복사된 마이그레이션은 이제 engine의 이름으로 scope가 지정됩니다. 예: 01_create_posts.blog.rb

  • 기본 테이블에서 직접 컬럼 값의 배열을 반환하는 ActiveRecord::Relation#pluck 메서드가 구현되었습니다. 이는 serialized 속성에서도 작동합니다.

    Client.where(:active => true).pluck(:id)
    # SELECT id from clients where active = 1
    
  • 생성된 association 메서드들은 오버라이딩과 구성이 가능하도록 별도의 모듈 내에 생성됩니다. MyModel이라는 클래스의 경우, 모듈은 MyModel::GeneratedFeatureMethods라고 명명됩니다. Active Model에 정의된 generated_attributes_methods 모듈 직후에 모델 클래스에 포함되므로, association 메서드는 동일한 이름의 속성 메서드를 오버라이드합니다.

  • 고유 쿼리를 생성하기 위한 ActiveRecord::Relation#uniq가 추가되었습니다.

    Client.select('DISTINCT name')
    
..다음과 같이 작성할 수 있습니다:

```ruby
Client.select(:name).uniq

relation에서 uniqueness를 되돌릴 수도 있습니다:

Client.select(:name).uniq.uniq(false)
  • SQLite, MySQL, PostgreSQL adapter에서 인덱스 정렬 순서를 지원합니다.

  • 연관관계의 :class_name 옵션에 string 외에도 symbol을 사용할 수 있게 되었습니다. 이는 초보자들의 혼란을 피하고 :foreign_key와 같은 다른 옵션들이 이미 symbol이나 string을 허용한다는 일관성을 유지하기 위함입니다.

has_many :clients, :class_name => :Client # symbol은 대문자로 시작해야 합니다
  • development 모드에서 db:dropdb:create와 대칭을 이루기 위해 test database도 함께 drop합니다.

  • 대소문자를 구분하지 않는 uniqueness validation은 컬럼이 이미 대소문자를 구분하지 않는 collation을 사용하는 경우 MySQL에서 LOWER 호출을 피합니다.

  • Transactional fixtures는 모든 활성 database 연결을 등록합니다. transactional fixtures를 비활성화하지 않고도 서로 다른 연결에서 모델을 테스트할 수 있습니다.

  • Active Record에 first_or_create, first_or_create!, first_or_initialize 메소드가 추가되었습니다. 이는 기존의 find_or_create_by 동적 메소드보다 레코드를 찾는데 사용되는 인수와 생성하는데 사용되는 인수가 명확하기 때문에 더 나은 접근 방식입니다.

User.where(:first_name => "Scarlett").first_or_create!(:last_name => "Johansson")
  • Active Record 객체에 with_lock 메소드가 추가되었습니다. 이 메소드는 트랜잭션을 시작하고, 객체를 (비관적으로) 잠그고 블록에 yield합니다. 메소드는 하나의 (선택적) 매개변수를 받아 lock!에 전달합니다.

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

class Order < ActiveRecord::Base
  def cancel!
    transaction do
      lock!
      # ... 취소 로직
    end
  end
end

다음과 같이:

class Order < ActiveRecord::Base
  def cancel!
    with_lock do
      # ... 취소 로직
    end
  end
end

8.1 Deprecations

  • 스레드에서 연결을 자동으로 닫는 것이 deprecated 되었습니다. 예를 들어 다음과 같은 코드는 deprecated 되었습니다:

    Thread.new { Post.find(1) }.join
    

    스레드 끝에서 데이터베이스 연결을 닫도록 다음과 같이 변경해야 합니다:

    Thread.new {
      Post.find(1)
      Post.connection.close
    }.join
    

    애플리케이션 코드에서 스레드를 생성하는 사람들만 이 변경 사항에 대해 신경 쓰면 됩니다.

  • set_table_name, set_inheritance_column, set_sequence_name, set_primary_key, set_locking_column 메서드들이 deprecated 되었습니다. 대신 할당 메서드를 사용하세요. 예를 들어, set_table_name 대신 self.table_name=를 사용하세요.

    class Project < ActiveRecord::Base
      self.table_name = "project"
    end
    

    또는 자신만의 self.table_name 메서드를 정의하세요:

    class Post < ActiveRecord::Base
      def self.table_name
        "special_" + super
      end
    end
    
    Post.table_name # => "special_posts"
    

9 Active Model

  • 특정 에러가 추가되었는지 확인하기 위해 ActiveModel::Errors#added?를 추가했습니다.

  • 실패했을 때 항상 예외를 발생시키는 strict => true를 사용하여 엄격한 유효성 검사를 정의하는 기능을 추가했습니다.

  • sanitizer 동작을 대체할 수 있는 간단한 API로 mass_assignment_sanitizer를 제공합니다. :logger(기본값)와 :strict sanitizer 동작 모두를 지원합니다.

9.1 지원중단(Deprecations)

  • ActiveModel::AttributeMethods에서 define_attr_method를 지원 중단했습니다. 이는 Active Record에서 set_table_name과 같은 메서드를 지원하기 위해서만 존재했으며, 이러한 메서드들도 지원 중단될 예정입니다.

  • Model.model_name.partial_path를 지원 중단하고 model.to_partial_path를 사용하도록 변경했습니다.

10 Active Resource

  • 리다이렉트 응답: 303 See Other와 307 Temporary Redirect가 이제 301 Moved Permanently와 302 Found처럼 동작합니다.

11 Active Support

  • 태깅 기능을 제공하기 위해 표준 Logger 클래스를 래핑할 수 있는 ActiveSupport:TaggedLogging을 추가했습니다.

    Logger = ActiveSupport::TaggedLogging.new(Logger.new(STDOUT))
    
    Logger.tagged("BCX") { Logger.info "Stuff" }
    # Logs "[BCX] Stuff"
    
    Logger.tagged("BCX", "Jason") { Logger.info "Stuff" }
    # Logs "[BCX] [Jason] Stuff"
    
    Logger.tagged("BCX") { Logger.tagged("Jason") { Logger.info "Stuff" } }
    # Logs "[BCX] [Jason] Stuff"
    
  • Date, Time, DateTimebeginning_of_week 메서드가 주의 시작일을 나타내는 선택적 인수를 받을 수 있습니다.

  • ActiveSupport::Notifications.subscribed는 블록이 실행되는 동안 이벤트에 대한 구독을 제공합니다.

  • 표준 API의 해당 메서드와 유사하지만 정규화된 상수 이름을 받는 새로운 메서드 Module#qualified_const_defined?, Module#qualified_const_get, Module#qualified_const_set를 정의했습니다.

  • inflections에서 #demodulize를 보완하는 #deconstantize를 추가했습니다. 이는 정규화된 상수 이름에서 가장 오른쪽 세그먼트를 제거합니다.

  • 상수(또는 그 일부)가 존재하지 않을 때 예외를 발생시키는 대신 nil을 반환하는 safe_constantize를 추가했습니다.

  • Array#extract_options!를 사용할 때 ActiveSupport::OrderedHash가 이제 추출 가능하도록 표시됩니다.

  • Array#unshift의 별칭으로 Array#prepend를, Array#<<의 별칭으로 Array#append를 추가했습니다.

  • Ruby 1.9의 공백 문자열 정의가 유니코드 공백으로 확장되었습니다. 또한 Ruby 1.8에서는 이데오그래픽 스페이스 U+3000이 공백으로 간주됩니다.

  • inflector가 약어를 인식합니다.

  • 범위를 생성하는 방법으로 Time#all_day, Time#all_week, Time#all_quarter, Time#all_year를 추가했습니다.

Event.where(:created_at => Time.now.all_week)
Event.where(:created_at => Time.now.all_day)
  • Class#cattr_accessor와 관련된 메서드에 instance_accessor: false 옵션이 추가되었습니다.

  • ActiveSupport::OrderedHash는 splat을 사용하여 파라미터를 받는 블록이 주어졌을 때 #each#each_pair에서 다른 동작을 합니다.

  • 개발 및 테스트에서 사용할 수 있는 ActiveSupport::Cache::NullStore가 추가되었습니다.

  • 표준 라이브러리의 SecureRandom을 선호하여 ActiveSupport::SecureRandom이 제거되었습니다.

11.1 Deprecations

  • ActiveSupport::Base64::Base64를 위해 deprecated 되었습니다.

  • ActiveSupport::Memoizable는 Ruby memoization 패턴을 위해 deprecated 되었습니다.

  • Module#synchronize는 대체 없이 deprecated 되었습니다. Ruby 표준 라이브러리의 monitor를 사용해주세요.

  • ActiveSupport::MessageEncryptor#encryptActiveSupport::MessageEncryptor#decrypt가 deprecated 되었습니다.

  • ActiveSupport::BufferedLogger#silence가 deprecated 되었습니다. 특정 블록에 대한 로그를 억제하려면 해당 블록의 로그 레벨을 변경하세요.

  • ActiveSupport::BufferedLogger#open_log가 deprecated 되었습니다. 이 메서드는 애초에 public이었어서는 안 됐습니다.

  • ActiveSupport::BufferedLogger의 로그 파일 디렉토리를 자동으로 생성하는 동작이 deprecated 되었습니다. 인스턴스화하기 전에 로그 파일의 디렉토리를 생성해주세요.

  • ActiveSupport::BufferedLogger#auto_flushing이 deprecated 되었습니다. 다음과 같이 기본 파일 핸들의 sync 레벨을 설정하거나 파일시스템을 조정하세요. FS 캐시가 이제 flushing을 제어합니다.

    f = File.open('foo.log', 'w')
    f.sync = true
    ActiveSupport::BufferedLogger.new f
    
  • ActiveSupport::BufferedLogger#flush가 deprecated 되었습니다. 파일핸들에 sync를 설정하거나 파일시스템을 조정하세요.

12 Credits

많은 시간을 들여 Rails를 안정적이고 견고한 프레임워크로 만든 수많은 사람들을 보려면 Rails 기여자 전체 목록을 참조하세요. 그들 모두에게 찬사를 보냅니다.

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



맨 위로