경로 및 리소스

기본 라우팅 규칙

현재 경로를 사용하여 경로를 살펴 보겠습니다rake routes:

$ rake routes Prefix Verb URI Pattern Controller#Action list_posts GET /list_posts(.:format) application#list_posts GET /show_post/:id(.:format) application#show_post new_post GET /new_post(.:format) application#new_post create_post POST /create_post(.:format) application#create_post GET /edit_post/:id(.:format) application#edit_post POST /update_post/:id(.:format) application#update_post POST /delete_post/:id(.:format) application#delete_post POST /create_comment_for_post/:post_id(.:format) application#create_comment POST /list_posts/:post_id/delete_comment/:comment_id(.:format) application#delete_comment list_comments GET /list_comments(.:format) application#list_comments 

레일스 규칙에 대한 핵심 통찰력 중 하나는 데이터 중심 앱(또는 루디 앱)이 사용자가 다음과 같은 응용 프로그램과 상호 작용할 수 있도록 매우 유사한 방법을 갖는 경향이 있다는 것입니다:

  • 페이지 목록을 보려면 뭔가의
  • 볼 무언가가
  • 여 새 인스턴스를 만들이 뭔가의
  • 실제로는 무언가를 만들
  • 보는 형태로 편집하의 인스턴스가
  • 실제로 업데이트가
  • 삭제

그 일곱”상호 작용 패턴” 은 일반적이다,레일을 제공하는 강한 집합의 규칙에서의 라우팅 컨트롤러,보기 및 형태로 도움을 그들에게는 워크플로 간단합니다. 우리는 지금 라우팅 부분에 초점을 맞출 것입니다.

라우팅의 경우,레일즈는 다음과 같은 방식으로 컨트롤러와 컨트롤러의 동작을 구조화하는 것이 좋습니다:

워크플로우 동사 경로 컨트롤러 동작
게시물 목록 표시 /게시물 게시물#색인
게시물 표시 가져 오기/게시물/:아이디 게시물#표시
게시물을 만들 페이지 표시 /게시물/새 게시물#새
게시물 만들기 게시물 /게시물 게시물#만들기
게시물 편집 페이지 표시 가져 오기 /게시물/:아이디/편집 게시물#편집
이 문제를 해결하기 위해 몇 가지 방법이 있습니다.
게시물 삭제 /게시물 삭제/:아이디 게시물#파괴

이 규칙을 따르도록 현재 라우팅의post부분을 변경할 수 있습니다:

# posts GET /list_posts -> GET /posts posts#index GET /show_post/:id -> GET /posts/:id posts#show GET /new_post -> GET /posts/new posts#new POST /create_post -> POST /posts posts#create GET /edit_post/:id -> GET /posts/:id/edit posts#edit POST /update_post/:id -> PUT/PATCH /posts/:id posts#update POST /delete_post/:id -> DELETE /posts/:id posts#destroy 

그리고routes.rb파일에,

Rails.application.routes.draw do ### posts ### get '/posts' => 'posts#index' get '/posts/new' => 'posts#new' get '/posts/:id' => 'posts#show' post '/posts' => 'posts#create' get '/posts/:id/edit' => 'posts#edit' patch '/posts/:id' => 'posts#update' put '/posts/:id' => 'posts#update' delete '/posts/:id' => 'posts#destroy' # comments later.. ... end 

이 새로운 패턴을 사용하면 웹 사이트 자체에 동사가 훨씬 적습니다.(GET/POST/PUT/PATCH/DELETE) 예를 들어/posts/:id과 같은 의미 체계를 제공합니다.

PUT은 최근PATCH가 이 동작에 대해 더 나은 시맨틱 일치로 결정될 때까지 리소스를 업데이트하는 데 사용되었습니다. 그 이후로 레일은PATCH를 선호하지만 두 동사를 모두 업데이트 할 수 있도록 이동했습니다.

나중에 보게 될 또 다른 변경 사항은ApplicationController에서 모든 것을 처리하는 대신 게시물과 관련된 모든 주소를PostsController로 라우팅한다는 것입니다. PostController의 액션 이름

  • 인덱스
  • 표시
  • 만들기
  • 편집
  • 업데이트
  • 파괴

또한 7 상호 작용에 해당하는 규칙입니다 패턴.

이것은 레일즈가 애플리케이션 개발자로서 사용자에게 부과하는 가장 강력한 규칙 세트입니다. 우리는 그것을 암기하기 위해 노력을하도록 요청합니다. 우리는 당신이 그렇게 할 수 있도록 책을 통해이 많은 시간을 다시 방문 할 것입니다.

여러 리소스에 대한 라우팅

