Paperclip头像更新原始,同时保持旧的调整大小的图像

时间:2014-10-15 19:16:44

标签: ruby-on-rails ruby-on-rails-4 paperclip

我在rails 4应用程序中使用带有s3的paperclip。它在任何地方都运行良好,但我有一个特定的用例,需要一些特殊的行为。

我需要将图片上传为头像,并将其调整为所有缩略图尺寸,但之后我需要能够仅更新原始图像,同时保留所有缩略图链接

目前,我使用Proc来根据类变量确定附件大小。这导致image 1上传并调整大小,然后我设置image 2没有样式。我希望这会创造所有的拇指,然后取代原来的。不幸的是,它正在更新每个大小的URL,但它们都是空的。

tl; dr - 我需要重新调整头像的大小,但我需要能够仅更新原始内容并将其余内容单独保留。

控制器

class StudentsController < ApplicationController


  # POST /students/:id/avatar
  def new_avatar
    current_student.avatar = params[:avatar]
    current_student.set_orginial_only TRUE
    current_student.avatar = params[:avatar_orig]
    if current_student.save
      render json: current_student, serializer: StudentAvatarSerializer, status: 200
    else
      render json: ErrorSerializer.new(current_student), status: 400
    end
  end

  # DELETE /students/:id/avatar
  def destroy_avatar
    current_student.avatar.destroy
    if current_student.save
      render json: {success: true}, status: 200
    else
      render json: ErrorSerializer.new(current_student), status: 400
    end
  end

  private

  # find student by id and cache
  def current_student
    @student ||= Student.find(params[:id])
  end


end

模型

class Student < ActiveRecord::Base

  @@orginial_only = FALSE

  def set_orginial_only value
    @@orginial_only = value
  end


  # Paperclip attachements
  has_attached_file :avatar, :styles => Proc.new { |clip| clip.instance.attachment_sizes },
                    path: "/:class/:attachment/:id/:content_type_extension/:style/:filename",
                    :default_url => "/images/:style/missing.png"


  validates_attachment_content_type :avatar, :content_type => /image/
  validates_attachment_size :avatar, :in => 0..2.megabytes

  def attachment_sizes
    if @@orginial_only
     styles = {} 
    else 
      styles = {
        tiny: '50x50#',
        tiny_retina: '100x100#',
        small: '60x60#',
        small_retina: '120x120#',
        medium: '108x108#',
        medium_retina: '216x216#',
        large: '205x205#',
        large_retina: '410x410#'
      } 
    end
    styles
  end
end

有没有办法在保留所有拇指的同时更新原始图像?

1 个答案:

答案 0 :(得分:0)

解决方案:我最终只使用回形针来调整图像大小,而aws-sdk则手动替换回形针分配路径中的原始图像。