기본 라우팅 규칙
현재 경로를 사용하여 경로를 살펴 보겠습니다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
. pay
과expedite
은orders
에서payments
과expeditions
의 하위 자원을 생성하는 것으로 구성된다.
편안한 인터페이스 웹 응용 프로그램 상호 작용 패턴을 표준화하여 더 쉽게 이해하고 프로그래밍 할 수 있도록합니다. 인터페이스는 리소스 조작을 중심으로 이루어지기 때문에 응답은 훨씬 더 예측 가능합니다. 웹 서비스와의 상호 작용을 단순화하는 편안한 아키텍처 패턴의 비유는 관계형 데이터베이스와 데이터베이스 언어가 데이터 저장소를 단순화하는 방법입니다. 즉,모든 프로젝트에서 데이터와 상호 작용하기 위한 다른 명령어 집합을 학습해야 합니다. 관계형 데이터베이스는 공통 데이터 구조(테이블에 저장된 행과 열로 데이터 레코드)와 공통 인터페이스 세트를 제공했습니다.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
동작의 경우 레일은 호환성을 위해PUT
과PATCH
동사를 모두 허용합니다.
명령줄 환경에서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
이며 값은동사의 배열입니다. match
은get
,post
및delete
와 같이 좀 더 일반적으로 사용되는라우팅 방법의 보다 일반적인 목적 형태이다. 그것은 그 방법과 같은 모든 옵션을 취할 수 있지만,그 방법에 비해,그것은 좀 더 유연성을 제공합니다.
예를 들어,match
을 사용하여 두 개의 서로 다른 경로에 대해 일치하는 주소를 지정할 수 있습니다. 일반적으로이 작업을 수행하려면 하나 대신 두 개의 명령이 필요합니다. 위의 예에서 볼 수 있습니다. 그 다음 우리는via:
를 사용하여 요청을 발행하기 위해 어떤 동사를 사용할 수 있는지 지정한다. 그렇지 않으면 응용 프로그램의 보안에 부정적인 영향을 미칠 수 있습니다.match
은 레일의 특정 동작으로 라우팅하는 또 다른 옵션을 제공합니다. 일반적으로get
및post
와 같이 더 일반적으로 사용되는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
로 지정하면 레일스가이 특정 리소스의 구성원임을 알 수 있습니다. 이 게시물 아래에 중첩 된 또 다른 자원,하지만 더 밀접하게 연결 또는이 응용 프로그램에서 우리의 게시물에 관련된 아니라는 것을. 이 형식은 여러 컬렉션 경로를 정의하기 위해 블록 형식과 동일한 구문을 사용합니다.collection
를member
로 바꿉니다. -
리디렉션:이 위의 예에 표시됩니다 그것에 대해 이야기 할 수있는 또 다른 개념이며,그 리디렉션입니다. 레일은 우리에게 경로와 함께 리디렉션 도우미를 사용하여 한 경로에서 다른 경로로 리디렉션 할 수있는 기능을 제공합니다.
get '/home', to: redirect('/')
. 누군가가 경로/home
에 액세스하려고 하면 루트 경로/
로 즉시 리디렉션됩니다. 우리는 또한 다음과 같은 것을 가질 수 있습니다:get '/home', to: redirect('/travel')
.
검토
레일 경로는 응용 프로그램 앞에 서 있습니다. 경로는 들어오는
-
params
params
-
resources
매크로를 사용하여 편안한 경로를 매우 빠르게 생성할 수 있습니다.