Пример псевдо-реализации:
Тестирование работы на рейках 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
, если оба будут введены пользователем)