d3v*_*kit 8 ruby json ruby-on-rails-3 faraday
我一整天都试图解决这个问题,这让我发疯了.
我有两个rails应用程序,ServerApp和ClientApp.ClientApp使用Her gem通过API从ServerApp获取数据.在我需要分页信息之前,一切都很棒.
这是我用来获取订单的方法(这使用kamainari进行分页和搜索搜索):
# ServerApp
def search
@search = Order.includes(:documents, :client).order('id desc').search(params[:q])
@orders = @search.result(distinct: true).page(params[:page]).per(params[:per])
respond_with @orders.as_json(include: :documents)
end
Run Code Online (Sandbox Code Playgroud)
它在json中返回一个哈希数组,Her用作订单的集合.这很好.
# Response
[
{
"client_id": 239,
"created_at": "2013-05-15T15:37:03-07:00",
"id": 2422,
"ordered_at": "2013-05-15T15:37:03-07:00",
"origin": "online",
"updated_at": "2013-05-15T15:37:03-07:00",
"documents": [
{ ... }
]
},
...
]
Run Code Online (Sandbox Code Playgroud)
但我需要分页信息.看起来我需要将其作为元数据发送给我的json.所以我改变了对此的回应:
respond_to do |format|
format.json do
render json: { orders: @orders.as_json(include: :documents), metadata: 'sent' }
end
end
Run Code Online (Sandbox Code Playgroud)
这确实发送了元数据,因此在我的ClientApp中,我可以编写@ orders.metadata并获取'sent'.但现在我的命令嵌套在'orders'中的数组中,所以我需要使用@ orders.orders,然后它将它视为数组而不是Her系列.
在做了一些阅读后,似乎通过标题发送分页信息是很多其他人这样做的方式(我能够使用本指南在after_filter中设置标题).但是我对如何在我的ClientApp中获取这些响应标头更加迷茫 - 我相信我需要一个法拉第中间件,但我只是没有运气让它工作.
如果有人知道我怎么能完成这件事,我将非常感激.我不能再花一天时间把头撞在墙上,但我觉得我只是解决这个问题的一个重要信息!
我遇到了同样的问题并通过添加我自己的中间件并重写"parse"和"on_complete"方法解决了这个问题,没有那么麻烦并且避免使用全局变量.
这是代码:
class CustomParserMiddleware < Her::Middleware::DefaultParseJSON
def parse(env)
json = parse_json(env[:body])
pagination = parse_json(env[:response_headers][:pagination_key]) || {}
errors = json.delete(:errors) || {}
metadata = json.delete(:metadata) || {}
{
:data => json,
:errors => errors,
:metadata => {
:pagination => pagination,
:additional_metadata => metadata
},
end
def on_complete(env)
env[:body] = case env[:status]
when 204
parse('{}')
else
parse(env)
end
end
end
Run Code Online (Sandbox Code Playgroud)
然后,您可以按如下方式访问分页:
model = Model.all
model.metadata[:pagination]
Run Code Online (Sandbox Code Playgroud)