获得一个Rails 4应用程序,该应用程序包含基本ApiConstraint
类中的路由,用于检查用户是否具有Accept
标头的正确值:
# app/routes.rb
scope(module: "v1", defaults: { format: :json }, constraints: ApiConstraint.new(version: 1)) do
# routes
end
# lib/api_constraint.rb
class ApiConstraint
attr_reader :version
def initialize(options)
@version = options[:version] || 1
end
def matches?(request)
regex = /.../
!!request.headers['Accept'].match(regex)
end
end
这一切都很好,但我希望在错误处理方面更加强大(来自true
的简单false
/ matches?
isn&# 39;足够)。有可能以某种方式只检查一次并提供正确的415 Unsupported Media Type
错误吗?我说一次,因为我认为我在routes.rb
的底部再次进行检查时看到了解决方法,例如:
match '*any', via: :all, to: -> (env) do
if env["HTTP_ACCEPT"].match(/.../)
[415, {}, "{ \"error\": \"Bad Accept header or something ... \" }"]
else
[404, {}, [ApiErrors.not_found.to_json]]
end
end
但这看起来真的很草率。我想避免使用像法拉第等东西这样的外部东西。我觉得这个有在Rails中是可能的,我只是不确定语法。我所看到的所有其他SO问题/博客文章似乎都没有提到这种功能。任何回复表示赞赏感谢。