No commit activity in last 3 years
No release in over 3 years
File attachments solution for Ruby on Rails 3
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

 Project Readme

Simple Attachments¶ ↑

Simple Attachments is a plugin for Ruby on Rails 3 which implements complex solution for working with file attachments.

Requirements¶ ↑

Plugin contains some CSS and JavaScript code, so Asset Pipeline should be switched on (by default). Also you need jQuery library to make JavaScript work.

Installation¶ ↑

Add this to your Gemfile and run the bundle command.

gem 'simple_attachments'

Getting Started¶ ↑

Let’s say you have a User which has one Avatar and many Document. The avatar can be change from user edit form. And the avatar data updates only after submiting the form. The documents are shown on the same page. They can be managed separately with auto saving all changes in background. You can find this app in test.

Migrations¶ ↑

class CreateAvatars < ActiveRecord::Migration
  def change
    create_table :avatars do |t|
      t.references :avatar, :null => true
      t.attachment
    end
  end
end

class CreateDocuments < ActiveRecord::Migration
  def change
    create_table :documents do |t|
      t.references :avatar, :null => true
      t.attachment
    end
  end
end

WARNING: it’s important to permit null value for container.

Routes¶ ↑

resources :avatars, :only => [:create, :show, :destroy]
resources :documents, :only => [:create, :show, :destroy]

Models¶ ↑

class User < ActiveRecord::Base
  has_one_attachment :avatar, :dependent => :destroy
  has_many_attachments :books, :dependent => :destroy
end

class Avatar < ActiveRecord::Base
  attached_to :user
  validates_mimetype %w(image/png image/gif image/jpeg)
  validates_filesize :less_than_or_equal_to => 5e4
end

class Document < ActiveRecord::Base
  attached_to :user
  validates_mimetype %w(application/pdf)
  validates_filesize :less_than_or_equal_to => 20e6
end

You can use a lot of options here. Just like with has_one, has_many and belongs_to.

Controllers¶ ↑

class AvatarsController < ApplicationController
  attachment_controller
end

class DocumentsController < ApplicationController
  attachment_controller
end

View¶ ↑

<%= form_for @user do |f| %>
  <%= f.file :avatar, :auto_associate => false %>
<% end %>

<%= files @user, :documents %>

WARNING: you also need csrf_meta_tags in your layout to work with protect_from_forgery filter.

JavaScript¶ ↑

Plugin doesn’t provide any implementation of the file appearance. Instead it triggers events, which are easy to handle.

//= require_self
//= require simple_attachments

$(function() {
  // Div is loaded and engine is ready.
  $(".simple_attachments_div").bind("init", function() {
    // You can add your own init features here.
  });
  // New field was created.
  // Field is a div displaying attachment information.
  $(".simple_attachments_div").bind("new_field", function(event, field) {
    // You have to set field in the right place and add binds.
    field.appendTo(this);
    // Attachment was loaded
    // data contains attachment properties and some little support variables
    field.bind("loaded", function(event, data) {
      // You have to create and/or set field content here
      data.destroy_link.appendTo(this);
      data.attachment_link.html(data.filename).appendTo(this);
    });
    // Attachment upload was failed
    // errors is an array of strings
    field.bind("failed", function(event, errors) {
      // You can do something here before field would be deleted
    });
  });
});

WARNING: simple_attachments.js should be required after binds.

CSS¶ ↑

simple_attachments.css contains some code to decorate default file input. So better require it, but it’s not so necessary.


© 2012 Tsokurov Alex <me@ximik.net>, released under the MIT license