2015-12-23 3 views
1

Я получаю эту ошибку при попытке СУММИТЬ каждый boxes.percent в локальную переменную percent.Невозможно суммировать целые числа ruby ​​

Вот ошибка:

no implicit conversion of Fixnum into Array

Мой код:

<% percent = 0, shares = 0 %> 
<% @modification.boxes.each do |d| 
    percent = percent + d.percent #here is problem, at least rails told me that 
    shares = shares + d.shares 
end %> 

<% unless percent == 100 %> 
    Total percent needs to be 100%! 
<% end %> 

<% unless shares == @modification.entity.total_number %> 
    Not correct number! 
<% end %> 

Где проблема? В базе данных как percent, так и shares для ящиков являются целыми.

+0

Объясните, что эти переменные/методы. – sawa

+0

Доля трассировки стека, по крайней мере несколько строк сверху –

+0

@sawa 'd.percent' и' d.shares' являются процентами и количеством акций для каждого 'box'. Все являются целыми числами в БД. Локальные переменные 'percent' и' shares' предназначены для подсчета всего вместе. Я объяснил, что вы хотели? – DanielsV

ответ

3

Вот ваша проблема:

Вы объявляете percent и shares как percent = 0, shares = 0. Это создаст процент как Array со значением [0,0]. Скорее объявите как percent = 0; shares = 0. (Обратите внимание на точку с запятой вместо запятой)

2.1.5 :042 > percent = 0, shares = 0 
=> [0, 0] 
2.1.5 :043 > percent 
=> [0, 0] 
2.1.5 :044 > percent.class 
=> Array 
+0

он работал идеально. благодаря – DanielsV

1

Задание не работает, как вы ожидаете:

percent = 0, shares = 0 

, потому что он интерпретируется как:

percent = (0, (shares = 0)) 

что эквивалентно:

shares = 0 
percent = 0, shares 

Последняя строка implicitly creates an array. Вы также можете написать:

shares = 0 
percent = [0, shares] 

«Исправить» на самом деле просто. Вы должны переместить переменные в левую сторону и значения в правой части:

percent, shares = 0, 0 

Это называется multiple assignment.


BTW, а не зацикливание себя, вы можете также использовать sum:

percent = @modification.boxes.sum(&:percent) 
shares = @modification.boxes.sum(&:shares) 
Смежные вопросы