Как редактировать загруженное изображение с помощью minimagick, чтобы это изображение загружалось в active_storage? - PullRequest
0 голосов
/ 28 февраля 2020

Я разрабатываю веб-приложение с Ruby на Rails, которое должно добавлять текст к изображению, загруженному пользователем. Прямо сейчас я понятия не имею, как редактировать изображение с минимагика. Я хочу спросить, как получить и отредактировать изображение, загруженное в active_storage.

Код, который я написал здесь:

Gemfile

ruby '2.5.3'

gem 'rails', '~> 5.2.2'
gem 'mysql2', '>= 0.4.4', '< 0.6.0'
gem 'puma', '~> 3.11'
gem 'sass-rails', '~> 5.0'
gem 'uglifier', '>= 1.3.0'

gem 'coffee-rails', '~> 4.2'
gem 'turbolinks', '~> 5'
gem 'jbuilder', '~> 2.5'
gem 'bootsnap', '>= 1.1.0', require: false

gem 'slim-rails'
gem 'html2slim'

gem 'carrierwave'
gem "mini_magick"

index. html .slim

.text
  p Upload Image

= form_for @picture, url: {action: "create"} do |f|
  = f.file_field :image
  = f.submit 'Submit'

pictures_controller.rb

class PicturesController < ApplicationController
  def index
    @picture = Picture.new
  end

  def show
    @picture = Picture.find_by(uuid: params[:id])
  end

  def create
    text = 'this is test text'
    image = picture_params[:image]
    @picture = Picture.new(uuid: SecureRandom.uuid, image: picture_params[:image])
    new_image = @picture.build_collage_image(text).tempfile.open.read
    send_data new_image, :type => 'image/png', :disposition => 'inline'
  end


  private

  def picture_params
    params.require(:picture).permit(:image, :ogp)
  end
end

models / picture.rb

class Picture < ApplicationRecord
  include CollageMaker
  include Rails.application.routes.url_helpers
  after_save :build_collage_image
  has_one_attached :collaged_image
  has_one_attached :image

  def build_collage_image(text)
    CollageMaker.build(url_for(self.image), text)
  end
end

беспокойства / collage_maker.rb

module CollageMaker
  extend ActiveSupport::Concern
  include Rails.application.routes.url_helpers

  FONT = './app/assets/fonts/cinecaption226.ttf'.freeze
  GRAVITY = 'center'
  TEXT_POSITION = '0,0'
  FONT_SIZE = 65
  INDENTION_COUNT = 16
  ROW_LIMIT = 8

  def self.build(image_url, text)
    text = prepare_text(text)
    image = MiniMagick::Image.open(image_url)
    image.combine_options do |config|
      config.font FONT
      config.fill 'white'
      config.gravity GRAVITY
      config.pointsize FONT_SIZE
      config.draw "text #{TEXT_POSITION} '#{text}'"
    end
  end

  private
  def self.prepare_text(text)
    text.to_s.scan(/.{1,#{INDENTION_COUNT}}/)[0...ROW_LIMIT].join("\n")
  end
end

При тестировании их, появилась эта ошибка.

enter image description here

1 Ответ

1 голос
/ 01 марта 2020

url_for - это контекстный путь просмотра к изображению.

Для внутреннего доступа к изображению необходимо использовать rails_blob_path

Из документации ...

Если вам нужно создать ссылку вне контекста контроллера / представления (фоновые задания, Cronjobs и т. Д. c.), Вы можете получить доступ к rails_blob_path следующим образом:

Rails.application .routes.url_helpers.rails_blob_path (user.avatar, only_path: true)

https://edgeguides.rubyonrails.org/active_storage_overview.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...