ksylvest/attached

View on GitHub
README.rdoc

Summary

Maintainability
Test Coverage
= Attached

Attached is a Ruby on Rails file attachment tool that lets users upload to the cloud. The gem supports AWS, Google and Rackspace for storage networks by default. It is influenced (and copied) from Paperclip and makes heavy use of the incredibly awesome Fog library.

== Requirements

The gem is tested with:

* Ruby on Rails 4.1.6
* Ruby 2.1.6
* Ruby 2.0.0
* Ruby 1.9.3
* JRuby

== Installation

  gem install attached

== Optional

  brew install imagemagick
  brew install lame

== Examples

Migration:

  rails g model video name:string encoding:attachment

  class CreateVideo < ActiveRecord::Migration
    def self.up
      create_table :videos do |t|
        t.string :name
        t.attachment :encoding

        t.timestamps
      end
    end

    def self.down
      drop_table :videos
    end
  end

Model:

  class Video < ActiveRecord::Base
  
    has_attached :encoding, styles: { 
      webm: { extension: '.webm' },
      mp4:  { extension: '.mp4'  },
      ogv:  { extension: '.ogv'  },
    }
  
    after_save do
      remote.encode(self.encoding.url)
    end
  
  end
  
Form:

  <%= form_for @video, html: { multipart: true } do |form| %>
    <%= form.file_field :encoding %>
  <% end %>
  
View:

  <video>
    <source src="<%= @video.encoding.url(:webm)" />
    <source src="<%= @video.encoding.url(:mp4) %>" />
    <source src="<%= @video.encoding.url(:ogg) %>" />
  </video>
  
== Advanced

=== Validations

  # app/models/person.rb
  validates_attached_presence :file
  validates_attached_size :file, in: 2.kilobytes..2.megabytes
  validates_attached_extension :file, in: %w(jpe jpg jpeg png)

==== Storage
  
  # app/models/user.rb
  has_attached :file, medium: :aws, credentials: "#{Rails.root}/config/aws.yml"
  
  # app/models/user.rb
  has_attached :file, medium: :google, credentials: "#{Rails.root}/config/google.yml"
  
  # app/models/user.rb
  has_attached :file, medium: :rackspace, credentials: "#{Rails.root}/config/rackspace.yml"
  
  # config/initializers/attached.rb
  Attached::Attachment.options[:medium] = :aws
  Attached::Attachment.options[:credentials] = "#{Rails.root}/config/aws.yml"
  
  # config/initializers/attached.rb
  Attached::Attachment.options[:medium] = :google
  Attached::Attachment.options[:credentials] = "#{Rails.root}/config/google.yml"
  
  # config/initializers/attached.rb
  Attached::Attachment.options[:medium] = :rackspace
  Attached::Attachment.options[:credentials] = "#{Rails.root}/config/rackspace.yml"
  
=== Processors

  # app/models/image.rb
  has_attached :file, processor: :image, styles: {
    small:   { size: '200x200>', extension: '.jpg', quality: 90 },
    large:   { size: '400x400<', extension: '.jpg', quality: 90 },
    default: { size: '300x300#', extension: '.jpg', quality: 90 },
  }
  
  # app/models/image.rb
  has_attached :file, processor: :image, styles: {
    small:   { operation: :decrease, width: 200, height: 200, extension: '.jpg', quality: 90 },
    large:   { operation: :increase, width: 400, height: 400, extension: '.jpg', quality: 90 },
    default: { operation: :resize,   width: 300, height: 300, extension: '.jpg', quality: 90 },
  }
  
  # app/models/audio.rb
  has_attached :file, processor: :audio, styles: {
    full:  { preset: '320kbps', extension: '.wav' },
    large: { preset: '256kbps', extension: '.wav' },
    small: { preset: '128kbps', extension: '.wav' },
  }
  
  # app/models/audio.rb
  has_attached :file, processor: :audio, styles: {
    full:  { preset: 'insane',  extension: '.wav' },
    large: { preset: 'extreme', extension: '.wav' },
    small: { preset: 'medium',  extension: '.wav' },
  }
  
=== Strategies

  # app/models/sample.rb
  has_attached :file, processor: ..., styles: { ... }, strategy: :delay
  has_attached :file, processor: ..., styles: { ... }, strategy: :cache
  
=== Reprocessing

  rake attached:process[Image,file]
  rake attached:process[Audio,file]
  
=== Aliases

  # app/initializer/attached.rb
  Attached::Attachment.options[:alias] = "https://storage.ksylvest.com/"

  # app/initializer/attached.rb
  Attached::Attachment.options[:aliases] = %w(
    https://a.storage.ksylvest.com/
    https://b.storage.ksylvest.com/
    https://c.storage.ksylvest.com/
    https://d.storage.ksylvest.com/
  )

=== Metadata

  # app/initializers/attached.rb
  Attached::Attachment.options[:metadata] = { 'Cache-Control' => 'max-age=3153600' }

== Status

{<img src="https://img.shields.io/gemnasium/ksylvest/attached.svg" />}[https://gemnasium.com/ksylvest/attached]
{<img src="https://img.shields.io/travis/ksylvest/attached.svg" />}[https://travis-ci.org/ksylvest/attached]
{<img src="https://img.shields.io/coveralls/ksylvest/attached.svg" />}[https://coveralls.io/r/ksylvest/attached]
{<img src="https://img.shields.io/codeclimate/github/ksylvest/attached.svg" />}[https://codeclimate.com/github/ksylvest/attached]

== Copyright

Copyright (c) 2010 - 2014 Kevin Sylvestre. See LICENSE for details.