Rails to_json проблема - PullRequest
       4

Rails to_json проблема

0 голосов
/ 26 апреля 2011

У меня странная проблема с методом to_json в моем приложении Rails 3. (по крайней мере, я думаю, что это связано с to_json)

В моем контроллере я получаю список всех библиотек, хранящихся в БД

@libraries = Library.where( "latitude IS NOT NULL AND longitude IS NOT NULL" )

А затем я создаю файл json, который содержит информацию библиотеки выше.

my_file = File.new("public/javascripts/libraries.json", "w")
my_file.write "var libs = {'libraries' : "
my_file.write @libraries.to_json( :only => [ :id, :name, :address, :latitude, :longitude ])
my_file.write "};"

Затем, на мой взгляд, я отображаю каждый объект библиотеки на Google Map. В файле просмотра я читаю файл json, загружая файл library.json как файл javascript.

Теперь проблема в том, что объекты библиотеки отображаются на карте Google ИНОГДА, но не всегда, и с помощью Firebug я смог определить, что иногда переменная "libs", которая содержится в файле JSON, " не определены».

Это заставляет меня думать, что файл не был полностью записан, или данные в файле не были полностью загружены. Но я не совсем уверен, что это такое.

Кто-нибудь знает, что может быть причиной этого?

Ответы [ 2 ]

1 голос
/ 26 апреля 2011

Я не совсем уверен, почему проблема существует, но я думаю, что это связано с файлом, который вы создаете.

Я бы предложил вам simply return the json data to the view, а затем вы можете обработать его на стороне клиента, используя javascript, jquery или любую другую платформу.

Таким образом, вы также можете убедиться в правильности данных, посмотрев их в Firebug.

ИЛИ

Вместо создания файла, просто hold the json data in a variable, и вы можете получить доступ к переменной в представлении.
Зачем создавать файл, если вы можете сделать это без него.

Причины:

  1. Создание файла - это процесс ввода-вывода, и это увеличит стоимость.
  2. Каждый раз, когда вы извлекаете данные из представления, вы делаете вызов извлечения, снова вызов IO. Вы можете сделать то же самое, просто поместив его в переменную, чтобы все это было в памяти.

Я говорю так, потому что каждый раз вы создаете новый файл, а файлы, созданные вами до текущего http-вызова, исчезают и бесполезны.

0 голосов
/ 26 апреля 2011

Да, это, вероятно, связано с тем, что вы записываете его в файл, а не просто включаете его в тег. Потому что, вероятно, иногда случается, что сервер получает запрос, записывает файл json, затем отображает представление и отправляет это представление клиенту. Затем клиенту предлагается загрузить файл library.json, что приведет к другому запросу на сервер для получения этого файла. Но что, если этот файл в этот момент перезаписывается, потому что другой клиент одновременно отправил запрос? Это не удастся.

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

#controller
@libraries = Library.where( "latitude IS NOT NULL AND longitude IS NOT NULL" ).to_json( :only => [ :id, :name, :address, :latitude, :longitude ])

#view
<script type="text/javascript">
var libs = {'libraries': <%= @libraries.html_safe %>}
</script>

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...