【问题标题】:data must be a two dimensional array of cellable objects数据必须是可单元格对象的二维数组
【发布时间】:2017-01-23 12:57:26
【问题描述】:

我正在尝试使用条件在表格中打印一些数据,但它返回以下错误:数据必须是可单元格对象的二维数组

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

【问题讨论】:

    标签: ruby-on-rails arrays ruby prawn


    【解决方案1】:

    应明确消除空映射单元格:

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

    【讨论】:

    • 这里的优先级真的很重要吗?我得到了相同的结果,do ... end{ ... }
    • @Stefan 确实,我已经重新检查过了,这里没关系。我的印象是它总是很重要,由于puts %w|a b c|.map do |e| e end #⇒ #<Enumerator:0x00000003b29168>,我总是在do-end 周围加上括号。
    【解决方案2】:

    它返回以下错误: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
    

    或者您可以使用selectmap 的组合:

    data = @lancamentos.select { |l| l.tipo == 'DESPESA' }
                       .map    { |l| [l.descricao_lancamento, l.valor] }
    
    table([ ['Lançamento'], *data ])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-21
      • 2020-11-14
      • 2014-06-04
      • 1970-01-01
      • 2017-12-20
      • 2021-07-17
      相关资源
      最近更新 更多