2012-08-29 2 views
3

사용자가 컴퓨터에서 CSV 파일을 선택한 다음 파일 폴더에 저장할 수있는 간단한 파일 업로드 양식이 있습니다. Carrierwave 사용자에게 애쓰며 내 앱은 Ruby on Rails에 내장되어 있습니다. 내가 파일을 저장하려고하면Carrierwave로 파일을 업로드하는 중에 경로가 일치하지 않습니다.

, 나는 여기에 다양한 구성 요소가 오류 "아니 경로 일치 [POST]"/ 고객/새 ".

를 얻을.

/new.html합니다. ERB

<%= form_for :dataload, :html => {:multipart => true} do |f| %> 

<p> 
    <%= f.file_field :file %> 
</p> 
<p><%= f.submit %></p> 
<% end %> 

/models/dataload.rb

class Dataload < ActiveRecord::Base 
    attr_accessible :file_name, :request_user, :source 
    mount_uploader :file, CustomerWarrantyUploader 
end 
,

*/로더/customer_warranty_uploader.rb *

class CustomerWarrantyUploader < CarrierWave::Uploader::Base 
    storage :file 
    def store_dir 
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" 
    end 
    def extension_white_list 
    %w(csv) 
    end 

* customers_controller.rb (새로운 방법; 나는 문제가 다양한 유사한 접근 방식을 시도하는 데 무엇 확실하지 않다 고객

resources :customers 

에 대한 현재 경로를 여기 *)이에

def new 
    @customer = Customer.new 

    respond_to do |format| 
     format.html # new.html.erb 
     format.json { render json: @customer } 
    end 
    end 

아무것도 완료하지 않았습니다. 모든 조언을 부탁드립니다.

답변

3

그 이유는 경로가 실제로 존재하지 않기 때문입니다.

GET  /customers   index display a list of all photos 
GET  /customers/new  new  return an HTML form for creating a new photo 
POST /customers   create create a new photo 
GET  /customers/:id  show display a specific photo 
GET  /customers/:id/edit edit return an HTML form for editing a photo 
PUT  /customers/:id  update update a specific photo 
DELETE /customers/:id  destroy delete a specific photo 

