Rails 5-Active Storage-Variant-异常:“#<minimagick :: error:`mogrify =”“ -resize-to-fit =”“ [800,=”“ 800]” =“”

时间:2018-06-25 13:49:04

标签: ruby-on-rails rails-activestorage ruby-on-rails-5.2

=“”

Rails 5.2.0(作为API)

/config/application.rb

  

config.active_storage.variant_processor =:vips

问题:

/serializers/api/v1/user/current_user_serializer.rb

class Api::V1::User::CurrentUserSerializer < Api::V1::User::BaseSerializer
  include Rails.application.routes.url_helpers

  attributes(
    [...]
    :avatar
    :created_at
  )

  def avatar
    if object.avatar.attachment
      avatar = {
        image: url_for( object.avatar ), # This one works
        thumb: url_for( object.avatar.variant(resize_to_fit: [800, 800]) ), # EXCEPTION
        thumb_test: url_for( object.avatar.variant(resize: '800x800') ) # Returns image of size: 640x800 (expected 800x800)
      }
    end
  end
end

我收到以下异常:

exception: "<MiniMagick::Error: `mogrify -resize-to-fit [800, 800] /tmp/mini_magick20180625-19749-rghjbg.jpg` failed with error: mogrify.im6: unrecognized option `-resize-to-fit' @ error/mogrify.c/MogrifyImageCommand/5519. >"

编辑

感谢@George Claghorn

我现在根据这篇文章创建了自己的变体: https://prograils.com/posts/rails-5-2-active-storage-new-approach-to-file-uploads

lib / active_storage_variants.rb

class ActiveStorageVariants
  class << self
    def resize_to_fill(width:, height:, blob:, gravity: 'Center')
      blob.analyze unless blob.analyzed?

      cols = blob.metadata[:width].to_f
      rows = blob.metadata[:height].to_f
      if width != cols || height != rows
        scale_x = width / cols
        scale_y = height / rows
        if scale_x >= scale_y
          cols = (scale_x * (cols + 0.5)).round
          resize = cols.to_s
        else
          rows = (scale_y * (rows + 0.5)).round
          resize = "x#{rows}"
        end
      end

      {
        resize: resize,
        gravity: gravity,
        background: 'rgba(255,255,255,0.0)',
        extent: cols != width || rows != height ? "#{width}x#{height}" : ''
      }.merge(optimize_hash(blob))
    end
  end
end

/models/concerns/users/active_storage_variants.rb

require 'active_storage_variants' # /lib/active_storage_variants.rb

module Users::ActiveStorageVariants

  def avatar_thumbnail
    variation = ActiveStorage::Variation.new(
      ActiveStorageVariants.resize_to_fill(
        width: 300, height: 300, blob: avatar.blob
      )
    )
    ActiveStorage::Variant.new(avatar.blob, variation)
  end
end

/models/user.rb

class User < ApplicationRecord
  ...

  ## Concerns
  include Users::ActiveStorageVariants

  ...
end

调用它:

  

user.avatar_thumbnail

2 个答案:

答案 0 :(得分:6)

resize_to_fit: [800, 800]ImageProcessing转换。 Rails 5.2不使用ImageProcessing,因此不支持libvips;它直接使用MiniMagick。

Rails 6将切换到ImageProcessing并添加libvips支持。要在Rails 6发行之前使用libvips,请在GitHub上捆绑rails / rails信息库的master分支:

# Gemfile
gem "rails", github: "rails/rails"

答案 1 :(得分:1)

找到了解决方法here

替换此

<%= image_tag user.avatar.variant(resize_to_fit: [100, 100]) %>

使用

<%= image_tag user.avatar.variant(resize: "100 x100") %>

为我工作。即使Office文档采用了以前的方法。