README.md
# Uploadbox
Easy uploads for Rails application
[![Code Climate](https://codeclimate.com/github/startae/uploadbox.png)](https://codeclimate.com/github/startae/uploadbox)
## Early Beta
This is still an early beta version and will change a lot until it reaches API stability.
That said, it's already being used on production projects.
## Installation
Make sure you have [ImageMagick](http://www.imagemagick.org/) installed.
#### Add to Gemfile
```
gem 'uploadbox', '0.2.0'
```
#### Run generators
```
rails g uploadbox:image
```
#### Migrate database
```
rake db:migrate
```
#### Add jquery and uploadbox to `application.js`
```
//= require jquery
//= require jquery_ujs
//= require uploadbox
```
#### Add uploadbox to `application.css`
```
/*
*= require uploadbox
*/
```
#### Create a development bucket on [Amazon S3](http://aws.amazon.com/s3/)
#### Edit CORS config for the bucket
```
<CORSConfiguration>
<CORSRule>
<AllowedOrigin>http://localhost:3000</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
```
#### Get S3 Key and Secret from Amazon S3 Credentials and update your `secrets.yml` file.
```
development:
s3_bucket: your-bucket-name
s3_key: your-s3-key
s3_secret: your-s3-secret
```
## Usage
### uploads_one
#### Add `uploads_one` to your model
```
class Post < ActiveRecord::Base
uploads_one :picture, thumb: [100, 100], regular: [600, 300], placeholder: 'default.png'
end
```
If `placeholder` is set posts without uploads will render the placeholder.
Empty `@post.picture.thumb` will render `app/assets/images/thumb_default.png`
#### Add field to form
```
<%= f.uploads_one :picture %>
```
You can pass a `:preview` option, so that the field will have the dimensions specified in the model.
```
<%= f.uploads_one :picture, preview: :thumb %>
```
#### Allow attribute on controller
```
def post_params
params.require(:post).permit(:title, :body, :picture)
end
```
#### Show image
```
<%= img @post.picture.regular if @post.picture? %>
```
### uploads_many
#### Add `uploads_many` to your model
```
class User < ActiveRecord::Base
uploads_many :pictures, thumb: [100, 100], regular: [600, 600], placeholder: 'default.png'
end
```
#### Add field to form
```
<%= f.uploads_many :pictures %>
```
You can pass a `:preview` option, so that the field will have the dimensions specified in the model.
```
<%= f.uploads_one :pictures, preview: :thumb %>
```
#### Allow attributes on controller
```
def post_params
params.require(:user).permit(..., pictures: [])
end
```
#### Show images
```
<% @user.pictures.each do |pic| %>
<%= img pic.regular %>
<% end %>
```
#### Set `background_processing` to `false` if you're using Heroku
Go to `config/initializers/uploadbox.rb`, find the line where `background_processing` is being set and set it to `false`.
```
Uploadbox.background_processing = false
```
## Recreate versions
You might come to a situation where you want to retroactively change a version or add a new one. You can use the `update_#{upload_name}_versions!` method to recreate the versions from the base file.
For a post with a picture:
```
Post.update_picture_versions!
```
## Heroku
#### Create a production bucket on S3 (Don't use your development bucket)
```
<CORSConfiguration>
<CORSRule>
<AllowedOrigin>http://yourdomain.com</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
```
#### Set environment variables
```
heroku config:add \
HEROKU_API_KEY=ab12acvc12 \
HEROKU_APP=your-app-name \
S3_KEY=AAAA123BBBB \
S3_SECRET=abc123ABcEffgee122 \
S3_BUCKET=uploads-production
```
#### Update your secrets.yml file
```
production:
s3_key: <%= ENV["S3_KEY"] %>
s3_secret: <%= ENV["S3_SECRET"] %>
s3_bucket: <%= ENV["S3_BUCKET"] %>
```
#### Add Redis
```
heroku addons:add rediscloud
```
## Upgrade from 0.1.x
If are upgrading from 0.1.x you will need to create a migration to add a column named `original_file` to the `images` table
```
rails g migration add_original_file_to_images original_file:string
rake db:migrate
```