2017-01-23 9 views
1

私は条件を使用してテーブル内のいくつかのデータを印刷しようとしているの2次元配列でなければなりませんが、それは次のエラーが返されます。データはcellableオブジェクトの2次元配列でなければなりませんデータは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''#⇒#<列挙子:0x00000003b29168> 'です。 – mudasobwa

0

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

あなたdata配列はnil値が含まれているため、このエラーが発生します。あなたが[[1], [3], [5]]をしたいのに対し

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

は、この例を考えてみましょう。

すでにdata変数を持っているので、あなたがmapの代わりにeachを使用することもできます。

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

それとも、selectmapの組み合わせを使用することができた:

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

table([ ['Lançamento'], *data ]) 
関連する問題