使用参数结果按 json 中的计数进行搜索

Doing search by count in json with params results

我正在尝试在 json 中实施计数器过滤器。当我访问 url api/v1/contacts?Results=2 [sic] 时,我只想从我的 json.

中获得两个结果

为此,我在我的控制器中创建了两个方法:一个从数据库中获取信息并将渲染转换为 json 的索引,以及一个 returns json 返回。

class Api::V1::ContactsController < ApplicationController

  before_action :results, only: [:index]

  def index
    @contacts = Contact.all
    render json: {results: @contacts[0..@number_results]}
  end


  def results
    if params[:results]
      results = params[:results]["results"]
      @number_results = results.to_i
    else
      @number_results = 3
    end
  end
end

不管为 results = 输入的值如何,@number_results 的值设置为 0,所以每当我输入 results = I 时,只得到第一个结果json。如果我不在 url 中键入 results =,它会将 @number_results 设置为 3,并在屏幕上显示四个结果。

有人能帮忙吗?

首先,在你提出的url中,"Results"是大写的。如果这就是您打算提交的方式,那么您需要在后端以这种方式进行搜索。但由于您的所有代码都使用小写字母 "results",我们将采用它。您应该以相同的方式修改您的 url:api/v1/contacts?results=2.

如果这就是您的 url 的样子,那么您输入的号码可以在 params[:results] 中访问。如果不传递任何参数,则 params[:results] 将 return nil。在检查它是否存在之前,不要在参数上调用 #to_i,因为 nil.to_i0

综上所述,这可能是您想要的:

class Api::V1::ContactsController < ApplicationController
  def index
    number_results = params[:results] || 3
    @contacts = Contact.all.limit(number_results.to_i)
    render json: {results: @contacts}
  end
end

如果params[:results]的结果是nil,则number_results赋值3

现在我们使用 #limit 来 return 仅请求的联系人数量。这允许我们完全取消 #results 方法。您还可以摆脱 before_action 回调。