CSV文件未在Rails 5应用程序中导出

时间:2017-03-02 20:12:49

标签: ruby-on-rails ruby export-to-csv

在我的Rails 5应用程序中,我有一个调用bulk_create函数的ajax put请求,该函数根据用户输入的参数创建n个记录(这就像一个魅力),从技术上讲它也应该生成一个csv文件使用刚刚生成的数据。

AJAX致电:

$('.bulk-button').on('click', function(){
    $.ajax({
        type: 'post',
        url: '/admin/coupons/bulk-create?number='+$('#bulk-number').val()
    });
});

在我的控制器中:

def bulk_create
    iterations = params[:number].to_i
    i = 0
    sequence = [('a'..'z')].map(&:to_a).flatten
    while i < iterations do
      name = (0...6).map { sequence[rand(sequence.length)] }.join
      Coupon.create(:name => name, :value => 10, :coupon_type => 'amount', :limit => 1, :expiration_date => Date.current + 365)
      i+=1
    end

    coupons = Coupon.order('created_at DESC').limit(iterations)

    respond_to do |format|
        format.html { redirect_to(admin_coupons_path) }
        format.csv { send_data coupons.to_csv }
    end
end

在我的模特中:

def self.to_csv(options = {})
  desired_columns = ["name", "value"]
  CSV.generate(options) do |csv|
    csv << desired_columns
    all.each do |coupon|
      csv << coupon.attributes.values_at(*desired_columns)
    end
  end
end

我没有在控制台中看到任何错误,但没有输出任何CSV文件。有什么猜测吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

关于代码清晰度和样式的一点

您的代码中存在一些不需要存在的复杂性:范围可以更直接的方式使用。

sequence[rand(sequence.length)]

您还可以使用#sample获取数组的随机元素,该元素可以为您提供:

#inject

而不是

(0...5).inject(""){ |coupon_code| coupon_code << sequence.sample }

to_csv的良好触摸也可以提供帮助,它允许您为对象提供多倍的时间来避免复杂的语法。 我们会这样:

to_csv

关于您的错误的另一点

我的猜测是方法[].to_csv # => "\n" [Coupon.first, Coupon.first].to_csv # => "#<Coupon:0x007f81ca4d2558>, #<Coupon:0x007f81ca4d2558>\n" 的定义是在Coupon本身上,而你并没有调用它。在这里,您的可变优惠券是从数据库中检索到的优惠券的集合,其具有像阵列一样的所有机会。让我们看一下数组如何处理to_csv

array.array

Array.to_csv似乎在每个元素上调用to_s并使用csv分隔符将它们全部连接起来。在这里我们得到它,您的方法调用位于代码中的正确位置,AudioSegment不会引发错误,因为Array支持它!

答案 1 :(得分:0)

问题原来是Ajax。我在几篇帖子中读过,ajax确实是困扰csv下载的。我用一个简单的form_tag替换了ajax调用,结果一切正常。