#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
Я думаю, что у меня есть несколько проблем:
- Правильно ли я отображаю json в контроллере?
- Должен ли я вызывать URL-адрес в скрипте или файле (поскольку я использую локальный сервер)?
- Я подозреваю, что есть и другие, например, должен ли метод процента быть в действии 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 (или поместить его в частичный). Моя ошибка заключалась в предположении, что мне нужно действие контроллера для извлечения данных.