Header

  1. View current page

    RubyOnRails 2.1 - What's New!

05. 액션컨트롤러

액션컨트롤러

액션 컨트롤러는 웹으로부터 요청을 받아 특정 작업 수행하고, 그 결과로 무언가를 렌더링 할 것인지, 혹은 다른 액션으로 리다이렉트 할 것인지 등을 결정하는 책임을 가진 레이어다.

액션은 컨트롤러 안에서 퍼블릭 메서드로 정의되며, 이 메서드는 라우팅에 의해 자동으로 실행된다.

ActionController::Routing

Map.root

지금부터는 map.root를 정의할 때, 여기에 별칭(alias)을 사용해 중복을 피할 수 있다(DRY).

레일스의 이전 버전에서는 다음과 같이 사용했었다:

  1. map.new_session :controller => 'sessions', :action => 'new'
    map.root :controller => 'sessions', :action => 'new'

이제는 다음과 같이 할 수 있다:

  1. map.new_session :controller => 'sessions', :action => 'new'
    map.root :new_session

라우트 인식

라우트 인식(Routes recognition)을 구현하는데 예전에는 라우트 하나하나를 모두 검사했었는데, 이 방식은 간혹 긴 응답시간을 보이기도 했다. 그래서 새로운 방식의 더 똑똑한 구현이 도입되었다. 이제 라우트의 트리를 생성하고, 라우트 인식은 유사한 라우트를 접두어로 묶고, 건너뛰기도 한다. 이 방식은 시간을 대략 2.7배 정도 단축시켰다.

모든 구현은 recognition_optimisation.rb 파일에 있으며, 실제 동작에 대한 자세한 사항은 주석으로 잘 설명하고 있다. 이 구현에 대하여 더 많은 정보를 얻고자 한다면 소스코드 안에 있는 문서를 참고하길 바란다.

Assert_routing

이제 라우트를 테스트할 때 HTTP 메서드를 함께 사용할 수 있다. 아래 예제를 보라:

  1. assert_routing({ :method => 'put',
                            :path => '/product/321' },
                         { :controller => "product",
                           :action => "update",
                           :id => "321" })

Map.resources

영어가 아닌 언어를 사용하는 사이트가 있고, 이 사이트에서 라우트를 그 언어로 정의하고 싶다고 가정해보자. 예를 들어 아래 URL이 있다.

  1. http://www.mysite.com.br/products/1234/reviews

이 URL 대신 다음과 같이 하기를 원한다고 해보자.

  1. http://www.mysite.com.br/produtos/1234/comentarios

이것은 이미 가능하긴 하지만, 쉬운 방법이 아니며 레일스 관례에 반하는 것이기도 하다.

 

지금부터는 라우트에 개인화를 적용하기 위한 용도로 map.resources:as 옵션을 사용할 수 있다. 아래는 위 URL을 포트투갈어로 바꾸는 예제다.

  1. map.resources :products, :as => 'produtos' do |product|
      # product_reviews_path(product) ==
      # '/produtos/1234/comentarios’
      product.resources :product_reviews, :as => 'comentarios'
    end

ActionController::Caching::Sweeping

레일스의 이전 버전에서 sweeper를 선언할 때는, 클래스를 심볼을 사용하여 표현했다:

  1. class ListsController < ApplicationController
      caches_action :index, :show, :public, :feed
      cache_sweeper :list_sweeper, :only => [ :edit, :destroy, :share ]
    end

 

이제 심볼 대신 클래스를 직접 사용해 선언할 수 있게 되었다.

이는 sweeper가 모듈 안에 정의되어 있는 경우 필요하다. 물론 여전히 심볼를 사용할 수도 있지만, 아래처럼 하는 것도 가능하다.

  1. class ListsController < ApplicationController
      caches_action :index, :show, :public, :feed
      cache_sweeper OpenBar::Sweeper, :only => [ :edit, :destroy, :share ]
    end

 

History

Last edited on 07/04/2008 18:32 by humbroll

Comments (0)

You must log in to leave a comment. Please sign in.