2017-01-23 12 views
1

Я пытаюсь напечатать некоторые данные в таблице, используя условие, но оно возвращает следующее сообщение об ошибке: данные должны быть два одномерный массив объектов cellableданные должны быть два одномерный массив cellable объектов

data = [["Lançamento"]] 
data += @lancamentos.map do |lancamento| 
    if lancamento.tipo == 'DESPESA' 
    [ 
     lancamento.descricao_lancamento, lancamento.valor 
    ] 
    end 
end 
pdf.table data 

ответ

2

Пустые преобразованные клетки должны быть устранены в явном виде:

data = [["Lançamento"]] 
data += (
    @lancamentos.map do |lancamento| 
    if lancamento.tipo == 'DESPESA' 
     [lancamento.descricao_lancamento, lancamento.valor] 
    end   
    end.compact # ⇐ HERE 
) 

pdf.table data 
+0

ли приоритет действительно имеет значения здесь? Я получаю тот же результат для обоих: 'do ... end' и' {...} ' – Stefan

+0

@Stefan действительно, я переустановил, здесь это не имеет значения. У меня было такое впечатление, что это всегда имеет значение, и я всегда ставил круглые скобки вокруг 'do-end' из-за' puts% w | a b c | .map do | e | e end '' # ⇒ # '. – mudasobwa

0

it returns the following error: data must be a two dimensional array of cellable objects

Вы получаете эту ошибку, потому что ваш data массив содержит nil значения.

Рассмотрим следующий пример:

[1, 2, 3, 4, 5].map { |i| [i] if i.odd? } 
#=> [[1], nil, [3], nil, [5]] 

В то время как вы хотите [[1], [3], [5]].

Поскольку у вас уже есть data переменных, вы могли бы использовать each вместо map:

data = [["Lançamento"]] 
@lancamentos.each do |lancamento| 
    if lancamento.tipo == 'DESPESA' 
    data << [lancamento.descricao_lancamento, lancamento.valor] 
    end 
end 
pdf.table data 

Или вы можете использовать комбинацию select и map:

data = @lancamentos.select { |l| l.tipo == 'DESPESA' } 
        .map { |l| [l.descricao_lancamento, l.valor] } 

table([ ['Lançamento'], *data ])