2012-07-12 5 views
0

레일즈 3.2.6 응용 프로그램을 사용하여 로그인해야합니다. 또한 레일스 엔진이 /api에 마운트되어있어 인증 없이도 특정 부분에 JSON API를 제공합니다.Rails 3.2 엔진 이상한 before_filter

GET /api/something 
GET/
GET /api/something 

모든 것이 예상대로 홈 페이지는 HTML 페이지를 렌더링 그들이해야대로 API 요청이 JSON을 반환 작동 : 나는 레일 서버를 걷어차 다음과 같은 요청을

.

이상한 부분이 있습니다. 레일즈 서버를 시작한 직후에이 순서대로 요청을하면 :

GET/
GET /api/something 
GET /api/something 

그런 다음 API 요청이 실패합니다. API 엔진에 루트 Rails 앱의 이전 필터가 실행되어 API 엔진에없는 UserSessionsController#new으로 리디렉션되어 실패합니다. 루트 Rails 앱 대신 API 엔진에 먼저 요청하는 경우 API 엔진은 필터 전에 상속하지 않습니다. 이 이상한 부분에 빛이 비추어지면 큰 것이 될 것입니다.

현재 나의 계획은 API 엔진을 적절하게 자체 장착 된 Rack 앱으로 전환하는 것입니다. 이 시점에서 엔진이라고 생각되는 유일한 이유는 내 앞에 누군가가 엔진을 정말 좋아하기 때문입니다.

+0

올바르게 이해 했으므로 루트 앱에'before_filter : authenticate_user'가있는 것 같습니다. 맞습니까? – bor1s

답변

1

여러 번 파고 들자 나는 문제를 발견했습니다. 그것은 엔진 자체와 함께했습니다. 나는 프로젝트의 창작에 책임이 없다는 것을 지적해야하며, 지금은 프로젝트의 창작에 책임이있다. ...

app/controllers/api_engine/application_controller.rb

class ApplicationController < ActionController::Base 
    before_filter :foo_bar 
    layout :application 
end 

그리고 우리의 엔진은 api_engine라고하고 ApiEngine 모듈에서 분리 가지고있다 :

는 ... 우리의 호스트 레일 애플 리케이션이 말할 수 있습니다

app/controllers/application_controller.rb :

module ApiEngine 
    class ApplicationController < ActionController::Base 
    layout false 
    end 
end 

app/controllers/api_engine/post_controller.rb :

module ApiEngine 
    class PostController < ApplicationController 
    # code goes here... 
    end 
end 

당신은 이미 내가 어디로 갈지 알고 있니? 문제는 Rails의 동적로드와 엔진을 어리 석게 구성하는 것의 조합입니다.

서버에 만든 첫 번째 요청이 엔진의 PostController에 때, post_controller.rb 파일이 ApiEngine 모듈 내에서 ApplicationController 일정을 통해 오는 필요합니다. 그러나 ::ApiEngine::ApplicationController이 정의되어 있지 않으므로 ::ApplicationController이 있는지 확인합니다. 엔진에서 application_controller.rb을 찾으러가는 것입니다.

그러나 첫 번째 요청이 ApplicationController을 정의하는 호스트 앱으로 이동하면 엔진이 요청을 받으면 루트 앱에서 ApplicationController을 사용하여 간단하게 끝나게되며 클래스의 자체 버전은 필요하지 않습니다.

이 솔루션은 엔진의 lib/api_engine/engine.rb 파일에하는 config.after_initialize 블록 내에서 올바른 응용 프로그램 컨트롤러 파일이 필요합니다, 상당히 간단하다

module ApiEngine 
    class Engine < Rails::Engine 
    isolate_namespace ApiEngine 
    config.after_initialize do 
     require "api_engine/application_controller" 
    end 
    end 
end 

을 그것은 특별히 다른 사람의 코드를 처리, 추적하기가 조금 까다했다, 당신은 특정한 "기본적인"것들이 그들이하는 것처럼 작동한다고 가정하는 경향이 있습니다. 다행스럽게도이 답변은 다른 누구도 비슷한 이상한 상황에 처했을 때 유용 할 것입니다 :)

+0

http://stackoverflow.com/questions/10042348/rails-3-2-engine-layouts – Chamnap