2

У меня есть многоэтапная форма, вдохновленная этим railcast, который имеет 3 файла для загрузки изображений. Однако, когда я загружаю изображение, я получаю сообщение об ошибке can't dump File.paperclip и проблема с загрузкой файлов

Из других вопросов в SO Я понимаю, что сохранение файла загрузки в сессии не работает, поэтому мне нужно отъ использовать что-то вроде этого:

unless @post.valid? 
     @post.assets.first.attachment.clear 
     @post.assets.first.attachment.queued_for_write.clear 
    end 

Это, однако, не похоже на работу. Должен ли я просматривать три загрузки файлов и очищать их каждый раз? Как я могу избежать этой ошибки?

Вот моя создать функцию:

session[:post_params].deep_merge!(params[:post]) if params[:post] 
    session[:duration] = params[:post_duration] if params[:post_duration] 


    @post = Post.new(session[:post_params]) 
    @post.current_step = session[:post_step] 

    unless @post.valid? 
     logger.info("attachment " + @post.assets.first.attachment.inspect) 
     @post.assets.first.attachment.clear 
     @post.assets.first.attachment.queued_for_write.clear 
    end 


    if @post.valid? 
     if params[:back_button] 
     @post.previous_step 
     elsif @post.last_step? 
     if @post.all_valid? 
      ... 
      session[:post_step] = session[:post_params] = nil 
      redirect_to @post and return 
     end 
     else 
     @post.next_step 
     end 

    session[:post_step] = @post.current_step 
    end 

    if @post.new_record? 
     render "new" 
    end 
    end 

Моя модель активов

class Asset < ActiveRecord::Base 
    # attr_accessible :title, :body 

belongs_to :post 
attr_accessible :attachment 
has_attached_file :attachment, :styles => { :medium => "600x600>", :small => "200x200>", :thumb => "100x100>" }, 
:default_url => "no_image_:style.jpg" 
end 
+0

У меня нет большого опыта работы с этим, в частности, таким образом, вы можете получить некоторое представление от этого [пост StackOverflow] (http://stackoverflow.com/questions/5876714/multi-step-form-in -rails-3-with-paperclip-attachments/8079113 # 8079113) –

+0

@RichPeck, что действительно там, где я нашел предложение об очистке объекта изображения – Ayrad

+0

это может помочь http://stackoverflow.com/questions/7079999/paperclipnotidentifiedbyimagemagickerrorimage -is-not-known-by-the-ident/16933264 # 16933264 – Nithin

ответ

1

Проблема заключается в том, что вы не можете сохранить File в объект сеанса, так как он должен быть Marshal ред и что не поддерживается. Как я вижу у вас есть три возможных решения:

  1. легкий выход из этого можно было бы добавить часть загрузки изображения на последнем шаге вы мастера. Таким образом, вам не нужно сохранять последнюю часть информации в сеансе, а скорее непосредственно в вашем объекте. Просто убедитесь, что вы пропустите сеанс сохранения на последнем шаге или вынимают файл Params перед хранением их в сессию с чем-то вроде

    params[:post].except(:assets) 
    
  2. Второе решение намного сложнее. Что вы можете сделать, каждый раз, когда ваш контроллер пытается сохранить модель, вы сохраняете вложения на диск в известном месте с уникальным именем. Теперь вместо хранения файла на сеансе вы будете хранить имена локальных файлов, которые вы только что создали (вам все равно нужно что-то вроде except от # 1, чтобы избежать исключения). После сохранения вы в основном восстанавливаете файлы с диска сервера, как указано в параметрах сеанса. Чтобы сохранить чистоту, вам нужно выполнить задание cron, которое удалит старые файлы (например, любой файл, сохраненный неделю назад). Вы можете использовать для этого whenever.

    Совет: Если вы выбираете выше решение и ваши вложения отдельная модель, как это кажется, вы можете сохранить «ТЕМП» активов без связанного post_id. Затем вместо имен файлов вы будете обрабатывать уникальные идентификаторы базы данных;)

  3. Наконец, если ваша бизнес-логика (и ваши нервы) позволяют это, вы можете рассмотреть возможность сохранения вашей модели в базе данных на каждом шагу, возможно, с флагом, означающим, что он частично сохраняется. Таким образом, вам не понадобится использовать сеанс, но вам придется иметь дело со многими условностями (в ваших проверках, в области обзора, в ваших ассоциациях ...), и, конечно, вам все еще нужно это задание cron.

+0

Хорошие предложения.Я хочу, чтобы решение 1 работало, но загрузка моего изображения на последнем шаге (оплата) не была бы логичной. Я изучаю решение 2, которое может быть сложным, поскольку я использую герою. – Ayrad

+0

Я думаю, вы, возможно, путали использование моделей и многоступенчатой ​​формы. Вам не нужно сопоставлять все шаги формы с одной моделью. Я не уверен, что такое ваша бизнес-логика, но также может иметь смысл создать модель с помощью первых нескольких шагов, и на последнем шаге, когда вы получите платеж, просто передайте ссылку созданного объекта 'id' и создайте другую модель связанный с другим. Не уверен, что это было ясно :) – Nikos

+0

Я действительно немного смущен. Не могли бы вы уточнить? Похоже, что изображения загружаются в param, называемые assets_attributes, поэтому я удаляю его из сеанса следующим образом: session [: post_params] .deep_merge! (Params [: listing] .except (: assets_attributes)), если params [: post]. Как я могу сохранить активы отдельно (загруженные изображения) и добавить их на последнем шаге к сообщению? – Ayrad

Смежные вопросы