2016-03-09 32 views
0

我想在Rails 4中將一些數據導出爲CSV。我有兩個模型:Excursions和Inscriptions。一次遊覽有許多題詞,一次題詞屬於一次遊覽。Rails - 如何在Rails中將嵌套資源導出爲CSV?

我有我嵌套的路線這樣定義的:

resources :excursions do 
    resources :inscriptions 
    get 'exportcsv' => 'excursions#download' 
    end 

所以我想實現的行爲是:當我訪問路線/觀光/ 1/exportcsv,一個CSV將被下載到我的電腦,它將以CSV格式包含excursion_id = 1的所有題詞。

在我的漂移模型我定義self.to_csv:

def self.to_csv(options = {}) 
    CSV.generate(options) do |csv| 
     csv << column_names 
     self.inscriptions.each do |inscription| 
     csv << inscription.attributes.values_at(*column_names) 
     end 
    end 
    end 

我的遊覽器的方法下載:

def download 
    @excursion = Excursion.find(params[:id]) 
    respond_to do |format| 
     format.html 
     format.csv { send_data @excursion.to_csv } 
    end 
    end 

編輯:當我去喜歡的路線:/旅行/: id/exportcsv服務器拋出ActiveRecord :: RecordNotFound錯誤。這個錯誤很容易解決,但如果我解決RecordNotFound我在此行中得到的ActionController :: UnknownFormat:

def download 
    @excursion = Excursion.find(params[:id]) 
    respond_to do |format| ########THIS LINE 
     format.html 
     format.csv { send_data @excursion.to_csv } 
    end 
    end 

我做錯了嗎?也許這一切的做法是不正確......

+0

問題是什麼? CSV的輸出是什麼?您是否遇到過csv標題列或其他問題? – Dharam

+0

@Dharam我已經更新了這個問題。抱歉! – F404

回答

0

我會更新路由到以下幾點:

resources :excursions do 
    get 'download', on: :member, constraints: { format: /(html|csv)/ } 
    resources :inscriptions 
end 

也有是在模型代碼中的錯誤。您正在導出inscriptions,但正在使用Excursion column_names而不是Inscription column_names。以下是更新的型號代碼。

class Excursion < ActiveRecord::Base 
    def to_csv(options = {}) 
    CSV.generate(options) do |csv| 
    inscription_column_names = Inscription.column_names 

    csv << inscription_column_names 

    self.inscriptions.each do |inscription| 
     csv << inscription.attributes.values_at(*inscription_column_names) 
    end 
    end 
end 

現在嘗試訪問http://localhost:3000/excursions/:id/download.csv

與現有Excursion記錄ID替換:id。如果您仍然遇到ActiveRecord::RecordNotFound錯誤,那麼問題可能是您嘗試訪問實際上不存在於數據庫中的Excursion

+0

我已經更新了代碼,但現在服務器正在拋出:*缺少模板遊覽/下載,應用程序/下載{:locale => [:en],:formats => [:html],:variants => [] ,:handlers => [:erb,:builder,:raw,:ruby,:coffee,:jbuilder]}。* – F404

+0

好吧,我遺漏了.csv擴展名。無論如何,現在服務器說沒有方法名爲to_csv: 'undefined method'to_csv'for#你的意思是? to_s' – F404

+0

將類方法'to_csv'轉換爲實例方法'to_csv'。更新了答案。 – Dharam