0

我的 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 控制器的一种帮手。不是一般的应用模型。

4

1 回答 1

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_pathsconfig/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 运算符(在此处了解更多信息),将 Array 扩展为要传递的参数列表,render而不是将整个返回的 Array 作为第一个参数发送。

于 2013-04-29T11:35:01.473 回答