Я разрабатываю веб-приложение с 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
При тестировании их, появилась эта ошибка.