Как кэшировать JSON в рубине на рельсах?

Обновить

December 2018

Просмотры

2.8k раз

5

Я смущен о том, как использовать JSON в моих рельсах (2.3.5) приложении. Это те элементы, которые мне нужны:

  1. шаблон HTML
  2. данные в формате JSON
  3. Javascript для отображения данных в шаблоне (я использую PURE )

JSON данные, рассчитанный с использованием вспомогательных методов (рельсов и мои собственные,), довольно большой, и это не меняется часто (в общем случае это сноска, заголовок и некоторые другие части страницы), поэтому она должна быть помещена в кэше. Что такое правильный способ сделать это?

Я попробовал 3 подхода.

A.

 - html template and javascript to render data placed in the view html.erb
 - method to get json data placed in the helper
    <script type="text/javascript">
      var data= <%= helper_method %>;
    </script>

Проблема: как кэшировать данные JSON?

B.

 - html template and javascript to render data placed in the view html.erb
 - method to get json data is a controller action
     def footer
        expires_in(4.hours)
        render :json => { calculated_data }
     end
 - ajax request in javascript
      $.ajax({
        type: "GET",
        url: "<%=footer_path %>",
        success: function(data){
          render json data in html template
        }
      });

Проблема: второй запрос отправить на сервер ...

C.

 - html template and javascript to render data placed in the view html.erb
 - method to get json data is a controller action
     def footer
        expires_in(4.hours)
        render :json => { calculated_data }
     end
 - data in javascript
    <script type="text/javascript" src="<%=footer_path %>">
    </script>

Проблемы: как я могу передать результат этого сценария в переменную, которую я могу использовать в JavaScript, что делает данные в шаблоне?

В случае В и С существует необходимость включения помощников в контроллере (методы расчета данных JSON), который является весьма некрасиво решением.

Что должно быть правильным решением для этого? Какой подход для этого, соответствующий ему нужно?

Спасибо за все предложения.

1 ответы

21

Нет ответов, но я не нашел решение. Для тех, кто мог бы иметь подобную проблему, возможно, это позволит сэкономить время для кого-то ...

Я использовал подход A и кэш Rails. У меня есть метод в помощнике

def footer
  return Rails.cache.fetch('footer', :expires_in => 4.hours){
    caluclate_data_with_other_methods.to_json
  }
end

Просто это...