【问题标题】:Carrierwave, MiniMagick, and S3Carrierwave、MiniMagick 和 S3
【发布时间】:2014-07-14 04:00:17
【问题描述】:

在我的 Rails 应用程序中,我允许用户使用 Carrierwave 和 Amazon S3 上传图像。我想实现一个功能,让用户通过旋转 90 度来编辑现有图像。

我对这段代码的去向感到困惑。它是在图像上传器文件中,还是在图像控制器中?它是怎么称呼的?我相信它应该看起来像这样:

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

但我无法找到可以帮助我的示例。如果有人能给我指点正确的方向,我将不胜感激!

编辑

感谢 deep 的彻底回复!这是我最终做的:

在我看来:

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

在我的控制器中:

# 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.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_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 方法中。

【问题讨论】:

    标签: ruby-on-rails amazon-s3 carrierwave minimagick


    【解决方案1】:

    这是我的解决方案

    首先在模型中定义一个属性访问器,并在更新时将其设置为 true。

    在你的模型中

    #image.rb
    attr_accessor :rotate
    

    在你的控制器中

    #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 提供了一个recreate_versions! 方法,该方法将处理并重新上传图像。在您的情况下,您可以添加一个 after_save 回调,仅当旋转属性设置为 true 时才会触发 recreate_versions! 方法。

    在你的模型中

    #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
    

    如果您不想替换原始图像,那么您所要做的就是在类似的版本中调用 process

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

    【讨论】:

    • 哇,非常感谢您的彻底回复。如果对我有用,我会尝试一下,然后将答案标记为正确!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2019-01-24
    • 2014-09-04
    • 2015-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多