2014-09-22 34 views
2

在建設西納特拉或Padrino的應用程序,我經常寫這樣如何在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 

我認爲Rails中,這是通過「Ressources」爲藍本。我的控制器往往是混合的,部分路由將取決於資源ID(將從任何數據庫中獲取),其他則不會。

可以使用哪些圖案來烘乾它?我知道的before處理 (僞代碼,但還沒有看到一個真正聰明的實現 - 它肯定有某處)

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

或把類似的代碼的方法,先打電話與每個路線需求。

儘管如此,我在幾乎所有的Sinatra教程中都看到類似的代碼片段,是不是有更好的選擇?如果我忽略它,我特別感興趣的是padrino方法。

這裏是如何的代碼,我想有可能看起來像

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

如果你想停止處理請求,只要你知道請求是無效的/一個錯誤發生,您可以使用Sinatras halt 。它會立即停止進一步處理,並允許您定義一個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 

有用於halt更加輸出選項,如提到你可以返回一個ERB模板,你還可以返回,而不是純文本等JSON。 Check the docs here

+0

謝謝。這似乎是一種有效且方便的方法,並「停止」使用的語義正確的東西。我會等待進一步的答案,並接受你作爲唯一可用的模式,如果沒有更多的來:) – Felix 2014-09-25 10:33:25

+0

好,我對其他方法也很感興趣,即使我非常確定停下來的路要走。你可以在http://myronmars.to/n/dev-blog/2012/01/why-sinatras-halt-is-awesome找到一個更高級的例子。 – maddin2code 2014-09-25 10:38:49

相關問題