Получение данных из Postgres в формате JSON в ROR в Highcharts javascript

#javascript #ruby-on-rails #json #postgresql #highcharts

#javascript #ruby-на-рельсах #json #postgresql #высокие диаграммы

Вопрос:

Я изучаю ROR (в настоящее время более 5 месяцев) и пытаюсь получить данные из базы данных Postgres в Highcharts. В таблице Postgres есть столбцы для:id, :name и:pc1, что соответствует процентному изменению за один год (среди прочих). В базе данных есть пять временных рядов [:id].

Вот схема БД:

 create_table "series", force: true do |t|
    t.string   "acronym"
    t.string   "name"
    t.string   "current"
    t.string   "previous"
    t.string   "pc1"
    t.datetime "created_at"
    t.datetime "updated_at"
end
 

Вот часть контроллера серии:

 class SeriesController < ApplicationController
before_action :set_series, only: [:show, :edit, :update, :destroy]

# GET /series
# GET /series.json
def index
  @series = Series.all
end

def percent
  @series.each do |series|
    series.name
    series.pc1
  end
  render :json  
end
 

Я определяю метод — «процент» — потому что я хочу создать несколько разных графиков, например, один для процентного изменения за год (этот), а также предыдущий и текущий.

Вот представление со скриптом Highcharts:

Более или менее следуя инструкциям Highcharts (здесь: http://www.highcharts.com/docs/working-with-data/preprocessing-data-from-a-database ), я извлек запрос «данные» из функции Highcharts. Исходный демонстрационный код Highcharts — с использованием встроенного «жестко закодированного» массива — находится здесь: http://www.highcharts.com/docs/getting-started/your-first-chart Я предполагаю, что я должен удалить серию, если я объявляю ее как переменную перед вызовом функции. Я игнорирую php в примере, потому что я должен отображать серию в json из контроллера.

 <div>
<script>
  var chart = new Highcharts.Chart({
    chart: {
       renderTo: 'container'
    },
    series: [{

// I pulled local host out of here because Stackoverflow doesn't like it

      var url =  "";
      $.getJSON(url,  function(resp) {
        options.series[0].name = name;
        options.series[0].pc1 = pc1;
        var chart = new Highcharts.Chart(options);
        });

      pointStart: 0,
      pointInterval
    }]
});

  $(function () { 

      $('#container').highcharts({
          chart: {
              type: 'bar'
          },
          title: {
              text: 'Fruit Consumption'
          },
          xAxis: {
              categories: ['Apples', 'Bananas', 'Oranges']
          },
          yAxis: {
              title: {
                  text: 'Fruit eaten'
              }
          },          
      });

  });
  </script>
</div>
 

Вот эта модель:

 class Series < ActiveRecord::Base
    has_many :series
end
 

Я думаю, что у меня есть несколько проблем:

  1. Правильно ли я отображаю json в контроллере?
  2. Должен ли я вызывать URL-адрес в скрипте или файле (поскольку я использую локальный сервер)?
  3. Я подозреваю, что есть и другие, например, должен ли метод процента быть в действии before в контроллере?

Ошибка в консоли заключается в следующей строке: var url = «http://localhost:3000/series «; Я перепробовал несколько вариантов, включая /series и путь к файлу.

Моя среда настроена (с использованием Apple Mac с Mavericks). Я использую приложение Terminal с запущенным сервером rails, Postgres, запущенным на отдельной вкладке, Sublime Text версии 2 и Chrome.

Ответ №1:

1. Правильно ли я отображаю json в контроллере?

Я так не думаю. Я бы также отправил статус, и вам нужно указать, что это за json. Итак, я бы сказал:

 def percent
  @series.each do |series|
    series.name
    series.pc1
  end
  render status: 200, json: @series.as_json  
end
 

2. Должен ли я вызывать URL-адрес в скрипте или файле (поскольку я использую сервер localhost)?

URL, всегда url. Вы не сможете получить доступ к файлу. И ваш URL кажется правильным.

3. Я подозреваю, что есть и другие, например, должен ли метод процента быть в действии before в контроллере?

Это зависит от того, что вы делаете. Если вы хотите ответить методом процента, сгенерированным json путем вызова /series route, вам нужно вызвать процент в методе индекса. Если вам нужен явный вызов /percent , вам просто нужно добавить его в маршруты, и все готово. Кстати, вы изменили файл routes для этого, верно? У вас должен быть хотя бы get, доступный для контроллера серии, или, если вы хотите полный CRUD, ресурс должен быть там. Кроме того, я думаю, вам следует придерживаться соглашения о том, что имя модели должно быть в форме единственного числа, а ваш has_many: series для меня не имеет смысла. Чего вы пытаетесь достичь там? Если серия имеет ряд_may, то у вас должно быть a serie_id в модели, а также a принадлежит.

Надеюсь, это как-то поможет.

Комментарии:

1. Афонсо, спасибо за вашу помощь! 1. Пересмотр рендеринга правильно форматирует данные и отправляет их в действие series#index. (Мой маршрут правильный.) Результатом является массив. 2. Чтобы извлечь данные из базы данных Postgres, передайте их Highcharts и отобразите диаграмму, вот что нужно сделать:

2. 1. Пересмотр рендеринга правильно форматирует данные и отправляет их в действие series#index. (Мой маршрут правильный.) Результатом является массив. A. Контроллер не должен иметь вызова рендеринга; скорее — в моем случае — просто @series = Series.all; B. Предварительная обработка json для Highcharts должна быть размещена в app /assets/ (имя контроллера) / javascript-file. C. HTML Highcharts переходит вваше мнение. Вам также необходимо добавить файл javascript Highcharts (или поместить его в частичный). Моя ошибка заключалась в предположении, что мне нужно действие контроллера для извлечения данных.