rails 5 выберите путь к файлу для загрузки CSV-файла - PullRequest
0 голосов
/ 02 июня 2018

В одной из моих моделей я получил функцию записи CSV в новый файл:

def self.all_to_csv(path)
 columns = %w[number name description]
 CSV.open(path, 'wb') do |csv|
  csv << columns.map
  in_year.each do |course|
    csv << course.attributes.values_at('number', 'name', 'description')
  end
 end
end

Отлично работает.Теперь я хотел бы создать форму HTML, чтобы выбрать / создать новый путь к файлу.Я пытался использовать стандарт html <input type="file">, но, похоже, он предназначен только для загрузки файлов, а не для загрузки по определенному пути к файлу!Я не хочу, чтобы пользователь сам писал полный путь, потому что он был бы слишком подвержен ошибкам.

Есть ли способ выбрать новый путь с помощью селектора файлов (см. Изображение) и отправить его по адресусервер?(без JavaScript, если возможно, только html и ruby)

Если я использую <input type="file">, откроется это окно, где я не могу ввести новый путь к файлу!Я могу создать файл и выбрать его впоследствии, но это не лучшее решение ..

File Selector

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

Я нашел решение для загрузки файла CSV с помощью браузера на компьютер.Я думал csv.open() - это функция для загрузки файлов с сервера на клиент.@nathanvda был абсолютно прав, когда сказал, что «у сервера нет доступа к созданию файлов в определенном месте на клиентской машине».Итак, мое окончательное решение выглядит так:

Вместо использования csv.open(), который напрямую записывает в файл, я использую CSV.generate для создания строки и передачи ее в контроллер.

course.rb

def self.all_to_csv
  columns = %w[Nummer Name Beschreibung Max.Teilnehmer]
  CSV.generate do |csv|
    csv << columns.map
    in_year.each do |course|
      csv << course.attributes.values_at('number', 'name', 'description', 'max_visitor')
    end
  end
end

В контроллере я получаю имя файла из простой html-формы и отображаю ответ в виде вложения csv-файла (type: 'text/csv) в диалоге загрузки (disposition: 'attachment'). документация по send_data

* courses_controller.rb '

def download_courses_csv
  filename = params[:filename]
  send_data Course.all_to_csv, filename: "#{filename}.csv", type: 'text/csv', disposition: 'attachment'
end

Et Voila!

download dialog

0 голосов
/ 02 июня 2018

В вашем методе контроллера вы можете получить доступ к params[:file], и это экземпляр UploadedFile с методом экземпляра #path.Подробнее в API http://api.rubyonrails.org/classes/ActionDispatch/Http/UploadedFile.html#method-i-path

uploaded_file = params[:file]
new_filename = uploaded_io.original_filename
unless params[:new_filename].blank?
  new_filename = params[:new_filename]
end

File.open(Rails.root.join('public', 'uploads', new_filename), 'wb') do |file|
  file.write(uploaded_file.read)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...