2

我有一个多步骤的形式灵感来自railcast有3个文件上传图像。但是,当我上传图像时,我收到错误can't dump File回形针和文件上传问题

在其他问题使我明白,在会话保存文件上传不工作,所以我需要OT使用这样的事情:

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 post]获得一些见解(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/paperclipnotidentifiedbyimagemagickerror-image -is-not-recognized-the-ident/16933264#16933264 – Nithin

回答

1

的问题是,你不能一个File存储到会话对象,因为它必须是Marshal ED,这是不支持。当我看到它,你有三种可能的解决方案:

  1. 最简单的办法,这一切都在最后一步的你向导添加图片上传部分。这样你就不需要将最后一部分信息保存在会话中,而是直接保存在对象中。只要确保你跳过会话保存在最后一步或者你把文件PARAMS他们的东西存放到您的会话像

    params[:post].except(:assets) 
    
  2. 之前,第二个解决方案是非常棘手。你可以做的是每当你的控制器试图保存一个模型时,你将附件保存在一个已知名称的磁盘上。现在,不是将文件存储到会话中,而是存储刚刚创建的本地文件名(您仍然需要类似except以避免该例外)。保存后,您将基本上恢复会话参数中指定的服务器磁盘中的文件。为了保持干净,你需要一个可以删除旧文件的cron作业(例如一周前保存的任何文件)。你可以使用whenever

    提示:如果选择上述溶液中,你的附件是一个独立的模型,因为它似乎,实际上你可以保存“TEMP”资产没有关联post_id。然后,而不是文件名,您将处理唯一的数据库ID;)

  3. 最后,如果您的业务逻辑(和您的神经)允许它,您可以考虑在每一步持续您的模型在数据库中,它被部分保存。这样你就不需要使用会话,但是你将不得不处理很多条件(在你的验证中,在你的范围内,在你的关联中......),当然你仍然需要这个cron工作。

+0

好的建议。我希望解决方案1能够工作,但是在最后一步(付款)上传图片并不合乎逻辑。我正在调查解决方案2,因为我使用的是heroku,所以这可能会很复杂。 – Ayrad

+0

我想你可能会混淆模型的使用和多步骤的形式。您无需将所有表单步骤与一个模型进行匹配。我不确定你的业务逻辑是什么,但是通过前几个步骤创建一个模型也是有意义的,在最后一步你只需传递创建的对象'id'的引用并生成一个不同的模型与另一个关联。不知道这是否明确:) – Nikos

+0

我确实有点困惑。你能澄清吗?它看起来像图像上传到一个名为assets_attributes的参数,所以我将它从会话中删除,如下所示:session [:post_params] .deep_merge!(params [:listing] .except(:assets_attributes))if params [:post]。如何分别保存资源(上传的图像)并在最后一步将其添加到帖子中? – Ayrad