Watarase¶ ↑
Watarase is a rails plugin for Image Upload.
Images are stored into the database as binary data. This plugin is inteded to be handled as a small image of the icon.
Requirements¶ ↑
Image processor¶ ↑
ImageMagick must be installed.
Installation¶ ↑
Add to Gemfile following
gem 'watarase'
Getting Started¶ ↑
Any model of the target is present is expected.
example
rails generate scaffold user username:string email:string
That model is the image handler.
Generate image holder. This is a model that is made separately.
rails generate watarase:uploader user
The generator made UserImageHolder the model class and the migration file.
Example of migration file is following.
class CreateUserImageHolders < ActiveRecord::Migration def change create_table :user_image_holders do |t| t.string :user_username t.string :filename t.string :content_type t.binary :image_data t.binary :image_thumb t.timestamps end end end
In this case, the foreign key ‘user_username’ is type :string. It was named {model name}_{pk} automatically.
Active Record¶ ↑
Define ‘acts_as_image_hander’ into Image handler model (ex. User).
class User self.primary_key :username # if this model's PK was 'username'. acts_as_image_handler # define image hander end
Routing¶ ↑
Add ‘load_image’ action in ‘config/routes.rb’
resources :users do member do get 'load_image' end end
Controller¶ ↑
Define ‘image_loadable <image_handler>’ definition in controllers.
If you need image caching then, use options caches: and expire_actions:.
class UsersController < ApplicationController image_loadable :user, caches: true, expire_actions: [:update], save_actions: [:create, :update]
In this case, action caching enabled, and clearing the cache in update action. The option save_actions is associate image_handler(ex. user) with image_holder(ex. user_image_holder).
Tips¶ ↑
def index @users = User.all end
It is a good idea to make the following changes:
def index @users = User.all.merge(includes: [:user_image_holder]) end
View¶ ↑
Examples _form.html.erb for User
<%= form_for(@user) do |f| %> <% if @user.errors.any? %> <div id="error_explanation"> <h2><%= pluralize(@user.errors.count, "error") %> prohibited this user from being saved:</h2> <ul> <% @user.errors.full_messages.each do |msg| %> <li><%= msg %></li> <% end %> </ul> </div> <% end %> <div class="field"> <%= f.label :username %><br /> <%= f.text_field :username %> </div> <div class="field"> <%= f.label :email %><br /> <%= f.text_field :email %> </div> <div class="field"> <%= f.label :image_file %><br /> <%= f.file_field :image_file %> </div> <% unless @user.new_record? %> <div class="field"> <%= f.check_box :remove_image %> <%= f.label :remove_image %><br /> </div> <% end %> <div class="actions"> <%= f.submit %> </div> <% end %>
Add file_field form, and check box for remove the image. Parameter name is fixed, :image_file and :remove_image.
Examples image load in index.html.erb
<% @users.each do |user| %> <tr> <td><%= image_tag image_thumb_path user if user.user_image_holder %></td> <td><%= user.username %></td> <td><%= link_to 'Show', user %></td> <td><%= link_to 'Edit', edit_user_path(user) %></td> <td><%= link_to 'Destroy', user, method: :delete, data: { confirm: 'Are you sure?' } %></td> </tr> <% end %>
TODO¶ ↑
* Configuring parameters for plugin settings. * Secure upload by file extentions.
This project rocks and uses MIT-LICENSE.