If a Class is extended with this module, it gains the #mount_uploader method, which is used for mapping attributes to uploaders and allowing easy assignment.
You can use #mount_uploader with pretty much any class, however it is intended to be used with some kind of persistent storage, like an ORM. If you want to persist the uploaded files in a particular Class, it needs to implement a `read_uploader` and a `write_uploader` method.
Mounts the given uploader on the given column. This means that assigning and reading from the column will upload and retrieve files. Supposing that a User class has an uploader mounted on image, you can assign and retrieve files like this:
@user.image # => <Uploader> @user.image = some_file_object @user.store_image! @user.image.url # => '/some_url.png'
It is also possible (but not recommended) to ommit the uploader, which will create an anonymous uploader class. Passing a block to this method makes it possible to customize it. This can be convenient for brevity, but if there is any significatnt logic in the uploader, you should do the right thing and have it in its own file.
Supposing a class has used mount_uploader to mount an uploader
on a column named image, in that case the following methods
will be added to the class:
Returns an instance of the uploader only if anything has been uploaded
Caches the given file
Returns the url to the uploaded file
Returns a string that identifies the cache location of the file
Retrieves the file from the cache based on the given cache name
Returns previously cached remote url
Retrieve the file from the remote url
An attribute reader that can be used with a checkbox to mark a file for removal
An attribute writer that can be used with a checkbox to mark a file for removal
Whether the file should be removed when store_image! is called.
Stores a file that has been assigned with image=
Removes the uploaded file from the filesystem.
Returns an error object if the last file to be assigned caused an integrity error
Returns an error object if the last file to be assigned caused a processing error
Uses the write_uploader method to set the identifier.
the attribute to mount this uploader on
the uploader class to mount
a set of options
customize anonymous uploaders
if the name of the column to be serialized to differs you can override it using this option
if set to true, integrity errors will result in caching failing silently
if set to true, processing errors will result in caching failing silently
Mounting uploaders on different columns.
class Song mount_uploader :lyrics, LyricsUploader mount_uploader :alternative_lyrics, LyricsUploader mount_uploader :file, SongUploader end
This will add an anonymous uploader with only the default settings:
class Data mount_uploader :csv end
this will add an anonymous uploader overriding the store_dir:
class Product mount_uploader :blueprint do def store_dir 'blueprints' end end end
# File lib/carrierwave/mount.rb, line 141 def mount_uploader(column, uploader=nil, options={}, &block) unless uploader uploader = Class.new(CarrierWave::Uploader::Base) uploader.class_eval(&block) end uploaders[column.to_sym] = uploader uploader_options[column.to_sym] = options include CarrierWave::Mount::Extension # Make sure to write over accessors directly defined on the class. # Simply super to the included module below. class_eval " def #{column}; super; end def #{column}=(new_file); super; end ", __FILE__, __LINE__+1 # Mixing this in as a Module instead of class_evaling directly, so we # can maintain the ability to super to any of these methods from within # the class. mod = Module.new include mod mod.class_eval " def #{column} _mounter(:#{column}).uploader end def #{column}=(new_file) _mounter(:#{column}).cache(new_file) end def #{column}? !_mounter(:#{column}).blank? end def #{column}_url(*args) _mounter(:#{column}).url(*args) end def #{column}_cache _mounter(:#{column}).cache_name end def #{column}_cache=(cache_name) _mounter(:#{column}).cache_name = cache_name end def remote_#{column}_url _mounter(:#{column}).remote_url end def remote_#{column}_url=(url) _mounter(:#{column}).remote_url = url end def remove_#{column} _mounter(:#{column}).remove end def remove_#{column}! _mounter(:#{column}).remove! end def remove_#{column}=(value) _mounter(:#{column}).remove = value end def remove_#{column}? _mounter(:#{column}).remove? end def store_#{column}! _mounter(:#{column}).store! end def #{column}_integrity_error _mounter(:#{column}).integrity_error end def #{column}_processing_error _mounter(:#{column}).processing_error end def write_#{column}_identifier _mounter(:#{column}).write_identifier end ", __FILE__, __LINE__+1 end
Return a particular option for a particular uploader
The column the uploader is mounted at
The option, e.g. validate_integrity
The option value
# File lib/carrierwave/mount.rb, line 47 def uploader_option(column, option) if uploader_options[column].has_key?(option) uploader_options[column][option] else uploaders[column].send(option) end end
# File lib/carrierwave/mount.rb, line 28 def uploader_options @uploader_options ||= {} @uploader_options = superclass.uploader_options.merge(@uploader_options) rescue NoMethodError @uploader_options end
what uploaders are mounted on which columns
# File lib/carrierwave/mount.rb, line 21 def uploaders @uploaders ||= {} @uploaders = superclass.uploaders.merge(@uploaders) rescue NoMethodError @uploaders end