2010-10-07 7 views
10

Ich versuche, eine CSV-Datei zu generieren. Alles ist in Ordnung außer für leere Felder, ich bin mir nicht ganz sicher "" anstelle von tatsächlichen Anführungszeichen. Ich habe den Code zur Verfügung gestellt, den ich verwende, um die Datei und etwas Ausgabe zu erzeugen.Ruby on Rails CSV setzen " " anstelle der tatsächlichen Angebote

<% 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 %> 

Ausgabe

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; 

Antwort

28

Statt html_safe auf jedem Teil des Feldes von Aufrufen und dann einen neuen (nicht-HTML-safe) string daraus zu machen, versuchen Sie es am Ende Aufruf, nach dem String wird von generate_line zurückgegeben:

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

UPDATE: Für Sicherheit, Sie müssen sicher sein, dass diese Vorlage nicht auf die b gesendet werden rowser als HTML, aber eine rohe Text/csv Datei. Wenn der Zeileninhalt tatsächliche HTML-Tags wie <script> enthält, werden diese nicht maskiert, weil Sie die Ausgabe als "sicher" deklariert haben.

Wenn dieser Inhalt innerhalb einer HTML-Seite ausgegeben werden muss, sollten Sie das richtige Escaping in Betracht ziehen, anstatt es so zu umgehen.

Überlegen Sie, ob Sie wirklich eine html.erb Vorlage zum Generieren von CSV benötigen.

+0

Danke, das hat gut funktioniert und genau das gemacht, was ich gesucht habe. Ich sollte das vorher bemerkt haben. –

+0

Danke !! es funktionierte wirklich für mich – vishB

+0

Sie können auch 'row.to_csv.html_safe' aufrufen, da' Array's eine 'to_csv' Methode haben. –

1

Hier ist eine Vorlage die ich verwendet habe, das funktioniert gut genug:

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

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

Sie können dies in der Steuerung vollständig tun, wenn Sie es als Art mögen und machen :text statt.

Es hilft auch, wenn Sie den Inhalt in Ordnung, in diesem Fall eine einfache @report Hash, in den Controller als das ganze schwere Heben in der Ansicht tun.

+0

Danke, das ist eine nützliche Vorlage, nicht genau das, was ich suchte, aber es wird gut für die zukünftige Referenz sein. –

+0

Sie würden das in eine Datei mit dem Namen 'export.csv.erb' eingeben, um sicherzustellen, dass es sich nicht um HTML-Escape handelt. – tadman

+1

@tadman Das ist eigentlich nicht korrekt. Sie müssen die CSV-Ausgabe explizit als HTML-sicher markieren, auch wenn sie sich in einer CSV.ERB-Datei befindet. Außerdem scheint Ihre Antwort darin zu bestehen, View-Code in den Controller einzufügen, was keinen Sinn ergibt. – latortuga