Ruby on Rails 2.3 릴리스 노트

Rails 2.3은 다양한 새로운 기능과 개선된 기능을 제공합니다. 여기에는 광범위한 Rack 통합, 새로워진 Rails Engines 지원, Active Record의 중첩 트랜잭션, 동적 및 기본 스코프, 통합 렌더링, 더 효율적인 라우팅, 애플리케이션 템플릿, 그리고 조용한 백트레이스 등이 포함됩니다. 이 목록은 주요 업그레이드를 다루고 있지만, 모든 작은 버그 수정과 변경 사항을 포함하지는 않습니다. 모든 것을 보고 싶다면 GitHub의 Rails 주 저장소에서 커밋 목록을 확인하거나 개별 Rails 구성 요소의 CHANGELOG 파일을 검토하세요.


애플리케이션 아키텍처

Rails 애플리케이션의 아키텍처에는 두 가지 주요 변경 사항이 있습니다: Rack 모듈식 웹 서버 인터페이스의 완전한 통합, 그리고 Rails Engines에 대한 새로운 지원.

Rack 통합

Rails는 이제 CGI 과거를 벗어나 Rack을 전반적으로 사용합니다. 이로 인해 내부적으로 많은 변화가 있었습니다(하지만 CGI를 사용하는 경우 걱정하지 마세요. Rails는 이제 프록시 인터페이스를 통해 CGI를 지원합니다). 그래도 이것은 Rails 내부에 큰 변화입니다. 2.3으로 업그레이드한 후에는 로컬 환경과 프로덕션 환경에서 테스트해야 합니다. 다음과 같은 사항을 테스트해야 합니다:

  • 세션
  • 쿠키
  • 파일 업로드
  • JSON/XML API

