2014-09-22 12 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

相关问题