gpt4 book ai didi

ruby - 如何在 sinatra/padrino 应用程序/ Controller 中干涸(失败)实体获取?

转载 作者:太空宇宙 更新时间:2023-11-03 16:00:50 25 4
gpt4 key购买 nike

在构建 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 中这是通过“资源”建模的。我的 Controller 往往是混合的,部分路由将取决于资源 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

最佳答案

如果你想在知道请求无效/发生错误后立即停止处理请求,你可以使用 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 .

关于ruby - 如何在 sinatra/padrino 应用程序/ Controller 中干涸(失败)实体获取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25971766/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com