때때로 여러 리소스가 있어야 합니다. 예를 들어 블로그 앱의 경우 댓글을 작성하기 위한 경로가 필요할 때마다 이 댓글이 작성된 게시물을 아는 것이 매우 중요합니다.

현재 이 작업을 수행하고 있습니다.:

post 'create_comment_for_post/:post_id' => 'application#create_comment' 

여러 관련 리소스가 있는 레일스 규칙은”가장 안쪽”리소스까지”포함하는”리소스로 시작하는 것입니다. 예를 들어,댓글에 대한 경로는 다음과 같이 변경됩니다:

post '/posts/:id/comments' => 'comments#create' delete '/posts/:post_id/comments/:id' => 'comments#destroy' get '/comments' => 'comments#index' 

“특정 게시물 아래에 댓글 만들기”및”특정 게시물 아래에 댓글 삭제”를 나타냅니다. 마지막 경로 인”시스템의 모든 댓글 표시”는 게시물 아래에”범위 지정”될 필요가 없습니다.

마지막 리소스가 자리 표시자:id를 사용하고 나머지는 모두:resource_id(예::post_id)가 되도록 합니다.

편안한

나머지는”대표 국가 이전”을 의미합니다. 확장 가능한 웹 서비스를 만드는 소프트웨어 아키텍처 스타일 및 지침입니다. 나머지는 웹 응용 프로그램을 구성하는 방법으로 여러 측면을 가지고 있지만 웹 응용 프로그램과 상호 작용하는 데 사용하는 인터페이스에 어떻게 적용되는지 살펴 보겠습니다.

휴식이 어떻게 링크의 의미를 단순화하는지 알아보려면 예제를 살펴보겠습니다. 우리가 온라인 피자 주문 서비스를 구축하고 있다고 가정 해 봅시다. 서비스 인터페이스의 구현은 다음과 같습니다.:

/check_order?order_id=2 /place_new_order /pizza_details?type=1 /pay_for_my_order?order_id=12 /cancel_order?order_id=3 /expedite_order?order_id=13 

편안한 인터페이스 디자인은 다음과 같습니다:

GET /orders/2 POST /orders GET /pizzas/1 POST /orders/12/payments DELETE /orders/3 POST /orders/13/expeditions 

편안한 인터페이스는”명사”또는”리소스”를 중심으로 인터페이스에서”동사”를 제거하는 대신 표준화 된 동사에 의존하는 것을 볼 수 있습니다(GET/POST/PUT/DELETE) 작업에 대한 잔혹한 의미를 제공합니다. 다음과 같은 동사check, place, cancel GET의 동사에 직접 매핑되어 검색,POST생성 및DELETE자원 파괴order. payexpediteorders에서paymentsexpeditions의 하위 자원을 생성하는 것으로 구성된다.

편안한 인터페이스 웹 응용 프로그램 상호 작용 패턴을 표준화하여 더 쉽게 이해하고 프로그래밍 할 수 있도록합니다. 인터페이스는 리소스 조작을 중심으로 이루어지기 때문에 응답은 훨씬 더 예측 가능합니다. 웹 서비스와의 상호 작용을 단순화하는 편안한 아키텍처 패턴의 비유는 관계형 데이터베이스와 데이터베이스 언어가 데이터 저장소를 단순화하는 방법입니다. 즉,모든 프로젝트에서 데이터와 상호 작용하기 위한 다른 명령어 집합을 학습해야 합니다. 관계형 데이터베이스는 공통 데이터 구조(테이블에 저장된 행과 열로 데이터 레코드)와 공통 인터페이스 세트를 제공했습니다.SELECT, INSERT, UPDATE 그리고DELETE은 모든 유형의 응용 프로그램을 지원할 수 있습니다.

웹앱을 위한 편안한 인터페이스를 채택하면 백엔드 데이터가 데이터베이스에 저장되는 방식에 맞춰 애플리케이션을 간소화하고 개발을 더 쉽게 할 수 있습니다. 우리는 다음 장에서 그것을 볼 수 있습니다.우리는 레일스의 라우팅 규칙 및 편안한 주소 패턴에 대해 이야기했습니다. 이제 우리의routes.rb파일은 다음과 같습니다:

### config/routes.rb ### Rails.application.routes.draw do ### posts ### get '/posts' => 'posts#index' get '/posts/new' => 'posts#new' get '/posts/:id' => 'posts#show' post '/posts' => 'posts#create' get '/posts/:id/edit' => 'posts#edit' patch '/posts/:id' => 'posts#update' put '/posts/:id' => 'posts#update' delete '/posts/:id' => 'posts#destroy' ### comments ### get '/comments' => 'comments#index' post '/posts/:id/comments' => 'comments#create' delete '/posts/:post_id/comments/:id' => 'comments#destroy' end 