당신이/유일한 POST 경로는, 고객이 볼 수 있듯이 : 자원은 다음과 같은 경로 (http://guides.rubyonrails.org/routing.html)를 생성한다. 양식을 간단하게 조정해야 트릭을해야합니다. 다음과 같은 뭔가 작업을해야합니다 :

<%= form_for :dataload, { :url => customers_path , :html => {:multipart => true} } do |f| %> 

편집 : 사용자 의견의 결과로 추가 정보를 추가.

업로드 한 파일을 처리하려면 컨트롤러에 논리를 추가해야합니다. 기본적으로 Railscast에서 그는 "사이트의 일부가 이미 구축되었습니다. 각 갤러리에 대한 링크와 갤러리의 그림을 보여주는 페이지가있는 갤러리가 나열된 페이지가 있습니다.". 여기에는 새로운 편집 페이지도 포함됩니다. 자신의 컨트롤러 (프로젝트 소스 코드에서 - http://media.railscasts.com/assets/episodes/sources/253-carrierwave-file-uploads.zip) 코드는 다음과 같습니다 그는 자신의 파일을 추가 할 때

@gallery = Gallery.new(params[:gallery]) 

그래서 그는 모델에 속성으로 그것을했다, 그래서 그는 attr_accessible :image이었다 추가했다 모든 비트를 모델에 적용하여 컨트롤러가 자동으로 이미지 처리를 시작하도록합니다 (동일한 매개 변수를 통해 처리됨). 모델의 애트리뷰트가 아닌 다른 매개 변수 (: dataload)를 통해 코드가 전달되면 현재 기술을 사용하여 코드를 추가해야 할 가능성이 높습니다. 어쩌면의 라인을 따라 뭔가 : 심지어

@dataload = Dataload.create(params[:dataload]) 

나 : 그럼

@dataload = Dataload.process_uploaded_file(params[:dataload]) 

, 당신은 ... 당신의 관련 고객 생성 논리를 킥오프 당신의 Dataloadprocess_uploaded_file 방법을 추가

실제로 처리하지 못한 또 다른 문제는 데이터에 오류가있을 때 어떤 일이 일어날 것인가입니다. 예를 들어 업로드 된 파일의 10 개 항목 중 2 개가 잘못된 레코드를 만드는 경우 어떻게 할 것인가? (그리고 오류를 어떻게 나타낼 것입니까?)

+0

좋습니다. 더 이상 오류가 없으며 고객이 성공적으로 생성되었다는 메시지가 나타납니다. 그러나 파일은 customer_warranty_uploader.rb에 지정된 위치에 저장되지 않습니다. 내가 누락 한 반송파는 무엇인가? – analyticsPierce

+1

컨트롤러에서 아무 것도하지 않는 것처럼 보입니다. 당신은 다음과 같은 일을 할 필요가있을 것입니다 : @dataload = Dataload.create (params [: dataload]) –

+1

또한 (그리고 저는 원래이 게시물에 거의 이것을 가지고 있지만 삭제했습니다.), 구현을 다소 재검토하고 싶을 수도 있습니다. 우려 사항을 명확히 구분할 수있는 것처럼 Dataload 객체를 위해 특별히 새로운 컨트롤러를 만드는 것이 더 바람직 할 수 있습니다. 고객 로직을 추가하지 않고도 유지 보수 및 문제 해결을보다 쉽게 ​​수행 할 수 있습니다. 여기에는 페이지에 두 가지 형식 (최소한)이 있다고 가정합니다. –

1

나는 그것이 즉 /customer/new로 리디렉션하지만 같은 HTTP 동작을 유지해야 당신의 Dataload 모델 대신 GETPOST, 따라서 라우팅 오류가있는 redirect_to :back의 확신 해요.

난 당신이 (리디렉션 컨트롤러의 영토입니다)하지만, 당신이 그것을 넣어 어디든지, 당신은 아마 GET 강제로 303 상태 코드가 필요합니다이 리디렉션을한다고 생각하지 않습니다

:

redirect_to :back, :status => 303, alert: "your file is being processed" 
docs에서

:

당신은 GET 또는 POST 이외의 XHR 요청을 사용하고 요청 후 일부 브라우저는 원래 요청 방법을 사용하여 리디렉션을 따릅니다 후 리디렉션합니다. 이로 인해 이중 삭제와 같은 바람직하지 않은 동작이 발생할 수 있습니다. 이 문제를 해결하려면 303을 반환 할 수 있습니다. GET 요청을 사용하여 수행 할 기타 상태 코드를 참조하십시오.

+0

dataloads 모델에서 리디렉션을 제거했지만 여전히 동일한 오류가 발생합니다. 모델에 로그 메시지를 추가하려고 시도했지만 절대 실행되지 않았습니다. 제 생각에 컨트롤러에 뭔가 빠져 있습니다. 생각? – analyticsPierce

+0

관련 컨트롤러 코드를 게시 할 수 있습니까? –

+0

내 질문에 새 메서드에 대한 코드를 추가했습니다. 그것은 그것을 생성 할 때 생성 된 것입니다. 나는 이것이 내가 시작한 railscast 동안 컨트롤러 코드를 추가하는 것에 대한 언급이 아니라는 것을 안다. 어쩌면 내가 뭔가를 놓친 것 같아. 도와 주셔서 감사합니다. – analyticsPierce

0

는 다른 컨트롤러를 통해 파일을 만들고
accepts_nested_attributes_for :dataload, allow_destroy: true
를 사용하고 형태 field_for을 사용해야합니다. nested_form gem

관련 문제