CarrieWave
についてざっくり解説
ota42y
2017/01/25 Shinjuku.rb #45
自己紹介
ota42y
ヘルスケア系の会社勤務(人募集中)
rubyとかgoとかC++とか
負債の消し方、探してます
リリースされました
招待コードota42y で入れます( ゚∀゚)o彡゚
CarrierWave
https://github.com/bbatsov/rubocop
A simple and extremely exible way to upload les
It works well with Rack based web applications
Cloud services support (AWS, google...)
ActiveRecord integration
Sample Code
class AvatarUploader < CarrierWave::Uploader::Base
storage :file
end
my_file = File.open('icon.png')
uploader = AvatarUploader.new
uploader.store!(my_file)
uploader.retrieve_from_store!('inoc.png')
upload to le (icon.png)
Write setting to uploader class
save path, extension whitelist, convert ....
UploadSetting
class MyUploader < CarrierWave::Uploader::Base
include CarrierWave::MiniMagick
process resize_to_fit: [800, 800]
version :thumb do
process resize_to_fill: [200,200]
end
def extension_whitelist
%w(jpg png)
end
storage :fog
def store_dir
"uploads/images"
end
end
Croud services support
use fog gem internally
https://github.com/fog/fog
support many service
AWS, Google, Rackspace...
CarrieWave provide generate access url method
ActiveRecord integration
Save le to database column
class User < ActiveRecord::Base
mount_uploader :icon, AwsUploader
end
u = User.first
u.icon = File.open('default_icon.png')
u.save!
u.icon.url # https://s3.amazonaws.com/path/to/file.png
u.icon_identifier # => 'default_icon.png'
When save model, upload le by uploader
Store the lename to column
ActiveRecord integration
CarrierWave don't store le to database
Store le to folder or clound (Uploader setting)
This gem store lename to database
(CarrierWave call identifier )
Uploader class provide le from lename
ActiveRecord integration
class User < ActiveRecord::Base
mount_uploader :icon, AwsUploader
end
mounter_uploader create these method
def icon
# return AwsUploader object
end
def icon=(new_file)
# set file to AwsUploader
end
def icon_identifier
# return filename
end
ActiveRecord integration
class User < ActiveRecord::Base
mount_uploader :icon, AwsUploader
end
And these save methods
def store_icon!
# save file using AwsUploader
end
def write_icon_identifier
# save filename to database
end
ActiveRecord integration
class User < ActiveRecord::Base
mount_uploader :icon, AwsUploader
end
And register these callbacks
after_save :"store_#{column}!"
before_save :"write_#{column}_identifier"
ActiveRecord integration
class User < ActiveRecord::Base
mount_uploader :icon, AwsUploader
end
u = User.first
u.icon = File.open('default_icon.png')
# call icon=(filename) method and set file to AwsUploader
u.save!
# Call `write_inoc_identifier` from before save callback.
# Write 'default_icon.png' to inon column attribute.
# (call `write_attribute(:inoc, 'default_icon.png')`
# So filename will store to ActiveRecord save! method.
# Call `store_icon` from after save callback
# This method store file using AwsUploader
ActiveRecord integration
class User < ActiveRecord::Base
mount_uploader :icon, AwsUploader
end
u = User.first
u.icon = File.open('default_icon.png')
u.save!
CarrierWave generate access url from lename
u.icon.url
# generate stored file's url
u.icon_identifier
# return filename in database ('default_icon.png')
Save le to lesystem
path = ::File.expand_path(store_path, store_root)
if uploader.move_to_store
file.move_to(path, file_permissions, dir_permissions)
else
file.copy_to(path, file_permissions, dir_permissions)
end
We can change copy or move by uploader setting
https://github.com/carrierwaveuploader/carrierwave
/blob/c45699c318ca895f89fa3304204e48b5f1c411
f1/lib/carrierwave/uploader/store.rb#L53
Save le to cloud
fog_file = new_file.to_file
@content_type ||= new_file.content_type
@file = directory.files.create({
:body => (fog_file ? fog_file : new_file).read,
:content_type => @content_type,
:key => path,
:public => @uploader.fog_public
}.merge(@uploader.fog_attributes))
fog_file.close if fog_file && !fog_file.closed?
use fog gem!
https://github.com/carrierwaveuploader/carrierwave
/blob/c45699c318ca895f89fa3304204e48b5f1c411
f1/lib/carrierwave/storage/fog.rb#L306

