Gem Version Code Climate Build Status Dependency Status

Attachs

Json based attachments for records in rails.

Why

I did this gem to:

  • Save attachments into one json column.
  • Handle multiple attachments without the need of a separate model.
  • Have a way to delete orphan files.
  • Use graphicsmagick out of the box.
  • Delete and rename attachments asynchronous.
  • Keep renamed files to improve seo.

Install

Put this line in your Gemfile:

gem 'attachs'

Then bundle:

$ bundle

To install GraphicsMagick you can use homebrew:

$ brew install graphicsmagick

Configuration

Generate the configuration file:

$ bundle exec rails g attachs:install

Set the global settings:

Attachs.configure do |config|
  config.convert_options = '-strip -quality 82'
  config.region = 'us-east-1'
  config.bucket = 'some-bucket'
  config.base_url = 'https://cdn.mydomain.com'

  config.interpolation :name do |record|
    record.name
  end
end

Usage

Definitions

Add the columns to your tables:

class AddAttachments < ActiveRecord::Migration
  def change
    add_column :shops, :logo, :jsonb, default: {}
    add_column :products, :pictures, :jsonb, default: []
  end
end

Define the attachments in your models:

class Shop < ActiveRecord::Base
  has_attachment(
    :logo,
    path: ':id/:name.png',
    default_path: 'missing.png'
  )
end

class Product < ActiveRecord::Base
  has_attachments(
    :pictures,
    path: ':id/:style.:extension',
    styles: {
      tiny: '25x25',
      small: '150x150#',
      medium: '300x300!',
      large: '600x'
    }
  )
end

NOTE: The out of the box interpolations are: filename, basename, extension, attribute, content_type, size.

Validations

To validate the presence of the attachment:

class User < ActiveRecord::Base
  has_attachment :pictures
  validates_attachment_presence_of :pictures
end

To validate the size of the attachment:

class User < ActiveRecord::Base
  has_attachment :pictures
  validates_attachment_size_of :pictures, in: 1..5.megabytes
end

To validate the content type of the attachment:

class User < ActiveRecord::Base
  has_attachment :pictures
  validates_attachment_content_type_of :pictures, with: /\Aimage/
end

NOTE: Look into lib/attachs/locales yamls to known the keys.

Forms

Your forms continue to work the same:

<%= form_for @shop do |f| %>
  <%= f.file_field :logo %>
<% end %>

You can manage collections with fields_for:

<%= form_for @product do |f| %>
  <%= f.fields_for :pictures do |ff| %>
    <%= ff.file_field :value %>
    <%= ff.number_field :position %>
  <% end %>
<% end %>

Urls

The url method points to the original file:

<%= image_tag shop.logo.url %>

To point to some particular style:

<%= image_tag shop.logo.url(:small) %>

Tasks

To reprocess all styles:

$ bundle exec rake attachs:reprocess

To fix missing styles:

$ bundle exec rake attachs:fix_missings

To remove orphan files:

$ bundle exec rake attachs:clear

Credits

This gem is maintained and funded by mmontossi.

License

It is free software, and may be redistributed under the terms specified in the MIT-LICENSE file.