2010-10-07 16 views
10

Sto tentando di generare un file CSV. Va tutto bene tranne che per i campi vuoti, non sono sicuro che abbiano invece di virgolette effettive. Ho fornito il codice che sto usando per generare il file e alcuni output.Ruby on Rails CSV mettendo " " anziché virgolette effettive

<% headers = ["Username", "Name", "E-mail", "Phone Number"] %> 
<%= CSV.generate_line headers %> 

<% @users_before_paginate.each do |user| %> 
    <% row = [ "#{user.username}".html_safe ] %> 
    <% row << "#{user.profile.first_name} #{user.profile.last_name}".html_safe unless user.profile.blank? %> 
    <% row << "#{user.email}".html_safe unless user.profile.nil? %> 
    <% row << "#{user.profile.phone}".html_safe unless user.profile.nil? %> 
    <%= CSV.generate_line row %> 
<% end %> 

uscita

Username,Name,E-mail,Phone Number 

    admin,LocalShopper ,[email protected],&quot;&quot; 
    Brian,Oliveri Design ,[email protected],727-537-9617 
    LocalShopperJenn,Jennifer M Gentile ,[email protected],&quot;&quot; 

risposta

28

Invece di chiamare html_safe su ogni parte della matrice e poi fare una nuova stringa (non-html-safe) da esso, provare a chiamare alla fine, dopo la stringa viene restituita dal generate_line:

<%= CSV.generate_line(row).html_safe %> 

UPDATE: per motivi di sicurezza, è necessario essere sicuri che questo modello non viene inviato al b rowser come HTML, ma un file /csv non elaborato. Se il contenuto della riga contiene tag HTML effettivi come <script>, questi non verrebbero scappati, perché hai dichiarato l'output come "sicuro".

Se questo contenuto deve essere emesso all'interno di una pagina HTML, è meglio considerare l'escape corretto anziché ignorarlo in questo modo.

Considerare se è davvero necessario un modello html.erb per generare CSV.

+0

Grazie, ha funzionato bene e ha fatto esattamente quello che stavo cercando. Dovrei averlo capito prima. –

+0

Grazie !! ha funzionato davvero per me – vishB

+0

Puoi anche chiamare 'row.to_csv.html_safe' poichè 'Array's ha un metodo' to_csv'. –

1

Ecco un modello che ho usato che funziona abbastanza bene:

<%= 
    response.content_type = 'application/octet-stream' 

    FasterCSV.generate do |csv| 
    csv << @report[:columns] 
    @report[:rows].each do |row| 
     csv << row 
    end 
    end 
%> 

È possibile farlo interamente all'interno del controllore, se ti piace e renderla come tipo :text invece.

Aiuta anche a dividere il contenuto in ordine, in questo caso un semplice hash @report, all'interno del controller piuttosto che fare tutto il sollevamento pesante nella vista.

+0

Grazie questo è un modello utile, non esattamente quello che stavo cercando, ma sarà buono per riferimento futuro. –

+0

Lo inseriresti in un file chiamato "export.csv.erb", ad esempio per assicurarti che non sia in HTML. – tadman

+1

@tadman Questo in realtà non è corretto. È necessario contrassegnare esplicitamente l'output CSV come sicuro per HTML, anche se si trova in un file .csv.erb. Inoltre, la tua risposta sembra sostenere il fatto di inserire il codice di visualizzazione nel controller che non ha alcun senso. – latortuga