2011-04-30 12 views
5

¿Cómo es que esto funciona para renderizar: json sin plantilla, pero no para renderizar: csv?rails 3: format.csv da "sin error de plantilla" pero format.json no necesita plantilla

en método del índice de mi datapoints_controller:

respond_to do |format| 
    format.json { render :json => @goal.datapoints.all }  
    format.csv { render :csv => @goal.datapoints.all } 
end 

Señalando mi navegador para /datapoints.json hace que la colección como una cadena JSON en la pantalla. Apuntando a /datapoints.csv da un error:

Template Missing: with {:locale=>[:en, :en], :formats=>[:csv], 
         :handlers=>[:rhtml, :rxml, :erb, :builder, :rjs]} 

Una instancia de punto de datos responde a to_csv, pero aunque lo mapa de forma manual en formato csv y lo hacen en forma de texto que da una plantilla perdido error, por lo que, p.ej He intentado algo como esto:

format.csv { render @goal.datapoints.map{|d| d.to_csv }.join "\n" } 
+0

http://stackoverflow.com/questions/94502/in-rails-how-to-return-records-as-a-csv-file –

Respuesta

10

Rails viene con procesadores de un montón de formatos, incluyendo JSON, pero no CSV. Here's where they are specified in the rails source (busque hacia abajo para una serie de llamadas add). Aunque es bastante fácil crear uno propio.

poner algo como esto en un inicializador (esto es más o menos sólo copian desde el procesador de XML desde el enlace de arriba, con XML sustituido por csv):

ActionController::Renderers.add :csv do |csv, options| 
    self.content_type ||= Mime::CSV 
    self.response_body = csv.respond_to?(:to_csv) ? csv.to_csv : csv 
end 

Luego, cuando se llama a render :csv => @foo este bloque será llamado, con el objeto @foo pasado como el parámetro csv.

En cuanto a lo que hace, es probable que necesite parche mono Array para agregar un método to_csv, o hacer que el bloque anterior detectar y manejar matrices.

Cuestiones relacionadas