watarase 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +156 -0
- data/Rakefile +32 -0
- data/lib/tasks/watarase_tasks.rake +4 -0
- data/lib/watarase.rb +28 -0
- data/lib/watarase/controller.rb +49 -0
- data/lib/watarase/generators/uploader/uploader_generator.rb +45 -0
- data/lib/watarase/model.rb +20 -0
- data/lib/watarase/version.rb +3 -0
- data/test/dummy/Gemfile +40 -0
- data/test/dummy/Gemfile.lock +120 -0
- data/test/dummy/README.rdoc +28 -0
- data/test/dummy/Rakefile +6 -0
- data/test/dummy/app/assets/images/rails.png +0 -0
- data/test/dummy/app/assets/javascripts/application.js +16 -0
- data/test/dummy/app/assets/javascripts/users.js.coffee +3 -0
- data/test/dummy/app/assets/stylesheets/application.css +13 -0
- data/test/dummy/app/assets/stylesheets/scaffolds.css.scss +69 -0
- data/test/dummy/app/assets/stylesheets/users.css.scss +3 -0
- data/test/dummy/app/controllers/application_controller.rb +5 -0
- data/test/dummy/app/controllers/users_controller.rb +80 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/helpers/users_helper.rb +5 -0
- data/test/dummy/app/models/user.rb +4 -0
- data/test/dummy/app/models/user_image_holder.rb +18 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/app/views/users/_form.html.erb +31 -0
- data/test/dummy/app/views/users/edit.html.erb +6 -0
- data/test/dummy/app/views/users/index.html.erb +31 -0
- data/test/dummy/app/views/users/index.json.jbuilder +4 -0
- data/test/dummy/app/views/users/new.html.erb +5 -0
- data/test/dummy/app/views/users/show.html.erb +10 -0
- data/test/dummy/app/views/users/show.json.jbuilder +1 -0
- data/test/dummy/bin/bundle +3 -0
- data/test/dummy/bin/rails +4 -0
- data/test/dummy/bin/rake +4 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/config/application.rb +25 -0
- data/test/dummy/config/boot.rb +6 -0
- data/test/dummy/config/database.yml +60 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +27 -0
- data/test/dummy/config/environments/production.rb +80 -0
- data/test/dummy/config/environments/test.rb +36 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/test/dummy/config/initializers/inflections.rb +16 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/secret_token.rb +12 -0
- data/test/dummy/config/initializers/session_store.rb +3 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +23 -0
- data/test/dummy/config/routes.rb +55 -0
- data/test/dummy/db/migrate/20130316163018_create_users.rb +11 -0
- data/test/dummy/db/migrate/20130318134905_create_user_image_holders.rb +13 -0
- data/test/dummy/db/schema.rb +42 -0
- data/test/dummy/db/seeds.rb +7 -0
- data/test/dummy/log/development.log +6173 -0
- data/test/dummy/log/test.log +4039 -0
- data/test/dummy/public/404.html +27 -0
- data/test/dummy/public/422.html +26 -0
- data/test/dummy/public/500.html +26 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/public/robots.txt +5 -0
- data/test/dummy/test/controllers/users_controller_test.rb +59 -0
- data/test/dummy/test/fixtures/images/default.png +0 -0
- data/test/dummy/test/fixtures/user_image_holders.yml +22 -0
- data/test/dummy/test/fixtures/users.yml +7 -0
- data/test/dummy/test/helpers/users_helper_test.rb +4 -0
- data/test/dummy/test/models/user_image_holder_test.rb +7 -0
- data/test/dummy/test/models/user_test.rb +7 -0
- data/test/dummy/test/test_helper.rb +15 -0
- data/test/dummy/tmp/cache/assets/development/sass/d65fc20612cada6cf950acc42e8249eabf15168c/scaffolds.css.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/d65fc20612cada6cf950acc42e8249eabf15168c/users.css.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/10fcfbe6ebae11a40c8eac41939a1b9a +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/4ad413f3e3326481d2f5f9327bbd0e12 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/639464835e9b3e69e17ff82198bb49d4 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/6c0f2a2c7346b84a92e2cb81473e251b +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/85ae64edf528ce6e981889f3f3c285d9 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/977ead1d20bc9f7e1c191bd4348f9e3a +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/981fdf59c6c819da5a85424ee749e704 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/af0b8e0d6ae482cd467cf7ca6cf461ba +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/bd3936370d0f952ada5774e2230046ed +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/be10cf0a459c2397da8192966ed4ae50 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/cf0fb9efef3ee1bf2ea2c3e108dee600 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/d46c90159d299e62b189c080134dba53 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/d5c7928882375575ed61c458a61defcf +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/df8b2265598a7cf1f0db49c6169b3031 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/e2e8f7f4c2e46b20bbaa95d67e83c41e +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/e459168835a5f27b832ace20874f7c10 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/e7726188d3504b41f9ac5e31d1eedea7 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/fb009e9fefe26f5f83de37860988c77d +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/d65fc20612cada6cf950acc42e8249eabf15168c/scaffolds.css.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/d65fc20612cada6cf950acc42e8249eabf15168c/users.css.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/10fcfbe6ebae11a40c8eac41939a1b9a +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/4ad413f3e3326481d2f5f9327bbd0e12 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/6c0f2a2c7346b84a92e2cb81473e251b +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/85ae64edf528ce6e981889f3f3c285d9 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/977ead1d20bc9f7e1c191bd4348f9e3a +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/af0b8e0d6ae482cd467cf7ca6cf461ba +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/bd3936370d0f952ada5774e2230046ed +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/be10cf0a459c2397da8192966ed4ae50 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/cf0fb9efef3ee1bf2ea2c3e108dee600 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/d46c90159d299e62b189c080134dba53 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/e7726188d3504b41f9ac5e31d1eedea7 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/fb009e9fefe26f5f83de37860988c77d +0 -0
- data/test/test_helper.rb +27 -0
- data/test/watarase_test.rb +27 -0
- metadata +316 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: b6816958a8af5231d8b1b44cbace43f565a71a0f
|
4
|
+
data.tar.gz: a6924e9932f269f1fb02a732e49c72304eed0437
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: dd29a838bc048ebb4d2203c101a4b6949298d6755e76ad938ce801940e0daebbfa28deca48d5198381bc86c0f5b091ae2e926386647e19a271fc483557657dd2
|
7
|
+
data.tar.gz: 747086dbb5ce17339ce21ee3599e947a256a1d5abcd860a72359176be7dd30ca6c0c1971a748a7e49aacb84ad9a1f3254e6be3c9ec4722bf65b306715a66ee37
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright 2013 Toshinobu KOBAYASHI
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,156 @@
|
|
1
|
+
= Watarase
|
2
|
+
|
3
|
+
Watarase is a rails plugin for Image Upload.
|
4
|
+
|
5
|
+
Images are stored into the database as binary data.
|
6
|
+
This plugin is inteded to be handled as a small image of the icon.
|
7
|
+
|
8
|
+
|
9
|
+
== Installation
|
10
|
+
|
11
|
+
Add to Gemfile following
|
12
|
+
|
13
|
+
gem 'watarase'
|
14
|
+
gem 'rmagick'
|
15
|
+
|
16
|
+
Now, watarase plugin setting following
|
17
|
+
|
18
|
+
gem 'watarase', :git => 'git://github.com/kobayashi-tbn/watarase.git'
|
19
|
+
|
20
|
+
|
21
|
+
== Getting Started
|
22
|
+
|
23
|
+
Any model of the target is present is expected.
|
24
|
+
|
25
|
+
example
|
26
|
+
|
27
|
+
rails generate scaffold user username:string email:string
|
28
|
+
|
29
|
+
That model is the image handler.
|
30
|
+
|
31
|
+
Generate image holder. This is a model that is made separately.
|
32
|
+
|
33
|
+
rails generate watarase:uploader user
|
34
|
+
|
35
|
+
The generator made UserImageHolder the model class and the migration file.
|
36
|
+
|
37
|
+
Example of migration file is following.
|
38
|
+
|
39
|
+
class CreateUserImageHolders < ActiveRecord::Migration
|
40
|
+
def change
|
41
|
+
create_table :user_image_holders do |t|
|
42
|
+
t.string :user_username
|
43
|
+
t.string :filename
|
44
|
+
t.string :content_type
|
45
|
+
t.binary :image_data
|
46
|
+
t.binary :image_thumb
|
47
|
+
|
48
|
+
t.timestamps
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
In this case, the foreign key 'user_username' is type :string.
|
54
|
+
It was named {model name}_{pk} automatically.
|
55
|
+
|
56
|
+
== Active Record
|
57
|
+
|
58
|
+
Define 'acts_as_image_hander' into Image handler model (ex. User).
|
59
|
+
|
60
|
+
class User
|
61
|
+
self.primary_key :username # if this model's PK was 'username'.
|
62
|
+
acts_as_image_handler # define image hander
|
63
|
+
end
|
64
|
+
|
65
|
+
== Routing
|
66
|
+
|
67
|
+
Add 'load_image' action in 'config/routes.rb'
|
68
|
+
|
69
|
+
resources :users do
|
70
|
+
member do
|
71
|
+
get 'load_image'
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
== Controller
|
76
|
+
|
77
|
+
Define 'image_loadable <image_handler>' definition in controllers.
|
78
|
+
|
79
|
+
class UsersController < ApplicationController
|
80
|
+
image_loadable :user
|
81
|
+
:
|
82
|
+
|
83
|
+
Set image holder to image handler by method 'set_iamge_holder'.
|
84
|
+
|
85
|
+
def create
|
86
|
+
@user = User.new(user_params)
|
87
|
+
set_image_holder @user
|
88
|
+
:
|
89
|
+
|
90
|
+
def update
|
91
|
+
set_image_holder @user
|
92
|
+
:
|
93
|
+
|
94
|
+
== View
|
95
|
+
|
96
|
+
Examples _form.html.erb for User
|
97
|
+
|
98
|
+
<%= form_for(@user) do |f| %>
|
99
|
+
<% if @user.errors.any? %>
|
100
|
+
<div id="error_explanation">
|
101
|
+
<h2><%= pluralize(@user.errors.count, "error") %> prohibited this user from being saved:</h2>
|
102
|
+
|
103
|
+
<ul>
|
104
|
+
<% @user.errors.full_messages.each do |msg| %>
|
105
|
+
<li><%= msg %></li>
|
106
|
+
<% end %>
|
107
|
+
</ul>
|
108
|
+
</div>
|
109
|
+
<% end %>
|
110
|
+
|
111
|
+
<div class="field">
|
112
|
+
<%= f.label :username %><br />
|
113
|
+
<%= f.text_field :username %>
|
114
|
+
</div>
|
115
|
+
<div class="field">
|
116
|
+
<%= f.label :email %><br />
|
117
|
+
<%= f.text_field :email %>
|
118
|
+
</div>
|
119
|
+
<div class="field">
|
120
|
+
<%= f.label :image_file %><br />
|
121
|
+
<%= f.file_field :image_file %>
|
122
|
+
</div>
|
123
|
+
<% unless @user.new_record? %>
|
124
|
+
<div class="field">
|
125
|
+
<%= f.check_box :remove_image %>
|
126
|
+
<%= f.label :remove_image %><br />
|
127
|
+
</div>
|
128
|
+
<% end %>
|
129
|
+
<div class="actions">
|
130
|
+
<%= f.submit %>
|
131
|
+
</div>
|
132
|
+
<% end %>
|
133
|
+
|
134
|
+
Add file_field form, and check box for remove the image.
|
135
|
+
Parameter name is fixed, :image_file and :remove_image.
|
136
|
+
|
137
|
+
Examples image load in index.html.erb
|
138
|
+
|
139
|
+
<% @users.each do |user| %>
|
140
|
+
<tr>
|
141
|
+
<td><%= image_tag image_thumb_path user if user.user_image_holder %></td>
|
142
|
+
<td><%= user.username %></td>
|
143
|
+
<td><%= link_to 'Show', user %></td>
|
144
|
+
<td><%= link_to 'Edit', edit_user_path(user) %></td>
|
145
|
+
<td><%= link_to 'Destroy', user, method: :delete, data: { confirm: 'Are you sure?' } %></td>
|
146
|
+
</tr>
|
147
|
+
<% end %>
|
148
|
+
|
149
|
+
|
150
|
+
== TODO
|
151
|
+
|
152
|
+
* Configuring parameters for plugin settings.
|
153
|
+
* Secure upload by file extentions.
|
154
|
+
|
155
|
+
|
156
|
+
This project rocks and uses MIT-LICENSE.
|
data/Rakefile
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
begin
|
2
|
+
require 'bundler/setup'
|
3
|
+
rescue LoadError
|
4
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
5
|
+
end
|
6
|
+
|
7
|
+
require 'rdoc/task'
|
8
|
+
|
9
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
10
|
+
rdoc.rdoc_dir = 'rdoc'
|
11
|
+
rdoc.title = 'Watarase'
|
12
|
+
rdoc.options << '--line-numbers'
|
13
|
+
rdoc.rdoc_files.include('README.rdoc')
|
14
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
|
19
|
+
|
20
|
+
Bundler::GemHelper.install_tasks
|
21
|
+
|
22
|
+
require 'rake/testtask'
|
23
|
+
|
24
|
+
Rake::TestTask.new(:test) do |t|
|
25
|
+
t.libs << 'lib'
|
26
|
+
t.libs << 'test'
|
27
|
+
t.pattern = 'test/**/*_test.rb'
|
28
|
+
t.verbose = false
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
task default: :test
|
data/lib/watarase.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'RMagick'
|
3
|
+
#require 'rmagick'
|
4
|
+
require 'rails/generators'
|
5
|
+
|
6
|
+
module Watarase
|
7
|
+
|
8
|
+
@@suffix = "image_holder"
|
9
|
+
|
10
|
+
def self.suffix
|
11
|
+
@@suffix
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.suffix=(_suffix)
|
15
|
+
@@suffix = _suffix
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
module Watarase
|
20
|
+
module Generators
|
21
|
+
class Base < Rails::Generators::NamedBase
|
22
|
+
#source_root File.expand_path(File.join(File.dirname(__FILE__), "watarase", "generator", "uploader", "template"))
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
require 'watarase/model'
|
27
|
+
require 'watarase/controller'
|
28
|
+
require 'watarase/generators/uploader/uploader_generator'
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module Watarase
|
2
|
+
module Controller
|
3
|
+
def self.included(controller)
|
4
|
+
controller.extend Watarase::ImageLoader
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
module ImageLoader
|
9
|
+
def image_loadable(_image_handler, options = {})
|
10
|
+
ih = _image_handler.to_s.camelize.constantize
|
11
|
+
self.class_variable_set(:@@image_handler, ih)
|
12
|
+
self.send(:include, Watarase::InstanceMethods)
|
13
|
+
self.send(:helper_method, :image_thumb_path)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
module InstanceMethods
|
18
|
+
def load_image
|
19
|
+
#image = "#{image_handler}_image".camelize.constantize.find(params[:id])
|
20
|
+
image = image_holder.find(params[:id])
|
21
|
+
column_name = :"#{(params[:image_column] || :image_data)}"
|
22
|
+
send_data image.send(column_name), type: image.content_type, disposition: 'inline'
|
23
|
+
end
|
24
|
+
|
25
|
+
def image_params
|
26
|
+
params.require(image_handler.name.underscore.to_sym).permit(:image_file, :remove_image)
|
27
|
+
end
|
28
|
+
|
29
|
+
def image_handler
|
30
|
+
self.class.class_variable_get(:@@image_handler)
|
31
|
+
end
|
32
|
+
|
33
|
+
def image_holder
|
34
|
+
"#{image_handler.name.underscore}_#{Watarase.suffix}".camelize.constantize
|
35
|
+
end
|
36
|
+
|
37
|
+
def image_thumb_path(model)
|
38
|
+
url_for(controller: image_handler.name.downcase!.pluralize, action: 'load_image', id: model.send(:"#{image_holder.name.underscore}").id, image_column: :image_thumb)
|
39
|
+
end
|
40
|
+
|
41
|
+
# Call before create, update
|
42
|
+
def set_image_holder(_image_handler)
|
43
|
+
_image_handler.send(:"#{image_holder.name.underscore}=", image_holder.new) unless _image_handler.send(:"#{image_holder.name.underscore}")
|
44
|
+
_image_handler.send(:"#{image_holder.name.underscore}").uploaded_image = image_params
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
ActionController::Base.send :include, Watarase::Controller unless ActionController::Base.include? Watarase::Controller
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Watarase
|
2
|
+
module Generators
|
3
|
+
class UploaderGenerator < Base
|
4
|
+
def create_image_holder
|
5
|
+
image_handler = file_name.camelcase.constantize
|
6
|
+
fk = image_handler.primary_key
|
7
|
+
fk_type = ((image_handler.respond_to? :columns) ? image_handler.columns.select{|column| column.name == fk}.first.type : :integer)
|
8
|
+
model_name = "#{file_name}_#{Watarase.suffix}"
|
9
|
+
|
10
|
+
# RMagick
|
11
|
+
str_include = " include Magick unless self.include? Magick\n"
|
12
|
+
|
13
|
+
# Associations
|
14
|
+
str_belongs_to = " belongs_to :#{file_name}, primary_key: :#{fk}, foreign_key: :#{file_name}_#{fk}\n"
|
15
|
+
|
16
|
+
# Instance Methods
|
17
|
+
str_methods = <<-CODE
|
18
|
+
|
19
|
+
def uploaded_image= (image_params)
|
20
|
+
if image_params[:remove_image] && image_params[:remove_image] == "1"
|
21
|
+
self.destroy
|
22
|
+
elsif image_params[:image_file] && !image_params[:image_file].blank?
|
23
|
+
self.filename = image_params[:image_file].original_filename
|
24
|
+
self.content_type = image_params[:image_file].content_type
|
25
|
+
data = image_params[:image_file].tempfile.read
|
26
|
+
self.image_data = Image.from_blob(data).first.resize_to_fit(100, 100).to_blob
|
27
|
+
self.image_thumb = Image.from_blob(data).first.thumbnail(35, 35).to_blob
|
28
|
+
elsif self.new_record?
|
29
|
+
self.destroy
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def extension_white_list
|
34
|
+
%w(jpg jpeg gif png)
|
35
|
+
end
|
36
|
+
CODE
|
37
|
+
|
38
|
+
generate "model", "#{model_name} #{file_name}_#{fk}:#{fk_type} filename:string content_type:string image_data:binary image_thumb:binary"
|
39
|
+
inject_into_class "app/models/#{model_name}.rb", model_name.camelcase.constantize do
|
40
|
+
str_include << str_belongs_to << str_methods
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'active_record/base'
|
2
|
+
|
3
|
+
module Watarase
|
4
|
+
module Model
|
5
|
+
def self.included(model)
|
6
|
+
model.extend Watarase::ActsAsImageHandler
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
module ActsAsImageHandler
|
11
|
+
def acts_as_image_handler
|
12
|
+
_image_holder = (self.name.underscore << '_' << Watarase.suffix).to_sym
|
13
|
+
self.send(:has_one, _image_holder, primary_key: self.primary_key, foreign_key: "#{self.name.underscore}_#{self.primary_key}", autosave: true)
|
14
|
+
self.send(:attr_accessor, :remove_image)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
ActiveRecord::Base.send :include, Watarase::Model unless ActiveRecord::Base.include? Watarase::Model
|
20
|
+
|
data/test/dummy/Gemfile
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
|
4
|
+
gem 'rails', '4.0.0.beta1'
|
5
|
+
|
6
|
+
gem 'pg'
|
7
|
+
|
8
|
+
# Gems used only for assets and not required
|
9
|
+
# in production environments by default.
|
10
|
+
group :assets do
|
11
|
+
gem 'sass-rails', '~> 4.0.0.beta1'
|
12
|
+
gem 'coffee-rails', '~> 4.0.0.beta1'
|
13
|
+
|
14
|
+
# See https://github.com/sstephenson/execjs#readme for more supported runtimes
|
15
|
+
# gem 'therubyracer', platforms: :ruby
|
16
|
+
|
17
|
+
gem 'uglifier', '>= 1.0.3'
|
18
|
+
end
|
19
|
+
|
20
|
+
gem 'jquery-rails'
|
21
|
+
|
22
|
+
# Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks
|
23
|
+
gem 'turbolinks'
|
24
|
+
|
25
|
+
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
|
26
|
+
gem 'jbuilder', '~> 1.0.1'
|
27
|
+
|
28
|
+
# To use ActiveModel has_secure_password
|
29
|
+
# gem 'bcrypt-ruby', '~> 3.0.0'
|
30
|
+
|
31
|
+
# Use unicorn as the app server
|
32
|
+
# gem 'unicorn'
|
33
|
+
|
34
|
+
# Deploy with Capistrano
|
35
|
+
# gem 'capistrano', group: :development
|
36
|
+
|
37
|
+
# To use debugger
|
38
|
+
# gem 'debugger'
|
39
|
+
|
40
|
+
gem 'rmagick'
|
@@ -0,0 +1,120 @@
|
|
1
|
+
GEM
|
2
|
+
remote: https://rubygems.org/
|
3
|
+
specs:
|
4
|
+
actionmailer (4.0.0.beta1)
|
5
|
+
actionpack (= 4.0.0.beta1)
|
6
|
+
mail (~> 2.5.3)
|
7
|
+
actionpack (4.0.0.beta1)
|
8
|
+
activesupport (= 4.0.0.beta1)
|
9
|
+
builder (~> 3.1.0)
|
10
|
+
erubis (~> 2.7.0)
|
11
|
+
rack (~> 1.5.2)
|
12
|
+
rack-test (~> 0.6.2)
|
13
|
+
activemodel (4.0.0.beta1)
|
14
|
+
activesupport (= 4.0.0.beta1)
|
15
|
+
builder (~> 3.1.0)
|
16
|
+
activerecord (4.0.0.beta1)
|
17
|
+
activemodel (= 4.0.0.beta1)
|
18
|
+
activerecord-deprecated_finders (~> 0.0.3)
|
19
|
+
activesupport (= 4.0.0.beta1)
|
20
|
+
arel (~> 4.0.0.beta1)
|
21
|
+
activerecord-deprecated_finders (0.0.3)
|
22
|
+
activesupport (4.0.0.beta1)
|
23
|
+
i18n (~> 0.6.2)
|
24
|
+
minitest (~> 4.2)
|
25
|
+
multi_json (~> 1.3)
|
26
|
+
thread_safe (~> 0.1)
|
27
|
+
tzinfo (~> 0.3.33)
|
28
|
+
arel (4.0.0.beta1)
|
29
|
+
atomic (1.0.1)
|
30
|
+
builder (3.1.4)
|
31
|
+
coffee-rails (4.0.0.beta1)
|
32
|
+
coffee-script (>= 2.2.0)
|
33
|
+
railties (>= 4.0.0.beta, < 5.0)
|
34
|
+
coffee-script (2.2.0)
|
35
|
+
coffee-script-source
|
36
|
+
execjs
|
37
|
+
coffee-script-source (1.5.0)
|
38
|
+
erubis (2.7.0)
|
39
|
+
execjs (1.4.0)
|
40
|
+
multi_json (~> 1.0)
|
41
|
+
hike (1.2.1)
|
42
|
+
i18n (0.6.4)
|
43
|
+
jbuilder (1.0.2)
|
44
|
+
activesupport (>= 3.0.0)
|
45
|
+
jquery-rails (2.2.1)
|
46
|
+
railties (>= 3.0, < 5.0)
|
47
|
+
thor (>= 0.14, < 2.0)
|
48
|
+
json (1.7.7)
|
49
|
+
mail (2.5.3)
|
50
|
+
i18n (>= 0.4.0)
|
51
|
+
mime-types (~> 1.16)
|
52
|
+
treetop (~> 1.4.8)
|
53
|
+
mime-types (1.21)
|
54
|
+
minitest (4.6.2)
|
55
|
+
multi_json (1.6.1)
|
56
|
+
pg (0.14.1)
|
57
|
+
polyglot (0.3.3)
|
58
|
+
rack (1.5.2)
|
59
|
+
rack-test (0.6.2)
|
60
|
+
rack (>= 1.0)
|
61
|
+
rails (4.0.0.beta1)
|
62
|
+
actionmailer (= 4.0.0.beta1)
|
63
|
+
actionpack (= 4.0.0.beta1)
|
64
|
+
activerecord (= 4.0.0.beta1)
|
65
|
+
activesupport (= 4.0.0.beta1)
|
66
|
+
bundler (>= 1.3.0, < 2.0)
|
67
|
+
railties (= 4.0.0.beta1)
|
68
|
+
sprockets-rails (~> 2.0.0.rc3)
|
69
|
+
railties (4.0.0.beta1)
|
70
|
+
actionpack (= 4.0.0.beta1)
|
71
|
+
activesupport (= 4.0.0.beta1)
|
72
|
+
rake (>= 0.8.7)
|
73
|
+
rdoc (~> 3.4)
|
74
|
+
thor (>= 0.17.0, < 2.0)
|
75
|
+
rake (10.0.3)
|
76
|
+
rdoc (3.12.2)
|
77
|
+
json (~> 1.4)
|
78
|
+
rmagick (2.13.2)
|
79
|
+
sass (3.2.6)
|
80
|
+
sass-rails (4.0.0.beta1)
|
81
|
+
railties (>= 4.0.0.beta, < 5.0)
|
82
|
+
sass (>= 3.1.10)
|
83
|
+
sprockets-rails (~> 2.0.0.rc0)
|
84
|
+
tilt (~> 1.3)
|
85
|
+
sprockets (2.9.0)
|
86
|
+
hike (~> 1.2)
|
87
|
+
multi_json (~> 1.0)
|
88
|
+
rack (~> 1.0)
|
89
|
+
tilt (~> 1.1, != 1.3.0)
|
90
|
+
sprockets-rails (2.0.0.rc3)
|
91
|
+
actionpack (>= 3.0)
|
92
|
+
activesupport (>= 3.0)
|
93
|
+
sprockets (~> 2.8)
|
94
|
+
thor (0.17.0)
|
95
|
+
thread_safe (0.1.0)
|
96
|
+
atomic
|
97
|
+
tilt (1.3.4)
|
98
|
+
treetop (1.4.12)
|
99
|
+
polyglot
|
100
|
+
polyglot (>= 0.3.1)
|
101
|
+
turbolinks (1.0.0)
|
102
|
+
coffee-rails
|
103
|
+
tzinfo (0.3.36)
|
104
|
+
uglifier (1.3.0)
|
105
|
+
execjs (>= 0.3.0)
|
106
|
+
multi_json (~> 1.0, >= 1.0.2)
|
107
|
+
|
108
|
+
PLATFORMS
|
109
|
+
ruby
|
110
|
+
|
111
|
+
DEPENDENCIES
|
112
|
+
coffee-rails (~> 4.0.0.beta1)
|
113
|
+
jbuilder (~> 1.0.1)
|
114
|
+
jquery-rails
|
115
|
+
pg
|
116
|
+
rails (= 4.0.0.beta1)
|
117
|
+
rmagick
|
118
|
+
sass-rails (~> 4.0.0.beta1)
|
119
|
+
turbolinks
|
120
|
+
uglifier (>= 1.0.3)
|