在我的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文件。有什么猜测吗?
谢谢!
答案 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调用,结果一切正常。