Я думаю о создании функции загрузки для нескольких файлов с использованием Rails5, Carrerwave. Я уже построил функцию загрузки нескольких файлов.
■ Что я хочу иметь возможность делать Если проверка не работает, я хотел бы иметь возможность сохранить данные файла. Он снабжен видом, который определяет, может ли валидация работать или нет, и в зависимости от результата HTML изменится. Однако, если проверка не удалась → после того, как второй файл регистрации содержит информацию о file_info, равную нулю.
■ информация о модели
・ Пользователь: родительская модель
・ Файлы : дочерняя модель -колонна информация
file_info: хранилище информации о файле,
имя_файла: хранилище информации о файле,
file_info_cache: ca sh хранилище информации
(пользователь и файлы одна ко многим ассоциациям)
■ Проблема
Ошибка проверки: view @ user.files [1] .file_info содержит значение, но после создания контроллера action @ user.files [1] .file_info null is включен. Файл ca sh type type = hidden, с помощью которого я отправляю его на контроллер.
Я думаю, что причина невозможности подключения данных заключается в том, что он не подключен к HTML, я Я не знаю, где я иду не так.
・ Просмотр отладочной информации после сбоя проверки.
pry
[1] pry(#<#<Class:0x00007f9e20452228>>)> @user.files
=> [#<File:0x00007f9e18f74118 id: nil, file_info: nil, created_at: nil, updated_at: nil, user: nil, references: nil, user_id: nil, file_name: "">,
#<FIle:0x00007f9e2095ace8 id: nil, file_info: nil, created_at: nil, updated_at: nil, user: nil, references: nil, user_id: nil, file_name: "test">]
// View when failed to validate file_info information is stored
[2] pry(#<#<Class:0x00007f9e20452228>>)> @user.files[1].file_info
=> #<FileUploader:0x00007f9e20959f50
@cache_id="1580997255-49160068767576-0071-9156",
@cache_storage=#<CarrierWave::Storage::File:0x00007f9e18f57130 @cache_called=nil, @uploader=#<FileUploader:0x00007f9e20959f50 ...>>,
@file=
#<CarrierWave::SanitizedFile:0x00007f9e209588a8
@content=nil,
@content_type="image/png",
@file="/Users/jasper/Desktop/ruby_workspace/myapp/public/uploads/tmp/1580997255-49160068767576-0071-9156/icon17.png",
@original_filename="icon17.png">,
@filename="icon17.png",
@identifier=nil,
@model=#<FIle:0x00007f9e2095ace8 id: nil, file_info: nil, created_at: nil, updated_at: nil, user: nil, references: nil, user_id: nil, file_name: "test">,
@mounted_as=:file_info,
@original_filename="icon17.png",
@staged=true,
@versions={}>
[3] pry(#<UsersController>)> @user.files[1].file_info.retrieve_from_cache! @user.files[1].file_info.cache_name
=> [:retrieve_versions_from_cache!]
・ html при сбое проверки (не сохранено)
html
<div class="form-group row p-2">
<div class="file-group ml-3">
<label for="user_files_attributes_0_ファイル名">ファイル名</label>
<input autocomplete="off" class="form-control file_info col-4" data-file="1" name="user[files_attributes][1][file_info_tmp]" placeholder="まずファイル名を入力してね!" type="text">
<input autocomplete="off" class="form-control file_info col-4" data-file="0" name="user[files_attributes][0][file_info_tmp]" placeholder="まずファイル名を入力してね!" style="display: none;" type="text" value="test">
<end></end>
<div id="preview">
<div class="dropzone-area">
<label class="dropzone-box" for="" id="fileInput"></label>
<div class="btn fa fa-file attached_file mt-2 disabled btn-outline-dark">ファイル添付</div>
<div class="input_area">
<input class="upload-file" data-file="1" id="upload-file" name="user[files_attributes][1][file_info]" type="file" style="display: none;">
<input class="upload-file" data-file="0" id="upload-file" name="user[files_attributes][0][file_info]" style="display: none;" type="file">
<end></end>
<input id="user_files_attributes_0_file_info_cache" name="user[files_attributes][0][file_info_cache]" type="hidden">
</div>
</div>
<li data-file="1" id="sp_sell-upload-item" style="list-style: none; margin-right: 20px; margin-top: 5px; margin-bottom: 20px; display: inline-block;">
<div class="sp_sell-upload-file">
<img src="data:image/png;base64,iVBORRK5CYII" width="128" height="128">
</div>
<p class="mb-0">test.png</p>
<div class="sp_sell-upload-button btn btn-sm btn-outline-danger">
<a class="sp_sell-upload-delete delete" data-file="1" style="cursor:pointer;">削除</a>
</div>
</li>
</div>
</div>
</div>
・ контроллер при сбое проверки (не сохранен)
pry
[1] pry(#<UsersController>)> @user.files
=> [#<FIle:0x00007f9e20227980 id: nil, file_info: nil, created_at: nil, updated_at: nil, user: nil, references: nil, user_id: nil, file_info_tmp: "">,
#<FIle:0x00007f9e2020fdf8 id: nil, file_info: nil, created_at: nil, updated_at: nil, user: nil, references: nil, user_id: nil, file_info_tmp: "test">]
[2] pry(#<UsersController>)> @user.files[1].file_info
=> #<FIleUploader:0x00007f9e1fed9a30
@cache_id=nil,
@file=nil,
@filename=nil,
@identifier=nil,
@model=#<FIle:0x00007f9e2020fdf8 id: nil, file_info: nil, created_at: nil, updated_at: nil, user: nil, references: nil, user_id: nil, file_info_tmp: "test">,
@mounted_as=:file_info,
@staged=false,
@versions=nil>
■ применимый исходный код
просмотр
- if @user.files.length == 1
.form-group.row.p-2
= f.fields_for :files do |p|
.file-group.ml-3
// for file name
= p.label :ファイル名
= p.text_field :file_name, class: 'form-control file_info col-4', id: 'file-name', placeholder: 'まずファイル名を入力してね!', autocomplete: 'off', 'data-file': 0
// for file input
#preview
.dropzone-area
= p.label :file_info, id: "fileInput", class: "dropzone-box", for: "" do
.btn.btn-outline-dark.fa.fa-file.attached_file.disabled.mt-2
| ファイル添付
.input_area
/ file attachment when validation failed
= p.file_field :file_info, id: "upload-file", class: "upload-file", 'data-file': 0
= p.hidden_field :file_info_cache
/ when validation failed
- else
.form-group.row.p-2
.file-group.ml-3
label for="user_files_attributes_0_ファイル名" ファイル名
- @user.files.reverse.each_with_index.reverse_each do |file, index|
- file_info = file.file_name
- if @user.files.length - 1 == index
input.form-control.file_info.col-4 autocomplete="off" data-file="#{index}" name="user[files_attributes][#{index}][file_name]" placeholder="まずファイル名を入力してね!" type="text"
-else
input.form-control.file_info.col-4 autocomplete="off" data-file="#{index}" name="user[files_attributes][#{index}][file_name]" placeholder="まずファイル名を入力してね!" type="text" style=("display: none;") value="#{file_info}"
end
#preview
.dropzone-area
label#fileInput.dropzone-box for=""
.btn.fa.fa-file.attached_file.mt-2.disabled.btn-outline-dark ファイル添付
.input_area
= binding.pry
- @user.files.reverse.each_with_index.reverse_each do |file_path, index|
- if @user.files.length - 1 == index
input#upload-file.upload-file data-file="#{index}" name="user[files_attributes][#{index}][file_info]" type="file"
- else
input#upload-file.upload-file data-file="#{index}" name="user[files_attributes][#{index}][file_info]" type="file" style=("display: none;")
end
input#user_files_attributes_0_file_info_cache name="user[files_attributes][0][file_info_cache]" type="hidden"
- @user.files.each_with_index do |file, index|
- if index != 0
li#sp_sell-upload-item data-file="#{index}" style=("list-style: none; margin-right: 20px; margin-top: 5px; margin-bottom: 20px; display: inline-block;")
.sp_sell-upload-file
- file_url = "data:" + file.file_info.content_type + ";base64," + Base64.encode64(File.read(file.file_info.path))
= file_tag file_url, :size => '128x128'
p.mb-0 = file.file_info.model.file_name + "." + file.file_info.file.original_filename.split(".")[-1]
.sp_sell-upload-button.btn.btn-sm.btn-outline-danger
a.sp_sell-upload-delete.delete data-file="#{index}" style="cursor:pointer;" 削除
контроллер
def create
@user = User.new(user_params)
if @user.files.length > 1
@user.files[0].destroy
end
binding.pry
if @user.save
else
respond_to do |format|
render_flg = 1
format.html { render action: 'new' }
end
end
redirect_to @user, notice: "「#{reg_name}」様の予約を登録しました。"
end
def user_params
params.require(:user).permit(
files_attributes: [
:file_info,
:file_info_cache,
:file_name
]
)
end
Если вы можете решить эту проблему, пожалуйста, сообщите мне.