rails 5选择文件路径以下载CSV文件

时间:2018-06-02 13:36:41

标签: ruby-on-rails ruby

在我的一个模型中,我得到了一个在新文件中写入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 :(得分:0)

在您的控制器方法中,您可以使用实例方法params[:file]访问UploadedFile,这是#path实例。阅读API enter image description here

中的更多内容
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

答案 1 :(得分:0)

我找到了一个解决方案,可以通过浏览器将csv文件下载到计算机上。 我认为csv.open()是将文件从服务器下载到客户端的功能。 @nathanvda完全正确,他说&#34;服务器无法在客户端机器上的特定位置实际创建文件&#34;。所以我的最终解决方案看起来像这样:

我使用csv.open()创建一个String并将其传递给控制器​​,而不是使用直接写入文件的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表单接收文件名,并在下载对话框(type: 'text/csv)中将响应显示为csv文件(disposition: 'attachment')附件。 send_data documentation

* courses_controller.rb&#39;

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