我的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
放在哪里?我不喜欢把它放在models文件夹,因为它是api控制器的辅助工具。不是一般的应用模型
我在我的应用程序之后命名一个类,并将其放在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/application.rb
config.autoload_paths
中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
你必须在FooBar::Api::Error
上定义一个to_a
方法
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操作符(在这里了解更多信息),将Array展开为传递给render
的参数列表,而不是将整个返回的Array作为第一个参数发送。