Обрезка с использованием Paperclip, ImageMagick, Jcrop и хранилища S3: Почему не будет 'image.reprocess!' reprocess?

Я (примерно) следую учебнику RailsCasts № 182 , в котором используются Paperclip, ImageMagick и Jcrop, чтобы разрешить пользовательская обрезка загруженных изображений.

Поскольку я использую Amazon S3 для хранения файлов, мне пришлось перенастроить части учебника, чтобы они подходили. Кажется, все работает отлично , за исключением из-за того, что обрезанная версия моего изображения не обрабатывается повторно (или результат этой обработки не загружается повторно в S3) - поэтому после процесса обрезки , У меня остается то же изображение, которое я изначально загрузил (это верно для всех размеров изображений, которые я храню для каждого изображения).

Вот моя модель Feature (как в Feature Image):

class Feature < ActiveRecord::Base
  require "#{Rails.root}/lib/paperclip_processors/cropper.rb"

  attr_accessible    :image_file_name, :image
  attr_accessor      :crop_x, :crop_y, :crop_w, :crop_h
  after_update       :reprocess_image, :if => :cropping?

  if Rails.env == "production"
  S3_CREDENTIALS = { :access_key_id     => '',
                     :secret_access_key => '',
                     :bucket            => ""}
  else
  S3_CREDENTIALS = { :access_key_id     => '',
                     :secret_access_key => '',
                     :bucket            => ""}
  end

  has_attached_file :image,
                    :styles          => { :small => "240x135>", :croppable => "960x960>", :display => "960x540>" },
                    :processors      => [:cropper],
                    :storage         => :s3,
                    :s3_credentials  => S3_CREDENTIALS,
                    :path            => "features/:id/:style.:extension"

  validates_attachment_content_type :image, :content_type => ['image/jpeg', 'image/gif', 'image/png',
                                                              'image/pjpeg', 'image/x-png'], 
                                            :message => 'must be a JPEG, GIF or PNG image'

  def cropping?
    !crop_x.blank? && !crop_y.blank? && !crop_w.blank? && !crop_h.blank?
  end

  def image_geometry(style = :original)
    @geometry ||= {}
    path = (image.options[:storage]==:s3) ? image.url(style) : image.path(style)
    @geometry[style] ||= Paperclip::Geometry.from_file(path)
  end

  private

  def reprocess_image
    image.reprocess!
  end
end

Вот моя 'обрезка .rb '(процессор для скрепок):

module Paperclip
  class Cropper < Thumbnail
    def transformation_command
      if crop_command
        crop_command + super.sub(/ -crop \S+/, '')
      else
        super
      end
    end

    def crop_command
      target = @attachment.instance
      if target.cropping?
        " -crop '#{target.crop_w}x#{target.crop_h}+#{target.crop_x}+#{target.crop_y}'"
      end
    end
  end
end

Соответствующие действия моего FeaturesController:

class FeaturesController < ApplicationController

  def new
    @feature = Feature.new
  end

  def create
    @feature = Feature.new(params[:feature])
    if @feature.save
      if params[:feature][:image].blank?
        flash[:notice] = "New feature added!"
        redirect_to @feature
      else
        render :crop
      end
    else
      @title = "Add a New Feature"
      render :new
    end
  end

  def edit
    @feature = Feature.find(params[:id])
    @title = "Edit #{@feature.headline}"
  end

  def update
    @feature = Feature.find(params[:id])
    if @feature.update_attributes(params[:feature])
      if params[:feature][:image].blank?
        flash[:notice] = "Feature updated!"
        redirect_to @feature
      else
        render :crop
      end
    else
      @title = "Edit Feature"
      render :edit
    end
  end
end

И соответствующие строки моего представления 'crop.html.erb':

<% content_for :javascript_includes do %>
    <%= javascript_include_tag 'jquery.Jcrop.min' %>
    
<% end %>
<% content_for :style_includes do %>
    <%= stylesheet_link_tag 'jquery.Jcrop', :media => 'screen' %>
<% end %>

<%= image_tag @feature.image.url(:croppable), :id => "cropbox" %>

<% form_for @feature do |f| %>
    <% for attribute in [:crop_x, :crop_y, :crop_w, :crop_h] %>
        <%= f.hidden_field attribute, :id => attribute %>
    <% end %>
    

<%= f.submit "Crop" %>

<% end %>

Проблема не в том, что произошла ошибка с настраиваемым кадрированием (смещение, площадь кадрирования и т. Д.) .), дело в том, что не происходит кадрирования , когда я нажимаю «кадрировать» - у меня остаются только изображения, полученные из исходной загрузки / процесса. Не похоже, что "image.reprocess!" происходит вообще (или результаты повторной обработки не сохраняются в S3).

Почему это может быть, и что я могу с этим сделать?

6
задан jasonmklug 7 July 2011 в 20:45
поделиться