2011-11-13 66 views
2
Class UserController 
    def export_users 
    users = User.all 
    stream_csv do |csv| 
     csv << ["Name","Email","Gender"] 
     users.each do |i| 
     csv << [i.name,i.email,i.gender] 
     end 
    end 
    end 

def stream_csv 
    require 'fastercsv' 

     filename = params[:action] + ".csv" 

     #this is required if you want this to work with IE  
     if request.env['HTTP_USER_AGENT'] =~ /msie/i 
      headers['Pragma'] = 'public' 
      headers["Content-type"] = "text/plain" 
      headers['Cache-Control'] = 'no-cache, must-revalidate, post-check=0, pre-check=0' 
      headers['Content-Disposition'] = "attachment; filename=\"#{filename}\"" 
      headers['Expires'] = "0" 
     else 
      headers["Content-Type"] ||= 'text/csv' 
      headers["Content-Disposition"] = "attachment; filename=\"#{filename}\"" 
      controller.response.headers["Content-Transfer-Encoding"] = "binary" 
     end 

     render :text => Proc.new { |response, output| 
      csv = FasterCSV.new(output, :row_sep => "\r\n") 
      yield csv 
     } 
    end 
end 

錯誤: 「#Proc:[email protected]/sites/app/controllers/export_controller.rb:56」導出CSV與Mongoid和FasterCSV

使用Ruby 1.8和Rails 3.0.9

所以我認爲這裏的問題是我沒有使用「Proc」。或者它不應該像只是另一個塊...

我想過編寫一個新的邏輯到類中,以便讀取更好。但是如果有人能向我解釋爲什麼我的代碼是錯誤的,或者至少將我指向一個新的方向,那麼我可能會在這裏學到新東西。感謝

注:找到一個更好的方式:

def export_inverts 
    require 'fastercsv' 
    inverts = Invert.all 
    filename = params[:action] + ".csv" 

    #this is required if you want this to work with IE 
    if request.env['HTTP_USER_AGENT'] =~ /msie/i 
    headers['Pragma'] = 'public' 
    headers["Content-type"] = "text/plain" 
    headers['Cache-Control'] = 'no-cache, must-revalidate, post-check=0, pre-check=0' 
    headers['Content-Disposition'] = "attachment; filename=\"#{filename}\"" 
    headers['Expires'] = "0" 
    else 
    headers["Content-Type"] ||= 'text/csv' 
    headers["Content-Disposition"] = "attachment; filename=\"#{filename}\"" 
    headers["Content-Transfer-Encoding"] = "binary" 
    end 

    csv_string = FasterCSV.generate do |csv| 
    csv << ["Genus","Species","Common Name","Pet Name","Gender"] 
    inverts.each do |i| 
     csv << [i.scientific_name,i.scientific_name,i.common_name,i.pet_name,i.gender] 
    end 
    end 
    render :text => csv_string 
end 

回答

2

收率只能一個函數或塊內使用。產量被用在一個函數中,這個函數需要一個塊來說明,在塊中產生一些值。實際上它表示將這個值輸入到塊已被轉換成和號運算符(大多數情況下)的過程中。但是,您可以將Proc傳遞給期望它的函數。

在這裏,你只是想從proc返回值,不需要「yield」。