1 Rails 3.1로 업그레이드하기
기존 애플리케이션을 업그레이드하는 경우, 시작하기 전에 충분한 테스트 커버리지를 확보하는 것이 좋습니다. 아직 Rails 3로 업그레이드하지 않았다면 먼저 Rails 3로 업그레이드하고, Rails 3.1로 업데이트를 시도하기 전에 애플리케이션이 예상대로 작동하는지 확인해야 합니다. 그런 다음 다음과 같은 변경 사항에 주의를 기울이세요:
1.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를 중단시키는 marshalling 버그가 있습니다. 하지만 Ruby Enterprise Edition은 1.8.7-2010.02 릴리스부터 이 문제가 해결되었습니다. 1.9 계열에서는 Ruby 1.9.1이 segfault를 일으키므로 사용할 수 없습니다. 따라서 1.9.x를 사용하고 싶다면 안정적인 사용을 위해 1.9.2를 선택하세요.
1.2 앱에서 업데이트할 사항
다음은 Rails의 최신 3.1.x 버전인 Rails 3.1.3으로 애플리케이션을 업그레이드하기 위한 변경 사항입니다.
1.2.1 Gemfile
Gemfile
에 다음과 같은 변경 사항을 적용하세요.
gem "rails", "= 3.1.3"
gem "mysql2"
# 새로운 asset pipeline에 필요함
group :assets do
gem "sass-rails", "~> 3.1.5"
gem "coffee-rails", "~> 3.1.1"
gem "uglifier", ">= 1.0.3"
end
# jQuery는 Rails 3.1의 기본 JavaScript 라이브러리입니다
gem "jquery-rails"
1.2.2 config/application.rb
Asset pipeline은 다음과 같은 추가 설정이 필요합니다:
config.assets.enabled = true config.assets.version = '1.0'
애플리케이션이 리소스로 "/assets" 경로를 사용하고 있다면 충돌을 피하기 위해 assets의 접두사를 변경할 수 있습니다:
# 기본값은 '/assets' config.assets.prefix = '/asset-files'
1.2.3 config/environments/development.rb
RJS 설정
config.action_view.debug_rjs = true
를 제거합니다.asset pipeline을 활성화한 경우 다음을 추가합니다.
# asset을 압축하지 않음 config.assets.compress = false # asset을 로드하는 라인을 확장 config.assets.debug = true
1.2.4 config/environments/production.rb
다시 한번 말씀드리지만, 아래의 대부분의 변경사항은 asset pipeline을 위한 것입니다. 이에 대해 Asset Pipeline 가이드에서 더 자세히 읽어볼 수 있습니다.
# JavaScript와 CSS 압축 config.assets.compress = true # 미리 컴파일된 asset이 없을 경우 asset pipeline으로 폴백하지 않음 config.assets.compile = false # asset URL에 대한 다이제스트 생성 config.assets.digest = true # 기본값은 Rails.root.join("public/assets") # config.assets.manifest = YOUR_PATH # 추가 asset 미리 컴파일 (application.js, application.css, 그리고 모든 non-JS/CSS는 이미 추가됨) # config.assets.precompile `= %w( admin.js admin.css )
# SSL을 통해 앱의 모든 접근을 강제하고, Strict-Transport-Security를 사용하며, secure cookies를 사용합니다.
# config.force_ssl = true
# Cache-Control로 성능을 위해 테스트용 정적 asset 서버를 구성
config.serve_static_assets = true
config.static_cache_control = "public, max-age=3600"
parameter들을 중첩된 hash로 감싸고 싶다면 다음 내용으로 이 파일을 추가하세요. 새로운 application에서는 이것이 기본적으로 활성화되어 있습니다.
# Be sure to restart your server when you modify this file. # This file contains settings for ActionController::ParamsWrapper which # is enabled by default. # Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array. ActiveSupport.on_load(:action_controller) do wrap_parameters :format => [:json] end # Disable root element in JSON by default. ActiveSupport.on_load(:active_record) do self.include_root_in_json = false end
1.2.5 view에서 asset helper 참조의 :cache와 :concat 옵션 제거
- Asset Pipeline에서는 :cache와 :concat 옵션이 더 이상 사용되지 않으므로, view에서 이 옵션들을 삭제하세요.
2 Rails 3.1 애플리케이션 생성하기
# 'rails' RubyGem이 설치되어 있어야 합니다
$ rails new myapp
$ cd myapp
2.1 Gem 벤더링
Rails는 이제 애플리케이션 루트의 Gemfile
을 사용하여 애플리케이션 실행에 필요한 gem들을 결정합니다. 이 Gemfile
은 Bundler gem에 의해 처리되며, Bundler는 모든 의존성을 설치합니다. 시스템 gem에 의존하지 않도록 모든 의존성을 로컬 애플리케이션에 설치할 수도 있습니다.
추가 정보: - bundler 홈페이지
2.2 Edge 버전으로 작업하기
Bundler
와 Gemfile
은 새로운 전용 bundle
명령어를 통해 Rails 애플리케이션을 고정하는 것을 매우 쉽게 만들어줍니다. Git 저장소에서 바로 bundle을 하고 싶다면, --edge
플래그를 전달할 수 있습니다:
$ rails new myapp --edge
Rails 저장소를 로컬에 체크아웃하고 이를 사용하여 애플리케이션을 생성하려면 --dev
flag를 전달하면 됩니다:
$ ruby /path/to/rails/railties/bin/rails new myapp --dev
3 Rails 아키텍처 변경사항
3.1 Assets Pipeline
Rails 3.1의 주요 변경사항은 Assets Pipeline입니다. 이는 CSS와 JavaScript를 일급 코드로 취급하며, plugins과 engines에서의 사용을 포함한 적절한 구성을 가능하게 합니다.
assets pipeline은 Sprockets에 의해 구동되며 Asset Pipeline 가이드에서 자세히 다루고 있습니다.
3.2 HTTP Streaming
HTTP Streaming은 Rails 3.1에서 새롭게 도입된 변경 사항입니다. 이를 통해 서버가 응답을 생성하는 동안 브라우저가 stylesheet와 JavaScript 파일을 다운로드할 수 있습니다. 이 기능은 Ruby 1.9.2가 필요하고, opt-in 방식이며 웹 서버의 지원도 필요하지만, NGINX와 Unicorn의 인기 있는 조합으로 이 기능을 활용할 준비가 되어 있습니다.
3.3 기본 JS 라이브러리가 이제 jQuery입니다
jQuery는 Rails 3.1에 기본적으로 포함된 JavaScript 라이브러리입니다. 하지만 Prototype을 사용한다면, 쉽게 전환할 수 있습니다.
$ rails new myapp -j prototype
3.4 Identity Map
Rails 3.1에서 Active Record는 Identity Map을 가지고 있습니다. identity map은 이전에 인스턴스화된 레코드들을 보관하고, 다시 접근할 때 해당 레코드와 연관된 객체를 반환합니다. identity map은 요청별로 생성되며 요청이 완료되면 flush됩니다.
Rails 3.1에서는 기본적으로 identity map이 비활성화되어 있습니다.
4 Railties
jQuery가 새로운 기본 JavaScript 라이브러리입니다.
jQuery와 Prototype은 더 이상 vendor에 포함되지 않으며, 이제
jquery-rails
와prototype-rails
gem을 통해 제공됩니다.application generator는 임의의 문자열이 될 수 있는
-j
옵션을 받습니다. "foo"가 전달되면, "foo-rails" gem이Gemfile
에 추가되고, 애플리케이션 JavaScript manifest는 "foo"와 "foo_ujs"를 필요로 합니다. 현재는 "prototype-rails"와 "jquery-rails"만 존재하며 asset pipeline을 통해 해당 파일들을 제공합니다.애플리케이션이나 플러그인을 생성할 때
--skip-gemfile
또는--skip-bundle
이 지정되지 않는 한bundle install
이 실행됩니다.controller와 resource generator는 이제 자동으로 asset stub을 생성합니다(이는
--skip-assets
로 비활성화할 수 있습니다). 이러한 stub들은 해당 라이브러리들이 사용 가능한 경우 CoffeeScript와 Sass를 사용합니다.Scaffold와 app generator는 Ruby 1.9에서 실행할 때 Ruby 1.9 스타일의 해시를 사용합니다. 이전 스타일의 해시를 생성하려면
--old-style-hash
를 전달할 수 있습니다.Scaffold controller generator는 XML 대신 JSON을 위한 format 블록을 생성합니다.
Active Record 로깅이 STDOUT으로 전달되어 콘솔에 인라인으로 표시됩니다.
모든 요청을 HTTPS 프로토콜로 강제하는
Rack::SSL
미들웨어를 로드하는config.force_ssl
설정이 추가되었습니다.gemspec, 테스트, 그리고 테스트를 위한 더미 애플리케이션을 포함한 Rails 플러그인을 생성하는
rails plugin new
명령이 추가되었습니다.기본 미들웨어 스택에
Rack::Etag
와Rack::ConditionalGet
이 추가되었습니다.기본 미들웨어 스택에
Rack::Cache
가 추가되었습니다.Engine이 주요 업데이트를 받았습니다 - 이제 어떤 경로에도 마운트할 수 있고, asset을 활성화하고, generator를 실행하는 등이 가능합니다.
5 Action Pack
5.1 Action Controller
CSRF 토큰 인증을 확인할 수 없는 경우 경고가 표시됩니다.
특정 컨트롤러에서 브라우저가 HTTPS 프로토콜을 통해 데이터를 전송하도록 강제하려면 컨트롤러에
force_ssl
을 지정하세요. 특정 action으로 제한하려면:only
또는:except
를 사용할 수 있습니다.config.filter_parameters
에 지정된 민감한 쿼리 문자열 파라미터가 이제 로그의 요청 경로에서 필터링됩니다.to_param
에 대해nil
을 반환하는 URL 파라미터는 이제 쿼리 문자열에서 제거됩니다.ActionController::ParamsWrapper
가 추가되어 파라미터를 중첩된 hash로 래핑하며, 새로운 애플리케이션에서는 기본적으로 JSON 요청에 대해 활성화됩니다. 이는config/initializers/wrap_parameters.rb
에서 커스터마이징할 수 있습니다.config.action_controller.include_all_helpers
가 추가되었습니다. 기본적으로ActionController::Base
에서helper :all
이 수행되어 모든 helper를 기본적으로 포함합니다.include_all_helpers
를false
로 설정하면 application_helper와 컨트롤러에 해당하는 helper만 포함됩니다(예: foo_controller의 경우 foo_helper).url_for
와 named URL helper는 이제:subdomain
과:domain
을 옵션으로 허용합니다.단일 클래스 메소드 호출로 간단한 http basic 인증을 수행할 수 있는
Base.http_basic_authenticate_with
가 추가되었습니다.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
- streaming 지원이 추가되었습니다. 다음과 같이 활성화할 수 있습니다:
class PostsController < ActionController::Base
stream
end
:only
또는 :except
를 사용하여 특정 action에만 제한할 수 있습니다. 자세한 내용은 ActionController::Streaming
문서를 참조하세요.
- redirect 라우트 메서드는 이제 URL의 특정 부분만 변경하는 옵션 해시나, call에 응답하는 객체를 받을 수 있어 redirect를 재사용할 수 있습니다.
5.2 Action Dispatch
config.action_dispatch.x_sendfile_header
의 기본값이 이제nil
이 되었고config/environments/production.rb
에서 이에 대한 특정 값을 설정하지 않습니다. 이를 통해 서버가X-Sendfile-Type
을 통해 설정할 수 있습니다.ActionDispatch::MiddlewareStack
는 이제 상속 대신 구성을 사용하며 더 이상 배열이 아닙니다.accept 헤더를 무시하기 위한
ActionDispatch::Request.ignore_accept_header
가 추가되었습니다.기본 스택에
Rack::Cache
가 추가되었습니다.etag 책임이
ActionDispatch::Response
에서 middleware 스택으로 이동되었습니다.Ruby 생태계 전반에 걸친 더 나은 호환성을 위해
Rack::Session
저장소 API를 사용합니다. 이는Rack::Session
이#get_session
이 네 개의 인수를 받아들이고 단순히#destroy
대신#destroy_session
을 요구하기 때문에 이전 버전과 호환되지 않습니다.템플릿 검색이 이제 상속 체인에서 더 위쪽까지 검색합니다.
5.3 Action View
form_tag
에:authenticity_token
옵션이 추가되어 커스텀 처리가 가능하거나:authenticity_token => false
를 전달하여 토큰을 생략할 수 있습니다.ActionView::Renderer
가 생성되었고ActionView::Context
를 위한 API가 명시되었습니다.Rails 3.1에서는
SafeBuffer
의 즉각적인 변경이 금지되었습니다.HTML5
button_tag
helper가 추가되었습니다.file_field
가 자동으로 감싸는 form에:multipart => true
를 추가합니다.tag helper에서 HTML5 data-* 속성을
:data
해시 옵션으로 생성하는 편리한 관용구가 추가되었습니다:tag("div", :data => {:name => 'Stephen', :city_state => %w(Chicago IL)}) # => <div data-name="Stephen" data-city-state="["Chicago","IL"]" />
키는 대시화(dasherize)됩니다. 문자열과 심볼을 제외한 값들은 JSON으로 인코딩됩니다.
csrf_meta_tag
가csrf_meta_tags
로 이름이 변경되었고, 하위 호환성을 위해csrf_meta_tag
를 별칭으로 사용합니다.이전 template handler API는 deprecated되었고, 새로운 API는 단순히 template handler가 call에 응답하도록 요구합니다.
rhtml과 rxml이 template handler에서 최종적으로 제거되었습니다.
config.action_view.cache_template_loading
이 다시 도입되어 템플릿의 캐시 여부를 결정할 수 있습니다.submit form helper는 더 이상 "object_name_id" ID를 생성하지 않습니다.
FormHelper#form_for
가:method
를:html
해시를 통하지 않고 직접 옵션으로 지정할 수 있습니다.form_for(@post, remote: true, html: { method: :delete })
대신form_for(@post, remote: true, method: :delete)
를 사용합니다.JavaScriptHelper#escape_javascript()
의 별칭으로JavaScriptHelper#j()
가 제공됩니다. 이는 JavaScriptHelper를 사용하는 템플릿 내에서 JSON gem이 추가하는Object#j()
메소드를 대체합니다.datetime selector에서 AM/PM 포맷을 사용할 수 있습니다.
auto_link
가 Rails에서 제거되어 rails_autolink gem으로 추출되었습니다.
6 Active Record
개별 모델의 테이블 이름을 단수화/복수화하기 위한 클래스 메소드
pluralize_table_names
가 추가되었습니다. 이전에는ActiveRecord::Base.pluralize_table_names
를 통해 모든 모델에 대해 전역으로만 설정할 수 있었습니다.class User < ActiveRecord::Base self.pluralize_table_names = false end
singular association에 block을 통한 속성 설정이 추가되었습니다. block은 인스턴스가 초기화된 후에 호출됩니다.
class User < ActiveRecord::Base has_one :account end user.build_account{ |a| a.credit_limit = 100.0 }
속성 이름 목록을 반환하는
ActiveRecord::Base.attribute_names
가 추가되었습니다. 모델이 abstract이거나 테이블이 존재하지 않는 경우 빈 배열을 반환합니다.CSV Fixtures는 deprecated되었으며 Rails 3.2.0에서 지원이 제거될 예정입니다.
ActiveRecord#new
,ActiveRecord#create
,ActiveRecord#update_attributes
는 모두 두 번째 hash를 옵션으로 받아 속성을 할당할 때 고려할 role을 지정할 수 있습니다. 이는 Active Model의 새로운 mass assignment 기능을 기반으로 합니다:class Post < ActiveRecord::Base attr_accessible :title attr_accessible :title, :published_at, :as => :admin end Post.new(params[:post], :as => :admin)
default_scope
는 이제 지연 평가를 위해 block, lambda 또는 call에 응답하는 다른 객체를 사용할 수 있습니다.default scope는 이제 가능한 가장 늦은 시점에 평가됩니다. 이는 default scope를 암시적으로 포함하는 scope가 생성되어 Model.unscoped로도 제거할 수 없게 되는 문제를 방지합니다.
PostgreSQL adapter는 PostgreSQL 버전 8.2 이상만 지원합니다.
ConnectionManagement
middleware가 변경되어 rack body가 flush된 후 connection pool을 정리합니다.Active Record에
update_column
메서드가 추가되었습니다. 이 새로운 메서드는 객체의 주어진 속성을 validation과 callback을 건너뛰고 업데이트합니다.updated_at
컬럼의 수정을 포함한 어떤 callback도 실행하지 않으려는 것이 확실한 경우가 아니라면update_attributes
나update_attribute
를 사용하는 것이 권장됩니다. 새로운 레코드에서는 호출해서는 안 됩니다.:through
옵션이 있는 Association은 이제:through
옵션과has_and_belongs_to_many
association을 포함한 모든 association을 through나 source association으로 사용할 수 있습니다.현재 데이터베이스 연결에 대한 설정은 이제
ActiveRecord::Base.connection_config
를 통해 접근할 수 있습니다.limit과 offset이 둘 다 제공되지 않는 한 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을 조작하는 역할을 하는Association
클래스(및 하위 클래스)와 collection association을 프록시하는 별도의 얇은 래퍼인CollectionProxy
가 있습니다. 이를 통해 namespace 오염을 방지하고, 관심사를 분리하며, 추가 리팩토링이 가능해집니다.singular association(
has_one
,belongs_to
)은 더 이상 프록시를 가지지 않으며 단순히 관련 레코드나nil
을 반환합니다. 이는bob.mother.create
와 같은 문서화되지 않은 메서드를 사용하지 말고 대신bob.create_mother
를 사용해야 한다는 것을 의미합니다.has_many :through
association에서:dependent
옵션을 지원합니다. 역사적이고 실용적인 이유로, 일반적인 has_many의 기본 전략이:nullify
임에도 불구하고association.delete(*records)
에서는:delete_all
이 기본 삭제 전략으로 사용됩니다. 또한, 이는 source reflection이 belongs_to인 경우에만 작동합니다. 다른 상황에서는 through association을 직접 수정해야 합니다.has_and_belongs_to_many
와has_many :through
에서association.destroy
의 동작이 변경되었습니다. 이제부터 association에서 'destroy' 또는 'delete'는 '연관된 레코드를 제거'가 아닌 '연결을 제거'를 의미합니다.이전에는
has_and_belongs_to_many.destroy(*records)
가 레코드 자체를 destroy 했습니다. join 테이블의 레코드는 삭제하지 않았습니다. 이제는 join 테이블의 레코드를 삭제합니다.이전에는
has_many_through.destroy(*records)
가 레코드 자체와 join 테이블의 레코드를 destroy 했습니다. [참고: 이는 항상 그랬던 것은 아닙니다; 이전 Rails 버전에서는 레코드 자체만 삭제했습니다.] 이제는 join 테이블의 레코드만 destroy 합니다.이 변경사항은 어느 정도 하위 호환성이 없지만, 안타깝게도 변경하기 전에 'deprecate'할 방법이 없습니다. 이 변경은 서로 다른 타입의 association 전반에 걸쳐 'destroy' 또는 'delete'의 의미를 일관되게 하기 위해 이루어졌습니다. 레코드 자체를 destroy하길 원한다면,
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
join 테이블의 속성에 접근하는 기능을 제거했습니다.has_many :through
를 사용해야 합니다.has_one
과belongs_to
association에create_association!
메서드를 추가했습니다.Migration이 이제 가역적이 되어, Rails가 migration을 되돌리는 방법을 알아냅니다. 가역적 migration을 사용하려면
change
메서드를 정의하면 됩니다.class MyMigration < ActiveRecord::Migration def change create_table(:horses) do |t| t.column :content, :text t.column :remind_at, :datetime end end end
일부 작업은 자동으로 되돌릴 수 없습니다. 그러한 작업을 되돌리는 방법을 알고 있다면, migration에서
up
과down
을 정의해야 합니다. change에서 되돌릴 수 없는 작업을 정의하면, down 실행 시IrreversibleMigration
예외가 발생합니다.Migration은 이제 클래스 메서드 대신 인스턴스 메서드를 사용합니다:
class FooMigration < ActiveRecord::Migration def up # self.up이 아님 # ... end end
모델과 생성적 migration 생성기(예: add_name_to_users)에서 생성된 migration 파일은 일반적인
up
과down
메서드 대신 가역적 migration의change
메서드를 사용합니다.association에서 문자열 SQL 조건의 보간을 지원하지 않습니다. 대신 proc을 사용해야 합니다.
has_many :things, :conditions => 'foo = #{bar}' # before has_many :things, :conditions => proc { "foo = #{bar}" } # after
proc 내부에서
self
는 association의 소유자 객체입니다. 단, association을 eager loading하는 경우에는self
가 association이 속한 클래스입니다.proc 내부에서는 모든 "일반적인" 조건을 사용할 수 있으므로 다음과 같은 것도 작동합니다:
has_many :things, :conditions => proc { ["foo = ?", bar] }
이전에는
has_and_belongs_to_many
association의:insert_sql
과:delete_sql
에서 'record'를 호출하여 삽입되거나 삭제되는 레코드를 가져올 수 있었습니다. 이제는 proc의 인자로 전달됩니다.BCrypt 암호화와 솔팅을 사용한 간단한 비밀번호 처리를 위해
ActiveRecord::Base#has_secure_password
(ActiveModel::SecurePassword
를 통해)가 추가되었습니다.# Schema: 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#dup
와ActiveRecord::Base#clone
의 동작이 일반적인 Ruby의 dup과 clone의 동작과 더 비슷하게 변경되었습니다.ActiveRecord::Base#clone
을 호출하면 frozen 상태를 포함한 레코드의 얕은 복사가 이루어집니다. 콜백은 호출되지 않습니다.ActiveRecord::Base#dup
을 호출하면 after initialize 훅을 포함하여 레코드가 복제됩니다. frozen 상태는 복사되지 않으며 모든 association이 초기화됩니다. 복제된 레코드는new_record?
에 대해true
를 반환하고, id 필드가nil
이며, 저장 가능합니다.쿼리 캐시가 이제 prepared statement와 함께 작동합니다. 애플리케이션의 변경이 필요하지 않습니다.
7 Active Model
attr_accessible
은 역할을 지정하기 위한:as
옵션을 받습니다.InclusionValidator
,ExclusionValidator
,FormatValidator
는 이제 proc, lambda, 또는call
에 응답하는 모든 것을 옵션으로 받습니다. 이 옵션은 현재 레코드를 인자로 받아InclusionValidator
와ExclusionValidator
의 경우include?
에 응답하는 객체를,FormatValidator
의 경우 정규식 객체를 반환합니다.BCrypt 암호화와 솔팅을 사용한 간단한 비밀번호 처리를 위해
ActiveModel::SecurePassword
가 추가되었습니다.ActiveModel::AttributeMethods
는 속성을 필요에 따라 정의할 수 있게 합니다.Observer를 선택적으로 활성화하고 비활성화할 수 있는 지원이 추가되었습니다.
대체
I18n
네임스페이스 조회가 더 이상 지원되지 않습니다.
8 Active Resource
모든 요청에 대한 기본 형식이 JSON으로 변경되었습니다. XML을 계속 사용하려면 클래스에
self.format = :xml
을 설정해야 합니다. 예를 들어,class User < ActiveResource::Base self.format = :xml end
9 Active Support
ActiveSupport::Dependencies
는 이제load_missing_constant
에서 기존 상수를 찾으면NameError
를 발생시킵니다.STDOUT
과STDERR
모두를 무음 처리하는 새로운 보고 메서드Kernel#quietly
가 추가되었습니다.String을
StringInquirer
객체로 변환하는 편의 메서드로String#inquiry
가 추가되었습니다.한 객체가 다른 객체에 포함되어 있는지 테스트하는
Object#in?
이 추가되었습니다.LocalCache
전략이 이제 익명 클래스가 아닌 실제 middleware 클래스가 되었습니다.재로드 가능한 클래스에 대한 참조를 보관하기 위해
ActiveSupport::Dependencies::ClassCache
클래스가 도입되었습니다.ActiveSupport::Dependencies::Reference
가 새로운ClassCache
를 직접 활용하도록 리팩토링되었습니다.Ruby 1.8에서
Range#include?
의 별칭으로Range#cover?
를 백포트했습니다.Date/DateTime/Time에
weeks_ago
와prev_week
가 추가되었습니다.ActiveSupport::Dependencies.remove_unloadable_constants!
에before_remove_const
콜백이 추가되었습니다.
폐기 예정:
- Ruby 표준 라이브러리의
SecureRandom
을 선호하여ActiveSupport::SecureRandom
이 폐기 예정입니다.
10 크레딧
Rails를 안정적이고 견고한 프레임워크로 만들기 위해 많은 시간을 투자한 수많은 사람들은 Rails 기여자 전체 목록을 참조하세요. 모든 분들께 큰 찬사를 보냅니다.
Rails 3.1 릴리스 노트는 Vijay Dev가 작성했습니다.