2013-05-19 4 views
3

레일에서 양식 도우미를 사용하여 업로드하는 기본 파일 (예 : 레일스 4.0.0.rc1 및 1.9.3p362)을 사용하여 edge rails guide을 사용하여 머리말을 붙이려 고합니다. 내가 Paperclip이나 CarrierWave에 들어가기 전에.양식 헬퍼를 사용하여 레일에 기본 파일 업로드

내 #create로 업로드 할 수있는 방법을 컨트롤러에 넣었습니다. 내 업로드 파일 이름이 저장된 이미지 열과 함께 새 레코드를 만드는 것이 계획되었습니다.

내 # 만들기이있다 : 나는 정확히 파일 업로드가 발생 레일 가이드를 따르

File.open(Rails.root.join('public', 'uploads', uploaded_io.original_filename), 'w') do |file| 
    file.write(uploaded_io.read) 
end 

, 내 public/uploads에서 파일을 볼 수 있지만 브라우저에서 인코딩 오류가 발생합니다 :
Encoding::UndefinedConversionError
"\x89" from ASCII-8BIT to UTF-8

\ x89는 파일 이름의 접미사에있는 점입니다. 즉 : .png

'b'를 File.open에 추가한다고하는 StackOverflow 게시물을 발견했습니다.이 게시물은 인코딩 오류를 수정하지만 다른 오류가 발생합니다. 이 StackOverflow post 내 오류를 다루고 있지만 솔루션을 따르고 여전히 오류가 있다고 생각합니다.

File.open(Rails.root.join('public', 'uploads', uploaded_io.original_filename), 'wb') do |file| 
    file.write(uploaded_io.read) 
end 

다음과 같은 TypeError가 발생하지만 인코딩 오류는 발생하지 않습니다. 반면에 파일은 업로드됩니다.

TypeError: can't cast ActionDispatch::Http::UploadedFile to string: 

내가 잘못하고있는 것에 대한 제안 사항이 있으십니까? 내가 클립을 이동하거나 CW 전에이 작품을보고 좋은 것

내가 업로드에 대한 열 :image를 사용했지만, 업로드시 :image:string 아니라는 것을 알아 냈

답변

2

, 그것은 (AN ActionDispatch::Http::UploadedFile 객체의 권리?). 데이터베이스에서 :image 열 필드 유형은 :string입니다. 그래서 :image에 저장하고 싶은 것은 uploaded_io.original_filename입니다.

제 첫 번째 솔루션은 ': image'를 form_for에 f.file_field으로 사용하지 않았습니다. 대신 :filename이라고 부르면 그 객체의 uploaded_io.original_filename을 잡고 :image에 저장 한 다음 저장합니다.

이것은보기 흉하지만 작동합니다.

uploaded_io = params[:piture][:filename] 
File.open(Rails.root.join('public', 'uploads', uploaded_io.original_filename), 'wb') do |file| 
    file.write(uploaded_io.read) 
end 
@picture.image = uploaded_io.original_filename 

나는 여전히 File.open 대 file.write가 (upload_io.read) (...)

+0

내가 carrierwave를 사용하여 동일한 오류를 데에 약간 흐릿한입니다. 이견있는 사람? – ctilley79

+0

아직 carrierwave를 체크 아웃하지 않았습니다. 죄송합니다. – kaplan

+0

나는 훨씬 더 레일 4 인 클립 클립을 사용하여 끝내었다. – ctilley79