Ruby on Rails 3.0 릴리스 노트
Rails 3.0은 무지개와 유니콘입니다! 당신의 저녁 식사를 준비하고 세탁을 해줄 것입니다. 이것이 도착하기 전에는 삶이 어떻게 가능했는지 궁금해할 것입니다. 이것은 우리가 지금까지 만든 최고의 Rails 버전입니다!
하지만 진지하게 말하자면, 이것은 정말 좋은 것들입니다. Merb 팀이 합류하면서 가져온 프레임워크 무관심, 더 슬림하고 빠른 내부, 그리고 맛있는 API들의 좋은 아이디어들이 모두 포함되어 있습니다. Merb 1.x에서 Rails 3.0으로 오시는 분들은 많은 것을 알아볼 것입니다. Rails 2.x에서 오시는 분들도 좋아하실 것입니다.
내부 정리에 대해 전혀 관심이 없다고 해도, Rails 3.0은 여러분을 기쁘게 할 것입니다. 우리는 새로운 기능과 향상된 API들을 많이 가지고 있습니다. Rails 개발자가 되기에 지금보다 더 좋은 때는 없습니다. 몇 가지 주요 사항은 다음과 같습니다:
- RESTful 선언에 중점을 둔 새로운 라우터
- Action Controller를 모델로 한 새로운 Action Mailer API (이제 다중 파트 메시지 보내는 고통이 없습니다!)
- 관계대수 위에 구축된 새로운 Active Record 체인 가능 쿼리 언어
- Prototype, jQuery 등의 드라이버가 있는 비침투적 JavaScript 헬퍼(인라인 JS의 종말)
- Bundler를 통한 명시적 종속성 관리
이 모든 것 위에, 우리는 오래된 API를 좋은 경고와 함께 사용하지 않도록 최선을 다했습니다. 즉, 기존 애플리케이션을 Rails 3로 이동시킬 때 즉시 모든 오래된 코드를 최신 모범 사례로 다시 작성할 필요가 없습니다.
이 릴리스 노트는 주요 업그레이드를 다루지만, 모든 작은 버그 수정과 변경 사항은 포함하지 않습니다. Rails 3.0은 250명 이상의 저자가 작성한 약 4,000개의 커밋으로 구성됩니다! 모든 것을 보려면 GitHub의 메인 Rails 리포지토리에서 커밋 목록을 확인하세요.
Rails 3를 설치하려면:
# 설정에 따라 sudo가 필요할 수 있습니다 $ gem install rails
Rails 3로 업그레이드하기
기존 애플리케이션을 업그레이드하는 경우, Rails 3로 이동하기 전에 좋은 테스트 커버리지를 가지는 것이 좋습니다. 또한 먼저 Rails 2.3.5로 업그레이드하고 애플리케이션이 여전히 예상대로 실행되는지 확인한 후에 Rails 3로 업데이트해야 합니다. 그런 다음 다음과 같은 변경 사항에 유의하세요:
Rails 3는 최소 Ruby 1.8.7을 요구합니다
Rails 3.0은 Ruby 1.8.7 이상을 요구합니다. 이전 Ruby 버전에 대한 지원은 공식적으로 중단되었으며 가능한 빨리 업그레이드해야 합니다. Rails 3.0은 Ruby 1.9.2와도 호환됩니다.
팁: Ruby 1.8.7 p248 및 p249에는 Rails 3.0을 중단시키는 마샬링 버그가 있습니다. 그러나 Ruby Enterprise Edition 1.8.7-2010.02 버전부터는 이 문제가 해결되었습니다. 1.9 버전에서는 Ruby 1.9.1이 Rails 3.0에서 세그먼테이션 오류가 발생하므로, Rails 3를 사용하려면 1.9.2로 전환해야 합니다.
Rails 애플리케이션 객체
동일한 프로세스에서 여러 Rails 애플리케이션을 실행할 수 있도록 지원하기 위한 기반 작업의 일환으로, Rails 3에서는 애플리케이션 객체라는 개념이 도입되었습니다. 애플리케이션 객체는 모든 애플리케이션별 구성을 보유하며, 이전 버전의 Rails에서 config/environment.rb
와 매우 유사한 성격을 가집니다.
각 Rails 애플리케이션에는 해당 애플리케이션 객체가 있어야 합니다. 애플리케이션 객체는 config/application.rb
에 정의됩니다. 기존 애플리케이션을 Rails 3로 업그레이드하는 경우, 이 파일을 추가하고 config/environment.rb
에서 적절한 구성을 config/application.rb
로 이동해야 합니다.
script/* 디렉토리가 script/rails로 대체됨
새로운 script/rails
는 이전에 script
디렉토리에 있던 모든 스크립트를 대체합니다. 그러나 script/rails
를 직접 실행하지는 않습니다. rails
명령어가 Rails 애플리케이션의 루트에서 실행되고 있음을 감지하고 스크립트를 실행합니다. 사용법은 다음과 같습니다:
$ rails console # script/console 대신 $ rails g scaffold post title:string # script/generate scaffold post title:string 대신
rails --help
를 실행하면 모든 옵션 목록을 볼 수 있습니다.
종속성 및 config.gem
config.gem
메서드가 제거되었으며 bundler
와 Gemfile
을 사용하도록 대체되었습니다. 자세한 내용은 아래 Vendoring Gems 섹션을 참조하세요.
업그레이드 프로세스
업그레이드 프로세스를 돕기 위해 Rails Upgrade 플러그인이 생성되었습니다.
플러그인을 설치한 후 rake rails:upgrade:check
를 실행하여 업데이트해야 할 부분(정보 링크 포함)을 확인할 수 있습니다. 또한 현재 config.gem
호출을 기반으로 Gemfile
을 생성하고 현재 라우트 파일에서 새 라우트 파일을 생성하는 작업도 제공합니다. 플러그인을 가져오려면 다음을 실행하세요:
$ ruby script/plugin install git://github.com/rails/rails_upgrade.git
Rails Upgrade is now an Official Plugin에서 이 작업의 예를 볼 수 있습니다.
Rails Upgrade 도구 외에도 더 많은 도움이 필요한 경우 IRC와 rubyonrails-talk에 있는 사람들이 같은 문제를 겪고 있을 수 있습니다. 업그레이드 경험을 블로그에 공유하여 다른 사람들이 혜택을 받을 수 있도록 하세요!
Rails 3.0 애플리케이션 만들기
# 'rails' RubyGem이 설치되어 있어야 합니다 $ rails new myapp $ cd myapp
Vendoring Gems
Rails는 이제 애플리케이션 루트의 Gemfile
을 사용하여 애플리케이션에 필요한 gem을 결정합니다. 이 Gemfile
은 Bundler에 의해 처리되며, 모든 종속성을 설치합니다. 심지어 시스템 gem에 의존하지 않고 로컬에 종속성을 설치할 수도 있습니다.
자세한 내용: - bundler 홈페이지
엣지 버전 사용하기
Bundler
와 Gemfile
을 사용하면 새로운 전용 bundle
명령어로 Rails 애플리케이션을 쉽게 동결할 수 있으므로 더 이상 rake freeze
가 관련이 없어지고 삭제되었습니다.
Git 리포지토리에서 직접 번들링하려면 --edge
플래그를 전달할 수 있습니다:
$ rails new myapp --edge
Rails 리포지토리의 로컬 체크아웃을 사용하여 애플리케이션을 생성하려면 --dev
플래그를 전달하세요:
$ ruby /path/to/rails/bin/rails new myapp --dev
Rails 아키텍처 변경 사항
Rails에는 6가지 주요 아키텍처 변경 사항이 있습니다.
Railties 재구성
Railties는 전체 Rails 프레임워크에 대한 일관된 플러그인 API를 제공하고 생성기와 Rails 바인딩을 완전히 다시 작성하여, 개발자가 이제 생성기와 애플리케이션 프레임워크의 모든 중요한 단계에 일관되고 정의된 방식으로 연결할 수 있습니다.
모든 Rails 핵심 구성 요소가 분리됨
Merb와 Rails의 병합으로 인해 Rails 핵심 구성 요소 간의 강한 결합을 제거하는 큰 작업이 있었습니다. 이제 이 작업이 완료되었으며, 모든 Rails 핵심 구성 요소가 플러그인 개발에 사용할 수 있는 동일한 API를 사용하고 있습니다. 즉, 만든 모든 플러그인이나 핵심 구성 요소 대체(DataMapper 또는 Sequel 등)가 Rails 핵심 구성 요소가 액세스할 수 있는 모든 기능에 액세스하고 확장 및 향상시킬 수 있습니다.
자세한 내용: - The Great Decoupling
Active Model 추상화
핵심 구성 요소 분리의 일부로, Action Pack에서 Active Record에 대한 모든 연결을 추출했습니다. 이제 완료되었습니다. 새로운 ORM 플러그인은 이제 Active Model 인터페이스만 구현하면 Action Pack과 seamlessly 작동합니다.
자세한 내용: - Make Any Ruby Object Feel Like ActiveRecord
컨트롤러 추상화
핵심 구성 요소 분리의 또 다른 큰 부분은 보기 렌더링 등의 개념을 처리하기 위해 HTTP 개념에서 분리된 기본 슈퍼클래스를 만드는 것이었습니다. AbstractController
의 생성으로 ActionController
와 ActionMailer
가 크게 단순화되었습니다.
자세한 정보: - Rails Edge Architecture
Arel 통합
Arel(또는 Active Relation)은 Active Record의 기반으로 채택되었으며 이제 Rails에 필수적입니다. Arel은 Active Record를 단순화하고 Active Record의 관계 기능을 위한 기반을 제공하는 SQL 추상화를 제공합니다.
자세한 내용: - Why I wrote Arel
메일 추출
Action Mailer는 시작 이래로 몽키 패치, 사전 구문 분석기 및 배달 및 수신 에이전트를 가지고 있었으며, TMail이 소스 트리에 포함되어 있었습니다. 버전 3에서는 모든 네, 번역을 계속하겠습니다.
메일 추출
Action Mailer는 시작 이래로 몽키 패치, 사전 구문 분석기 및 배달 및 수신 에이전트를 가지고 있었으며, TMail이 소스 트리에 포함되어 있었습니다. 버전 3에서는 모든 이메일 메시지 관련 기능이 Mail gem으로 추상화되었습니다. 이를 통해 Action Mailer와 이메일 구문 분석기 간의 코드 중복이 줄어들고 명확한 경계가 생겼습니다.
자세한 내용: - New Action Mailer API in Rails 3
문서화
Rails 트리의 문서화는 모든 API 변경 사항을 반영하여 업데이트되고 있으며, Rails Edge Guides도 Rails 3.0의 변경 사항을 반영하여 하나씩 업데이트되고 있습니다. 그러나 guides.rubyonrails.org의 가이드는 안정 버전인 2.3.5 버전을 계속 포함할 것입니다.
자세한 정보: - Rails Documentation Projects
국제화
Rails 3에서는 최신 I18n gem이 제공하는 많은 속도 향상을 포함하여 I18n 지원에 많은 작업이 이루어졌습니다.
- 모든 객체에 대한 I18n -
ActiveModel::Translation
및ActiveModel::Validations
를 포함하여 I18n 동작을 모든 객체에 추가할 수 있습니다.errors.messages
폴백도 있습니다. - 속성에 기본 번역을 지정할 수 있습니다.
- 폼 제출 태그는 객체 상태에 따라 올바른 상태(생성 또는 업데이트)를 자동으로 가져와 올바른 번역을 가져옵니다.
- 속성 이름만 전달하면 I18n으로 레이블이 작동합니다.
자세한 정보: - Rails 3 I18n changes
Railties
핵심 Rails 프레임워크의 분리로 Railties가 큰 개선을 받았으며, 프레임워크, 엔진 또는 플러그인을 연결하는 것이 가능한 한 쉽고 확장 가능하도록 만들었습니다:
- 각 애플리케이션에는 자체 네임스페이스가 있으며, 애플리케이션은
YourAppName.boot
로 시작됩니다. 예를 들어 다른 애플리케이션과 상호 작용하기가 훨씬 쉬워졌습니다. Rails.root/app
아래의 모든 것이 이제 로드 경로에 추가되므로app/observers/user_observer.rb
를 만들고 Rails가 수정 없이 로드할 수 있습니다.Rails 3.0은 이제
Rails.config
객체를 제공하여 Rails 전체 구성 옵션의 중앙 저장소 역할을 합니다.애플리케이션 생성에는 test-unit, Active Record, Prototype 및 Git 설치를 건너뛸 수 있는 추가 플래그가 있습니다. 또한
--dev
플래그가 추가되어 애플리케이션을 사용자의 Rails 체크아웃을 가리키는Gemfile
로 설정합니다(Rails 바이너리 경로로 결정됨). 자세한 내용은rails --help
를 참조하세요.
Railties 생성기에는 많은 관심이 쏟아졌습니다:
- 생성기가 완전히 다시 작성되어 이전 버전과 호환되지 않습니다.
- Rails 템플릿 API와 생성기 API가 병합되었습니다(이전과 동일).
- 생성기는 더 이상 특수 경로에서 로드되지 않고 Ruby 로드 경로에서 찾습니다. 따라서
rails generate foo
를 호출하면generators/foo_generator
를 찾습니다. - 새 생성기에는 후크가 있어 템플릿 엔진, ORM, 테스트 프레임워크 등이 쉽게 연결될 수 있습니다.
- 새 생성기를 통해
Rails.root/lib/templates
에 복사본을 배치하여 템플릿을 재정의할 수 있습니다. Rails::Generators::TestCase
도 제공되므로 자체 생성기를 만들고 테스트할 수 있습니다.
또한 Railties 생성기가 생성한 뷰에도 일부 개선 사항이 있습니다:
- 뷰에서는
p
태그 대신div
태그를 사용합니다. - 생성된 스캐폴드는 편집 및 새 뷰에 중복된 코드 대신
_form
부분 템플릿을 사용합니다. - 스캐폴드 폼은 전달된 객체 상태에 따라 “Create ModelName” 또는 “Update ModelName"을 반환하는
f.submit
을 사용합니다.
마지막으로 rake 작업에 몇 가지 향상 사항이 추가되었습니다:
rake db:forward
가 추가되어 개별적으로 또는 그룹으로 마이그레이션을 앞으로 이동할 수 있습니다.rake routes CONTROLLER=x
가 추가되어 한 컨트롤러의 라우트만 볼 수 있습니다.
Railties는 이제 다음을 사용하지 않도록 권장합니다:
RAILS_ROOT
대신Rails.root
,RAILS_ENV
대신Rails.env
, 그리고RAILS_DEFAULT_LOGGER
대신Rails.logger
.
PLUGIN/rails/tasks
및 PLUGIN/tasks
는 더 이상 로드되지 않으며, 모든 작업은 이제 PLUGIN/lib/tasks
에 있어야 합니다.
자세한 정보:
Action Pack
Action Pack에는 중요한 내부 및 외부 변경 사항이 있었습니다.
Abstract Controller
Abstract Controller는 Action Controller의 일반적인 부분을 재사용 가능한 모듈로 추출했습니다. 이 추상화를 통해 ActionMailer::Base
가 이제 AbstractController
에서 상속받고 Mail gem에 Rails DSL을 래핑할 수 있게 되었습니다.
또한 Action Controller의 코드를 단순화할 수 있는 기회를 제공했습니다.
그러나 Abstract Controller는 사용자 대상 API가 아니며 일상적인 Rails 사용에서 직접 접하지 않을 것입니다.
자세한 정보: - Rails Edge Architecture
Action Controller
application_controller.rb
에protect_from_forgery
가 기본적으로 켜져 있습니다.cookie_verifier_secret
이 deprecated되었으며, 대신Rails.application.config.cookie_secret
에 할당되고config/initializers/cookie_verification_secret.rb
라는 별도의 파일로 이동했습니다.session_store
는ActionController::Base.session
에서 구성되었으며, 이제Rails.application.config.session_store
로 이동했습니다. 기본값은config/initializers/session_store.rb
에 설정됩니다.cookies.secure
를 사용하면cookie.secure[:key] => value
와 같이 암호화된 쿠키 값을 설정할 수 있습니다.cookies.permanent
를 사용하면cookie.permanent[:key] => value
와 같이 영구 쿠키 값을 설정할 수 있으며, 확인 실패 시 예외를 발생시킵니다.format
호출 내에서:notice => 'This is a flash message'
또는:alert => 'Something went wrong'
을 전달할 수 있습니다.flash[]
해시는 이전과 같이 작동합니다.respond_with
메서드가 추가되어 컨트롤러의 응답 생성을 단순화합니다.ActionController::Responder
가 추가되어 응답 생성의 유연성을 높였습니다.
Deprecations:
filter_parameter_logging
은config.filter_parameters << :password
로 대체되었습니다.
자세한 정보:
Action Dispatch
Action Dispatch는 Rails 3.0의 새로운 기능이며 라우팅에 대한 새롭고 깨끗한 구현을 제공합니다.
- 라우터의 큰 정리 및 재작성, Rails 라우터는 이제 Rails DSL이 있는
rack_mount
입니다. 독립형 소프트웨어입니다. 각 애플리케이션의 정의된 경로가 이제 애플리케이션 모듈 내에 네임스페이스화됩니다. 즉:
# 대신: ActionController::Routing::Routes.draw do |map| map.resources :posts end # 다음과 같이 합니다: AppName::Application.routes do resources :posts end
라우터에
match
메서드가 추가되었으며 모든 Rack 애플리케이션을 일치하는 경로에 전달할 수 있습니다.라우터에
constraints
메서드가 추가되어 정의된 제약 조건으로 라우터를 보호할 수 있습니다.라우터에
scope
메서드가 추가되어 다른 언어나 다른 작업에 대한 경로를 네임스페이스화할 수 있습니다. 예를 들어:scope 'es' do resources :projects, :path_names => { :edit => 'cambiar' }, :path => 'proyecto' end # /es/proyecto/1/cambiar 경로를 제공합니다
라우터에
root
메서드가 추가되어match '/', :to => path
의 단축 방식을 제공합니다.일치하는 세그먼트를 선택적으로 전달할 수 있습니다. 예:
match "/:controller(/:action(/:id))(.:format)"
, 각 괄호로 묶인 세그먼트는 선택 사항입니다.블록을 통해 경로를 표현할 수 있습니다. 예를 들어
controller :home { match '/:action' }
을 호출할 수 있습니다.
참고. 이전 스타일의 map
명령은 이전과 같이 작동하지만 호환성 계층이 제공되며 Rails 3.1 릴리스에서 제거될 것입니다.
Deprecations
- 비 REST 애플리케이션에 대한 캐치 올 경로(
/:controller/:action/:id
)가 이제 주석 처리되었습니다. - 경로
:path_prefix
가 더 이상 존재하지 않으며:name_prefix
에 자동으로 ”_“가 추가됩니다.
자세한 정보: * The Rails 3 Router: Rack it Up * Revamped Routes in Rails 3 * Generic Actions in Rails 3
Action View
비침투적 JavaScript
Action View 헬퍼에 대한 주요 재작성이 수행되었으며, 비침투적 JavaScript(UJS) 후크를 구현하고 이전의 인라인 AJAX 명령을 제거했습니다. 이를 통해 Rails에서 모든 호환네, 번역을 계속하겠습니다.
Action View
비침투적 JavaScript
Action View 헬퍼에 대한 주요 재작성이 수행되었으며, 비침투적 JavaScript(UJS) 후크를 구현하고 이전의 인라인 AJAX 명령을 제거했습니다. 이를 통해 Rails에서 모든 호환 가능한 UJS 드라이버를 사용하여 UJS 후크를 구현할 수 있습니다.
이는 이전의 remote_<method>
헬퍼가 Rails 코어에서 제거되고 Prototype Legacy Helper에 배치되었음을 의미합니다. UJS 후크를 HTML에 삽입하려면 이제 :remote => true
를 전달합니다. 예:
form_for @post, :remote => true
다음과 같이 생성됩니다:
<form action="http://host.com" id="create-post" method="post" data-remote="true">
블록이 있는 헬퍼
form_for
또는 div_for
와 같이 블록에서 콘텐츠를 삽입하는 헬퍼는 이제 <%=
를 사용합니다:
<%= form_for @post do |f| %> ... <% end %>
자체 헬퍼도 문자열을 반환해야 하며, 출력 버퍼에 직접 추가하지 않아야 합니다.
cache
또는 content_for
와 같이 다른 작업을 수행하는 헬퍼는 이전과 같이 <%
를 사용해야 합니다.
기타 변경 사항
h(string)
을 호출하여 HTML 출력을 이스케이프할 필요가 더 이상 없습니다. 이제 기본적으로 모든 뷰 템플릿에서 활성화되어 있습니다. 이스케이프되지 않은 문자열을 원하는 경우raw(string)
을 호출하세요.- 기본적으로 HTML5 출력이 생성됩니다.
- 폼 레이블 헬퍼는 이제 단일 값에서 I18n을 가져오므로
f.label :name
은:name
번역을 가져옵니다. - I18n 선택 레이블은 이제
:en.helpers.select
여야 하며:en.support.select
가 아닙니다. - ERB 템플릿 내부의 Ruby 보간 끝에 마이너스 기호를 배치할 필요가 더 이상 없습니다.
grouped_collection_select
헬퍼가 Action View에 추가되었습니다.content_for?
가 추가되어 뷰에 콘텐츠가 존재하는지 확인할 수 있습니다.- 폼 헬퍼에
:value => nil
을 전달하면 필드의value
속성이 nil로 설정됩니다(기본값 사용 안 함). - 폼 헬퍼에
:id => nil
을 전달하면 해당 필드에id
속성이 렌더링되지 않습니다. image_tag
에:alt => nil
을 전달하면img
태그에alt
속성이 렌더링되지 않습니다.
Active Model
Active Model은 Rails 3.0의 새로운 기능입니다. Action Pack과 seamlessly 작동할 수 있도록 모든 ORM 라이브러리가 Active Model 인터페이스를 구현할 수 있는 추상화 계층을 제공합니다.
ORM 추상화 및 Action Pack 인터페이스
핵심 구성 요소 분리의 일부로 Action Pack에서 Active Record에 대한 모든 연결을 추출했습니다. 이제 완료되었습니다. 새로운 ORM 플러그인은 이제 Active Model 인터페이스만 구현하면 Action Pack과 seamlessly 작동합니다.
자세한 내용: - Make Any Ruby Object Feel Like ActiveRecord
유효성 검사
유효성 검사가 Active Record에서 Active Model로 이동되었으며, Rails 3에서 ORM 라이브러리 전반에 걸쳐 작동하는 유효성 검사 인터페이스를 제공합니다.
validates :attribute, options_hash
단축 메서드가 있어 모든 validates 클래스 메서드에 대한 옵션을 전달할 수 있습니다. 하나의 validate 메서드에 여러 옵션을 전달할 수 있습니다.validates
메서드에는 다음과 같은 옵션이 있습니다::acceptance => Boolean
.:confirmation => Boolean
.:exclusion => { :in => Enumerable }
.:inclusion => { :in => Enumerable }
.:format => { :with => Regexp, :on => :create }
.:length => { :maximum => Fixnum }
.:numericality => Boolean
.:presence => Boolean
.:uniqueness => Boolean
.
참고: Rails 버전 2.3의 모든 유효성 검사 메서드는 Rails 3.0에서도 계속 지원됩니다. 새로운 validates 메서드는 모델 유효성 검사에 대한 추가 지원을 제공하기 위한 것이며 기존 API를 대체하기 위한 것은 아닙니다.
유효성 검사기 객체를 전달할 수도 있으며, 이를 Active Model을 사용하는 객체 간에 재사용할 수 있습니다:
class TitleValidator < ActiveModel::EachValidator Titles = ['Mr.', 'Mrs.', 'Dr.'] def validate_each(record, attribute, value) unless Titles.include?(value) record.errors[attribute] << 'must be a valid title' end end end
class Person include ActiveModel::Validations attr_accessor :title validates :title, :presence => true, :title => true end # 또는 Active Record의 경우 class Person < ActiveRecord::Base validates :title, :presence => true, :title => true end
내부 조사도 지원됩니다:
User.validators User.validators_on(:login)
자세한 정보:
Active Record
Active Record는 Active Model으로의 추상화, Arel을 사용한 쿼리 인터페이스 전체 업데이트, 유효성 검사 업데이트 및 많은 향상 및 수정 사항을 포함하여 Rails 3.0에서 많은 관심을 받았습니다. Rails 2.x API는 호환성 계층을 통해 계속 사용할 수 있으며, 3.1 버전까지 지원되고 3.2 버전에서 제거될 것입니다.
쿼리 인터페이스
Arel을 통해 Active Record의 핵심 메서드는 이제 관계를 반환합니다. Rails 2.3.x의 기존 API는 계속 지원되며 Rails 3.1까지 사용할 수 있지만 더 이상 사용되지 않고 Rails 3.2에서 제거될 것입니다. 그러나 새로운 API는 다음과 같은 새로운 메서드를 제공하며, 이 메서드들은 모두 관계를 반환하여 연결할 수 있습니다:
where
- 관계에 대한 조건을 제공합니다(반환되는 내용).select
- 반환할 모델 속성을 선택합니다.group
- 속성으로 관계를 그룹화합니다.having
- 그룹 관계를 제한하는 표현식을 제공합니다(GROUP BY 제약 조건).joins
- 다른 테이블에 관계를 조인합니다.clause
- 조인 관계를 제한하는 표현식을 제공합니다(JOIN 제약 조건).includes
- 사전 로드된 다른 관계를 포함합니다.order
- 제공된 표현식에 따라 관계를 정렬합니다.limit
- 관계를 지정된 레코드 수로 제한합니다.lock
- 반환된 레코드를 잠급니다.readonly
- 데이터의 읽기 전용 복사본을 반환합니다.from
- 둘 이상의 테이블에서 관계를 선택할 수 있는 방법을 제공합니다.scope
- (이전의named_scope
) 관계를 반환하며 다른 관계 메서드와 연결할 수 있습니다.with_scope
- 및with_exclusive_scope
도 이제 관계를 반환하므로 연결할 수 있습니다.default_scope
도 관계와 작동합니다.
자세한 정보:
향상 사항
- Active Record 객체에
:destroyed?
가 추가되었습니다. - Active Record 연결에
:inverse_of
가 추가되어 이미 로드된 연결 인스턴스를 데이터베이스 호출 없이 가져올 수 있습니다.
패치 및 Deprecations
또한 Active Record 브랜치에 많은 수정 사항이 있었습니다:
- SQLite 2 지원이 SQLite 3로 대체되었습니다.
- MySQL에 대한 열 순서 지원이 추가되었습니다.
- PostgreSQL 어댑터의
TIME ZONE
지원이 수정되어 잘못된 값을 더 이상 삽입하지 않습니다. - PostgreSQL에 대한 다중 스키마 테이블 이름 지원이 추가되었습니다.
- PostgreSQL에 대한 XML 데이터 유형 열 지원이 추가되었습니다.
table_name
이 이제 캐시됩니다.- Oracle 어댑터에도 많은 버그 수정이 있었습니다.
다음과 같은 Deprecations도 있습니다:
- Active Record 클래스의
named_scope
가 deprecated되었으며scope
로 이름이 변경되었습니다. scope
메서드에서는:conditions => {}
의 찾기 메서드 대신 관계 메서드를 사용해야 합니다. 예:scope :since, lambda {|time| where("created_at > ?", time) }
.save(false)
가 deprecated되었으며save(:validate => false)
를 사용해야 합니다.- Active Record에 대한 I18n 오류 메시지는
:en.activerecord.errors.template
에서:en.errors.template
로 변경되어야 합니다. model.errors.on
이 deprecated되었으며model.errors[]
를 사용해야 합니다.validates_presence_of
는validates... :presence => true
로 대체됩니다.ActiveRecord::Base.colorize_logging
및config.active_record.colorize_logging
이 deprecated되었으며Rails::LogSubscriber.colorize_logging
또는config.colorize_logging
을 사용해야 합니다.
참고: Active Record 엣지에 상태 머신 구현이 몇 달 동안 있었지만 Rails 3.0 릴리스에서는 제거되었습니다.
Active Resource
Active Resource도 Active Model으로 추출되어 Action Pack과 seamlessly 작동하는 Active Resource 객체를 사용할 수 있습니다.
- Active Model을 통한 유효성 검사가 추가되었습니다.
- 관찰 후크가 추가되었습니다.
- HTTP 프록시 지원이 추가되었습니다.
- 다이제스트 인증 지원이 추가되었습니다.
- 모델 명명이 Active Model으로 이동되었습니다.
- Active Resource 속성이 인디퍼런트 액세스 해시로 변경되었습니다.
first
,last
및all
에 대한 별칭이 해당 찾기 범위에 추가되었습니다.find_every
가 아무것도 반환되지 않으면ResourceNotFound
오류를 더 이상 발생시키지 않습니다.- 객체가
valid?
가 네, 번역을 계속하겠습니다.
Active Resource
Active Resource도 Active Model으로 추출되어 Action Pack과 seamlessly 작동하는 Active Resource 객체를 사용할 수 있습니다.
- Active Model을 통한 유효성 검사가 추가되었습니다.
- 관찰 후크가 추가되었습니다.
- HTTP 프록시 지원이 추가되었습니다.
- 다이제스트 인증 지원이 추가되었습니다.
- 모델 명명이 Active Model으로 이동되었습니다.
- Active Resource 속성이 인디퍼런트 액세스 해시로 변경되었습니다.
first
,last
및all
에 대한 별칭이 해당 찾기 범위에 추가되었습니다.find_every
가 아무것도 반환되지 않으면ResourceNotFound
오류를 더 이상 발생시키지 않습니다.save!
가 추가되어 객체가valid?
가 아닌 경우ResourceInvalid
를 발생시킵니다.update_attribute
및update_attributes
가 Active Resource 모델에 추가되었습니다.exists?
가 추가되었습니다.SchemaDefinition
이Schema
로,define_schema
가schema
로 이름이 변경되었습니다.- 원격 오류를 로드하는 데 Active Resources의
format
을 사용하고content-type
을 사용하지 않습니다. - 스키마 블록에
instance_eval
을 사용합니다. ActiveResource::ConnectionError#to_s
가@response
가code
또는message
에 응답하지 않는 경우 Ruby 1.9 호환성을 처리하도록 수정되었습니다.- JSON 형식의 오류 지원이 추가되었습니다.
- 숫자 배열을 로드할 때
load
가 작동하도록 수정되었습니다. - 원격 리소스가 삭제된 경우 410 응답을 인식하도록 수정되었습니다.
- Active Resource 연결에 SSL 옵션을 설정할 수 있는 기능이 추가되었습니다.
- 연결 시간 초과 설정이
Net::HTTP
open_timeout
에도 영향을 미칩니다.
Deprecations:
save(false)
가 deprecated되었으며save(:validate => false)
를 사용해야 합니다.- Ruby 1.9.2:
URI.parse
및.decode
가 deprecated되었으며 더 이상 라이브러리에서 사용되지 않습니다.
Active Support
Active Support에서는 다양한 핵심 구성 요소를 선택적으로 사용할 수 있도록 하는 데 많은 노력이 기울여졌습니다. 즉, 전체 Active Support 라이브러리를 요구하지 않고도 해당 부분을 사용할 수 있습니다. 이를 통해 Rails의 다양한 핵심 구성 요소를 더 슬림하게 실행할 수 있습니다.
Active Support의 주요 변경 사항은 다음과 같습니다:
- 라이브러리 전체에서 사용되지 않는 메서드를 제거하는 등 대규모 정리가 이루어졌습니다.
- Active Support는 더 이상 TZInfo, Memcache Client 및 Builder의 벤더 버전을 제공하지 않습니다. 이러한 것들은 모두 종속성으로 포함되어
bundle install
명령을 통해 설치됩니다. ActiveSupport::SafeBuffer
에 안전한 버퍼가 구현되었습니다.Array.uniq_by
및Array.uniq_by!
가 추가되었습니다.Array#rand
가 제거되었고 Ruby 1.9의Array#sample
이 백포트되었습니다.TimeZone.seconds_to_utc_offset
의 버그가 수정되어 잘못된 값을 반환하지 않습니다.ActiveSupport::Notifications
미들웨어가 추가되었습니다.ActiveSupport.use_standard_json_time_format
이 기본적으로 true로 설정되었습니다.ActiveSupport.escape_html_entities_in_json
이 기본적으로 false로 설정되었습니다.Integer#multiple_of?
가 인수로 zero를 허용하며, 수신기가 zero가 아닌 경우 false를 반환합니다.string.chars
가string.mb_chars
로 이름이 변경되었습니다.ActiveSupport::OrderedHash
가 이제 YAML을 통해 역직렬화될 수 있습니다.- LibXML 및 Nokogiri를 사용하는 SAX 기반 파서가 XmlMini에 추가되었습니다.
Object#presence
가 추가되어#present?
이면 객체를 반환하고 그렇지 않으면nil
을 반환합니다.String#exclude?
코어 확장이 추가되어#include?
의 반대를 반환합니다.DateTime
에to_i
가 추가되어 모델의DateTime
속성에 대한to_yaml
이 올바르게 작동합니다.Enumerable#exclude?
가 추가되어Enumerable#include?
와 대칭성을 유지하고!x.include?
를 피할 수 있습니다.- XSS 이스케이프가 기본적으로 켜졌습니다.
ActiveSupport::HashWithIndifferentAccess
에 깊은 병합 지원이 추가되었습니다.Enumerable#sum
이 이제:size
에 응답하지 않는 모든 열거형에서 작동합니다.- 길이가 0인 기간의
inspect
가 빈 문자열 대신 ‘0 seconds'를 반환합니다. element
및collection
이ModelName
에 추가되었습니다.String#to_time
및String#to_datetime
이 소수 초를 처리합니다.- 전후 필터 객체에 대한 새 콜백 지원이 추가되었습니다.
ActiveSupport::OrderedHash#to_a
메서드가 순서가 지정된 배열 집합을 반환합니다. Ruby 1.9의Hash#to_a
와 일치합니다.MissingSourceFile
이 상수로 존재하지만 이제LoadError
와 동일합니다.- 하위 클래스에 의해 재정의 및 상속될 수 있는 클래스 수준 속성을 선언할 수 있는
Class#class_attribute
가 추가되었습니다. - 마침내
ActiveRecord::Associations
의DeprecatedCallbacks
가 제거되었습니다. Object#metaclass
가 Ruby와 일치하도록Kernel#singleton_class
로 변경되었습니다.
다음 메서드는 Ruby 1.8.7 및 1.9에서 이제 사용 가능하므로 제거되었습니다:
Integer#even?
및Integer#odd?
String#each_char
String#start_with?
및String#end_with?
(3인칭 별칭은 유지됨)String#bytesize
Object#tap
Symbol#to_proc
Object#instance_variable_defined?
Enumerable#none?
REXML에 대한 보안 패치는 Ruby 1.8.7의 초기 패치 수준에서도 여전히 필요하므로 Active Support에 남아 있습니다. Active Support는 적용해야 하는지 여부를 알고 있습니다.
다음 메서드는 더 이상 프레임워크에서 사용되지 않아 제거되었습니다:
Kernel#daemonize
Object#remove_subclasses_of
Object#extend_with_included_modules_from
,Object#extended_by
Class#remove_class
Regexp#number_of_captures
,Regexp.unoptionalize
,Regexp.optionalize
,Regexp#number_of_captures
Action Mailer
Action Mailer에 새로운 API가 도입되었으며, TMail이 새로운 Mail 이메일 라이브러리로 대체되었습니다. Action Mailer 자체가 거의 완전히 재작성되었으며, 거의 모든 코드 행이 수정되었습니다. 그 결과 Action Mailer는 이제 Abstract Controller를 상속받고 Mail gem을 Rails DSL으로 래핑합니다. 이를 통해 Action Mailer의 코드와 다른 라이브러리의 중복이 크게 줄었습니다.
- 모든 메일러는 이제 기본적으로
app/mailers
에 있습니다. attachments
,headers
및mail
의 세 가지 메서드를 사용하여 새 API로 이메일을 보낼 수 있습니다.- Action Mailer에
attachments.inline
메서드를 사용한 인라인 첨부 파일에 대한 기본 지원이 추가되었습니다. - Action Mailer 이메일 메서드가 이제
Mail::Message
객체를 반환하며, 이 객체에deliver
메시지를 보내 자체 전송할 수 있습니다. - 모든 배달 방법이 이제 Mail gem으로 추상화되었습니다.
mail
배달 메서드는 유효한 메일 헤더 필드와 해당 값 쌍의 해시를 허용할 수 있습니다.mail
배달 메서드는 Action Controller의respond_to
와 유사한 방식으로 작동하며, 명시적으로 또는 암시적으로 템플릿을 렌더링할 수 있습니다. Action Mailer는 필요에 따라 이메일을 다중 파트로 변환합니다.format.mime_type
호출 내에서 프로시저를 전달하고 명시적으로 특정 유형의 텍스트를 렌더링하거나 레이아웃 또는 다른 템플릿을 추가할 수 있습니다. 프로시저 내부의render
호출은 Abstract Controller에서 제공되며 동일한 옵션을 지원합니다.- 메일러 단위 테스트가 기능 테스트로 이동되었습니다.
- Action Mailer는 이제 Mail Gem에 모든 자동 헤더 필드 및 본문 인코딩을 위임합니다.
- Action Mailer는 이메일 본문과 헤더를 자동으로 인코딩합니다.
Deprecations:
:charset
,:content_type
,:mime_version
,:implicit_parts_order
가 모두ActionMailer.default :key => value
스타일 선언으로 deprecated되었습니다.- 메일러 동적
create_method_name
및deliver_method_name
이 deprecated되었으며,method_name
을 호출하면Mail::Message
객체가 반환됩니다. ActionMailer.deliver(message)
가 deprecated되었으며,message.deliver
를 호출하면 됩니다.template_root
가 deprecated되었으며,format.mime_type
메서드 내부의render
호출에 옵션을 전달하세요.- 인스턴스 변수를 정의하는
body
메서드가 deprecated되었습니다(body {:ivar => value}
). 대신 메서드에 직접 인스턴스 변수를 선언하면 뷰에서 사용할 수 있습니다. - 메일러가
app/models
에 있는 것이 deprecated되었으며app/mailers
를 사용해야 합니다.
자세한 정보:
크레딧
Rails에 많은 시간을 보내 기여한 모든 사람들의 전체 기여자 목록을 참조하세요. 그들 모두에게 박수를 보냅니다.
Rails 3.0 릴리스 노트는 Mikel Lindsaar가 작성했습니다.