RoR: принять загрузку файла и копировать и вставить вставку - PullRequest
1 голос
/ 28 марта 2019

Я хочу дать пользователю возможность загрузить файл CSV с вводом HTML ИЛИ скопировать и вставить данные столбца в текстовое поле, а затем создать файл CSV, чтобы сохранить его в модели.

Знаете ли вы какие-нибудь хорошие библиотеки или прагматичный подход к решению этой проблемы?

1 Ответ

1 голос
/ 28 марта 2019

Пример псевдо-реализации:

Тестирование работы на рейках 5.2 с ActiveStorage

Если вы уже настроили ActiveStorage,

приложение / модели / 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

приложение / просмотров / Foos / _form.html.erb

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

приложение / контроллеры / 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, если оба будут введены пользователем)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...