Janko Marohnic
• from Croatia ", living in Czechia #
• Ruby off Rails developer
• creator of Shrine
@janko
@jankomarohnic
Slide 4
Slide 4 text
Active Storage?
Slide 5
Slide 5 text
Active Storage Shrine
Rails & Active Record only
Rails, Hanami, Sinatra, Roda...
Active Record, Sequel, ROM...
framework library
integrated experience more control
more opinionated more features
Slide 6
Slide 6 text
Metadata
&
Validation
Slide 7
Slide 7 text
class PhotosController < AC::Base
def create
photo = Photo.new(photo_params)
if photo.valid?
photo.save
# ...
else
# ...
end
end
end
Slide 8
Slide 8 text
class ImageUploader < Shrine
TYPES = %w[image/jpeg image/png ...]
EXTENSIONS = %w[jpg jpeg png ...]
Attacher.validate do
validate_max_size 10*1024*1024
validate_mime_type TYPES
validate_extension EXTENSIONS
end
end
class PhotosController < AC::Base
def create
file = params[:photo][:image]
file.read #=> ""
file.filename #=> "nature.jpg"
file.content_type #=> "image/jpeg"
photo = Photo.new(image: file)
photo.image.mime_type #=> "text/x-php"
photo.valid? #=> false
end
end
MIME Type
Slide 11
Slide 11 text
https://www.bamsoftware.com/hacks/deflate.html
$ identify spark.png
... 225000x225000 ... 6.1MB
Attacher.validate do
# ...
if validate_mime_type IMAGE_TYPES
validate_max_dimensions [5000, 5000]
end
end
Image Dimensions
Slide 12
Slide 12 text
class VideoUploader < Shrine
add_metadata :duration do |file|
FFMPEG::Movie.new(file.path).duration
end
Attacher.validate do
if file.duration > 5*60*60
errors << "is too long (max is 5h)"
end
end
end
Custom Metadata