【问题标题】:rails caching or locally storing query parameters?轨道缓存或本地存储查询参数?
【发布时间】:2017-06-21 01:30:05
【问题描述】:

我尝试为 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(); 

【问题讨论】:

    标签: javascript ruby-on-rails caching session-storage


    【解决方案1】:

    如果您想要每个用户缓存,您可以使用会话 ID 作为缓存键的一部分:

    cache_key = session.id + search_term_web.to_query
    Rails.cache.write({ id: session.id }, search_term_web)
    

    您还可以使用用户 ID 或任何其他唯一标识符。您不仅可以使用字符串作为缓存键,还可以使用数组或哈希。

    您也可以将内容存储在会话存储中 - 但是 the default store (CookieStore) 的大小非常有限,这是由浏览器对 cookie 施加的。如果您打算存储来自 API 调用的响应之类的内容,则应使用其他存储机制,例如 Redis 或 Memcached。

    但是会话在模型中不可用 - 您需要将会话传递到模型中或在控制器中处理缓存。

    【讨论】:

    • 感谢您的想法。但它在我的代码中不起作用。这个终于成功了。 request_ip = request.ip session[request_ip] = params[:q]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-11
    • 2019-04-29
    • 2012-12-01
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多