rubyonrails.org에서 더 보기:

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

Ruby on Rails 3.1 릴리스 노트

Rails 3.1의 주요 변경사항:

  • Streaming
  • Reversible Migrations
  • Assets Pipeline
  • jQuery가 기본 JavaScript 라이브러리로 채택

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

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들을 결정합니다. 이 GemfileBundler gem에 의해 처리되며, Bundler는 모든 의존성을 설치합니다. 시스템 gem에 의존하지 않도록 모든 의존성을 로컬 애플리케이션에 설치할 수도 있습니다.

추가 정보: - bundler 홈페이지

2.2 Edge 버전으로 작업하기

BundlerGemfile은 새로운 전용 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-railsprototype-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::EtagRack::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_helpersfalse로 설정하면 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="[&quot;Chicago&quot;,&quot;IL&quot;]" />
    

키는 대시화(dasherize)됩니다. 문자열과 심볼을 제외한 값들은 JSON으로 인코딩됩니다.

  • csrf_meta_tagcsrf_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_attributesupdate_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_manyhas_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_onebelongs_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에서 updown을 정의해야 합니다. change에서 되돌릴 수 없는 작업을 정의하면, down 실행 시 IrreversibleMigration 예외가 발생합니다.

  • Migration은 이제 클래스 메서드 대신 인스턴스 메서드를 사용합니다:

    class FooMigration < ActiveRecord::Migration
      def up # self.up이 아님
        # ...
      end
    end
    
  • 모델과 생성적 migration 생성기(예: add_name_to_users)에서 생성된 migration 파일은 일반적인 updown 메서드 대신 가역적 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#dupActiveRecord::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에 응답하는 모든 것을 옵션으로 받습니다. 이 옵션은 현재 레코드를 인자로 받아 InclusionValidatorExclusionValidator의 경우 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를 발생시킵니다.

  • STDOUTSTDERR 모두를 무음 처리하는 새로운 보고 메서드 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_agoprev_week가 추가되었습니다.

  • ActiveSupport::Dependencies.remove_unloadable_constants!before_remove_const 콜백이 추가되었습니다.

폐기 예정:

  • Ruby 표준 라이브러리의 SecureRandom을 선호하여 ActiveSupport::SecureRandom이 폐기 예정입니다.

10 크레딧

Rails를 안정적이고 견고한 프레임워크로 만들기 위해 많은 시간을 투자한 수많은 사람들은 Rails 기여자 전체 목록을 참조하세요. 모든 분들께 큰 찬사를 보냅니다.

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



맨 위로