Как я могу передать этот массив в функцию javascript в файле html.erb, без erb оценки Date.UTC? - PullRequest
0 голосов
/ 15 февраля 2012

Я пытаюсь настроить HighStock Stockchart для использования двумерного массива datetime и value.Этот метод упоминается только в документе Highcharts, а не в highstock.

У меня есть метод в моем файле помощника вида:

  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

Это массив, который возвращается точно так же, как яхочу, чтобы он появился в javascript:

[[Date.UTC(2012, 1, 2), 1],
[Date.UTC(2012, 2, 2), 5],
[Date.UTC(2012, 3, 2), 15],
[Date.UTC(2012, 6, 2), 8],
[Date.UTC(2012, 7, 2), 3],
[Date.UTC(2012, 8, 2), 73],
[Date.UTC(2012, 9, 2), 77]]

И это код из файла 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>

Ошибка, которую я получаю в своем браузере, я думаю, что ERBШаблон пытается оценить функцию Date.UTC, а не передавать ее в JavaScript для этого.Моя проблема заключается в том, что всякий раз, когда я помещаю какие-либо кавычки вокруг Data.UTC в массив или массивы, кавычки появляются в конечном массиве массивов, отправляемых в javascript.

Как передать этот точный массив массивов безимея рубин оценивать это?

1 Ответ

2 голосов
/ 15 февраля 2012

Давайте сделаем ваш метод проще, пока мы его исправляем.Если вы когда-нибудь окажетесь с кодом, подобным этому:

foo = []
bar.each{ … foo << jim }

… тогда вместо этого вы должны использовать это:

foo = bar.map{ … jim }

У вас есть Date.UTC в вашем Ruby код, который требует Ruby для запуска этого кода при сборке массива.Вместо того, чтобы создавать массив массивов, мы будем использовать Enumerable#map для преобразования вашего codes_by_user в массив строк , которые представляют собой требуемый код JS:

def byusers_chart_series(name, byusers)
  codes_by_user = byusers.where(:hpmuser => "#{name}").group("date(hpmcreated)").select("date(hpmcreated) as dater, count(globalcode) as codes")
  codes_by_user.map do |record|
    parts = %w[year month day].map{ |s| record.dater.send(s) }
    "[Date.UTC(#{parts.join(',')}),#{record.codes}]"
  end
end

А затем, на ваш взгляд:

data: [ <%= byusers_chart_series(name, byusers).join(", ") %> ],

Это приведет к выводу, подобному следующему в вашем HTML:

data: [ [Date.UTC(2011,10,7),42], [Date.UTC(2012,4,3),17] ],
...