[Carrierwave] при сбое проверки не может сохранить [Rails5] - PullRequest
0 голосов
/ 13 февраля 2020

Я думаю о создании функции загрузки для нескольких файлов с использованием 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

Если вы можете решить эту проблему, пожалуйста, сообщите мне.

...