2012-12-06 4 views
1

동일한 컨트롤러 작업으로 HTML에 대한 모든 요청을 처리하려는 앱을 작성하고 있습니다. JSON에 특정한 다른 경로가 있습니다. 여기 내 경로가 어떻게 생겼는지입니다 :Rails : 요청 형식에 따라 다른 컨트롤러로 라우팅

Blog::Application.routes.draw do 
    constraints format: :json do 
    resources :posts 
    end 

    match "(*path)" => "web#index" 
end 

문제는 constraints는 "이 경로를 건너 뛰고 요청에없는 경우 다음을 시도하기보다는"이 경로는 지정된 형식 작동 "으로 해석되고있는 것입니다 지정된 형식. " URL이 JSON 형식으로 제한되어 있기 때문에 브라우저에서 /게시물로 이동 즉

는 나에게 허용 아니 (406)을 제공합니다. 대신 요청이 HTML 인 경우 웹 # 색인으로 전달하고 요청이 JSON 인 경우 리소스가 많은 경로를 조회합니다. 어떻게이 일을 성취 할 수 있습니까? (레일 3.2.9를 사용.)

모든

답변

1

저는 이것에 대해 생각해 봤으며 결론에 도달했습니다.

  • HTTP 404 상태 코드를 반환하려는 경로가 일부 있기 때문에 모든 경로에서 단일 페이지 응용 프로그램 HTML을 반환하지 않을 수도 있습니다. 당신은 확실히 당신의 레일 라우터에서 모든 HTML 경로를 정의하는 것이 유리할 수있다
  • 다른 컨트롤러에 다른 형식을 라우팅해야
  • 당신이 그것을 사용할 수 있도록
  • 귀하의 HTTP 경로, 당신의 JSON 경로와 다른 것 자바 스크립트 라우터를 생성합니다. 이 작업을 수행하는 보석이 적어도 하나 있습니다.
  • 레일즈에는이 기능이 없으며이 보석 https://github.com/svenfuchs/routing-filter은 실제로 올바른 도구처럼 보이지 않습니다. 내 시도는 다음과 같습니다. Rails routing-filter route all html requests to one action
  • 라우팅 충돌을 피하기 위해 JSi API를 모듈 Api 아래에서 네임 스페이스로 설정하면 아무런 문제가 없습니다.
  • 단일 페이지 앱에서 Google에 콘텐츠가 표시되지 않거나 중복 된 콘텐츠가 금지됩니다.

는 정말 질문에 대답하지 않는 약간 다른 접근을했다,하지만 난 그것을 몇 가지 장점이 있다고 생각 :

여기

내 설정/routes.rb입니다

FooApp::Application.routes.draw do 

    # Route all resources to your frontend controller. If you put this 
    # in a namespace, it will expect to find another frontend controller 
    # defined in that namespace, particularly useful if, for instance, 
    # that namespace is called Admin and you want a separate single page 
    # app for an admin interface. Also, you set a convention on the names 
    # of your HTML controllers. Use Rails's action_missing method to 
    # delegate all possible actions on your frontend controllers. 

    def html_resources(name, options, &block) 
    resources(name, options.merge(:controller => "frontend"), &block) 
    end 

    # JSON API 
    namespace :api do 
    resources :things, :except => [:edit, :new] 
    end 

    # HTML 
    html_resources :things, :only => [:edit, :new, :index, :show] do 
    get :other_action 
    end 
end 


class FrontendController < ApplicationController 
    def action_missing(*args, &block) 
    render :index 
    end 
end 
0

우선 저도 같은 행동에 대해 서로 다른 컨트롤러가 "레일 방식"하지라고 생각합니다. 아마도 미들웨어의 저수준 사용자 정의 요청 처리기로 문제를 해결할 수 있습니다.

+1

하지를 정말로 .. 단일 페이지 응용 프로그램의 경우 이것은 정확히 원하는 것일 수 있습니다. Html 요청은 클라이언트 측에서 채워진 단순한 레이아웃을 생성합니다. Json 요청은 경로 별 json 출력을 생성합니다. – fifigyuri

+0

Google의 최고 Rails 사용자 중 일부가 이러한 종류의 컨트롤러 분리를 수행했으며 단일 페이지 앱에서 사용하기에 적합하다고 들었습니다. 얇은 컨트롤러를 사용하는 것이 가장 확실한 방법입니다. 각 컨트롤러 메소드에서 동작을 구성하는 대신 config/routes.rb에서 동일한 URL로 여러 URL을 라우팅하는 DRYness 및 단순성도 있습니다. 일반적으로 뚜렷한 관심사에 대해 컨트롤러 하나를 추가하는 것은 모든 컨트롤러를 그 관심사에 연결하는 것보다 낫습니다. 불타는 것에 대해 유감스럽게 생각하고 나는 더 나은 대답을 생각하려고 노력할 것입니다. – user1158559

관련 문제