Module: AttachmerbFu::InstanceMethods
- Defined in:
- lib/attachmerb_fu.rb
Instance Method Summary collapse
-
#content_type=(new_type) ⇒ Object
Sets the content type.
-
#copy_to_temp_file(file) ⇒ Object
Copies the given file to a randomly named Tempfile.
-
#create_or_update_thumbnail(temp_file, file_name_suffix, *size) ⇒ Object
Creates or updates the thumbnail for the current attachment.
-
#create_temp_file ⇒ Object
Stub for creating a temp file from the attachment data.
-
#filename=(new_name) ⇒ Object
Sanitizes a filename.
-
#image? ⇒ Boolean
Checks whether the attachment’s content type is an image content type.
-
#image_size ⇒ Object
Returns the width/height in a suitable format for the image_tag helper: (100x100).
-
#save_attachment? ⇒ Boolean
Returns true if the attachment data will be written to the storage system on the next save.
-
#temp_data ⇒ Object
Gets the data from the latest temp file.
-
#temp_data=(data) ⇒ Object
Writes the given data to a Tempfile and adds it to the collection of temp files.
-
#temp_path ⇒ Object
Gets the latest temp path from the collection of temp paths.
-
#temp_path=(value) ⇒ Object
Adds a new temp_path to the array.
-
#temp_paths ⇒ Object
Gets an array of the currently used temp paths.
-
#thumbnail_class ⇒ Object
Returns the class used to create new thumbnails for this attachment.
-
#thumbnail_name_for(thumbnail = nil) ⇒ Object
Gets the thumbnail name for a filename.
-
#thumbnailable? ⇒ Boolean
Returns true/false if an attachment is thumbnailable.
-
#uploaded_data ⇒ Object
nil placeholder in case this field is used in a form.
-
#uploaded_data=(file_data) ⇒ Object
This method handles the uploaded file object.
-
#with_image(&block) ⇒ Object
Allows you to work with a processed representation (RMagick, ImageScience, etc) of the attachment in a block.
-
#write_to_temp_file(data) ⇒ Object
Writes the given file to a randomly named Tempfile.
Instance Method Details
#content_type=(new_type) ⇒ Object
Sets the content type.
242 243 244 |
# File 'lib/attachmerb_fu.rb', line 242 def content_type=(new_type) write_attribute :content_type, new_type.to_s.strip end |
#copy_to_temp_file(file) ⇒ Object
Copies the given file to a randomly named Tempfile.
322 323 324 |
# File 'lib/attachmerb_fu.rb', line 322 def copy_to_temp_file(file) self.class.copy_to_temp_file file, random_tempfile_filename end |
#create_or_update_thumbnail(temp_file, file_name_suffix, *size) ⇒ Object
Creates or updates the thumbnail for the current attachment.
227 228 229 230 231 232 233 234 235 236 237 238 239 |
# File 'lib/attachmerb_fu.rb', line 227 def create_or_update_thumbnail(temp_file, file_name_suffix, *size) thumbnailable? || raise(ThumbnailError.new("Can't create a thumbnail if the content type is not an image or there is no parent_id column")) returning find_or_initialize_thumbnail(file_name_suffix) do |thumb| thumb.attributes = { :content_type => content_type, :filename => thumbnail_name_for(file_name_suffix), :temp_path => temp_file, :thumbnail_resize_options => size } callback_with_args :before_thumbnail_saved, thumb thumb.save! end end |
#create_temp_file ⇒ Object
Stub for creating a temp file from the attachment data. This should be defined in the backend module.
332 |
# File 'lib/attachmerb_fu.rb', line 332 def create_temp_file() end |
#filename=(new_name) ⇒ Object
Sanitizes a filename.
247 248 249 |
# File 'lib/attachmerb_fu.rb', line 247 def filename=(new_name) write_attribute :filename, sanitize_filename(new_name) end |
#image? ⇒ Boolean
Checks whether the attachment’s content type is an image content type
200 201 202 |
# File 'lib/attachmerb_fu.rb', line 200 def image? self.class.image?(content_type) end |
#image_size ⇒ Object
Returns the width/height in a suitable format for the image_tag helper: (100x100)
252 253 254 |
# File 'lib/attachmerb_fu.rb', line 252 def image_size [width.to_s, height.to_s] * 'x' end |
#save_attachment? ⇒ Boolean
Returns true if the attachment data will be written to the storage system on the next save
257 258 259 |
# File 'lib/attachmerb_fu.rb', line 257 def File.file?(temp_path.to_s) end |
#temp_data ⇒ Object
Gets the data from the latest temp file. This will read the file into memory.
312 313 314 |
# File 'lib/attachmerb_fu.rb', line 312 def temp_data ? File.read(temp_path) : nil end |
#temp_data=(data) ⇒ Object
Writes the given data to a Tempfile and adds it to the collection of temp files.
317 318 319 |
# File 'lib/attachmerb_fu.rb', line 317 def temp_data=(data) self.temp_path = write_to_temp_file data unless data.nil? end |
#temp_path ⇒ Object
Gets the latest temp path from the collection of temp paths. While working with an attachment, multiple Tempfile objects may be created for various processing purposes (resizing, for example). An array of all the tempfile objects is stored so that the Tempfile instance is held on to until it’s not needed anymore. The collection is cleared after saving the attachment.
293 294 295 296 |
# File 'lib/attachmerb_fu.rb', line 293 def temp_path p = temp_paths.first p.respond_to?(:path) ? p.path : p.to_s end |
#temp_path=(value) ⇒ Object
Adds a new temp_path to the array. This should take a string or a Tempfile. This class makes no attempt to remove the files, so Tempfiles should be used. Tempfiles remove themselves when they go out of scope. You can also use string paths for temporary files, such as those used for uploaded files in a web server.
306 307 308 309 |
# File 'lib/attachmerb_fu.rb', line 306 def temp_path=(value) temp_paths.unshift value temp_path end |
#temp_paths ⇒ Object
Gets an array of the currently used temp paths. Defaults to a copy of #full_filename.
299 300 301 |
# File 'lib/attachmerb_fu.rb', line 299 def temp_paths @temp_paths ||= (new_record? || !File.exist?(full_filename)) ? [] : [copy_to_temp_file(full_filename)] end |
#thumbnail_class ⇒ Object
Returns the class used to create new thumbnails for this attachment.
210 211 212 |
# File 'lib/attachmerb_fu.rb', line 210 def thumbnail_class self.class.thumbnail_class end |
#thumbnail_name_for(thumbnail = nil) ⇒ Object
Gets the thumbnail name for a filename. ‘foo.jpg’ becomes ‘foo_thumbnail.jpg’
215 216 217 218 219 220 221 222 223 224 |
# File 'lib/attachmerb_fu.rb', line 215 def thumbnail_name_for(thumbnail = nil) return filename if thumbnail.blank? ext = nil basename = filename.gsub /\.\w+$/ do |s| ext = s; '' end # ImageScience doesn't create gif thumbnails, only pngs ext.sub!(/gif$/, 'png') if [:processor] == "ImageScienceProcessor" "#{basename}_#{thumbnail}#{ext}" end |
#thumbnailable? ⇒ Boolean
Returns true/false if an attachment is thumbnailable. A thumbnailable attachment has an image content type and the parent_id attribute.
205 206 207 |
# File 'lib/attachmerb_fu.rb', line 205 def thumbnailable? image? && respond_to?(:parent_id) && parent_id.nil? end |
#uploaded_data ⇒ Object
nil placeholder in case this field is used in a form.
262 |
# File 'lib/attachmerb_fu.rb', line 262 def uploaded_data() nil; end |
#uploaded_data=(file_data) ⇒ Object
This method handles the uploaded file object. If you set the field name to uploaded_data, you don’t need any special code in your controller.
<% form_for :attachment, :html => { :multipart => true } do |f| -%>
<p><%= f.file_field :uploaded_data %></p>
<p><%= submit_tag :Save %>
<% end -%>
@attachment = Attachment.create! params[:attachment]
TODO: Allow it to work with Merb tempfiles too.
275 276 277 278 279 280 281 282 283 284 285 286 287 |
# File 'lib/attachmerb_fu.rb', line 275 def uploaded_data=(file_data) return nil if file_data.nil? || file_data["size"] == 0 self.content_type = file_data["content_type"] self.filename = file_data["filename"] if respond_to?(:filename) data = file_data["tempfile"] if data.is_a?(StringIO) data.rewind self.temp_data = data.read else self.temp_path = data.path end end |
#with_image(&block) ⇒ Object
Allows you to work with a processed representation (RMagick, ImageScience, etc) of the attachment in a block.
@attachment.with_image do |img|
self.data = img.thumbnail(100, 100).to_blob
end
340 341 342 |
# File 'lib/attachmerb_fu.rb', line 340 def with_image(&block) self.class.with_image(temp_path, &block) end |
#write_to_temp_file(data) ⇒ Object
Writes the given file to a randomly named Tempfile.
327 328 329 |
# File 'lib/attachmerb_fu.rb', line 327 def write_to_temp_file(data) self.class.write_to_temp_file data, random_tempfile_filename end |