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

Ruby on rails CSV文件未在Rails 5应用程序中导出,ruby-on-rails,ruby,export-to-csv,Ruby On Rails,Ruby,Export To Csv,在我的Rails 5应用程序中,我有一个ajax put请求,它调用一个bulk_create函数,该函数根据用户输入的参数创建n个记录(这就像一个符咒),从技术上讲,它还应该使用刚刚生成的数据生成一个csv文件 AJAX调用: $('.bulk-button').on('click', function(){ $.ajax({ type: 'post', url: '/admin/coupons/bulk-create?number='+$('#bulk

在我的Rails 5应用程序中,我有一个ajax put请求,它调用一个bulk_create函数,该函数根据用户输入的参数创建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 bulk\u创建
迭代次数=参数[:编号]。至
i=0
序列=[('a'..'z')].map(&:to_a).展平
而我呢
name=(0…6).map{sequence[rand(sequence.length)]}.join
优惠券.create(:name=>name,:value=>10,:优惠券类型=>amount',:limit=>1,:expiration\u date=>date.current+365)
i+=1
结束
优惠券=优惠券.订单('created_at DESC')。限制(迭代)
回应待办事项|格式|
format.html{重定向到(管理路径)}
format.csv{send_data coups.to_csv}
结束
结束
在我的模型中:

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
def self.to_csv(选项={})
所需的_列=[“名称”,“值”]
CSV.生成(选项)do | CSV|

csv关于代码的清晰性和风格

代码中存在一些不需要的复杂情况:可以更直接地使用范围

sequence = ('a'..'z').to_a
您还可以使用#sample获得数组的随机元素,该元素将为您提供:

sequence.sample 
而不是

sequence[rand(sequence.length)]
一个漂亮的
#inject
也会有所帮助,它允许您将对象的输入时间乘以几倍,以避免复杂的语法。 因此,我们会:

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

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

问题原来是Ajax。我在几篇文章中读到,ajax确实是csv下载的麻烦所在。我用一个简单的form_标记替换了ajax调用,一切都解决了。

您尝试过在url中使用.csv吗
/admin/coups/bulk create.csv?number=…
首先,当您在控制器中调用
coups.to_csv
时,在模型中定义的
self.to_csv
不是所调用的。控制器中的优惠券是ActiveRecord类,无法访问优惠券类方法。一般来说,由于to_csv执行的是更多的格式化/呈现类型的操作,因此不应首先在模型上定义它。您应该创建一个新类(比如,couponscv?)并在该类上编写to_csv方法。更好的是,可能有一块宝石正好可以解决这个问题。此外,正如上面的评论所说,如果没有.csv,请求将无法通过。这是一个轻微的简化,因为
优惠券.order('created_at DESC')。limit(iterations)
确实返回一个ActiveRecord关系对象而不是数组,但在其他方面是一个很好的答案。另外,为了进一步改进注入行,您可以执行
6.times.injection(“”{|优惠券|代码|优惠券|代码非常感谢您对如何改进代码的建议。是的,确实是[]。要实现csv,我可以在响应中看到返回的csv响应,即使文件没有下载。@Gyoko-我还尝试使用了一些gem(特别是ascsv),它产生的错误比以往任何时候都多,不幸的是,几乎没有相关文档。因此,我尝试删除模型中的self.to_csv方法,在测试时得到:NoMethodError(未定义的方法“to_csv”表示#你的意思是?to_s):从技术上讲,这意味着当我调用coupons.to_csv时,实际上是调用self.to_csv。
[].to_csv # => "\n"
[Coupon.first, Coupon.first].to_csv
# => "#<Coupon:0x007f81ca4d2558>, #<Coupon:0x007f81ca4d2558>\n"