在chartjs中渲染Rails json数据

Rendering Rails json data in chartjs

本文关键字:Rails json 数据 chartjs      更新时间:2023-09-26

我的作品集中有一个canvas标签#show page:

<%= content_tag :canvas, "", id: "positions_chart", width: "300", height: "300", data: {positions: @positions } %>

在我的portfolio.js文件中,我创建了一个chartInstance对象:

$(document).ready(function () {
  var context = document.getElementById('positions_chart');
  var ctx = context.getContext("2d");
  var pieData = {
    labels: $("#positions_chart").data(positions['name']),
    datasets: [
      {
        backgroundColor: "rgba(220,220,220,1)",
        borderColor: "rgba(220,220,220,1)",
        data: $("#positions_chart").data(positions['quantity'])
     }
   ]
 }
  var chartInstance = new Chart(ctx, {
    type: 'pie',
    data: pieData,
    options: {
      responsive: true
    }
  });
console.log(chartInstance);
});

我正在DOM中加载我想要的数据——一个位置数据的集合。

<canvas id="positions_chart" width="600" height="600" 
data-positions="[{"id":1,"ticker":"AAPL","name":"Apple Inc.",
                  "quantity":20,"portfolio_id":1,"created_at":"2016-10-22T18:19:36.255Z",
                  "updated_at":"2016-10-23T01:21:38.731Z","price":"116.6"},... 
style="width: 300px; height: 300px;"></canvas>

我在网上看到的例子是如何处理js文件中的数据和数据集属性中的预加载数据。我想有一个饼状图的标签对应于报价机名称和使用数据从我的rails数据库。我在画布标签中抓取数据,并在我的js文件中访问它。据我所知,我将pieData对象传递给ctx对象,无论我选择哪个图(在本例中是pie),它都应该将标签和数据集呈现给一个图。我不知道为什么饼状图没有显示。

这是你想要的吗?

你可以传递你从rails数据库得到的数据,并立即插入到你的js代码中(不需要把它放在帆布标签的data属性中)。

我看到你正在使用chart js v2,所以我认为不需要了解上下文。

我还修改了你的代码。

在你的js代码

$(document).ready(function() {
  var positionsQuantity = <%= raw(@positions.map(&:quantity)) %>;
  var positionName = <%= raw(@positions.map(&:name)) %>;
  var ctx = $('#positions_chart');
  var pieData = {
    labels: positionName,
    datasets: [
    {
      label: "pie labels",
      data: positionsQuantity,
      backgroundColor: "rgba(220,220,220,1)",
      borderColor: "rgba(220,220,220,1)"
    }]
  }
  var chartInstance = new Chart(ctx, {
    type: 'pie',
    data: pieData,
    options: {
      responsive: true
    }
  });
});

希望它能起作用!