CarrierWave не сохраняет загрузку после повторного отображения формы - PullRequest
7 голосов
/ 20 марта 2012

У меня есть приложение 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"=>"sample@example.com", "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, 'sample@example.com', 'Mr Sample', 'Sample content', '2012-03-20 08:51:56', 'Unresolved', 'Sample', '2012-03-20 08:51:56', NULL, NULL, NULL, NULL)

Похоже, что он правильно передает вложение через параметр attachment_cache в параметрах, но затем не сохраняет вложение, так как у него нет поля params [: модель] [: вложение].

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

Ответы [ 6 ]

3 голосов
/ 06 августа 2015

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

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

#view
<%= f.file_field :attachment %>
<%= f.hidden_field :attachment_cache %>
2 голосов
/ 28 февраля 2016

Это решит вашу проблему 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] пусты

2 голосов
/ 15 мая 2013

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

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

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

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

0 голосов
/ 12 января 2017

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

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

permit_params: :title, :file, :file_cache
0 голосов
/ 10 марта 2015

Для меня проблема была в том, что у меня было

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

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

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

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

0 голосов
/ 25 марта 2014

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

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

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

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

...