RoR:接受文件上传以及复制和粘贴上传

时间:2019-03-28 10:16:10

标签: javascript ruby-on-rails ruby

我想让用户可以使用HTML输入来上传CSV文件,或者将列数据复制并粘贴到文本框中,然后创建一个CSV文件,以将其保存到模型中。

您知道任何好的库或实用方法如何解决此问题吗?

1 个答案:

答案 0 :(得分:1)

伪实现示例:

使用ActiveStorage

测试了在Rails 5.2上的工作

假设您已经set up ActiveStorage

app / models / foo.rb

class Foo < ApplicationRecord
  has_one_attached :csv

  # sets `csv` attachment from a String input
  # i.e. value = "Name,Age,\nBen,24,\nJenny,23,\nGeorge,21,\n"
  def csv_string=(value)
    tempfile = Tempfile.new
    tempfile << value
    tempfile.close

    self.csv = ActionDispatch::Http::UploadedFile.new(
      tempfile: tempfile,
      type: 'text/csv',
      filename: 'some_file_name.csv' # << change this filename accordingly
    )
  end
end

app / views / foos / _form.html.erb

<%= form_with(model: @foo, local: true) do |form| %>
  <!-- ... -->
  <%= form.file_field :csv %>
  <%= form.text_area :csv_string %>
  <!-- ... -->
<% end %>

app / controllers / foos_controller.rb

class FoosController < ApplicationController

  def create
    @foo = Foo.new(foo_params)
    # ...
  end

  private

  def foo_params
    params.require(:foo).permit(:csv, :csv_string)
  end
end

您的TODO

  • 添加一些JS,允许用户仅选择CSV的“文件上载”或“文本区域”(即,一些JS将隐藏/显示(和“启用” /“禁用”)输入之一相应地),因为如果您没有这种交互作用,将会使用户感到困惑,因为上面的file_field和text_area并排显示在表单上。 (但是只有一个有效):csv_string将覆盖csv的值(如果用户输入了两者)