CarrieWaveについてざっくり解説

  • 1.
  • 2.
  • 3.
  • 4.
    CarrierWave https://github.com/bbatsov/rubocop A simple andextremely exible way to upload les It works well with Rack based web applications Cloud services support (AWS, google...) ActiveRecord integration
  • 5.
    Sample Code class AvatarUploader< CarrierWave::Uploader::Base storage :file end my_file = File.open('icon.png') uploader = AvatarUploader.new uploader.store!(my_file) uploader.retrieve_from_store!('inoc.png') upload to le (icon.png) Write setting to uploader class save path, extension whitelist, convert ....
  • 6.
    UploadSetting class MyUploader <CarrierWave::Uploader::Base include CarrierWave::MiniMagick process resize_to_fit: [800, 800] version :thumb do process resize_to_fill: [200,200] end def extension_whitelist %w(jpg png) end storage :fog def store_dir "uploads/images" end end
  • 7.
    Croud services support usefog gem internally https://github.com/fog/fog support many service AWS, Google, Rackspace... CarrieWave provide generate access url method
  • 8.
    ActiveRecord integration Save leto database column class User < ActiveRecord::Base mount_uploader :icon, AwsUploader end u = User.first u.icon = File.open('default_icon.png') u.save! u.icon.url # https://s3.amazonaws.com/path/to/file.png u.icon_identifier # => 'default_icon.png' When save model, upload le by uploader Store the lename to column
  • 9.
    ActiveRecord integration CarrierWave don'tstore le to database Store le to folder or clound (Uploader setting) This gem store lename to database (CarrierWave call identifier ) Uploader class provide le from lename
  • 10.
    ActiveRecord integration class User< ActiveRecord::Base mount_uploader :icon, AwsUploader end mounter_uploader create these method def icon # return AwsUploader object end def icon=(new_file) # set file to AwsUploader end def icon_identifier # return filename end
  • 11.
    ActiveRecord integration class User< ActiveRecord::Base mount_uploader :icon, AwsUploader end And these save methods def store_icon! # save file using AwsUploader end def write_icon_identifier # save filename to database end
  • 12.
    ActiveRecord integration class User< ActiveRecord::Base mount_uploader :icon, AwsUploader end And register these callbacks after_save :"store_#{column}!" before_save :"write_#{column}_identifier"
  • 13.
    ActiveRecord integration class User< ActiveRecord::Base mount_uploader :icon, AwsUploader end u = User.first u.icon = File.open('default_icon.png') # call icon=(filename) method and set file to AwsUploader u.save! # Call `write_inoc_identifier` from before save callback. # Write 'default_icon.png' to inon column attribute. # (call `write_attribute(:inoc, 'default_icon.png')` # So filename will store to ActiveRecord save! method. # Call `store_icon` from after save callback # This method store file using AwsUploader
  • 14.
    ActiveRecord integration class User< ActiveRecord::Base mount_uploader :icon, AwsUploader end u = User.first u.icon = File.open('default_icon.png') u.save! CarrierWave generate access url from lename u.icon.url # generate stored file's url u.icon_identifier # return filename in database ('default_icon.png')
  • 15.
    Save le tolesystem path = ::File.expand_path(store_path, store_root) if uploader.move_to_store file.move_to(path, file_permissions, dir_permissions) else file.copy_to(path, file_permissions, dir_permissions) end We can change copy or move by uploader setting https://github.com/carrierwaveuploader/carrierwave /blob/c45699c318ca895f89fa3304204e48b5f1c411 f1/lib/carrierwave/uploader/store.rb#L53
  • 16.
    Save le tocloud fog_file = new_file.to_file @content_type ||= new_file.content_type @file = directory.files.create({ :body => (fog_file ? fog_file : new_file).read, :content_type => @content_type, :key => path, :public => @uploader.fog_public }.merge(@uploader.fog_attributes)) fog_file.close if fog_file && !fog_file.closed? use fog gem! https://github.com/carrierwaveuploader/carrierwave /blob/c45699c318ca895f89fa3304204e48b5f1c411 f1/lib/carrierwave/storage/fog.rb#L306