2014-09-22 4 views
2

, 나는 종종sinatra/padrino 앱/컨트롤러에서 엔티티 페치를 마르는 방법 (실패)? 시나 또는 대부가 애플 리케이션을 구축

get '/resource/:id' do 
    resource = Resource.find(params[:id]) 
    return status 404 if resource.nil? 
    # .. 
end 

과 같은 코드를 작성하거나 실제로, 나는이 "능숙"을 통해 모델링 레일 생각

flash[:warning] = "A Resource with id #{params[:id]} coud not be found". 
redirect back 

을 좋아합니다. 내 컨트롤러가 섞여있는 경향이 있습니다. 경로의 일부는 리소스 ID (어떤 db에서 가져 오겠습니까)에 의존하며, 다른 리소스는 그렇지 않습니다.

이 패턴을 말리는 데 사용할 수있는 패턴은 무엇입니까? 나는 before 핸들러 알고 (의사 코드,하지만 정말 스마트 구현을 보지 못했다! - 어딘가에 반드시 거기 밖으로)

before "*" do 
    @resource = Resource.get(params[:id]) 
    redirect_with_flash if @resource.nil? 
end 

또는 각 경로에서 먼저 전화를하는 방법에 유사한 코드를 넣어 요구 사항.

그래도 거의 모든 Sinatra 튜토리얼에서 유사한 코드 조각이 보입니다. 더 좋은 옵션이 아닌가요? 나는 그것을 간과한다면 특히 padrino 접근에 관심이있다. 여기

는 요청/오류가 사용할 수있는 발생했습니다 Sinatras halt 무효 알고있는 코드 내가 바로 당신이 요청을 처리 중지하려면

MyPadrinoApp::App.controllers :user do 
    associated_resource = User 
    associated_resource_error_flashs = { "404": "A User with %s could not be found" } 

    get :show, :with => :id, :resource_bound => :user do 
    render '/user/show' # in which @user is available 
    end 
end 

답변

2

처럼 보일 수 있습니다 싶은 방법입니다 . 즉시 처리를 중단하고 http 상태 코드 및 표시 할 메시지를 정의 할 수 있습니다. 응용 프로그램이 REST API에 관한 것이 아니라면 해당 오류 템플리트를 정의 할 수 있습니다.

요청한 리소스가 없기 때문에 요청이 유효하지 않게됩니다. 404로 대답하는 것이 정확하고 halt에게 응답에서이 상태 코드를 사용하도록 말할 수 있습니다.

아주 간단한 구현은 다음과 같을 수 있습니다

get '/resource/:id' do 
    resource = Resource.find(params[:id]) 
    halt 404, "A Resource with id #{params[:id]} could not be found" if resource.nil? 
    # .. 
end 

더 우아한 방법은 오류 처리에 대한 관심 도우미 방법을 사용하여 자원을로드하면 동일한 통화를 사용하는 것이 좋다 모든 노선.

helpers do 
    def load_resource 
    Resource.find(params[:id]) || halt(404, "A Resource with id #{params[:id]} could not be found") 
    end 
end 

get '/resource/:id' do 
    # load the resource via helper method 
    resource = load_resource 

    # if the resource doesn't exists, the request and processing is already dropped 
    .. 
end 

는 대신 등 일반 텍스트 그리고 JSON을 반환 할 수 있습니다, 당신은 ERB 템플릿을 반환 할 수 있습니다 언급 한 바와 같이, halt에 대한 더 많은 출력 옵션이 있습니다. Check the docs here.

+0

감사합니다. 이는 유효하고 편리한 접근법처럼 보이며 의미 상으로는 올바른 것을 사용하지 못하게합니다. 나는 더 이상의 대답을 기다릴 것이고, 더 이상 올 수없는 유일한 패턴으로 당신을 받아 들일 것입니다. – Felix

+0

좋았어, 나는 다른 방법에도 관심이있다. halt 사용에 대한보다 자세한 예제는 http://myronmars.to/n/dev-blog/2012/01/why-sinatras-halt-is-awesome에서 찾을 수 있습니다. – maddin2code