사실,우리가posts섹션에서 가지고있는 것과 같은 경로는 매우 일반적이므로 레일스는 당신을 위해 그것들을 생성하는 데 도움이되는 특별한resources표기법을 제공합니다.

우리는 간단하게 할 수 있습니다:

resources :posts 

이 줄은 이전에 가지고 있던 8 줄을 자동으로 생성합니다. update동작의 경우 레일은 호환성을 위해PUTPATCH동사를 모두 허용합니다.

명령줄 환경에서bundle exec rake routes을 실행하여 정확히 동일한 경로 집합을 생성하는지 확인할 수 있습니다.

이 단일 라인은 8 개의 경로를 생성합니다. 우리의 경우 우리는 여기에 모든 경로를 필요로하는 일이,하지만 당신은 단지 경로의 하위 집합을 필요로하는 경우,당신은 더 명시 적으로 정의 할 수 있습니다:

resources :posts, only: 

위의 줄은 당신을 위해 3 개의 경로 만 생성합니다-bundle exec rake routes을 입력하여 확인하십시오.

중첩 리소스

레일스는 또한 리소스를 중첩하여 여러 리소스로 패턴을 만들 수 있습니다.:

### config/routes.rb ### Rails.application.routes.draw do resources :posts do resources :comments, only: end resources :comments, only: :index end 

bundle exec rake routes을 실행하고 출력을 확인하십시오.

경로 도우미

bundle exec rake routes을 실행할 때 이러한 경로 중 일부에 대한Prefix열을 확인합니다. 이들은 우리가 우리의 경로에 대한 레일’제공 경로 도우미를 사용하는 방법을 알고 도움이 여기에 있습니다. 컨트롤러와 뷰에서 이러한 접두사 뒤에_path를 사용하여 경로를 쉽게 만들 수 있습니다.

예:

posts_path # => '/posts' post_id = 123 post_comments_path(post_id) # => '/posts/123/comments' 

