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을 결정합니다. 이 Gemfile
은 Bundler gem에 의해 처리되며, Bundler는 모든 의존성을 설치합니다. 시스템 gem에 의존하지 않도록 모든 의존성을 애플리케이션에 로컬로 설치할 수도 있습니다.
자세한 정보: Bundler 홈페이지
2.2 Edge판 Rails 사용하기
Bundler
와 Gemfile
은 새로운 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}
이는
title
과author
에 대한 인덱스를 생성하며, 후자는 고유 인덱스가 됩니다. decimal과 같은 일부 타입은 사용자 정의 옵션을 받습니다. 예제에서price
는 precision이 7이고 scale이 2인 decimal 컬럼이 됩니다.Turn gem이 기본
Gemfile
에서 제거되었습니다.이전 플러그인 생성기
rails generate plugin
이rails 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::Benchmarkable
를ActionController::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_tag
의ActionView::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_for
와div_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_at
과updated_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:drop
은db: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
,DateTime
의beginning_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#encrypt
와ActiveSupport::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가 작성했습니다.