2016-12-13 67 views
1

我的控制器上有一个搜索方法,可以响应html或CSV格式。 html格式根据预期呈现搜索结果,我希望CSV格式通过下载结果的CSV文件来工作。Rails:在respond_to block(csv)中处理错误

大多数情况下,调用send_data并生成CSV文件。但是,在某些情况下,我不需要想要生成CSV,而是显示一个错误(例如,当用户使用了所有分配的月份导出时)。下面的代码是我想就像要做的简化版本,但是这似乎并不像我试图处理这个错误。

respond_to do |format| 
     format.html do 
     @results = ... 
     render "index" 
     end 

     format.csv do 
     @results = ... 

     if user_can_export?(@results) 
      send_data generate_csv(@results), filename: "Search-Results.csv" 
     else 
      flash[:error] = "Unable to export search results." 
      render "index" 
     end 
     end 
    end 

有没有什么办法让我摆脱这个块和呈现HTML或我坚持在这里生成一个csv文件?我宁愿不通过发送包含错误消息的csv文件来处理这种情况,但这似乎是我目前最好的选择。帮助表示赞赏!

+0

了''后.'“无法导出搜索结果”'会导致错误的当前请求周期显示提示信息。 – max

+0

好抓。这不是所有真实的代码,只是我输入的一个想法。我修复了 –

回答

1

您需要将内容类型标题设置为text/html而不是text/csv

render template: "things/index.html.erb", content_type: "text/html" 

另外如果你想在你需要使用flash.now[:error] = "Unable to export search results"

+0

以上的错字,仍然收到缺少的模板错误。似乎仍然尝试使用csv格式: '缺少模板漏洞/索引,应用程序/索引与{:locale => [:en],::formats => [:csv],:handlers => [:erb ,:builder,:coffee,:rabl]}。 –

+0

啊,你需要使用模板的显式路径。 'render template:“things/index.html.erb”' – max

+0

它寻找错误的模板,因为rails仍然将请求视为CSV。你可以通过使用'content_type =“text/html”'来解决它,我相信这会改变响应对象,所以我会使用'html'来进行模板查找。 – max