Ответ 1
Я все еще не уверен, почему это исправило проблему, но это произошло.
Я изменил ссылку в представлении на
<%= link_to "Export to csv", request.parameters.merge({:format => :csv})%>
и теперь он работает!
Я хочу предоставить своим пользователям возможность экспортировать таблицу в CSV.
Итак, в моем контроллере я добавил поверх файла:
respond_to :html, :js, :csv
Я также устанавливаю заголовки, если запрошенный формат - csv:
if params[:format] == 'csv'
generate_csv_headers("negotiations-#{Time.now.strftime("%Y%m%d")}")
end
Код для generate_csv_headers
(в application_controller):
def generate_csv_headers(filename)
headers.merge!({
'Cache-Control' => 'must-revalidate, post-check=0, pre-check=0',
'Content-Type' => 'text/csv',
'Content-Disposition' => "attachment; filename=\"#{filename}\"",
'Content-Transfer-Encoding' => 'binary'
})
end
Я также создал представление с именем index.csv.erb
для создания моего файла:
<%- headers = ["Id", "Name"] -%>
<%= CSV.generate_line headers %>
<%- @negotiations.each do |n| -%>
<%- row = [ n.id,
n.name ] -%>
<%= CSV.generate_line row %>
<%- end -%>
У меня нет никакой ошибки, но она просто отображает содержимое CSV файла, в то время как я ожидаю приглашение от браузера загрузить файл.
Я много читал, но не мог найти ничего, что сработало бы. У вас есть идея?
спасибо, стр.
Я все еще не уверен, почему это исправило проблему, но это произошло.
Я изменил ссылку в представлении на
<%= link_to "Export to csv", request.parameters.merge({:format => :csv})%>
и теперь он работает!
Я не уверен, что вы должны сделать это таким образом, но если вы создадите и сохраните файл, вы можете использовать send_file для отправки его в браузер. См. http://api.rubyonrails.org/classes/ActionController/Streaming.html
Вам может быть интересен этот драгоценный камень, который я создал под названием CSV shaper, который позволяет вам создавать CSV-выход, используя действительно красивый Ruby DSL.
Он также будет обрабатывать правильную настройку заголовков ответов, одновременно разрешая настройку имени файла.