Ruby on rails 如何将此数组传递给html.erb文件中的javascript函数,而不让erb计算Date.UTC?
我试图将HighStock股票图表配置为使用datetime和value的二维数组。这种方法只在Highcharts文档中提到,而不是highstock文档 我的视图帮助文件中有一个方法:Ruby on rails 如何将此数组传递给html.erb文件中的javascript函数,而不让erb计算Date.UTC?,ruby-on-rails,ruby,ruby-on-rails-3,highcharts,erb,Ruby On Rails,Ruby,Ruby On Rails 3,Highcharts,Erb,我试图将HighStock股票图表配置为使用datetime和value的二维数组。这种方法只在Highcharts文档中提到,而不是highstock文档 我的视图帮助文件中有一个方法: def byusers_chart_series(name, byusers) data = [] codes_by_user = byusers.where(:hpmuser => "#{name}").group("date(hpmcreated)").s
def byusers_chart_series(name, byusers)
data = []
codes_by_user = byusers.where(:hpmuser => "#{name}").group("date(hpmcreated)").select("date(hpmcreated) as dater, count(globalcode) as codes")
codes_by_user.each do |record|
#x = [Date.UTC("#{record.dater.year.inspect.to_i}", "#{record.dater.day.inspect.to_i}", "#{record.dater.month.inspect.to_i}"), "#{record.codes.inspect.to_i}"]
x = [Date.UTC("#{record.dater.year.inspect.to_i}", "#{record.dater.day.inspect.to_i}", "#{record.dater.month.inspect.to_i}"), "#{record.codes.inspect.to_i}"]
data << Array(x)
end
data
end
这是html.ERB文件中的代码:
<script type="text/javascript" charset="UTF-8">
$(function() {
new Highcharts.StockChart({
chart : {
renderTo: 'weeks52dynamic',
borderColor: '#EBBA95',
borderWidth: 3
},
legend : {
align : "left",
enabled : true,
layout : "vertical",
verticalAlign : "top"
},
rangeSelector : {
selected : 0
},
title : {
text : 'title'
},
scrollbar: {
barBackgroundColor: 'gray',
barBorderRadius: 7,
barBorderWidth: 0,
buttonBackgroundColor: 'gray',
buttonBorderWidth: 0,
buttonBorderRadius: 7,
trackBackgroundColor: 'none',
trackBorderWidth: 1,
trackBorderRadius: 8,
trackBorderColor: '#CCC'
},
xAxis: {
title: {
text: "Date"
},
type: "datetime",
dateTimeLabelFormats: { // don't display the dummy year
month: '%e. %b',
year: '%b'
}
},
yAxis: {
min: 0,
title: {
text: "Number of Codes"
}
},
series: [
<% { "New Codes" => Newcode.codesperday }.each do |name, newcodes| %>
{
name: "<%= name %>",
pointInterval: <%= 1.day * 1000 %>,
pointStart: <%= 350.weeks.ago.to_i * 1000 %>,
data: <%= newcodes_chart_series(newcodes, 350.weeks.ago) %>,
marker : {
enabled : true,
radius: 3
}
},
<% end %>
<% { "User" => Newcode.byuser }.each do |name, byusers| %>
{
name: "<%= name %>",
data: <%= byusers_chart_series(name, byusers) %>,
marker : {
enabled : true,
radius: 3
}
}
<% end %>
]
});
});
</script>
$(函数(){
新海图({
图表:{
renderTo:“weeks52dynamic”,
边框颜色:'#EBBA95',
边框宽度:3
},
图例:{
对齐:“左”,
启用:对,
布局:“垂直”,
垂直排列:“顶部”
},
范围选择器:{
已选:0
},
标题:{
文本:“标题”
},
滚动条:{
barBackgroundColor:“灰色”,
半径:7,
宽度:0,
按钮背景颜色:“灰色”,
ButtonOrderWidth:0,
按钮顺序半径:7,
trackBackgroundColor:“无”,
轨道边界宽度:1,
轨道边界半径:8,
trackBorderColor:“#CCC”
},
xAxis:{
标题:{
正文:“日期”
},
键入:“日期时间”,
dateTimeLabelFormats:{//不显示虚拟年份
月份:'%e.%b',
年份:'%b'
}
},
亚克斯:{
分:0,,
标题:{
正文:“代码数”
}
},
系列:[
Newcode.codesperday}。每个do |名称,Newcode |%>
{
姓名:“,
点间隔:,
起点:,
数据:,
标记:{
启用:对,
半径:3
}
},
Newcode.byuser}。每个do |名称,byusers |%>
{
姓名:“,
数据:,
标记:{
启用:对,
半径:3
}
}
]
});
});
我在浏览器中遇到的错误,我认为ERB模板试图评估Date.UTC函数,而不是将其传递给JavaScript。我的问题是,每当我在数组中的Data.UTC周围加上任何类型的引号时,引号就会出现在发送给javascript的最后一个数组中
如何在不让ruby计算的情况下传递数组的精确数组?在修复过程中,让我们简化您的方法。如果您发现自己使用了这样的代码:
foo = []
bar.each{ … foo << jim }
Ruby代码中有Date.UTC
,这要求Ruby在构建阵列时运行此代码。与创建数组数组不同,我们将使用将您的code\u by\u user
转换为字符串数组,这些字符串是您想要的JS代码:
def byusers\u chart\u系列(名称,byusers)
codes_by_user=byusers.where(:hpmuser=>“#{name}”).group(“日期(hpmcreated)”)。选择(“日期(hpmcreated)作为日期器,计数(全局代码)作为代码”)
代码_by_user.map do |记录|
parts=%w[年-月-日].map{s|record.dater.send(s)}
[Date.UTC(#{parts.join(',')}),#{record.codes}]
结束
结束
在你看来:
数据:[],
这将在HTML中生成如下输出:
数据:[[Date.UTC(2011,10,7),42],[Date.UTC(2012,4,3),17],
一个提示:当你有这个代码时:“{record.dater.year.inspect.to_i}”
你所做的是说“Ruby,给我一个数字(年份);现在把它变成一个字符串(inspect);现在把那个字符串变成一个数字(to_i);现在把那个数字变成一个字符串。(字符串插值{…}
总是在将表达式的结果放入字符串之前调用。)因此,对于整数,最好使用简单的代码“#{record.dater.year}”“
。好的,我正在将你告诉我的这两种简化技术添加到我的代码中,我对使用这两种技术感到内疚。每种技术都可以在多个地方构建一个新的数组。我有一种方法,可以为用户提供唯一的方法,它可以为我提供数据库中的所有用户。使用.map将它从5行减到2行,ruby很棒。现在,如果我想从每个月中减去1来解释javascript中以零为基础的月份,该怎么办?@opensourcechris您可以删除我放在那里的小地图,或者在构建字符串之前添加parts[1]-=1
。
foo = []
bar.each{ … foo << jim }
foo = bar.map{ … jim }