我试图在我的json中实现一个反向过滤器。当我访问网址api/v1/contacts?Results=2
[原文如此]时,我想从我的json中得到两个结果。
为此,我在我的控制器中创建了两个方法:一个从数据库获取信息并将渲染器转换为json的索引,以及一个返回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的第一个结果。如果我没有在网址中输入results =
,则会将@number_results
设置为3
,并在屏幕上显示四个结果。
有人可以帮忙吗?
答案 0 :(得分:1)
首先,在您建议的网址中,&#34;结果&#34;资本化。如果您打算提交它,那么您需要在后端以这种方式搜索它。但是,由于您的所有代码都使用小写&#34;结果&#34;,我们将继续使用它。您应该以相同的方式修改您的网址:resources :authors do
resources: posts
end
。
如果这是您的网址的样子,那么您传入的号码可以在api/v1/contacts?results=2
中访问。如果您未传递参数,则params[:results]
将返回params[:results]
。在检查其存在之前,请不要在该参数上调用nil
,因为#to_i
是nil.to_i
。
所有这一切,这就是你想要的:
0
如果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
方法。您还可以摆脱#results
回调。