2010-11-17 79 views
1

我是一名学生,目前已经注册了一个信息技术课程,并且获得了一个项目,要求我的团队和我使用Rails 3 + Ruby 1.9.2创建一个动态表单构建器。这个动态表单构建器的一个关键特性是用户可以导出表单的结果。使用Ruby 1.9+ API中定义的CSV类来实现CSV功能并没有太多成功。我在form_results控制器中定义了一个“导出”函数,目前我只是想写入一个CSV文件。我导出功能如下:如何在Ruby 1.9.2 + Rails3中将表格数据导出为CSV文件?

def export 
CSV.open("/public/results/results.csv", "wb") do |csv| 
    csv << ["sample", "data"] 
end 
end 

并在视图,我用链接的功能:

<%= link_to 'Download CSV', form_form_results_path(@form), :method => :export %> 

我觉得,如果我能得到CSV类的正常实施,我将能够在没有任何严重问题的情况下完成其余的逻辑。任何指导,输入或帮助将不胜感激。

感谢,

马兹M.

回答

2

您使用:method特性参数的不正确。这应该用来指定http动词。文档浏览: http://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#method-i-link_to

我建议在他们正在查看的动态表单的动作使用respond_to块,并使用format.csv。这可以让你仅仅通过调用行动网址的.csv在您的表单模型添加到URL

respond_to do |format| 
    format.html 
    format.csv { render :text => @dynamic_form.to_csv} #this will return txt in browser 
    #format.csv { render :csv => @dynamic_form.to_csv} #with mime type (should prompt browser download) 
end 

然后使用相同的动作,但呈现不同格式的结果,你可以创建一个to_csv DEF这将渲染csv并将其作为字符串返回。你真的不应该在你的控制器中放置任何这样的逻辑。控制器用于创建实例变量(创建逻辑应在模型中完成)并转发到适当的视图。该模型应该包含你的大部分逻辑。谷歌“瘦身控制器,肥胖模型”的更多信息。

def to_csv 
    csv = some_logic_here_to_create_csv_string 
    csv 
end 

你的link_to调用可能会是这样的(只是写这篇关闭我的头顶。我不记得,如果这是正确的语法):

<%= link_to 'Download CSV', form_form_results_path(@form, :format=>:csv) %> 
1

你应该参考this链接。这Railscast插曲解释导出CSV格式或XLS格式的数据。您也可以参考this链接。