问题
Similar to this question except I don't use html_safe anywhere in the whole project.
I generate a CSV file in index.csv.erb like this:
<%=
response.content_type = 'application/octet-stream'
CSV.generate do |csv|
@persons.each do |person|
csv << [ person[:name], person[:nickname] ]
end
end
%>
PROBLEM: If nickname is NULL in the database (ActiveRecord/MySQL) then the CSV file associated element becomes "". I would expect "", or even nothing at all.
Result file sample:
Nicolas, Nico
Joe, ""
How can I prevent this from happening?
回答1:
The problem here is that you're not using html_safe. Your nickname field is blank and converted to "" in the csv file, but it is deemed unsafe by Rails and html escaped.
Just call html_safe on the result:
<%=
response.content_type = 'application/octet-stream'
CSV.generate do |csv|
@persons.each do |person|
csv << [ person[:name], person[:nickname] ]
end
end .html_safe
%>
The solution you linked to does not work anymore with Rails 3 because all strings are considered unsafe by default, which was not the case in Rails 2.
回答2:
Refactored
Benoit is absolutely correct and thanks for that tip. After looking at your code I see a much cleaner approach to generating your CSV as well, which I thought I would share for those landing here (like me!):
<%=
response.content_type = 'application/octet-stream'
@persons.collect{ |person| [ person[:name], person[:nickname] ].to_csv }.join.html_safe
%>
Essentially, you don't need all that CSV generate stuff. Ruby can take an Array and turn it into a CSV string, then just use a collect and join to put it all together nicely.
You can also do the following if you prefer having it on separate lines, which I do:
<% response.content_type = 'application/octet-stream' -%>
<% @persons.each do |person| -%>
<%= [ person[:name], person[:nickname] ].to_csv( row_sep: nil ).html_safe %>
<% end -%>
Here you'll need to use the -%> to ensure you don't get extra blank lines and you'll need to use the row_sep: nil option so that to_csv doesn't add a \n at the end of each line.
Anyway, hope that helps clean some people's code up.
来源:https://stackoverflow.com/questions/7358509/rails3-csv-putting-quotquot-instead-of-actual-quotes