2014-07-14 7 views
1

내 Rails 앱에서 사용자는 Carrierwave 및 Amazon S3를 사용하여 이미지를 업로드 할 수 있습니다. 사용자가 기존 이미지를 90도 회전하여 편집 할 수있는 기능을 구현하고 싶습니다.Carrierwave, MiniMagick 및 S3

이 코드의 위치에 대해 혼란스러워합니다. 이미지 업 로더 파일 또는 이미지 컨트롤러에 있습니까? 그리고 어떻게 불려지나요? 나는 이것이 다음과 같이 보일 것이라고 믿습니다 :

image = Image.find(params[:id]) 
image_obj = MiniMagick::Image.read(image.file) 
image_obj.rotate(-90) 
image_obj.write(image.file) 

그러나 저는 저를 돕기 위해 모범을 찾을 수 없었습니다. 누구든지 올바른 방향으로 포인터를 줄 수 있다면 정말 고맙겠습니다!

편집 자신의 철저한 대응을위한 깊이에

감사합니다! 내 업 로더에서

# image.rb 
    attr_accessible :rotated 
    after_save :rotate_image, if: ->(obj){obj.rotated.present? && obj.rotated?} 

    def rotate_image 
    self.image_path.recreate_versions! 
    end 

: 내 모델에서

# image_controller.rb: 
def rotate 
    @image = Image.find(params[:id]) 
    @image.rotated = true 
    @image.save 
    respond_to do |format| 
     format.js { render :nothing => true } 
    end 
end 

: 내 컨트롤러에서

# image.html.erb: 
<%= link_to rotate_image_path(:id => image.id), :remote => true %> 

: 내보기에서

: 여기에 내가하고 결국 무엇

# image_uploader.rb 
    process :rotate_img 

    def rotate_img 
    if model.rotated.present? && model.rotated? 
     manipulate! do |img| 
     img.rotate '-90' 
     img 
     end 
    end 
end 

제가 변경 한 유일한 업 로더는 조건 처리를 시도하는 중에 오류가 발생했습니다. rotate_img 메서드 내에 조건을 넣었습니다.

답변

4

내 솔루션

먼저 모델에서 속성 접근자를 정의하고 업데이트 할 때 true로 설정합니다. 컨트롤러

#images_controller.rb 
def update 
    @image = Image.find(params[:id]) 
    @image.rotate = true 
    @image.save 
    redirect_to root_path, :notice => "Bla bla bla" 
end 

Carrierwave에서 모델

#image.rb 
attr_accessor :rotate 

에서

처리하고 이미지를 다시 업로드하는 recreate_versions! 방법을 제공한다. 회전하는 속성이 true로 설정된 경우에만 recreate_versions! 메서드를 트리거하는 after_save 콜백을 추가 할 수 있습니다. 모델 이미지 당신이 이미지를 회전 할 수있는 코드를 작성할 수 있습니다 업 로더에서 지금

#image.rb 
after_save :rotate_image, if: ->(obj){ obj.rotate.present? and obj.rotate? } 

def rotate_image 
    self.file.recreate_versions! 
end 

에서

.

#image_uploader.rb 
....... 
# It will replace the original image with rotated version 
process :rotate_img, :if => model.rotate.present and model.rotate? 

def rotate_img 
    manipulate! do |img| 
    img.rotate "90" 
    img #returns the manipulated image 
    end 
end 

원본 이미지를 대체하지 않으려면

은 당신이 할 일은,

# Create different versions of your uploaded files: 
version :rotated_img do 
    process :rotate_img 
end 
+0

와우 같은 버전의 내부 프로세스를 호출 철저하게 응답 해 주셔서 너무 감사합니다. 나는 이것을 시험해 볼 것이고, 그것이 나를 위해 일하면 정확한 답을 표시 할 것이다! – scientiffic