코드에서/posts/123/comments와 같은 경로를 직접 하드 코딩하는 대신 도우미를 사용하면 어떤 이점이 있습니까? (예를 들어,컨트롤러 작업에? 경로 도우미를 사용하려는 이유는 앱에서 경로 도우미를 변경하려는 경우 다른 경로를 반환하기 위해 경로 도우미를 사용하는 것이 훨씬 쉽기 때문입니다.:

get '/register', to: 'users#new', as: 'register' 

이 경로에”로”절을 추가 할 때bundle exec rake routes을 실행하면register이있는Prefix열이 표시되고register_path을 사용하여/register경로를 얻을 수 있습니다. 이제 경로를/login로 변경하려면해야 할 일은:

get '/login', to: 'users#new', as: 'register' 

이제 우리의register_path은 우리에게/login을줍니다. 레일스 앱에서 코드를 변경할 필요는 없습니다.

더 많은 라우팅 규칙

우리가 이동하기 전에,이제 우리가 이미 본 것의 몇 가지 변형뿐만 아니라 레일스 라우팅에서 우리가 사용할 수있는 다른 기능을 살펴 보자:

### config/routes.rb ### Rails.application.routes.draw do # pointing our homepage (root path) to posts#index root to: 'posts#index' # `match` & `via:` allow us to define one route and use several HTTP verbs # `as:` lets us define the name of the route prefix match '/authors/:id' => 'authors#update', via: , as: :update_author # update_author PUT|PATCH /authors/:id(.:format) authors#update resources :posts do # define extra params to pass for requests to a route get 'popular', on: :collection, action: :index, popular: true # popular_posts GET /posts/popular(.:format) posts#index {:popular=>true} get 'preview', on: :member # ... end # we can even use routes to redirect get '/home', to: redirect('/') end 

의 한 번에 하나 위에 나열된 모든 기능을 분해 할 수 있습니다.

  • 루트:root는 어떤 동작이”/”에 매핑되는지 지정하는 데 사용됩니다.이root는 경로 파일의 맨 위에 지정되어야하기 때문에 웹 사이트/앱의 루트 주소가 가장 일반적으로 사용됩니다.

  • 경기+경유: match은 하나 이상의 경로에 패턴을 일치시키는 데 사용됩니다. 또한 이 패턴을 사용하여 일치하는 데 사용할 수 있는 동사를 지정할 수도 있습니다. 이 작업은match메서드에 해시를 전달하여 수행합니다. 이 해시의 키는via이며 값은 동사의 배열입니다. matchget,postdelete와 같이 좀 더 일반적으로 사용되는 라우팅 방법의 보다 일반적인 목적 형태이다. 그것은 그 방법과 같은 모든 옵션을 취할 수 있지만,그 방법에 비해,그것은 좀 더 유연성을 제공합니다.
    예를 들어,match을 사용하여 두 개의 서로 다른 경로에 대해 일치하는 주소를 지정할 수 있습니다. 일반적으로이 작업을 수행하려면 하나 대신 두 개의 명령이 필요합니다. 위의 예에서 볼 수 있습니다. 그 다음 우리는via: 를 사용하여 요청을 발행하기 위해 어떤 동사를 사용할 수 있는지 지정한다. 그렇지 않으면 응용 프로그램의 보안에 부정적인 영향을 미칠 수 있습니다.
    match은 레일의 특정 동작으로 라우팅하는 또 다른 옵션을 제공합니다. 일반적으로getpost와 같이 더 일반적으로 사용되는HttpHelpers방법을 고수하는 것이 가장 좋습니다.

  • 다음과 같이:as:옵션을 경로 선언과 함께 사용하여 주소 도우미의 접두사를 변경할 수 있다고 조금 전에 언급했습니다. 이것은 다양한 방법으로 사용될 수 있습니다. 우리는as:을 사용하여 사용자 정의 도우미와 더 잘 일치시킬 수 있습니다. 다른 용도는 응용 프로그램 내의 리소스와 더 잘 일치하는 더 직관적인 것으로 현재 경로 도우미를 변경하는 것입니다.

  • 수집 경로:위의posts리소스 아래에/popular경로를 중첩하는 방법을 참조하십시오. 그런 다음on: :collection를 사용하여 이 경로를 중첩하는 리소스의 일부를 지정합니다. 그 컬렉션으로 간주되도록 우리는 많은 게시물이 있습니다. on: :collection를 지정하면”경로/posts/popular과 일치하십시오.”on: :collection를 추가하지 않은 경우 레일즈는이 경로가 게시물 컬렉션의 단일 구성원과 관련된 다른 리소스에 해당한다고 가정합니다. 이 경우 우리의 경로는/posts/:id/popular이 될 것입니다. 블록 형식을 사용하여 여러 컬렉션 경로를 지정할 수도 있습니다.

collection do get 'popular' end 
  • 추가 매개 변수 전달:우리는 항상 우리의params해시와 함께 전달되는 기본 매개 변수를 지정할 수 있습니다. 이를 지정하는 방법에는 두 가지가 있습니다.:
get 'popular', on: :collection, action: :index, popular: true 

popular: true 인기 노선이params해시를 통해 일치하는 우리의 행동으로 전달됩니다. 키가:popular이고 값이true입니다. 우리는 또한 우리의 경로 방법에 해시를 전달하여보다 명시 적 구문을 사용할 수 있습니다get,여기서 키는defaults:값은 우리가 우리의 행동에 전달하고자하는 매개 변수의 이름을 포함하는 또 다른 해시입니다.

get 'popular', on: :collection, action: :index, defaults: { popular: true} 
  • 멤버 경로:on: member을 사용하여 경로가 컬렉션의 멤버와 일치하도록 지정할 수 있습니다. 이 기능을 사용하면 동적 세그먼트가:id로 표시됩니다. 또한preview_post로 작성됩니다. 이 경로를on: member로 지정하면 레일스가이 특정 리소스의 구성원임을 알 수 있습니다. 이 게시물 아래에 중첩 된 또 다른 자원,하지만 더 밀접하게 연결 또는이 응용 프로그램에서 우리의 게시물에 관련된 아니라는 것을. 이 형식은 여러 컬렉션 경로를 정의하기 위해 블록 형식과 동일한 구문을 사용합니다.collectionmember로 바꿉니다.

  • 리디렉션:이 위의 예에 표시됩니다 그것에 대해 이야기 할 수있는 또 다른 개념이며,그 리디렉션입니다. 레일은 우리에게 경로와 함께 리디렉션 도우미를 사용하여 한 경로에서 다른 경로로 리디렉션 할 수있는 기능을 제공합니다.get '/home', to: redirect('/'). 누군가가 경로/home에 액세스하려고 하면 루트 경로/로 즉시 리디렉션됩니다. 우리는 또한 다음과 같은 것을 가질 수 있습니다:get '/home', to: redirect('/travel').

검토

레일 경로는 응용 프로그램 앞에 서 있습니다. 경로는 들어오는 요청을 해석하고:

  • paramsparams
  • resources매크로를 사용하여 편안한 경로를 매우 빠르게 생성할 수 있습니다.

답글 남기기

이메일 주소는 공개되지 않습니다.