我在尝试用回形针做一些不寻常的把戏时遇到了很大的麻烦。这是我的情况:我的应用程序用户有一个头像图像,我的想法是让他们通过 Jcrop 裁剪他们的头像。我的应用程序托管在 Heroku 中,因此我必须将图像上传到 Amazon S3。我使用这个流行的railscast来实现裁剪功能,但它需要处理两次图像。这是问题开始的地方。
我认为一个可行的解决方案可能不是第一次处理图像(当用户选择图像时),而是第二次处理。我已经在我的控制器中实现了这段代码:
def change_avatar
@user = current_user
paperclip_parameters = params[:user][:avatar] #first time call
if @temp_image_object.present? || params[:avatar].present?
if check_crop_params #second controller call
@user.avatar = File.new(@user.tmp_avatar_path) #overrides the
redirect_to @user, notice: t("messages.update.user.avatar") if @user.save
else #first controller call
@temp_path = @user.generate_temp_image(paperclip_parameters)
@user.tmp_avatar_path = @new_path #store the custom path to retrieve it in the second call
render :action => 'avatar_crop' if @user.save
end
end
end
def check_crop_params
!params[:user][:crop_x].blank? && !params[:user][:crop_y].blank? && !params[:user][:crop_w].blank? && !params[:user][:crop_h ].blank?
end
在我的用户模型中:
#this method copies the original image tempfile when user upload the image to a custom path and returns the custom path
def generate_temp_image(paperclip_parameters)
uploaded_img_path = uploaded_img.tempfile.path
temp_dir = Rails.root.join('public/tmp')
Dir.mkdir(temp_dir) unless Dir.exists?(temp_dir)
FileUtils.cp(uploaded_img.tempfile, temp_dir)
new_path = uploaded_img_path
end
我还有 jcrop 的自定义处理器,它在处理图像时采用裁剪变量。当我上传图像(第一个控制器调用)时,change_avatar 方法运行良好,但是当我裁剪图像(第二个控制器调用)时,图像没有被裁剪,回形针创建图像样式文件,但忽略了我所做的裁剪。
有任何想法吗?我该做什么?