加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 使用Her,Faraday在API中进行Rails分页

发布时间:2020-12-16 23:23:42 所属栏目:百科 来源:网络整理
导读:我一整天都试图解决这个问题,这让我发疯了. 我有两个rails应用程序,ServerApp和ClientApp. ClientApp使用Her gem通过API从ServerApp获取数据.在我需要分页信息之前,一切都很棒. 这是我用来获取订单的方法(这使用kamainari进行分页和搜索搜索): # ServerAppd
我一整天都试图解决这个问题,这让我发疯了.

我有两个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

它在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": [
      { ... }
    ]
  },...
]

但我需要分页信息.看起来我需要send it as metadata with my json.所以我改变了对此的回应:

respond_to do |format|
  format.json do
    render json: { orders: @orders.as_json(include: :documents),metadata: 'sent' }
  end
end

这确实发送了元数据,因此在我的ClientApp中,我可以编写@ orders.metadata并获取’sent’.但现在我的命令嵌套在’orders’中的数组中,所以我需要使用@ orders.orders,然后它将它视为数组而不是Her系列.

在做了一些阅读后,似乎通过标题发送分页信息是很多其他人这样做的方式(我能够使用this guide在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

然后,您可以按如下方式访问分页:

model = Model.all
    model.metadata[:pagination]

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读