Я (примерно) следую учебнику 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).
Почему это может быть, и что я могу с этим сделать?