我的rails应用程序有一个json api。 对此api的操作可能会返回错误。我目前正在使用类似的东西:
respond_with({:success=>false, :message=>"error_message"}, :status=>400, :location=>nil)
控制器中的
我想让这更好。因此,我决定创建一个错误类及其视图,因此我可以在控制器中执行类似的操作:
error.new({message=>"my message", :status =>400})
render error
我的问题是。我应该在哪里放置ApiError
课程?
我不喜欢把它放在模特文件夹上,因为它是api控制器的帮手。不是一般的应用程序模型。
答案 0 :(得分:2)
我在申请后将这样的类命名为lib/my_app/
。例如,如果您的应用为FooBar
,我会有一个lib/foo_bar/api
文件夹,并将您的课程定义为lib/foo_bar/api/error.rb
class FooBar::Api::Error
# ...
end
可以使用FooBar::Api::Error.new(...)
如果您选择这条路线,则需要在lib/
config.autoload_paths
添加到config/application.rb
config.autoload_paths += Dir["#{config.root}/lib"]
您知道如何让
render error
代码返回错误状态代码吗?不使用(:status => error.status)
当然,但据我所知,你不能只是通过error
。你必须打电话给
error = FooBar::Api::Error.new({ message: "Some error message" }, status: :bad_request)
render *error.to_a
然后,您必须在to_a
FooBar::Api::Error
方法
class FooBar::Api::Error
def initialize(data={}, options={})
@data = data
@options.reverse_merge! status: 200
end
def to_a
[@data, @options]
end
end
当您致电error.to_a
时,您将返回一个数组,其中包含要传递给render
的参数列表。上面渲染线上的*
是Splat运算符(了解更多here),将数组扩展为要传递给render
的参数列表,而不是将整个返回的数组作为第一个论点。