【问题标题】:Generate CSV file from rails从 rails 生成 CSV 文件
【发布时间】:2010-03-18 19:17:48
【问题描述】:

我一直在阅读类似的问题,但许多答案对我来说已经过时或不够清楚。

我希望能够(在控制器操作中)执行类似的操作:

respond_to do |format|
  format.html
  format.csv
end

我知道我需要一个视图,例如 action.csv.erb


所以我的问题是:

1) 我需要在 Rails 中配置什么才能让这种情况发生。

2) 我应该如何设置 CSV 视图以显示模型中的一些基本字段?

更新:

所以我尝试走逗号的路线,我安装并出售了 gem。

然后根据我的阅读,我把这个扔到我的模型中(根据我的需要定制):

comma do

user_id 'User'
created_at 'Date'
name 'Name'
end

然后我将其放入控件中以进行索引操作(根据自述文件):

  format.csv { render :csv => MyModel.limited(50) }

然后在访问索引时(不是 CSV 格式)我收到以下 ActionController 异常错误:

未定义的方法“逗号”

然后我用谷歌搜索,我读到我应该在我的模型中加上 require 'comma'。

这样做之后,我刷新了(我的本地索引页面),错误变为:

没有要加载的文件 -- 逗号

所以在这一点上我决定它一定不能明显地找到逗号文件。所以我将文件从 comma 的 vendored gem 文件夹,从 comma 的 lib 文件夹复制到 rails lib 文件夹。然后我刷新了页面并出现了这个错误:

未初始化常量错误

然后我几乎放弃了。

来自跟踪的错误是:

/Users/elliot/.gem/ruby/1.8/gems/activesupport-2.3.5/lib/active_support/dependencies.rb:443:in load_missing_constant' /Users/elliot/.gem/ruby/1.8/gems/activesupport-2.3.5/lib/active_support/dependencies.rb:80:in const_missing' /Users/elliot/.gem/ruby/1.8/gems/activesupport-2.3.5/lib/active_support/dependencies.rb:92:in `const_missing'

其他说明,我已经安装了 FasterCSV

希望有足够的信息:)

【问题讨论】:

    标签: ruby-on-rails csv


    【解决方案1】:

    我建议看看comma。它运行良好,允许您在模型级别而不是视图级别处理内容。

    【讨论】:

    • 我一直在尝试这个,但没有成功。
    • 您有什么不满意的地方?如果您遇到错误,您能否使用该错误更新您的原始帖子?
    • 我似乎无法重新创建您的问题:/ 我刚刚开始了一个新的 rails 2.3.5 项目,将逗号作为 gem 安装,在我的 environment.rb 文件中需要它,解压缩 gem,创建一个调用逗号的虚拟模型,它可以工作。你的模型上真的有limited 方法吗?如果您尝试将.csv 格式放在索引上,然后在模型的每个实例中传递它,它仍然不起作用吗?
    • 感谢您的持续努力,昨天的某个时候,我决定暂时放弃 CSV 并采取不同的方式。下次我回来时,我一定会尝试这条路线(但从头开始)!
    【解决方案2】:

    看看 FasterCSV。

    csv_string = FasterCSV.generate do |csv|
    
      cols = ["column one", "column two", "column three"]
    
      csv << cols
    
      @entries.each do |entry|                
        csv << [entry.column_one, entry.column_two, entry.column_three ]
      end
    
      filename = "data-#{Time.now.to_date.to_s}.csv"    
    
    end
    
    send_data(csv_string, :type => 'text/csv; charset=utf-8; header=present', :filename => filename)  
    

    【讨论】:

    • 所以这会进入控制器吗?然后如何访问该文件?
    • send_data方法返回文件供用户下载。
    • 您需要将 send_data 位放在 generate 块之外。此外,现在 FasterCSV 已合并到 Rails 中,您只需执行 CSV.generate。
    【解决方案3】:

    这很糟糕,但是 CSV 库(在 1.9 中,== FasterCSV)不能很好地与 meta_where 配合使用,所以我这样做了:

    @customers.collect {|c| lines.push ["#{c.lastname}","#{c.firstname}","#{c.id}","#{c.type}"}
    lines = lines.collect {|line| line.join(',')}
    csv_string = lines.join("\n")  
    respond_to do |format|
      format.html
      format.csv { send_data(csv_string, :filename => "#{@plan.name.camelize}.csv", :type => "text/csv") }
    end
    

    它很丑,但很有效。

    【讨论】:

    • 我喜欢这个答案,如果您只是生成一个非常基本的 CSV,则简单而有效(尽管我将逻辑移到模型中而不是将其放在控制器中)。
    • 是的,这对我来说是一个快速而肮脏的 hack,但如果你要“真正”使用它,模型是一个更好的地方。
    • 顺便说一句,如果您从语义上考虑 - 模型是一个糟糕的地方。客户不应该知道如何呈现自己。这不合逻辑,除了胖模型在rails中太突出了。为什么不制作一个接受模型并允许此方法的 PORO?
    【解决方案4】:

    看看 CSV Shaper。

    https://github.com/paulspringett/csv_shaper

    它有一个很好的 DSL,并且非常适合 Rails 模型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-07
      • 2011-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多