在Rails中以CSV格式下载单个记录

时间:2017-02-15 15:01:31

标签: ruby-on-rails ruby csv

我正在使用ruby csv库。当我尝试下载多个记录时,它工作正常,并以CSV文件下载所有记录。

@assets = Asset.all
respond_to do |f|
  f.html
  f.csv { send_data @assets.to_csv }
  f.xls { send_data @assets.to_csv(col_sep: "\t") }
end

但是当我试图下载单曲时。这是错误

  

未定义的方法`to_csv'

这是我单个记录的代码。

@assets = Asset.last
respond_to do |f|
  f.html
  f.csv {
    send_data @assets.to_csv
  }
end

这是我的to_csv代码

 def self.to_csv(options = {})
    CSV.generate(options) do |f|
      f << column_names
      all.each do |asset|
        f << asset.attributes.values_at(*column_names)
      end
    end
  end

1 个答案:

答案 0 :(得分:2)

这里的问题是to_csv方法应该在ActiveRecord集合而不是单个记录上调用。

我相信你得到的错误必须

  

NoMethodError:未定义的方法`to_csv&#39;对于#&lt;资产:0x0000000xxxx&GT;

更改

@assets = Asset.last

@assets = Asset.limit(1).order(id: :desc)

因此,您可以稍微调整一下代码以将集合传递给to_csv并且它可以正常工作

@assets = Asset.limit(1).order(id: :desc)
respond_to do |f|
  f.html
  f.csv {
    send_data @assets.to_csv
  }
end

修改

这是一种解决方法,但它可以正常工作

# If you only want the last record
@assets = Asset.limit(1).order(id: :desc)

# If you know the id or a specific condition
@assets = Asset.where(id: 1).limit(1)