2016-12-13 60 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