Module: AttachmerbFu::InstanceMethods

Defined in:
lib/attachmerb_fu.rb

Instance Method Summary collapse

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_fileObject

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

Returns:

  • (Boolean)


200
201
202
# File 'lib/attachmerb_fu.rb', line 200

def image?
  self.class.image?(content_type)
end

#image_sizeObject

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

Returns:

  • (Boolean)


257
258
259
# File 'lib/attachmerb_fu.rb', line 257

def save_attachment?
  File.file?(temp_path.to_s)
end

#temp_dataObject

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
  save_attachment? ? 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_pathObject

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_pathsObject

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_classObject

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 attachment_options[: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.

Returns:

  • (Boolean)


205
206
207
# File 'lib/attachmerb_fu.rb', line 205

def thumbnailable?
  image? && respond_to?(:parent_id) && parent_id.nil?
end

#uploaded_dataObject

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