如何在ruby中用小方法组织大块方法

时间:2014-09-04 06:43:03

标签: ruby-on-rails ruby

在我的ruby on rails应用程序中,我有一个简单的类,它将发票转换为csv格式:

require 'csv'
class InvoiceCsvExporter

  def initialize(invoices)
    @invoices = invoices
  end

  def export
    CSV.generate do |csv|
      generate_invoice_headers
      generate_invoices

    end
  end

  private
  def generate_invoice_headers
    csv << ["Invoice number", "Company", "Customer", "State", "Invoice date",
      "Delivery date", "Subtotal", "Total", "Tax", "Offer", "Contract"]
  end

  def generate_line_item_headers
    csv << ["Line Items:"]
    csv << ["Product", "Description", "Quantity", "Unit price", "Discount type", "Discount", "Amount"]
  end

  def generate_invoices
    @invoices.each do |invoice|
      csv << []
      csv << [invoice.format_id, invoice.company.name, invoice.customer.fullname, invoice.aasm_state,
        invoice.invoice_date, invoice.delivery_date, invoice.subtotal.round(2), invoice.total.round(2),
        invoice.tax, invoice.invoice_offer, invoice.invoice_contract]
      generate_line_item_headers
      generate_line_item(invoice)
    end
  end

  def generate_line_item(invoice)
    invoice.line_items.each do |line_item|
      csv << [line_item.product.name, line_item.description, line_item.quantity,
        line_item.unit_price, line_item.discount_type, line_item.discount_value, line_item.total_price.round(2)]
    end
    csv << []
  end
end

在我的导出方法中,我尝试使用此generate_invoice_headers方法,但它给了我一个错误:

undefined local variable or method `csv' for #<InvoiceCsvExporter:0x007f6a255ef218>

我该如何处理这个问题?

1 个答案:

答案 0 :(得分:2)

您需要使用本地变量:

  def export
    CSV.generate do |csv|
      @csv = csv
      generate_invoice_headers
      generate_invoices
    end
  end

然后将csv来电更改为@csv

另一种继续方式:将参数传递给方法。