[英]Using rails data collection in .js.erb
我有一个图书索引页面,其中显示了使用家族结构的所有图书:
@books.each do |book|
....
end
我要在同一页面上使用相同的@books
数据显示Google图表。 该图表由div触发:
<div id="chart_div"></div>
还有一个chart.js.erb
文件:
if ($("#chart_div").length > 0){
google.load('visualization', '1.1', {packages: ['corechart']});
google.setOnLoadCallback(drawChart);
function drawChart() {
var data = google.visualization.arrayToDataTable([
['Title', 'Author'],
<%- @books.each do |book| %>
<%= "['#{book.title}','#{book.author}']," %>
<%- end %>
]);
var chart = new google.visualization.AreaChart(document.getElementById('chart_div'));
chart.draw(data, options);
}
}
但这会返回nil:NilClass的错误undefined method
each , so the
@books is not available in the
.js.erb`文件中is not available in the
。 如何在JavaScript中提供书籍? 在图表中是否有更好的选择来使用此数据?
JavaScript不是在控制器动作的上下文中编译的,因此您不能使用在控制器中分配的实例变量。 您可能有两个选择:
chart.js
文件从服务器通过AJAX
加载数据 @book
数据存储到您的DOM中,例如 作为JSON
,然后从chart.js
读取 第二种选择更容易解释:
将类似这样的代码添加到购物车中的页面:
<script id="chart_data" type="application/json" charset="uff-8>
<%= raw @books.map { |book| [h(book.title), h(book.author)] }.unshift(['Title', 'Author']).to_json %>
</script>
并在chart.js
的draw_chart
函数中使用
var data_array = JSON.parse($("#chart_data").html());
var data = google.visualization.arrayToDataTable(data_array);
您也可以从chart.js
删除erb
扩展名,而无需使用erb
编译javascript。
我希望这个能有一点帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.