2012-11-29 2 views
0

사용자가 책을 만들 때 책 ID와 동일한 이름으로 이미지를 업로드하는 레일 응용 프로그램이 있습니다 (assets/books_icon). 그것은 개발 mode.Then에서 작동레일 프로덕션 환경에서 파일 업로드 후 파일 경로가 업데이트되지 않습니다.

upload_icon(params[:book][:image_upload]) 

# upload_image when create/update book 
    def upload_icon(uploaded_io) 
     photo_directory = "app/assets/images/" 

     # only when user upload the iphoto 
     if uploaded_io.present? 

     # upload to the exact location with category_id 
     extension = File.extname(uploaded_io.original_filename) 
     photo_location = 'books_image/'+ @book.id.to_s + extension 

     # open in binary mode 
     photo_full_location = photo_directory + photo_location 
     File.open(photo_full_location, 'wb') do |file| 
      file.write(uploaded_io.read) 
     end 

     # only have to state which is the directory, 
     # image_tag will use assets piepline which will add 'assets/images/' as prefix in src 
     @book.update_attribute(:image_url, photo_location) 
     end 
    end 

, 나는 데이터베이스로 MySQL과 맥 아파치 서버에서 승객과 레일 응용 프로그램을 배포하고 난 개발의 구성 파일에 config.assets.compile = true을 변경했습니다.

생산 모드에서 새 책을 만들 수 있으며 이미지를 assets/books_icon에 업로드 할 수 있습니다. 그러나 방금 업로드 한 이미지의 파일 경로는 update이 아닙니다.

예를 들어, id가 2 인 새 책을 만들고 assets/books_icon에 2.jpg가 있습니다. 하지만 레일 응용 프로그램은 http://localhost/assets/images/books_icon/2.jpg가 누락되었다고 말합니다. 나는 아파치 서버를 다시 시작할 때

그러나, 나는 http://localhost/assets/images/books_icon/2.jpg

caching 이러한 유형의 문제를 해결하기 위해 어떤 해결책이 거기에서 사진을 볼 수 있습니다 ??

+0

공개 앱이 아닌 앱/저작물에 저장하도록 특정 요구 사항이 있나요? –

+0

아무런 요구 사항이 없습니다 :) 그것은 내 숙제를위한 제 디자인입니다. – code4j

답변

2

이 컨텍스트에서 업로드 된 이미지는 실제로 "자산"으로 간주되지 않습니다. 다른 곳에서 저장 한 데이터라고 생각할 수 있습니다. 이미지 애셋은 로고 또는 배경 이미지 등일 수 있습니다. Rails의 자산 파이프 라인은 자산 일 때 간단한 파일 경로를 실제 자원 (예 : 이미지)으로 변환하기 위해 매우 까다로운 작업을 수행합니다.

기본적으로 레일스는 app/public 폴더를 문서 루트로 만듭니다. 따라서 이미지를 업로드 할 수있는 곳 (예 : "upload/img"하위 디렉토리)에 /upload/img/mybook.jpg 경로를 사용하여 참조 할 수 있습니다.

이 방법은 이미지가 실제로 데이터베이스의 데이터와 직접 연결되지만 서버의 파일 시스템에 위치하기 때문에 취약합니다. 개발에서 계단이나 프로덕션 서버로 이동할 때부터 시작됩니다.

한 가지 방법은 이 아닙니다. 이미지를 업로드하고 데이터베이스에 BLOB 형식으로 저장하는 것이 좋습니다. 또 다른 I 에서 데이터베이스의 확장자 역할을하는 이미지를 업로드 할 수있는 다른 "중앙"서버를 갖는 것이 좋습니다. 많은 사람들이 Amazon AWS "S3"서비스를 사용합니다. CarrierWave gem을 살펴보면이 모든 것을 쉽고 유연하며 강력하게 만들 수 있습니다.

+0

답변 해 주셔서 감사합니다. :)'assets' 폴더의 의미를 알지 못했습니다. 나는 보석을 볼 것이다 :) – code4j

관련 문제