CarrierWave не сохраняет загрузку после повторного отображения формы

У меня есть приложение rails, которое первоначально использовало Paperclip для загрузки файлов, однако, поскольку я увидел, что CarrierWave, по-видимому, имеет функцию типа «постоянной загрузки» по сравнению с повторным отображением формы, я решил попробовать.

На мой взгляд имею следующее:

= f.input :attachment
= f.hidden_field :attachment_cache

Что правильно кэширует файл, если форма не проходит проверку и отображается повторно, однако, когда я исправляю ошибки проверки и повторно отправляю, вложение не обрабатывается.

Started POST "/section/model" for 127.0.0.1 at 2012-03-20 08:51:56 +0000
  Processing by Client::WishesController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"zkdPQBsAnsNzx555rkwZ5+clfnLaXg+NtL+GdFei188=", "model"=>{"title"=>"Sample", "content"=>"Sample content", "contact_name"=>"Mr Sample", "contact_email"=>"[email protected]", "attachment_cache"=>"20120320-0851-42559-1644/SampleAttachment.pdf"}, "commit"=>"Create Wish"}
  Client Load (0.3ms)  SELECT `clients`.* FROM `clients` WHERE `clients`.`id` = 1 LIMIT 1
   (0.2ms)  BEGIN
  SQL (0.4ms)  INSERT INTO `models` (`attachment`, `client_id`, `contact_email`, `contact_name`, `content`, `created_at`, `status`, `title`, `updated_at`, `upload_content_type`, `upload_file_name`, `upload_file_size`, `upload_updated_at`) VALUES (NULL, 1, '[email protected]', 'Mr Sample', 'Sample content', '2012-03-20 08:51:56', 'Unresolved', 'Sample', '2012-03-20 08:51:56', NULL, NULL, NULL, NULL)

Кажется, что он правильно передает вложение через вложение_кэш в параметрах, но затем не сохраняет вложение, поскольку у него нет поля params[:model][:attachment].

В нем не говорится о каких-либо дальнейших шагах в разделе CarrierWave, чтобы заставить загрузки работать при повторном отображении форм на CarrierWave GitHub. .


person HaaR    schedule 20.03.2012    source источник
comment
Это работает, если я создаю/обновляю с массовым назначением и устанавливаю отдельные переменные, но мне было интересно, есть ли способ сделать это без массового назначения?   -  person HaaR    schedule 20.03.2012
comment
Попробуйте открыть заявку для этого.   -  person Nash Bridges    schedule 21.03.2012
comment
вы нашли ответ на это?   -  person user749798    schedule 08.05.2013
comment
Вы также должны добавить имя поля к сильному параметру   -  person Bernie Chiu    schedule 16.04.2017


Ответы (6)


Попробуйте заполнить значение avatar_cache, чтобы в случае сбоя проверки оно было предварительно заполнено в форме:

= f.hidden_field :attachment_cache, :value => @model.attachment_cache

Где @model это название вашей модели

Кажется, это работает для меня, когда одна и та же форма перезагружается несколько раз (т.е. когда проверка не выполняется несколько раз). Я думаю, что они исключили это из документации.

person Kenny    schedule 15.05.2013
comment
Вы также должны добавить имя поля к сильному параметру - person Bernie Chiu; 16.04.2017

Это немного старый вопрос, но он сработал для меня после того, как я добавил сильный параметр в контроллер, например:

#controller
def object_params
  params.require(:object).permit(:attachment, :attachment_cache)
end

#view
<%= f.file_field :attachment %>
<%= f.hidden_field :attachment_cache %>
person Marko Ćilimković    schedule 06.08.2015

Это решит вашу проблему на 100%

Пожалуйста, взгляните на

accepts_nested_attributes_for :avatars, allow_destroy: true, 
 reject_if: lambda { |avatar| avatar[:avatar].blank? and avatar[:avatar_cache].blank?}

Здесь мы отклоняем аватар, когда avatar[:avatar] и avatar[:avatar_cache] пусты.

person Ramkrishnan Patidar    schedule 28.02.2016

Причина в том, что «изменился?» проверьте, при ошибке проверки мы передаем кешированный файл в поле #{model}_cache, которое не является столбцом таблицы базы данных, поэтому он не сохраняет объект, потому что с точки зрения AR ничего не изменилось.

Я взломал эту работу, создав в модели метод, содержащий файл: «данные» — это имя столбца.

def data_cache=(text)
  @changed_attributes.merge!("data" => nil)
  super
end

Надеюсь это поможет.

person jiongye    schedule 25.03.2014
comment
Я отредактировал, чтобы удалить предысторию из этого ответа. Ответы должны отвечать на вопрос и не содержать посторонней информации. Не стесняйтесь просматривать мои изменения и добро пожаловать в StackOverflow! - person BradleyDotNET; 25.03.2014

Для меня проблема заключалась в том, что я

accepts_nested_attributes_for :avatars, allow_destroy: true, reject_if: lambda { |avatar| avatar[:file].blank? }

Итак, я отклонял файл, потому что файла там не было

Важно отметить, что сохраняется не сам файл, а только файловый кеш. Вот почему документы предлагают следующее:

Возможно, было бы неплохо показать пользователю, что файл был загружен, в случае изображений хорошим индикатором будет небольшая миниатюра:

person stevenspiel    schedule 10.03.2015

Чтобы добавить к ответу @marko:

Если вы используете Active Admin, вам необходимо добавить кешированный файл в строку Permit_params.

permit_params: :title, :file, :file_cache
person troxwalt    schedule 12.01.2017