문제

I'd like to process images differently based on whether they're landscape or portrait.

This is the code in my image uploader model:

def is_landscape?
    if @file
      image = ::MiniMagick::Image.open(file)
      Rails.logger.info "from in is_landscape? : #{image[:width] > image[:height]}"
      image[:width] >= image[:height]
    end
  end

  def is_portrait?
    Rails.logger.info "from in is_portrait? : #{image[:height] > image[:width]}"
    image[:height] > image[:width]
  end

  process :resize_to_fill => [667, 500], if: :is_landscape?

  process :resize_to_fill => [500, 667], if: :is_portrait?

  version :preview do
    process :resize_to_fill => [380,285]
  end

  version :thumb do
      process :resize_to_fill => [105,79], if: :is_landscape?
      process :resize_to_fill => [105, 158], if: :is_portrait?
  end

I'm getting the error

"ArgumentError (wrong number of arguments (1 for 0)): app/uploaders/image_path_uploader.rb:31:in `is_landscape?'"

What am I doing wrong?

도움이 되었습니까?

해결책

I had to pass the new file to the is_landscape? and is_portrait? methods to get it to work:

  def is_landscape?(new_file)
      image = ::MiniMagick::Image::read(File.binread(@file.file))
      Rails.logger.info "from in is_landscape? : #{image[:width] > image[:height]}"
      image[:width] >= image[:height]
  end

  def is_portrait?(new_file)
    Rails.logger.info "from in is_portrait? : #{ !is_landscape?(new_file)}"
    !is_landscape?(new_file)
  end

  process :resize_to_fill => [667, 500], if: :is_landscape?

  process :resize_to_fill => [500, 667], if: :is_portrait?

  version :preview do
    process :resize_to_fill => [380,285]
  end

  version :thumb do
      process :resize_to_fill => [105,79], if: :is_landscape?
      process :resize_to_fill => [105, 158], if: :is_portrait?
  end
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top