@vanderv
Ruby on Rails

[Rails] Почему paperclip не сохраняет изображение, если форма не проходит валидацию?

Под инпутом вывожу превью загружаемой фотки. Если фотки нету, то показывается фото по умолчанию - обычная заглушка. Так вот после сабмита невалидной формы в этой превьюшке оказывается загружаемый файл и он почему не сохранился. Тобеж показывает что файла не существует. Исправляю форму отправляю форму - инпут с файлом пустой.
То беж у меня 2 проблемы:
1) Как сохранить изображение даже если форма не валидна.
2) Если форма не валидна - надо сохранять выбор инпута и повторно отправлять тот же файл.
Изображения обрабатываю с помощью гема paperclip
  • Вопрос задан
  • 2821 просмотр
Пригласить эксперта
Ответы на вопрос 3
Vakiliy
@Vakiliy
Можно костыль использовать, что-нибудь типа такого:

Модель
attr_accessor :cache_file
after_initialize :fetch_upload

  def fetch_upload
    options = { namespace: 'upload_cache', expire_in: 10.minutes }
    file = attach.queued_for_write[:original]
    if file.present?
      self.cache_file = attach.original_filename
      Rails.cache.write(cache_file, File.read(file.path), options)
    elsif cache_file.present?
      file = StringIO.new(Rails.cache.read(cache_file, options))
      if file.present?
        self.attach = file
        self.attach.instance_write(:file_name, cache_file)
      end
    end
  end

Вьюха
<%= f.text_field :cache_file %>
<%= f.file_field :attach %>
Ответ написан
Комментировать
@Coffin
Инпут пустой - это ограничения браузера и безопасность, что бы ты не мог читать файлы.
Ответ написан
Комментировать
@Finist
К сожалению не знаю как такое провернуть в paperclip, но в carrierwave (аналог) использовал такой вот трюк:
<%= form_for @user, :html => {:multipart => true} do |f| %>
  <p>
    <label>My Avatar</label>
    <%= f.file_field :avatar %>
    <%= f.hidden_field :avatar_cache %> # сохраняет изображения если форма не валидна
  </p>
<% end %>
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы