2017-02-03 14 views
0

Я пытаюсь сохранить строку запроса для вызова API, чтобы я мог использовать его снова для следующих 30 или 60 или более результатов. Когда я использовал кеширование в Rails, запрос передается между различными компьютерами в Интернете. Это не то, что я хотел сделать. Он должен быть только для одного пользователя, а затем этого одного пользователя, который не вошел в систему или что-то может получить следующие результаты, нажав на ссылку.кэширование рельсов или локальное сохранение параметров запроса?

Так что я попробовал javascript вместо того, чтобы захватить входные данные из текстового поля, а затем сохранить его в sessionStorage. Он работает один раз, а затем я не знаю, как изменить этот sessionStorage снова.

Код приведен ниже. Любые идеи о том, как правильно хранить строки запросов в рельсах для следующего вызова 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(); 

ответ

1

Если вы хотите в кэш пользователя вы можете использовать идентификатор сессии в качестве части ключа кэша:

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

Вы также можете использовать идентификатор пользователя или любой другой уникальный идентификатор. Вы не ограничены использованием строк в качестве ключей кеша - вы также можете использовать массивы или хеши.

Вы также можете хранить вещи в хранилище сеансов - однако the default store (CookieStore) имеет очень маленький размер, указанный браузером при помощи куки-файлов. Если вы собираетесь хранить что-то вроде ответа от вызова API, вы должны использовать другой механизм хранения, такой как Redis или Memcached.

Однако сеанс недоступен в модели - либо вам необходимо передать сеанс в вашу модель, либо обработать кеширование в контроллере.

+0

Благодарим вас за идею. Но это не сработало в моем коде. В конце концов, этот трюк сделал. request_ip = request.ip сеанс [request_ip] = params [: q] – Jutta