Rack 관련 변경 사항의 요약은 다음과 같습니다:

  • script/server가 Rack을 사용하도록 전환되었으므로 Rack 호환 서버를 지원합니다. script/serverconfig.ru 파일이 있는 경우 이를 선택합니다. 기본적으로 config.ru 파일을 찾지만 -c 스위치로 이를 재정의할 수 있습니다.
  • FCGI 핸들러가 Rack을 통해 실행됩니다.
  • ActionController::Dispatcher는 자체 기본 미들웨어 스택을 유지합니다. 미들웨어를 삽입, 재정렬 및 제거할 수 있습니다. 스택은 부팅 시 체인으로 컴파일됩니다. environment.rb에서 미들웨어 스택을 구성할 수 있습니다.
  • rake middleware 작업이 추가되어 미들웨어 스택을 검사할 수 있습니다. 이는 미들웨어 스택의 순서를 디버깅하는 데 유용합니다.
  • 통합 테스트 러너가 전체 미들웨어 및 애플리케이션 스택을 실행하도록 수정되었습니다. 이를 통해 통합 테스트가 Rack 미들웨어를 테스트하는 데 완벽합니다.
  • ActionController::CGIHandler는 Rack 호환 형식으로 변환하는 CGI 래퍼입니다. CGIHandler는 이전 CGI 객체의 환경 정보를 Rack 호환 형식으로 변환하는 것을 목적으로 합니다.
  • CgiRequestCgiResponse가 제거되었습니다.
  • 세션 저장소가 지연 로드됩니다. 요청 중에 세션 객체에 액세스하지 않으면 세션 데이터(쿠키 구문 분석, 메모리 캐시에서 데이터 로드 또는 Active Record 객체 조회)를 시도하지 않습니다.
  • 테스트에서 CGI::Cookie.new를 사용할 필요가 없습니다. request.cookies["foo"]에 문자열 값을 할당하면 쿠키가 예상대로 설정됩니다.
  • CGI::Session::CookieStoreActionController::Session::CookieStore로 대체되었습니다.
  • CGI::Session::MemCacheStoreActionController::Session::MemCacheStore로 대체되었습니다.
  • CGI::Session::ActiveRecordStoreActiveRecord::SessionStore로 대체되었습니다.
  • ActionController::Base.session_store = :active_record_store로 세션 저장소를 여전히 변경할 수 있습니다.
  • 기본 세션 옵션은 ActionController::Base.session = { :key => "..." }로 여전히 설정됩니다. 그러나 :session_domain 옵션이 :domain으로 변경되었습니다.
  • 일반적으로 요청 전체를 감싸는 뮤텍스가 ActionController::Lock 미들웨어로 이동되었습니다.
  • ActionController::AbstractRequestActionController::Request가 통합되었습니다. 새로운 ActionController::RequestRack::Request를 상속합니다. 이로 인해 테스트 요청에서 response.headers['type']에 대한 액세스가 영향을 받습니다. 대신 response.content_type을 사용하세요.
  • ActiveRecord::QueryCache 미들웨어가 ActiveRecord가 로드된 경우 자동으로 미들웨어 스택에 삽입됩니다. 이 미들웨어는 요청별 Active Record 쿼리 캐시를 설정하고 플러시합니다.
  • Rails 라우터와 컨트롤러 클래스는 Rack 사양을 따릅니다. SomeController.call(env)로 컨트롤러를 직접 호출할 수 있습니다. 라우터는 라우팅 매개변수를 rack.routing_args에 저장합니다.
  • ActionController::RequestRack::Request를 상속합니다.
  • config.action_controller.session = { :session_key => 'foo', ...를 사용하는 대신 config.action_controller.session = { :key => 'foo', ...를 사용하세요.
  • ParamsParser 미들웨어는 XML, JSON 또는 YAML 요청을 사전 처리하여 이후 Rack::Request 객체에서 정상적으로 읽을 수 있도록 합니다.

Rails Engines에 대한 새로운 지원

몇 버전 동안 업그레이드가 없었던 후, Rails 2.3은 Rails Engines(다른 애플리케이션에 포함될 수 있는 Rails 애플리케이션)에 대한 새로운 기능을 제공합니다. 첫째, Engines의 라우팅 파일이 이제 자동으로 로드되고 다시 로드됩니다. 이는 routes.rb 파일과 마찬가지입니다(다른 플러그인의 라우팅 파일에도 적용됩니다). 둘째, 플러그인에 app 폴더가 있는 경우 app/[models|controllers|helpers]가 자동으로 Rails 로드 경로에 추가됩니다. Engines는 이제 뷰 경로 추가를 지원하며, Action Mailer와 Action View도 Engines와 다른 플러그인의 뷰를 사용합니다.

문서화

Ruby on Rails 가이드 프로젝트는 Rails 2.3에 대한 추가 가이드를 발행했습니다. 또한 별도 사이트에서는 Edge Rails에 대한 업데이트된 가이드를 제공합니다. 다른 문서화 노력에는 Rails 위키의 재출시와 Rails 책에 대한 초기 계획이 포함됩니다.

Ruby 1.9.1 지원

Rails 2.3은 Ruby 1.8 또는 최근 출시된 Ruby 1.9.1에서 실행되는 경우 모든 테스트를 통과해야 합니다. 그러나 1.9.1로 이동하려면 데이터 어댑터, 플러그인 및 기타 종속성이 Ruby 1.9.1과 호환되는지 확인해야 합니다.

Active Record

Active Record에는 새로운 기능과 버그 수정이 많이 포함되어 있습니다. 주요 기능에는 중첩 속성, 중첩 트랜잭션, 동적 및 기본 스코프, 일괄 처리 등이 포함됩니다.

중첩 속성

Active Record는 이제 중첩 모델의 속성을 직접 업데이트할 수 있습니다:

class Book < ActiveRecord::Base
  has_one :author
  has_many :pages

  accepts_nested_attributes_for :author, :pages
end

중첩 속성을 활성화하면 관련 자식 레코드와 함께 레코드를 자동(및 원자적으로) 저장할 수 있고, 자식 인식 유효성 검사와 중첩 폼 지원(나중에 설명)이 가능합니다.

또한 :reject_if 옵션을 사용하여 추가된 새 레코드에 대한 요구 사항을 지정할 수 있습니다:

accepts_nested_attributes_for :author,
  :reject_if => proc { |attributes| attributes['name'].blank? }

중첩 트랜잭션

Active Record는 이제 중첩 트랜잭션을 지원합니다. 이를 통해 다음과 같은 코드를 작성할 수 있습니다:

User.transaction do
  User.create(:username => 'Admin')
  User.transaction(:requires_new => true) do
    User.create(:username => 'Regular')
    raise ActiveRecord::Rollback
  end
end

User.find(:all)  # => 'Admin'만 반환

중첩 트랜잭션을 통해 내부 트랜잭션을 롤백할 수 있지만 외부 트랜잭션의 상태에는 영향을 미치지 않습니다. 트랜잭션을 중첩하려면 명시적으로 :requires_new 옵션을 추가해야 합니다. 그렇지 않으면 중첩 트랜잭션이 단순히 부모 트랜잭션의 일부가 됩니다(Rails 2.2에서와 같이). 내부적으로는 세이브포인트를 사용하여 진정한 중첩 트랜잭션이 없는 데이터베이스에서도 지원됩니다. 또한 테스트 중 트랜잭션 고정과 잘 작동하도록 하는 약간의 마법이 있습니다.

동적 스코프

Rails의 동적 파인더(색상과 맛으로 find_by_color_and_flavor와 같은 메서드를 동적으로 만들 수 있음)와 명명된 스코프(재사용 가능한 쿼리 조건을 currently_active와 같은 친숙한 이름으로 캡슐화할 수 있음)에 대해 잘 알고 있을 것입니다. 이제 동적 스코프 메서드도 사용할 수 있습니다. 아이디어는 온더플라이 필터링과 메서드 체이닝을 허용하는 구문을 만드는 것입니다. 예를 들면 다음과 같습니다:

Order.scoped_by_customer_id(12)
Order.scoped_by_customer_id(12).find(:all,
  :conditions => "status = 'open'")
Order.scoped_by_customer_id(12, 계속해서 Ruby on Rails 2.3 릴리스 노트를 번역하겠습니다.

### 기본 스코프

Rails 2.3에서는 명명된 스코프와 유사한 _기본 스코프_ 개념을 도입합니다. 기본 스코프는 모델 내의 모든 명명된 스코프 또는 find 메서드에 적용됩니다. 예를 들어 `default_scope :order => 'name ASC'` 작성할  있으며, 해당 모델에서 레코드를 검색할 때마다 이름순으로 정렬됩니다(물론 옵션을 재정의하면 예외).

* 주요 기여자: Paweł Kondzior
*  많은 정보: [Edge Rails 새로운 : 기본 스코프](http://archives.ryandaigle.com/articles/2008/11/18/what-s-new-in-edge-rails-default-scoping)

### 일괄 처리

Active Record 모델에서 메모리 압력을 줄이면서 많은 레코드를 처리할  있도록 `find_in_batches` 사용할  있습니다:

```ruby
Customer.find_in_batches(:conditions => {:active => true}) do |customer_group|
  customer_group.each { |customer| customer.update_account_balance! }
end

대부분의 find 옵션을 find_in_batches에 전달할 수 있습니다. 그러나 레코드 반환 순서를 지정할 수 없으며(기본적으로 기본 키의 오름차순으로 반환됨), :limit 옵션을 사용할 수 없습니다. 대신 :batch_size 옵션을 사용하여 각 배치에 반환되는 레코드 수를 설정할 수 있습니다(기본값은 1000).

새로운 find_each 메서드는 개별 레코드를 반환하는 find_in_batches의 래퍼를 제공합니다(기본 배치 크기는 1000):

Customer.find_each do |customer|
  customer.update_account_balance!
end

소수의 레코드(1000개 미만)의 경우 일반 find 메서드와 자체 루프를 사용해야 합니다.

콜백에 대한 다중 조건

Active Record 콜백을 사용할 때 :if:unless 옵션을 동일한 콜백에 결합하고 배열로 여러 조건을 제공할 수 있습니다:

before_save :update_credit_rating, :if => :active,
  :unless => [:admin, :cash_only]
  • 주요 기여자: L. Caviola

having을 사용한 찾기

Rails에는 이제 그룹화된 찾기에서 레코드를 필터링하기 위한 :having 옵션이 find(그리고 has_manyhas_and_belongs_to_many 연관에도) 있습니다. SQL 배경이 깊은 사람들이 알고 있듯이, 이를 통해 그룹화된 결과를 기반으로 필터링할 수 있습니다:

developers = Developer.find(:all, :group => "salary",
  :having => "sum(salary) > 10000", :select => "salary")

MySQL 연결 다시 연결

MySQL은 연결에 대한 다시 연결 플래그를 지원합니다. 이 플래그가 true로 설정되면 클라이언트가 연결이 끊어진 경우 포기하기 전에 서버에 다시 연결을 시도합니다. database.yml에서 MySQL 연결에 대해 reconnect = true를 설정할 수 있습니다. 기본값은 false이므로 기존 애플리케이션의 동작은 변경되지 않습니다.

기타 Active Record 변경 사항

  • has_and_belongs_to_many 프리로딩에 대한 생성된 SQL에서 불필요한 AS가 제거되어 일부 데이터베이스에서 더 잘 작동합니다.
  • ActiveRecord::Base#new_record?가 이제 nil이 아닌 false를 반환합니다.
  • has_many :through 연관에서 테이블 이름 인용에 대한 버그가 수정되었습니다.
  • 특정 타임스탬프로 updated_at 타임스탬프를 지정할 수 있습니다: cust = Customer.create(:name => "ABC Industries", :updated_at => 1.day.ago)
  • find_by_attribute! 호출 실패에 대한 더 나은 오류 메시지.
  • Active Record의 to_xml 지원이 :camelize 옵션 추가로 약간 더 유연해졌습니다.
  • before_update 또는 before_create에서 콜백을 취소하는 버그가 수정되었습니다.
  • JDBC를 통한 데이터베이스 테스트를 위한 Rake 작업이 추가되었습니다.
  • validates_length_of:in 또는 :within 옵션과 함께 사용자 정의 오류 메시지를 사용합니다(제공된 경우).
  • 범위된 선택에 대한 카운트가 제대로 작동하므로 Account.scoped(:select => "DISTINCT credit_limit").count와 같은 작업을 수행할 수 있습니다.
  • ActiveRecord::Base#invalid?가 이제 ActiveRecord::Base#valid?의 반대로 작동합니다.

Action Controller

Action Controller는 렌더링, 라우팅 및 기타 영역에서 상당한 변화를 선보입니다.

통합 렌더링

ActionController::Base#render는 무엇을 렌더링할지 결정하는 데 훨씬 더 똑똑해졌습니다. 이제 무엇을 렌더링할지만 알려주면 올바른 결과를 얻을 수 있습니다. 이전 Rails 버전에서는 렌더링하기 위해 명시적 정보를 제공해야 했습니다:

render :file => '/tmp/random_file.erb'
render :template => 'other_controller/action'
render :action => 'show'

이제 Rails 2.3에서는 렌더링할 대상을 간단히 제공할 수 있습니다:

render '/tmp/random_file.erb'
render 'other_controller/action'
render 'show'
render :show

Rails는 선행 슬래시, 내장 슬래시 또는 전혀 없음에 따라 파일, 템플릿 및 작업 간에 선택합니다. 다른 렌더링 스타일(:inline, :text, :update, :nothing, :json, :xml, :js)은 여전히 명시적 옵션이 필요합니다.

애플리케이션 컨트롤러 이름 변경

항상 application.rb의 특수한 이름이 신경 쓰였던 사람들은 기쁘게 생각할 것입니다! 이제 application_controller.rb로 변경되었습니다. 또한 rake rails:update:application_controller 작업을 통해 이를 자동으로 수행할 수 있으며, rake rails:update 프로세스의 일부로 실행됩니다.

HTTP 다이제스트 인증 지원

Rails에 이제 HTTP 다이제스트 인증에 대한 기본 지원이 포함되어 있습니다. 이를 사용하려면 사용자의 비밀번호를 반환하는 블록과 함께 authenticate_or_request_with_http_digest를 호출합니다(그런 다음 전송된 자격 증명과 비교하기 위해 해시됨):

class PostsController < ApplicationController
  Users = {"dhh" => "secret"}
  before_filter :authenticate

  def secret
    render :text => "Password Required!"
  end

  private
  def authenticate
    realm = "Application"
    authenticate_or_request_with_http_digest(realm) do |name|
      Users[name]
    end
  end
end

더 효율적인 라우팅

Rails 2.3에는 라우팅 관련 두 가지 중요한 변경 사항이 있습니다. formatted_ 라우트 헬퍼가 제거되었고, 대신 :format을 옵션으로 전달합니다. 이를 통해 라우트 생성 프로세스가 리소스당 50% 줄어들고 메모리 사용량도 상당히 줄어듭니다(대규모 애플리케이션에서 최대 100MB). 코드에서 formatted_ 헬퍼를 사용하는 경우 아직 작동하지만 이 동작은 더 이상 사용되지 않으며, 새 표준을 사용하여 해당 라우트를 다시 작성하면 애플리케이션이 더 효율적입니다. 또 다른 큰 변화는 Rails가 이제 routes.rb 외에 여러 라우팅 파일을 지원한다는 것입니다. RouteSet#add_configuration_file을 사용하여 언제든지 추가 라우트를 로드할 수 있습니다 - 현재 로드된 라우트를 지우지 않고도 말이죠. 이 변경 사항은 Engines에 가장 유용하지만 라우트를 일괄적으로 로드해야 하는 모든 애플리케이션에서 사용할 수 있습니다.

Rack 기반 지연 로드 세션

Action Controller 세션 저장소의 기반을 Rack 수준으로 내리는 큰 변화가 있었습니다. 이로 인해 코드에 상당한 작업이 필요했지만 Rails 애플리케이션에는 완전히 투명합니다(보너스로 이전 CGI 세션 핸들러에 대한 지저분한 패치가 제거되었습니다). 그러나 중요한 이유는 하나 있습니다: Rails 애플리케이션과 동일한 세션 저장소 핸들러(따라서 동일한 세션)에 액세스할 수 있다는 것입니다. 또한 세션은 이제 지연 로드됩니다(프레임워크의 나머지 부분에 대한 로드 개선과 일치). 따라서 더 이상 세션을 명시적으로 비활성화할 필요가 없습니다. 그냥 참조하지 않으면 로드되지 않습니다.

MIME 유형 처리 변경

Rails의 MIME 유형 처리에는 몇 가지 변경 사항이 있습니다. 첫째, MIME::Type은 이제 =~ 연산자를 구현하므로 동의어가 있는 유형의 존재를 확인할 때 훨씬 깨끗해집니다:

if content_type && Mime::JS =~ content_type
  # 멋진 일을 합니다
end

Mime::JS =~ "text/javascript"        => true, 계속해서 Ruby on Rails 2.3 릴리스 노트를 번역하겠습니다.

### MIME 유형 처리 변경 (계속)

Mime::JS =~ "application/javascript" => true

다른 변경 사항은 프레임워크가 이제 JavaScript 확인 시 Mime::JS를 사용한다는 것입니다. 이를 통해 이러한 대안을 깨끗하게 처리할 수 있습니다.

respond_to의 최적화

Rails-Merb 팀 합병의 첫 열매 중 하나로, Rails 2.3에는 respond_to 메서드에 대한 일부 최적화가 포함되어 있습니다. respond_to는 MIME 유형에 따라 컨트롤러의 결과를 다르게 포맷할 수 있도록 하는 데 널리 사용됩니다. method_missing 호출을 제거하고 프로파일링과 미세 조정을 거쳐 세 가지 형식 간에 전환하는 간단한 respond_to에서 초당 요청 수가 8% 향상되었습니다. 가장 좋은 점은 애플리케이션 코드를 전혀 변경할 필요가 없다는 것입니다.

캐싱 성능 향상

Rails는 이제 원격 캐시 저장소에서 읽은 내용을 요청별 로컬 캐시에 보관하여 불필요한 읽기를 줄이고 사이트 성능을 높입니다. 이 작업은 원래 MemCacheStore로 제한되었지만 이제 필요한 메서드를 구현하는 모든 원격 저장소에서 사용할 수 있습니다.

지역화된 뷰

Rails는 이제 설정된 로케일에 따라 지역화된 뷰를 제공할 수 있습니다. 예를 들어 Posts 컨트롤러에 show 작업이 있다고 가정합시다. 기본적으로 app/views/posts/show.html.erb를 렌더링합니다. 그러나 I18n.locale = :da를 설정하면 app/views/posts/show.da.html.erb를 렌더링합니다. 지역화된 템플릿이 없는 경우 장식되지 않은 버전이 사용됩니다. Rails에는 현재 Rails 프로젝트에서 사용 가능한 번역을 반환하는 I18n#available_localesI18n::SimpleBackend#available_locales도 포함되어 있습니다.

또한 동일한 체계를 사용하여 public 디렉토리의 구조 파일을 지역화할 수 있습니다. public/500.da.html 또는 public/404.en.html이 작동합니다.

부분 범위의 번역

번역 API에 대한 변경으로 부분 내에서 키 번역을 더 쉽고 반복적이지 않게 작성할 수 있습니다. people/index.html.erb 템플릿에서 translate(".foo")를 호출하면 실제로 I18n.translate("people.index.foo")를 호출하게 됩니다. 키 앞에 마침표를 붙이지 않으면 API가 범위를 지정하지 않습니다.

기타 Action Controller 변경 사항

  • ETag 처리가 약간 정리되었습니다. Rails는 응답 본문이 없거나 send_file로 파일을 보낼 때 ETag 헤더를 보내지 않습니다.
  • Rails가 IP 스푸핑을 확인하는 것이 문제가 될 수 있습니다(예: 휴대폰에서 많은 트래픽을 처리하는 사이트). 이 경우 ActionController::Base.ip_spoofing_check = false를 설정하여 확인을 완전히 비활성화할 수 있습니다.
  • ActionController::Dispatcher가 자체 미들웨어 스택을 구현하며 rake middleware로 확인할 수 있습니다.
  • 쿠키 세션에 이제 지속적인 세션 식별자가 있으며 서버 측 저장소와 API 호환성이 있습니다.
  • send_filesend_data:type 옵션에 기호를 사용할 수 있습니다. 예: send_file("fabulous.png", :type => :png).
  • map.resources:only:except 옵션이 중첩 리소스에 더 이상 상속되지 않습니다.
  • 번들된 memcached 클라이언트가 1.6.4.99 버전으로 업데이트되었습니다.
  • expires_in, stale?fresh_when 메서드에 프록시 캐싱과 잘 작동하도록 하는 :public 옵션이 추가되었습니다.
  • :requirements 옵션이 추가 RESTful 멤버 경로와 제대로 작동합니다.
  • 얕은 경로가 이제 네임스페이스를 제대로 존중합니다.
  • polymorphic_url이 불규칙한 복수 이름을 가진 객체를 더 잘 처리합니다.

Action View

Rails 2.3의 Action View에는 중첩 모델 폼, render 개선, 날짜 선택 도우미에 대한 더 유연한 프롬프트, 자산 캐싱 속도 향상 등이 포함됩니다.

중첩 객체 폼

(Active Record 섹션에서 설명한 대로) 부모 모델이 자식 객체에 대한 중첩 속성을 허용하는 경우 form_forfield_for를 사용하여 중첩 폼을 만들 수 있습니다. 이러한 폼은 임의로 깊게 중첩될 수 있어 과도한 코드 없이 복잡한 객체 계층을 단일 뷰에서 편집할 수 있습니다. 예를 들어 다음과 같은 모델이 있다고 가정합시다:

class Customer < ActiveRecord::Base
  has_many :orders

  accepts_nested_attributes_for :orders, :allow_destroy => true
end

Rails 2.3에서 다음과 같은 뷰를 작성할 수 있습니다:

<% form_for @customer do |customer_form| %>
  <div>
    <%= customer_form.label :name, 'Customer Name:' %>
    <%= customer_form.text_field :name %>
  </div>

  <!-- 여기서 customer_form 빌더 인스턴스에 fields_for를 호출합니다.
   블록은 orders 컬렉션의 각 멤버에 대해 호출됩니다. -->
  <% customer_form.fields_for :orders do |order_form| %>
    <p>
      <div>
        <%= order_form.label :number, 'Order Number:' %>
        <%= order_form.text_field :number %>
      </div>

  <!-- 모델의 allow_destroy 옵션을 통해 자식 레코드 삭제가 가능합니다. -->
      <% unless order_form.object.new_record? %>
        <div>
          <%= order_form.label :_delete, 'Remove:' %>
          <%= order_form.check_box :_delete %>
        </div>
      <% end %>
    </p>
  <% end %>

  <%= customer_form.submit %>
<% end %>

부분 렌더링의 스마트화

render 메서드는 여러 해 동안 점점 더 똑똑해졌고, 이제는 더 스마트해졌습니다. 객체나 컬렉션이 있고 적절한 부분이 있으며 명명이 맞는 경우 이제 단순히 객체를 렌더링하면 작동합니다. 예를 들어 Rails 2.3에서 다음과 같은 렌더링 호출이 뷰에서 작동합니다(적절한 명명이 전제됨):

# @article에 대한 render :partial => 'articles/_article',
# :object => @article와 동일
render @article

# @articles에 대한 render :partial => 'articles/_article',
# :collection => @articles와 동일
render @articles

날짜 선택 도우미에 대한 프롬프트

Rails 2.3에서는 컬렉션 선택 도우미와 마찬가지로 다양한 날짜 선택 도우미(date_select, time_selectdatetime_select)에 대한 사용자 정의 프롬프트를 제공할 수 있습니다. 프롬프트 문자열 또는 다양한 구성 요소에 대한 개별 프롬프트 문자열의 해시를 제공할 수 있습니다. 또한 :prompttrue로 설정하여 사용자 정의 일반 프롬프트를 사용할 수 있습니다:

select_datetime(DateTime.now, :prompt => true)

select_datetime(DateTime.now, :prompt => "Choose date and time")

select_datetime(DateTime.now, :prompt =>
  {:day => 'Choose day', :month => 'Choose month',
   :year => 'Choose year', :hour => 'Choose hour',
   :minute => 'Choose minute'})

AssetTag 타임스탬프 캐싱

Rails의 정적 자산 경로에 “캐시 버스터"로 타임스탬프를 추가하는 관행에 익숙할 것입니다. 이를 통해 서버에서 변경할 때 브라우저 캐시의 오래된 복사본이 제공되지 않도록 합니다. Action View의 cache_asset_timestamps 구성 옵션을 통해 이 동작을 수정할 수 있습니다. 캐싱을 활성화하면 Rails는 자산을 처음 제공할 때 타임스탬프를 계산하고 해당 값을 저장합니다. 이를 통해 정적 자산을 더 적은 (비싼) 파일 시스템 호출로 제공할 수 있지만, 서버가 실행되는 동안 자산을 수정하더라도 클라이언트가 변경 사항을 인식하지 못할 수 있습니다.

객체로서의 자산 호스트

자산 호스트가 Edge Rails에서 더 유연해졌습니다. 특정 객체로 자산 호스트를 선언할 수 있으며, 이 객체는 호출에 응답합니다. 이를 통해 필요한 복잡한 로직을 자산 호스팅에 구현할 수 있습니다.

grouped_options_for_select 도우미 메서드

Action View에는 이미 선택 컨트롤을 생성하는 데 도움이 되는 많은 도우미가 있지만 이제 grouped_options_for_select가 하나 더 추가되었습니다. 이 메서드는 문자열 배열 또는 해시를 받아 optgroup 태그로 래핑된 option 태그 문자열로 변환합니다. 예를 들면 다음과 같습니다:

grouped_options_for_select([["Hats", ["Baseball Cap","Cowboy Hat"]]],
  "Cowboy Hat", "Choose a product...")

다음과 같은 결과를 반환합니다:

<option value="">Choose a product...</option>
<optgroup label="Hats">
  <option value="Baseball Cap">Baseball Cap</option>
  <option selected="selected" value="Cowboy Hat">Cowboy Hat</option>
</optgroup>

폼 선택 도우미에 대한 비활성화된 옵션네, 계속해서 Ruby on Rails 2.3 릴리스 노트를 번역하겠습니다.

폼 선택 도우미에 대한 비활성화된 옵션

(selectoptions_for_select 등) 폼 선택 도우미는 이제 :disabled 옵션을 지원하며, 이 옵션은 비활성화된 값의 단일 값 또는 배열을 허용합니다:

select(:post, :category, Post::CATEGORIES, :disabled => 'private')

다음과 같은 결과를 반환합니다:

<select name="post[category]">
<option>story</option>
<option>joke</option>
<option>poem</option>
<option disabled="disabled">private</option>
</select>

런타임에 컬렉션에서 선택 및/또는 비활성화할 옵션을 결정하는 익명 함수를 사용할 수도 있습니다:

options_from_collection_for_select(@product.sizes, :name, :id, :disabled => lambda{|size| size.out_of_stock?})

템플릿 로딩에 대한 참고 사항

Rails 2.3에는 특정 환경에 대해 캐시된 템플릿을 활성화하거나 비활성화할 수 있는 기능이 포함되어 있습니다. 캐시된 템플릿을 사용하면 렌더링될 때 새 템플릿 파일을 확인하지 않으므로 속도가 빨라집니다. 그러나 서버를 다시 시작하지 않고는 템플릿을 "온더플라이"로 교체할 수 없습니다.

대부분의 경우 프로덕션에서 템플릿 캐싱을 켜는 것이 좋습니다. 이를 위해 production.rb 파일에 다음 설정을 추가할 수 있습니다:

config.action_view.cache_template_loading = true

이 줄은 새 Rails 2.3 애플리케이션에 기본적으로 생성됩니다. 이전 Rails 버전에서 업그레이드한 경우 Rails는 프로덕션과 테스트에서 템플릿을 기본적으로 캐시하지만 개발에서는 그렇지 않습니다.

기타 Action View 변경 사항

  • CSRF 보호를 위한 토큰 생성이 단순화되었습니다. Rails는 이제 세션 ID로 작업하는 대신 ActiveSupport::SecureRandom에 의해 생성된 단순한 무작위 문자열을 사용합니다.
  • auto_link가 이제 :target:class와 같은 옵션을 생성된 이메일 링크에 제대로 적용합니다.
  • autolink 도우미가 약간 정리되어 더 깨끗하고 직관적입니다.
  • current_page?가 URL에 여러 쿼리 매개변수가 있는 경우에도 제대로 작동합니다.

Active Support

Active Support에는 Object#try의 도입을 포함하여 몇 가지 흥미로운 변경 사항이 있습니다.

Object#try

많은 사람들이 try()를 사용하여 객체에 대한 작업을 시도하는 것을 채택했습니다. 특히 뷰에서 <%= @person.try(:name) %>와 같이 작성하면 nil 확인을 피할 수 있습니다. 이제 이 기능이 Rails에 내장되어 있습니다. Rails에서 구현된 대로 try()는 개인 메서드에 대해 NoMethodError를 발생시키고 객체가 nil인 경우 항상 nil을 반환합니다.

  • 더 많은 정보: try()

Object#tap 백포트

Object#tapRuby 1.9와 1.8.7에 추가된 기능으로, Rails에 있던 returning 메서드와 유사합니다. 블록에 yield하고 yield된 객체를 반환합니다. Rails에는 이제 이를 이전 Ruby 버전에서도 사용할 수 있도록 하는 코드가 포함되어 있습니다.

XMLmini에 대한 교체 가능한 파서

Active Support의 XML 구문 분석 지원은 다양한 파서를 지정할 수 있도록 더 유연해졌습니다. 기본적으로 표준 REXML 구현을 사용하지만 필요한 gem이 설치된 경우 더 빠른 LibXML 또는 Nokogiri 구현을 쉽게 지정할 수 있습니다:

XmlMini.backend = 'LibXML'

TimeWithZone의 소수 초

TimeTimeWithZone 클래스에는 시간을 XML 친화적 문자열로 반환하는 xmlschema 메서드가 포함되어 있습니다. Rails 2.3부터 TimeWithZoneTime과 마찬가지로 반환되는 문자열의 소수 초 부분에 대한 자릿수를 지정하는 인수를 지원합니다:

Time.zone.now.xmlschema(6) # => "2009-01-16T13:00:06.13653Z"

JSON 키 인용

"json.org” 사이트의 사양을 살펴보면 JSON 구조의 모든 키는 문자열이어야 하며 큰따옴표로 인용되어야 합니다. Rails 2.3부터 숫자 키를 포함하여 여기에 맞게 처리합니다.

기타 Active Support 변경 사항

  • Enumerable#none?을 사용하여 요소 중 하나도 제공된 블록과 일치하지 않는지 확인할 수 있습니다.
  • Active Support delegates를 사용하는 경우 :allow_nil 옵션을 사용하면 대상 객체가 nil인 경우 예외가 아닌 nil을 반환할 수 있습니다.
  • ActiveSupport::OrderedHash: 이제 each_keyeach_value를 구현합니다.
  • ActiveSupport::MessageEncryptor는 신뢰할 수 없는 위치(쿠키 등)에 정보를 암호화하는 간단한 방법을 제공합니다.
  • Active Support의 from_xml은 더 이상 XmlSimple에 의존하지 않습니다. 대신 Rails에는 자체 XmlMini 구현이 포함되어 있으며, 필요한 기능만 포함됩니다. 이를 통해 Rails에 포함된 XmlSimple 복사본을 제거할 수 있습니다.
  • 개인 메서드를 메모이제이션하면 결과가 개인 메서드가 됩니다.
  • String#parameterize에 선택적 구분자를 허용합니다: "Quick Brown Fox".parameterize('_') => "quick_brown_fox".
  • number_to_phone이 이제 7자리 전화번호를 허용합니다.
  • ActiveSupport::Json.decode가 이제 \u0000 스타일 이스케이프 시퀀스를 처리합니다.

Railties

Rack 변경 사항 외에도 Railties(Rails 자체의 핵심 코드)에는 Rails Metal, 애플리케이션 템플릿, 조용한 백트레이스 등 많은 중요한 변경 사항이 있습니다.

Rails Metal

Rails Metal은 Rails 애플리케이션 내에서 초고속 엔드포인트를 제공하는 새로운 메커니즘입니다. Metal 클래스는 라우팅과 Action Controller를 우회하여 원시 속도를 제공합니다(물론 Action Controller의 모든 기능이 없습니다). 이는 Rails를 Rack 애플리케이션으로 만들고 노출된 미들웨어 스택을 만드는 최근 기반 작업을 기반으로 합니다. Metal 엔드포인트는 애플리케이션이나 플러그인에서 로드할 수 있습니다.

애플리케이션 템플릿

Rails 2.3에는 Jeremy McAnally의 rg 애플리케이션 생성기가 통합되었습니다. 이는 Rails에 템플릿 기반 애플리케이션 생성 기능이 내장되었음을 의미합니다. 모든 애플리케이션에 포함하는 일련의 플러그인(많은 다른 사용 사례 중 하나)이 있는 경우 템플릿을 한 번 설정하고 rails 명령을 실행할 때마다 다시 사용할 수 있습니다. 기존 애플리케이션에 템플릿을 적용하는 Rake 작업도 있습니다:

$ rake rails:template LOCATION=~/template.rb

이 작업은 프로젝트에 이미 포함된 코드 위에 템플릿의 변경 사항을 적용합니다.

더 조용한 백트레이스

thoughtbot의 Quiet Backtrace 플러그인을 기반으로 하여 Test::Unit 백트레이스에서 선택적으로 행을 제거할 수 있게 되었습니다. Rails 2.3에는 ActiveSupport::BacktraceCleanerRails::BacktraceCleaner가 코어에 구현되어 있습니다. 이를 통해 필터(백트레이스 행에 대한 regex 기반 대체 수행)와 silencer(백트레이스 행 완전 제거)를 지원합니다. Rails는 새 애플리케이션에서 가장 일반적인 소음을 제거하기 위해 자동으로 silencer를 추가하며, 사용자 고유의 추가 사항을 보유할 config/backtrace_silencers.rb 파일을 작성합니다. 이 기능을 통해 백트레이스에서 발생하는 모든 gem의 출력도 더 깨끗해집니다.

지연 로드/자동 로드를 통한 개발 모드의 더 빠른 부팅 시간

Rails(및 종속성)의 일부 부분이 실제로 필요할 때만 메모리로 로드되도록 많은 작업이 수행되었습니다. Active Support, Active Record, Action Controller, Action Mailer 및 Action View와 같은 핵심 프레임워크는 이제 autoload를 사용하여 개별 클래스를 지연 로드합니다. 이 작업을 통해 메모리 사용량을 낮추고 전반적인 Rails 성능을 향상시킬 수 있습니다.

또한 preload_frameworks 옵션을 사용하여 핵심 라이브러리를 시작 시 자동 로네, 계속해서 Ruby on Rails 2.3 릴리스 노트를 번역하겠습니다.

지연 로드/자동 로드를 통한 개발 모드의 더 빠른 부팅 시간 (계속)

드할지 여부를 지정할 수도 있습니다. 이 옵션은 기본적으로 false이므로 Rails가 부분 부분 자동 로드되지만, 때로는 모든 것을 한 번에 로드해야 하는 경우도 있습니다 - Passenger와 JRuby가 그렇습니다.

rake gem 작업 재작성

다양한 경우에 잘 작동하도록 rake gem 작업의 내부가 상당히 수정되었습니다. 이제 gem 시스템은 개발 및 런타임 종속성의 차이를 알고, 더 견고한 압축 해제 시스템을 가지며, gem 상태에 대한 더 나은 정보를 제공하고, 처음부터 “닭과 달걀” 종속성 문제에 더 강합니다. JRuby에서 gem 명령을 사용하거나 이미 벤더링된 gem을 가져오려는 종속성에 대한 수정 사항도 있습니다.

기타 Railties 변경 사항

  • CI 서버를 빌드하기 위한 Rails 업데이트 지침이 업데이트되고 확장되었습니다.
  • 내부 Rails 테스트가 Test::Unit::TestCase에서 ActiveSupport::TestCase로 전환되었으며 Rails 코어에는 Mocha가 필요합니다.
  • 기본 environment.rb 파일이 정리되었습니다.
  • dbconsole 스크립트가 이제 모두 숫자 비밀번호를 사용할 수 있습니다.
  • Rails.root가 이제 Pathname 객체를 반환하므로 기존 코드에서 join 메서드를 직접 사용할 수 있습니다.
  • CGI 및 FCGI 디스패칭을 처리하는 /public 내의 다양한 파일이 더 이상 기본적으로 생성되지 않습니다(필요한 경우 --with-dispatchers를 사용하여 rails 명령을 실행하거나 나중에 rake rails:update:generate_dispatchers로 추가할 수 있습니다).
  • Rails 가이드가 AsciiDoc에서 Textile 마크업으로 변환되었습니다.
  • 스캐폴딩된 뷰와 컨트롤러가 약간 정리되었습니다.
  • script/server가 이제 --path 인수를 허용하여 특정 경로에서 Rails 애플리케이션을 마운트할 수 있습니다.
  • 구성된 gem이 누락된 경우 gem rake 작업이 환경의 많은 부분을 건너뜁니다. 이를 통해 gem이 누락되어 rake gems:install을 실행할 수 없었던 많은 “닭과 달걀” 문제를 해결할 수 있습니다.
  • Gem은 이제 정확히 한 번만 압축 해제됩니다. 이를 통해 파일에 읽기 전용 권한으로 압축된 gem(hoe 등)과 관련된 문제가 해결됩니다.

Deprecated

이 릴리스에서는 몇 가지 오래된 코드가 더 이상 사용되지 않습니다:

  • 검사기, 수확기 및 생성기 스크립트에 의존하는 (상당히 드문) Rails 개발자의 경우, 이러한 스크립트가 더 이상 핵심 Rails에 포함되지 않습니다. 필요한 경우 irsprocessscripts 플러그인에서 복사본을 가져올 수 있습니다.
  • render_component는 Rails 2.3에서 “더 이상 사용되지 않음"에서 "존재하지 않음"으로 전환됩니다. 여전히 필요한 경우 render_component 플러그인을 설치할 수 있습니다.
  • Rails 구성 요소에 대한 지원이 제거되었습니다.
  • script/performance/request를 실행하여 통합 테스트 기반 성능을 확인하는 사람들은 새로운 트릭을 배워야 합니다. 이 스크립트가 핵심 Rails에서 제거되었습니다. 동일한 기능을 제공하는 새로운 request_profiler 플러그인을 설치할 수 있습니다.
  • ActionController::Base#session_enabled?는 세션이 지연 로드되기 때문에 더 이상 사용되지 않습니다.
  • protect_from_forgery:digest:secret 옵션이 더 이상 사용되지 않으며 효과가 없습니다.
  • 일부 통합 테스트 도우미가 제거되었습니다. response.headers["Status"]headers["Status"]가 더 이상 아무것도 반환하지 않습니다. Rack은 반환 헤더에 "Status"를 허용하지 않습니다. 그러나 statusstatus_message 도우미를 계속 사용할 수 있습니다. response.headers["cookie"]headers["cookie"]가 더 이상 클라이언트에 보낸 모든 CGI 쿠키를 반환하지 않습니다. headers["Set-Cookie"]를 검사하여 원시 쿠키 헤더를 확인하거나 cookies 도우미를 사용하여 보낸 쿠키의 해시를 가져올 수 있습니다.
  • formatted_polymorphic_url이 더 이상 사용되지 않습니다. 대신 :format을 사용하여 polymorphic_url을 사용하세요.
  • ActionController::Response#set_cookie:http_only 옵션이 :httponly로 이름이 변경되었습니다.
  • to_sentence:connector:skip_last_comma 옵션이 :words_connector, :two_words_connector:last_word_connector 옵션으로 대체되었습니다.
  • file_field 컨트롤로 multipart 폼을 게시하면 이제 컨트롤러에 nil이 제출되며, 이는 Rack의 multipart 파서와 이전 Rails 파서 간의 차이 때문입니다.

크레딧

릴리스 노트는 Mike Gunderloy가 작성했습니다. 이 Rails 2.3 릴리스 노트 버전은 Rails 2.3 RC2를 기반으로 작성되었습니다.