2017-10-02 13 views
0

반송파를 사용하여 이미지의 크기를 가져 오려고했지만 직접 작성한 코드를 사용하여 빠른 이미지 after_save 또는 after commit을 실행하려고 시도했습니다. 이 오류를 얻을 :반송파를 사용하여 업로드 한 이미지의 실제 크기 가져 오기

wrong number of arguments (1 for 0) 
    Extracted source (around line #45): 
    # [String] contents of the file 
    # 
    def read 
    file.read if file.respond_to?(:read) 
    end 

carrierwave (0.11.2) lib/carrierwave/uploader/proxy.rb:45:in `read' 
fastimage (2.1.0) lib/fastimage.rb:343:in `block in fetch_using_read' 

모델이 내 시스템에 단지 로컬 파일이

class Micropost < ApplicationRecord 

    after_save :change_picture_dimensions 
    mount_uploader :picture, PictureUploader 

def change_picture_dimensions 
    if :picture? 
    widthheight = FastImage.size(picture) 
    if widthheight[0] >= 501 
     newheightratio = widthheight[1].to_f/widthheight[0].to_f 
    newheight = newheightratio * 500 
     self.picture = "<img src=\"" + picture.to_s + "\" width=\"500\" height=\"" + newheight.to_s + "\">" 
     else 
     self.picture = "<img src=\"" + picture.to_s + "\" width=\"" + widthheight[0].to_s + "\" height=\"" + widthheight[1].to_s + "\">" 
     end 
    end 
    end 

처럼 보일 것입니다. minimagick here을 사용하여 치수를 구할 수 있지만 carrierwave의 프로세스에 대해 더 알고 싶습니다. 왜이 오류의 치수 원인을 얻기 위해 내 방법을 사용할 수 없습니까? 내 방법에서는 가로 세로 비율을 유지하기 위해 비율을 사용하고 있지만 어떤 이미지에 대해서도 div의 고정 너비에 맞출 수 있습니다.

EDIT : 개체가 저장되기 전에해야 할 것을 알았지 만 before_create를 사용하더라도 동일한 오류가 발생합니다.

+1

를 감지하기 때문에 내 생각 중복 될 것인가? –

+0

사진은 내 로컬 파일 시스템에서 내 필드에서 들어오는 .jpg입니다. 내가 가지고있는 문제는 Fastimage가 다른 서버에서 URL의 차원을 가져올 수 있으며 locallly 저장된 파일에서 해당 파일을 가져올 수 있다고 확신하지만 내 로컬 시스템에서 파일을 가져올 때 이해할 수 없습니다. 그것을 액세스하는 방법을 알아. –

답변

1

그림을 문자열로 지정할 수 없습니다. URL, 파일 또는 IO 객체 여야합니다.

# app/uploaders/picture_uploader.rb 
class PictureUploader < CarrierWave::Uploader::Base 
    ... 
    process resize_to_fit: [500, nil] 
end 

class Micropost < ApplicationRecord 
    mount_uploader :picture, PictureUploader 
end 

은 당신이 할 수있는 다른 서버에서 이미지를 저장하려면 :

micropost = Micropost.create(
    picture: 'http://server.example.org/image.png' 
) 

을하고 지금은 렌더링 할 수 방금 다음과 같은 선언 500 픽셀에 맞게 전처리 이미지 폭하려면

페이지상의 내용

= image_tag micropost.picture.url 

또한 이미지 크기를 모델에 저장할 수 있습니다. 이 작업을 수행하는 방법은 this documentation입니다. 당신이 사진 모델로 이미지 크기를 저장 한 후에는 image_tag에서 그들을 지정할 수 있지만 브라우저가 이미지 크기이 경우 변수`picture` 무엇 자동으로

= image_tag micropost.picture.url, width: picture.width, height: picture.height 
+0

괜찮아. 명확히하기 위해 carrierwave는 파일 이름을 문자열 (ofcourse)로 저장하고 public uploads 폴더에 저장된 파일에 대한 참조를 가리 킵니까? 나는 그 부분을 알고 싶어서 내가하고있는 일을 이해한다. 나는 말한다. 그러나 당신이 기울어 질 때 무엇이 ​​그 것을 계속하는 것을 알기 위해 가고 있는지에 관해 안다. 나는 아무것도 찾을 수 없었다. 그럼 당신이 말했듯이 사진을 데리고에 대한 URL을 만듭니다 ... –

+0

좋아 StringIO를 읽고 File 객체에서 소스를 래핑하여 파일에서 읽을 수 있도록 표시합니다. :디 –