Лучший способ отправки редко меняющихся данных JSON клиенту в рабочей среде - PullRequest
1 голос
/ 19 декабря 2011

Я разрабатываю чрезвычайно тяжелое для JavaScript приложение с использованием Rails 3.1.Я разработал область «администратор», в которой приложение можно настроить самостоятельно через веб-интерфейс с использованием моделей Rails.Ожидается, что эта часть базы данных будет меняться очень редко, но мне нужно иметь возможность изменить ее, поэтому администратор.

Сейчас я разрабатываю наилучший способ передачи данных в браузер.,Мне нужно, чтобы клиент загрузил данные до того, как само приложение JavaScript может быть запущено, поэтому я хотел бы по возможности избегать любых вызовов AJAX, потому что эти последующие запросы должны быть выполнены в первую очередь.

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

Я также не могу использовать встроенный код ERB в ресурсах, потому что, даже если я не прекомпилирую их, фактический файл ресурса должен быть изменен до того, как Rails примет изменения.Несмотря на то, что данные модели изменились, поскольку код ERB не изменился, Rails не создаст для меня новый файл ресурсов, даже если я коснусь файла (чтобы обновить временную метку), потому что его хэш MD5 не изменился.

На данный момент я собираюсь разбить и внедрить модели JSON непосредственно в шаблоны представлений, но мне не хочется этого делать (разделение данных и представлений и все такое).

Существуют ли более эффективные решения, такие как программный способ заставить Rails / Sprockets перекомпилировать определенный актив или все из них?

1 Ответ

0 голосов
/ 20 декабря 2011

Пока что я решил создать контроллер и представление JavaScript для него, используя respond_to.Пример:

class ConfigurationController < ApplicationController
  def index
    respond_to do |fmt|
      fmt.js
      # ...
    end
  end
end

Представление JS для этого контроллера выделяет данные модели:

<% InfrequentlyChangingModel.all.each do |record| %>
  AppData[<%= record.id %>] = (<%= record.to_json.html_safe %>);
<% end %>

Затем в представлении переднего плана я ссылаюсь на него, как на любой другой файл JavaScript:

<%= javascript_include_tag 'configuration' %>

Я все еще открыт для других предложений, но это самое чистое и наиболее похожее на Rails решение, которое я смог найти до сих пор.Он генерирует дополнительный запрос заранее (для файла js), но должен довольно хорошо кэшировать и избегать дополнительного AJAX.

...