2

나는 3 개 파일 업로드 이미지가이 railcast에서 영감을 다단계 형태를 갖는다. 그러나 이미지를 업로드 할 때 오류 can't dump File가 표시됩니다.클립 및 파일 업로드 문제

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

이 그러나 작동하지 않는 것 : 다른 질문에서

은 그래서 세션에서 파일 업로드를 절약이 같은 구약 사용 뭔가가 필요하므로 작동하지 않는 것으로 알고 있습니다. 3 가지 파일 업로드를 살펴보고 매번 삭제해야합니까? 이 오류를 피하려면 어떻게해야합니까? 여기

내 생성 기능입니다 :

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

저는이 점에 대해 많은 경험이 없으므로이 통찰력을 얻을 수 있습니다. (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-ident-by-the-ident/16933264 # 16933264 – Nithin

답변

1

문제는 Marshal 에드이어야하고 그 때문에 당신이 세션 개체에 File를 저장할 수 있다는 것입니다 지원되지 않습니다. 당신은 마법사의 마지막 단계에서 이미지 업로드 부분을 추가하는 것입니다

  1. 이 중 쉬운 방법 : 제가보기에는 세 가지 가능한 솔루션을 가지고있다. 그렇게하면 세션에서 정보의 마지막 부분을 저장하지 않고 개체에 직접 저장할 수 있습니다. 그냥 당신이 마지막 단계에 저장 세션을 건너 뛸 수 있는지 확인하거나 두 번째 솔루션은 매우 까다 롭습니다

    params[:post].except(:assets) 
    
  2. 같은 것을 사용하여 세션을 저장하기 전에 파일 PARAMS을 꺼내. 컨트롤러가 고유 한 이름으로 알려진 장소의 디스크에 첨부 파일을 유지하는 모델을 저장하려고 할 때마다 할 수 있습니다. 이제 대신 방금 만든 로컬 파일 이름을 저장합니다 세션에 파일을 저장하는 (당신은 여전히 ​​예외를 피하기 위해 # 1에서 except 같은 뭔가가 필요). 저장시 기본적으로 세션 매개 변수에 지정된대로 서버 디스크에서 파일을 복원합니다. 일을 깨끗하게 유지하려면 오래된 파일 (예 : 일주일 전에 저장된 파일)을 삭제하는 크론 작업이 필요합니다. 당신은 whenever을 사용할 수 있습니다.

    : 위의 솔루션을 선택하고 첨부 파일이 별도의 모델 인 경우 실제로는 연결된 post_id없이 '임시'애셋을 저장할 수 있습니다. 그런 다음 파일 이름 대신 고유 한 데이터베이스 ID를 처리하게됩니다.)

  3. 마지막으로 비즈니스 논리 (및 신경)에서 허용하는 경우 모든 단계에서 데이터베이스의 모델을 계속 유지할 수 있습니다. 부분적으로 저장됩니다. 그렇게하면 세션을 사용할 필요가 없지만 많은 조건문 (유효성 검사, 범위 지정, 연결)을 처리해야하며 물론 cron 작업이 여전히 필요합니다.

+0

좋은 제안.솔루션 1을 사용하길 원하지만 마지막 단계 (지불)에서 이미지 업로드가 논리적이지 않을 것입니다. 나는 heroku를 사용하고 있기 때문에 복잡 할 수도있는 해결책 2를 조사 중입니다. – Ayrad

+0

모델 및 다단계 양식의 사용법을 혼동했을 수도 있습니다. 모든 양식 단계를 하나의 모델과 일치시킬 필요는 없습니다. 당신의 비즈니스 로직이 무엇인지 모르겠지만, 처음 몇 단계를 거쳐 모델을 만드는 것이 합리적입니다. 그리고 마지막 단계에서 지불금을 받고 생성 된 객체'id'의 참조를 전달하고 다른 모델을 생성하십시오. 다른 하나와 관련된다. 그것이 명확한 지 확실하지 않다. – Nikos

+0

나는 정말로 약간 혼란 스럽다. 명확히 해 주시겠습니까? assets_attributes라는 매개 변수로 이미지가 업로드 된 것처럼 보이므로 session : : post_params] .deep_merge! (params [: listing] .except (: assets_attributes)) params [: post]와 같이 세션에서 제거합니다. 저작물을 별도로 저장하고 (업로드 된 이미지) 어떻게 마지막 단계에서 게시물에 추가 할 수 있습니까? – Ayrad