Использование переменных в массиве, переданном в def - Rails - PullRequest
0 голосов
/ 28 октября 2009

Я использую Google charts API для создания круговой диаграммы в моем приложении Rails. Тем не менее, у меня проблема с передачей локальных переменных в def в помощнике. Def принимает двумерный массив пар [label, value]. Это не нравится, когда я пытаюсь передать локальную переменную в качестве значения. Они рассчитываются заблаговременно и представлены в валютном формате. Помещение переменной в кавычки или в #{} также не работает.

application_helper.rb

  def pie_chart(data, options = {})
    options[:width] ||= 250
    options[:height] ||= 100
    options[:colors] = %w(F5DD7E 0DB2AC FC8D4D FC694D FABA32 704948 968144 C08FBC ADD97E)
    dt = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-."
    options[:divisor] ||= 1
    options[:title] ||= "Energy Costs"

    while (data.map { |k,v| v }.max / options[:divisor] >= 4096) do
      options[:divisor] *= 20
    end

    opts = {
      :cht => "p",
      :chd => "e:#{data.map{|k,v|v=v/options[:divisor];dt[v/64..v/64]+dt[v%64..v%64]}}",
      :chl => "#{data.map { |k,v| CGI::escape(k)}.join('|')}",
      :chs => "#{options[:width]}x#{options[:height]}",
      :chco => options[:colors].slice(0, data.length).join(','),
      :chf => "bg,s,FFFFFF00",
      :chtt => "#{options[:title]}"
    }

Вызов def в представлении:

<%= pie_chart( [["Light Cost", #{light_cost}], ["Small Appliance Cost", #{sm_appl_cost}]], :width => 550, :height => 200) %>

Как передать локальные переменные?

Ответы [ 2 ]

1 голос
/ 28 октября 2009

Какую ошибку вы получаете? Вы должны быть в состоянии назвать это как:

<%=
  pie_chart(
    [
      ["Light Cost", light_cost],
      ["Small Appliance Cost", sm_appl_cost]
    ],
    { :width => 550, :height => 200 }
  )
%>

Я добавил {} в хеш, чтобы сделать его более понятным и явным.

Использование #{var} здесь не способ сделать это, потому что это для подстановки в строке, например, "Here is the value: #{var}".

0 голосов
/ 28 октября 2009

Так что этот код определенно нуждается в числовых значениях, но #{} просто начинает комментарий, если не используется внутри строки, и вам не нужна строка там.

И фактически, как написано, pie_chart будет принимать либо двумерный массив, как вы говорите ИЛИ хэш, если его единственное использование - с 2 переменными .map итераторы. Таким образом, вы должны иметь возможность использовать [["str1", light_cost], ["str2", sm_appl_cost]] или { 'str1'=>light_cost, 'str2'=>sm_appl_cost}.

Вы должны убедиться, что эти местные жители числовые. Попробуйте использовать .to_i или .to_f, если это не так.

...