在rails应用程序中放置控制器助手类的位置

时间:2013-04-29 11:12:51

标签: ruby-on-rails ruby-on-rails-3

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

1 个答案:

答案 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的参数列表,而不是将整个返回的数组作为第一个论点。