2013-05-26 3 views
3

나는 버전 네임 스페이스 내 API를 가지고네임 스페이스 API의 자원 루트

namespace :api do 
    namespace :v1 do 
    resources :posts 
    end 
end 

하지만 지금은 내 컨트롤러가있을 때 할 어떤 루트는 그것을 정의되어 있지 않기 때문에 나는 Post에 대한 경로 오류를 얻을 redirect_to @post. 자동으로에 있어야 감지 redirect_to @post을 만들 수있는 방법이 있나요

def create 
    @post = Post.new(params[:post]) 
    if @post.save 
    redirect_to api_v1_post_url(@post) 
    # or redirect_to [:api, :v1, @post] 
    else 
    # ... 
    end 
end 

:

def create 
    @post = Post.new(params[:post]) 
    if @post.save 
    redirect_to @post 
    else 
    # ... 
    end 
end 

undefined method `post_url' for #<Api::V1::PostsController:0x007fb9c5fc8858> 

은 내가 명명 된 경로와 세상의 그 끝은 아니다로 리디렉션 내 컨트롤러를 업데이트 할 수 있습니다 알고 오른쪽 API 버전 (레일은 api_v1_post_url을 사용하기 때문에 작동합니까?) redirect_to을 덮어 쓸 수 있지만 실제로는 네임 스페이스가 url_for을 인식하도록하고 싶습니다. 레일이이 문제를 해결할 수 있을까요? (당신이 지금 사용하는 일) 레일 라우터 루비의 세 가지 옵션

네임 스페이스이 있습니다

답변

5

namespace :api do 
    namespace :v1 do 
    resources :posts 
    end 
end 

컨트롤러 : app/controllers/api/v1/PostsController.rb

예 URL 경로 : example.com/api/v1/posts

범위 (만 URL 경로 설정)

scope 'api/v1' do 
resources :posts 
end 

컨트롤러 : app/controllers/PostsController.rb

예 URL 경로 : example.com/api/v1/posts

모듈 (전용 컨트롤러 세트)

scope module: 'api/v1' do 
    resources :posts 
end 

컨트롤러 : app/controllers/api/v1/PostsController.rb

URL 경로 예 : example.com/posts

위에서 알 수 있듯이 3 개 모두는 원하는 방식과 비슷하지만 원하는 방식과 유사합니다.

난처한 긴 경로 도우미 api_v1_post_url을 사용하는 것에 대한 유일한 해결책은 명명 된 경로를 사용하여 경로를 단축하는 것입니다.

namespace :api, :as => "a" do 
    namespace :v1, :as => "1" do 
    resources :posts 
    end 
end 

그래서 대신 api_v1_post_url

def create 
    @post = Post.new(params[:post]) 
    if @post.save 
    redirect_to api_v1_post_url(@post) 
    end 
end 

당신이 조금 짧은 a_1_post_url

def create 
    @post = Post.new(params[:post]) 
    if @post.save 
    redirect_to a_1_post_url(@post) 
    end 
end 

마지막을 사용할 수 있습니다, 나는, 나는 지능적으로 네임 스페이스 지정을 자동으로 감지 할 수있는 방법을 알고 두려워하지 오전 있어요 레일 라우팅.

희망 하시겠습니까?

관련 문제