【问题标题】:Output array of hashes from Ruby on Rails to chart.js从 Ruby on Rails 输出哈希数组到 chart.js
【发布时间】:2019-08-31 17:11:05
【问题描述】:

当使用时间作为第二个轴时,我在从 Ruby on Rails 项目中准备用于 chart.js 的数据时遇到了一些问题。

我查看了其他各种问题并设法非常接近,但在以 chart.js 可以识别的格式导出数据时遇到问题。

感谢您的帮助!


问题

我需要以这种形式打印的数据:

data: [
  {"x":1567006282000,"y":145},        
  {"x":1567009767000,"y":120},
  {"x":1567009838000,"y":130}
]

但我目前得到以下信息:

data: [
    {"x":1567006282000,"y":145}, 
    {"x":1567009767000,"y":120}, 
    {"x":1567009838000,"y":130}
]

当前尝试

我在我的控制器中创建如下数组,其中reading_timeobs.heart_rate 是整数,我认为这是在创建一个哈希数组:

...
@hr.push ( { :x => reading_time, :y => obs.heart_rate  } )
...

然后我将其打印在我的视图中,转换为 json,以便理论上它可以与 javascript 库 chart.js 一起使用:

...
data: <%= @hr.to_json %>,
...

很确定我的问题在上面两行中的某个地方,但完整的代码在下面,以备不时之需。


完整代码

这就是我在控制器中创建(我认为的)哈希数组的方式:

def chart 

    # Load observations for specific patient
    @observations = Observation.where(:patient_id => params[:patient_id]);

    # Prep arrays
    @readings = []
    @hr = []

    # Cycle through all observations for this patient
    @observations.each do |obs| 

        # Convert created time to integer
        # Multiple by 1000 as chart.js expects milliseconds while ruby uses seconds from UNIX epoch
        reading_time = obs.created_at.to_i * 1000

        # Add time to array so we can use this for the labels
        @readings.push(reading_time)

        # Create hash of time and observation value
        hr_temp = {:x => reading_time , :y => obs.heart_rate }

        # Push hash to the array
        @hr.push( hr_temp )

        # Repeat for other obserations - blood pressure, oxygen sats, etc

    end

end

最后我是如何在我的视图中打印的:

<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.bundle.min.js" integrity="sha256-xKeoJ50pzbUGkpQxDYHD7o7hxe0LaOGeguUidbq6vis=" crossorigin="anonymous"></script>

<canvas id="myChart" width="400" height="400"></canvas>
<script>

var ctx = document.getElementById('myChart').getContext('2d');
var scatterChart = new Chart(ctx, {
    type: 'line',
    data: {
        labels: <%= @readings %>,
        datasets: [{
            label: 'Heart Rate',
            data: <%= @hr.to_json %>,
            borderWidth: 1
        }]
    },
    options: {
        scales: {
            xAxes: [{
                type: 'time',
                time: {
                    parser: 'X', // parse x values as unix timestamp
                    tooltipFormat: 'MMM Do, \'YY'
                },
            }]
        }
    }
});
</script>

工作示例

这是一个显示我的目标的工作硬编码示例。

var ctx = document.getElementById('myChart').getContext('2d');
var scatterChart = new Chart(ctx, {
    type: 'line',
    data: {
        datasets: [{
            label: 'Heart Rate',
            data: [
              {"x":1567006282000,"y":145},        
              {"x":1567009767000,"y":120},
              {"x":1567009838000,"y":130}
            ]
        }]
    },
    options: {
        scales: {
		xAxes: [{
			type: 'time',
			time: {
				parser: 'X', // parse x values as unix timestamp
				tooltipFormat: 'MMM Do, \'YY'
			},
		}]
	}
    }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.bundle.min.js" integrity="sha256-xKeoJ50pzbUGkpQxDYHD7o7hxe0LaOGeguUidbq6vis=" crossorigin="anonymous"></script>

<canvas id="myChart" width="400" height="400"></canvas>

【问题讨论】:

  • 从ruby来看,如果你有哈希对象中的数据,什么时候不使用to_json
  • 试试data: &lt;%= @hr.to_json.html_safe %&gt;
  • 谢谢,.html_safe 就是答案。感谢帮助!这花了我几个小时

标签: javascript ruby-on-rails ruby chart.js chart.js2


【解决方案1】:

由于渲染,它在后台使用to_s,这可能会在从string 类型对象渲染时导致一些编码问题。您应该尝试在@hr.to_json 返回的对象上使用html_safe 方法,例如@hr.to_json.html_safe

【讨论】:

  • 谢谢,.html_safe 是答案。感谢帮助!这花了我几个小时
  • @OliverTrampleasure 没问题:D
猜你喜欢
  • 1970-01-01
  • 2013-04-08
  • 2014-04-09
  • 2013-07-06
  • 1970-01-01
  • 2017-07-09
  • 2011-04-15
  • 2015-05-05
  • 2012-03-26
相关资源
最近更新 更多