我尝试为API调用存储查询字符串,以便我可以再次使用它来获取下一个30或60或更多结果。当我在Rails中使用缓存时,查询将在Internet中的不同计算机之间传递。这不是我想做的。它应该仅适用于一个用户,然后这个未登录的用户或某些东西可以按链接获得下一个结果。
所以我尝试了javascript而不是从文本字段中获取输入,然后将其存储在sessionStorage中。它工作一次然后我不知道如何再次更改sessionStorage。
代码如下。有关如何在rails中正确存储查询字符串以进行下一次api调用的任何想法吗?
模型1
def self.search_results(search_term_web, params_web)
Rails.cache.write 'searchterm', search_term_web
results = good.search(search_term_web)
end
模型2
def self.search_results_again(params_web)
results = good.search(Rails.cache.write 'searchterm')
end
控制器
def search
if params[:q]
@params_web = {:count =>30, :offset => 0}
params[:bing] = @params_web
@q = User.search_results(params[:q], params[:good])
if @q
# render json: @q
render partial: "cognitives/q"
else
render status: :not_found, nothing: true
end
end
end
def search30
if Rails.cache.read 'searchterm'
@params_web = {:count =>30, :offset => 30}
params[:bing] = @params_web
@q = User.search_results_again(params[:good])
if @q
# render json: @q
render partial: "cognitives/q"
else
render status: :not_found, nothing: true
end
end
end
使用Javascript的另一种方法
var addsearchterm = function (){
localStorage.begriff = document.getElementById('web- text').value;
document.getElementById('begriff').innerHTML = localStorage.begriff;
};
addsearchterm();
答案 0 :(得分:1)
如果您需要每用户缓存,则可以将会话ID用作缓存密钥的一部分:
let selected = [{
id: 15,
name: 'Canada'
}, {
id: 25,
name: 'Germany'
}];
let all = [{
id: 15,
name: 'Canada'
}, {
id: 25,
name: 'Germany'
}, {
id: 32,
name: 'United States'
}, {
id: 40,
name: 'China'
}]
let ref = selected.reduce((obj, o) => (obj[o.id] = true, obj), {});
console.log(
all.filter(o => !ref[o.id])
)
您还可以使用用户ID或任何其他唯一标识符。您不仅限于使用字符串作为缓存键 - 您也可以使用数组或哈希值。
您还可以将内容存储在会话存储中 - 但the default store (CookieStore)的浏览器对Cookie的限制非常有限。如果您打算存储类似API调用的响应,您应该使用其他存储机制,如Redis或Memcached。
但是会话在模型中不可用 - 您需要将会话传递到模型中或处理控制器中的缓存。