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



我的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作为第一个参数发送。

最新更新