effective_assets 0.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/MIT-LICENSE +1 -1
- data/README.md +341 -72
- data/app/assets/javascripts/effective/snippets/effective_asset.js.coffee +53 -0
- data/app/assets/javascripts/effective_assets.js +4 -0
- data/app/assets/javascripts/effective_assets/asset_box.js.coffee +36 -0
- data/app/assets/javascripts/effective_assets/asset_box_dialog.js.coffee +49 -0
- data/app/assets/javascripts/effective_assets/asset_box_drag_and_drop.js.coffee +2 -0
- data/app/assets/javascripts/effective_assets/asset_box_filtering.js.coffee +16 -0
- data/app/assets/javascripts/effective_assets/asset_box_sorting.js.coffee +8 -0
- data/app/assets/javascripts/effective_assets/jquery_ui_sortable.js +813 -585
- data/app/assets/javascripts/effective_assets/s3_uploader.js.coffee +268 -0
- data/app/assets/javascripts/effective_assets_iframe.js.coffee +28 -0
- data/app/assets/stylesheets/active_admin/effective_assets.css.scss +57 -0
- data/app/assets/stylesheets/effective_assets/_asset_box_input.scss +54 -175
- data/app/assets/stylesheets/effective_assets/_iframe_bootstrap.scss +1714 -0
- data/app/assets/stylesheets/effective_assets/_input_bootstrap.scss +508 -0
- data/app/assets/stylesheets/effective_assets_iframe.css.scss +23 -0
- data/app/controllers/effective/assets_controller.rb +41 -0
- data/app/controllers/effective/s3_uploads_controller.rb +58 -74
- data/app/helpers/effective_assets_helper.rb +30 -14
- data/app/helpers/effective_assets_s3_helper.rb +69 -0
- data/app/models/concerns/acts_as_asset_box.rb +75 -11
- data/app/models/effective/access_denied.rb +17 -0
- data/app/models/effective/asset.rb +130 -93
- data/app/models/effective/attachment.rb +2 -7
- data/app/models/effective/delayed_job.rb +33 -78
- data/app/models/effective/snippets/effective_asset.rb +19 -0
- data/app/models/effective/user_uploads.rb +19 -0
- data/app/models/inputs/asset_box.rb +154 -0
- data/app/models/inputs/asset_box_form_input.rb +7 -0
- data/app/models/inputs/asset_box_formtastic_input.rb +9 -0
- data/app/models/inputs/asset_box_input.rb +13 -82
- data/app/models/inputs/asset_box_simple_form_input.rb +7 -0
- data/app/uploaders/effective_assets_uploader.rb +14 -2
- data/app/uploaders/{asset_uploader.rb → test_asset_uploader.rb} +1 -1
- data/app/views/active_admin/effective_assets/_edit.html.haml +3 -3
- data/app/views/active_admin/effective_assets/_new.html.haml +2 -1
- data/app/views/asset_box_input/_attachment_as_list.html.haml +17 -0
- data/app/views/asset_box_input/_attachment_as_table.html.haml +32 -0
- data/app/views/asset_box_input/_attachment_as_thumbnail.html.haml +20 -0
- data/app/views/asset_box_input/_dialog.html.haml +18 -0
- data/app/views/asset_box_input/_progress_bar_template.html.haml +8 -0
- data/app/views/asset_box_input/_uploader.html.haml +21 -115
- data/app/views/effective/assets/iframe.html.haml +17 -0
- data/app/views/effective/snippets/_effective_asset.html.haml +8 -0
- data/config/routes.rb +8 -2
- data/db/migrate/01_create_effective_assets.rb.erb +3 -0
- data/lib/effective_assets.rb +34 -3
- data/lib/effective_assets/engine.rb +11 -8
- data/lib/effective_assets/version.rb +1 -1
- data/lib/generators/templates/asset_uploader.rb +35 -0
- data/lib/generators/templates/effective_assets.rb +31 -4
- data/lib/tasks/effective_assets_tasks.rake +115 -4
- data/spec/internal/config/database.yml +3 -0
- data/spec/internal/config/initializers/effective_assets.rb +18 -0
- data/spec/internal/config/routes.rb +3 -0
- data/spec/internal/db/combustion_test.sqlite +0 -0
- data/spec/internal/db/schema.rb +52 -0
- data/spec/internal/log/test.log +793 -0
- data/spec/{dummy → internal}/public/favicon.ico +0 -0
- data/spec/internal/public/sprites.png +0 -0
- data/spec/models/asset_spec.rb +119 -35
- data/spec/spec_helper.rb +9 -3
- metadata +95 -234
- data/app/assets/images/effective_assets/s3_down_button.gif +0 -0
- data/app/assets/images/effective_assets/s3_over_button.gif +0 -0
- data/app/assets/images/effective_assets/s3_up_button.gif +0 -0
- data/app/assets/images/effective_assets/s3_upload.swf +0 -0
- data/app/assets/javascripts/effective_assets/asset_box_input.js.coffee +0 -71
- data/app/assets/javascripts/effective_assets/asset_box_uploader.js +0 -122
- data/app/assets/javascripts/effective_assets/asset_box_uploader_customization.js +0 -166
- data/app/controllers/effective/attachments_controller.rb +0 -14
- data/app/views/asset_box_input/_attachment_fields.html.haml +0 -14
- data/spec/dummy/README.rdoc +0 -261
- data/spec/dummy/Rakefile +0 -7
- data/spec/dummy/app/assets/javascripts/application.js +0 -15
- data/spec/dummy/app/assets/stylesheets/application.css +0 -13
- data/spec/dummy/app/controllers/application_controller.rb +0 -3
- data/spec/dummy/app/helpers/application_helper.rb +0 -2
- data/spec/dummy/app/views/layouts/application.html.erb +0 -14
- data/spec/dummy/config.ru +0 -4
- data/spec/dummy/config/application.rb +0 -65
- data/spec/dummy/config/boot.rb +0 -10
- data/spec/dummy/config/database.yml +0 -25
- data/spec/dummy/config/environment.rb +0 -5
- data/spec/dummy/config/environments/development.rb +0 -37
- data/spec/dummy/config/environments/production.rb +0 -67
- data/spec/dummy/config/environments/test.rb +0 -37
- data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -7
- data/spec/dummy/config/initializers/inflections.rb +0 -15
- data/spec/dummy/config/initializers/mime_types.rb +0 -5
- data/spec/dummy/config/initializers/secret_token.rb +0 -7
- data/spec/dummy/config/initializers/session_store.rb +0 -8
- data/spec/dummy/config/initializers/wrap_parameters.rb +0 -14
- data/spec/dummy/config/locales/en.yml +0 -5
- data/spec/dummy/config/routes.rb +0 -58
- data/spec/dummy/db/development.sqlite3 +0 -0
- data/spec/dummy/db/schema.rb +0 -16
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/log/development.log +0 -71
- data/spec/dummy/log/test.log +0 -33
- data/spec/dummy/public/404.html +0 -26
- data/spec/dummy/public/422.html +0 -26
- data/spec/dummy/public/500.html +0 -25
- data/spec/dummy/script/rails +0 -6
- data/spec/dummy/spec_link +0 -3
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: 66a6a8c617143cf4a5bf07ca983c107eb051cf4f
|
|
4
|
+
data.tar.gz: 1603b90503e071746ee3624122d94ded27feb91e
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: e456d433b9525f7d8b8f3b7224485b4f4525be003a84f75e67dc7f4452fc527300f1d89e6388d85da60afaf943f87d2d5552ed4aed7aee169d6bb33fca7abad1
|
|
7
|
+
data.tar.gz: fa8954c62cd8ae6178990ae71f547e0bbfae9a8a5f3b81680ebaeb500f3dfcfc29cb1bb9dd2d136efd537db80743e73d19ea30bc1a070395e5471a404c1bc671
|
data/MIT-LICENSE
CHANGED
data/README.md
CHANGED
|
@@ -1,14 +1,20 @@
|
|
|
1
1
|
# Effective Assets
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Upload images and files directly to AWS S3 with a custom form input, then seamlessly organize and attach them to any ActiveRecord object.
|
|
4
|
+
|
|
5
|
+
A Rails Engine full solution for managing assets (images, files, videos, etc).
|
|
4
6
|
|
|
5
7
|
Attach one or more assets to any model with validations.
|
|
6
8
|
|
|
7
|
-
|
|
9
|
+
Upload direct to Amazon S3 implementation based on jQuery-File-Upload and image processing on a background process with CarrierWave and DelayedJob
|
|
10
|
+
|
|
11
|
+
Rails FormBuilder, Formtastic and SimpleForm inputs for displaying, managing, and uploading assets direct to S3.
|
|
12
|
+
|
|
13
|
+
Works with AWS public-read and authenticated-read for easy secured downloads.
|
|
8
14
|
|
|
9
|
-
|
|
15
|
+
Includes integration with ActiveAdmin
|
|
10
16
|
|
|
11
|
-
|
|
17
|
+
Rails 3.2.x and Rails4 support
|
|
12
18
|
|
|
13
19
|
## Getting Started
|
|
14
20
|
|
|
@@ -32,7 +38,7 @@ rails generate effective_assets:install
|
|
|
32
38
|
|
|
33
39
|
The generator will install an initializer which describes all configuration options and creates two database migrations, one for EffectiveAssets the other for DelayedJob.
|
|
34
40
|
|
|
35
|
-
If you want to tweak the table name (to use something other than the default
|
|
41
|
+
If you want to tweak the table name (to use something other than the default `assets` and `attachments`), manually adjust both the configuration file and the migration now.
|
|
36
42
|
|
|
37
43
|
Then migrate the database:
|
|
38
44
|
|
|
@@ -40,120 +46,343 @@ Then migrate the database:
|
|
|
40
46
|
rake db:migrate
|
|
41
47
|
```
|
|
42
48
|
|
|
43
|
-
If you intend to use the form helper method to display and upload assets, require the javascript in your application.js
|
|
49
|
+
If you intend to use the form helper method to display and upload assets, require the javascript in your application.js:
|
|
44
50
|
|
|
45
51
|
```ruby
|
|
46
|
-
//= require
|
|
52
|
+
//= require effective_assets
|
|
47
53
|
```
|
|
48
54
|
|
|
49
|
-
If you intend to use ActiveAdmin (optional
|
|
55
|
+
If you intend to use ActiveAdmin (optional):
|
|
50
56
|
|
|
51
57
|
Add to your ActiveAdmin.js file:
|
|
52
58
|
|
|
53
59
|
```ruby
|
|
54
60
|
//= require effective_assets
|
|
55
|
-
|
|
56
61
|
```
|
|
57
62
|
|
|
58
63
|
And to your ActiveAdmin stylesheet
|
|
59
64
|
|
|
60
65
|
```ruby
|
|
61
66
|
body.active_admin {
|
|
62
|
-
@import "effective_assets";
|
|
63
67
|
}
|
|
68
|
+
@import "active_admin/effective_assets";
|
|
64
69
|
```
|
|
65
70
|
|
|
66
71
|
If ActiveAdmin is installed, there will automatically be an 'Effective Assets' page.
|
|
67
72
|
|
|
73
|
+
## Create/Configure an S3 Bucket
|
|
74
|
+
|
|
75
|
+
You will need an AWS IAM user with sufficient priviledges and a properly configured S3 bucket to use with effective_assets
|
|
76
|
+
|
|
77
|
+
### Log into AWS Console
|
|
78
|
+
|
|
79
|
+
- Visit http://aws.amazon.com/console/
|
|
80
|
+
- Click My Account from top-right and sign in with your AWS account.
|
|
81
|
+
|
|
82
|
+
### Create an S3 Bucket
|
|
83
|
+
|
|
84
|
+
- Click Services -> S3 from the top-left menu
|
|
85
|
+
- Click Create Bucket
|
|
86
|
+
- Give the Bucket a name, and select the US Standard region
|
|
87
|
+
|
|
88
|
+
### Configure CORS Permissions
|
|
89
|
+
|
|
90
|
+
- From the S3 All Buckets Screen (as above)
|
|
91
|
+
|
|
92
|
+
- Select the desired bucket to configure and select 'Properties'
|
|
93
|
+
- Expand Permissions
|
|
94
|
+
- Click 'Edit CORS Configuration' and enter the following
|
|
95
|
+
|
|
96
|
+
```xml
|
|
97
|
+
<CORSConfiguration>
|
|
98
|
+
<CORSRule>
|
|
99
|
+
<AllowedOrigin>*</AllowedOrigin>
|
|
100
|
+
<AllowedMethod>POST</AllowedMethod>
|
|
101
|
+
<AllowedHeader>*</AllowedHeader>
|
|
102
|
+
</CORSRule>
|
|
103
|
+
<CORSRule>
|
|
104
|
+
<AllowedOrigin>*</AllowedOrigin>
|
|
105
|
+
<AllowedMethod>GET</AllowedMethod>
|
|
106
|
+
</CORSRule>
|
|
107
|
+
</CORSConfiguration>
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
- Click Save
|
|
111
|
+
|
|
112
|
+
The Bucket is now set up and ready to accept uploads, but we still need a user that has permission to access S3
|
|
113
|
+
|
|
114
|
+
### Create an IAM User and record its AWS Access Keys
|
|
115
|
+
|
|
116
|
+
- After logging in to your AWS console
|
|
117
|
+
|
|
118
|
+
- Click Services -> IAM from the top-left
|
|
119
|
+
|
|
120
|
+
- Select Users from the left-side menu
|
|
121
|
+
- Click Create New Users
|
|
122
|
+
- Create just one user with any name
|
|
123
|
+
|
|
124
|
+
- Expand the Show User Security Credentials
|
|
125
|
+
- This displays the AWS Access Key and Secret Access Key.
|
|
126
|
+
- (important) These are the two values you should copy into the effective_assets.rb initializer file
|
|
127
|
+
|
|
128
|
+
- Once the user is created, Click on the User and find the Permissions tab
|
|
129
|
+
- Select Permissions tab
|
|
130
|
+
- Click Attach User Policy
|
|
131
|
+
- Scroll down and Select 'Amazon S3 Full Access'
|
|
132
|
+
|
|
133
|
+
This user is now set up and ready to access the S3 Bucket previously created
|
|
134
|
+
|
|
135
|
+
### Add S3 Access Keys
|
|
136
|
+
|
|
137
|
+
Add the name of your S3 Bucket, Access Key and Secret Access Key to the config/initializers/effective_assets.rb file.
|
|
138
|
+
|
|
139
|
+
```ruby
|
|
140
|
+
config.aws_bucket = 'my-bucket'
|
|
141
|
+
config.aws_access_key_id = 'ABCDEFGHIJKLMNOP'
|
|
142
|
+
config.aws_secret_access_key = 'xmowueroewairo74pacja1/werjow'
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
You should now be able to upload to this bucket.
|
|
146
|
+
|
|
147
|
+
|
|
68
148
|
## Usage
|
|
69
149
|
|
|
70
150
|
### Model
|
|
71
151
|
|
|
72
|
-
|
|
152
|
+
Use the `acts_as_asset_box` mixin to define a set of 'boxes' all your assets are grouped into. A box is just a category, which can have any name.
|
|
73
153
|
|
|
74
|
-
If the box is declared
|
|
154
|
+
If the box is declared using a singular word, such as `:photo` it will be set up as a `has_one` asset. When defined as a plural, such as `:photos` it implies a `has_many` assets.
|
|
75
155
|
|
|
76
|
-
The following will create
|
|
156
|
+
The following will create 4 separate boxes of assets:
|
|
77
157
|
|
|
78
158
|
```ruby
|
|
79
159
|
class User
|
|
80
|
-
acts_as_asset_box :
|
|
160
|
+
acts_as_asset_box :avatar, :photos, :videos, :mp3s
|
|
81
161
|
end
|
|
82
162
|
```
|
|
83
163
|
|
|
84
|
-
Calling
|
|
164
|
+
Calling `user.avatar` will return a single `Effective::Asset`. Calling `user.photos` will return an array of `Effective::Assets`.
|
|
165
|
+
|
|
166
|
+
Then to get the URL of an asset:
|
|
167
|
+
|
|
168
|
+
```ruby
|
|
169
|
+
asset = user.avatar
|
|
170
|
+
=> an Effective::Asset
|
|
171
|
+
|
|
172
|
+
asset.url
|
|
173
|
+
=> "http://aws_bucket.s3.amazonaws.com/assets/1/my_avatar.png"
|
|
174
|
+
|
|
175
|
+
asset.url(:thumb) # See image versions (below)
|
|
176
|
+
=> "http://aws_bucket.s3.amazonaws.com/assets/1/thumb_my_avatar.png"
|
|
85
177
|
|
|
86
|
-
|
|
178
|
+
user.photos
|
|
179
|
+
=> [Effective::Asset<1>, Effective::Asset<2>] # An array of Effective::Asset objects
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### Validations
|
|
87
183
|
|
|
88
184
|
```ruby
|
|
89
185
|
class User
|
|
90
|
-
acts_as_asset_box :
|
|
186
|
+
acts_as_asset_box :avatar => true, :photos => false, :videos => 2, :mp3s => 5..10
|
|
91
187
|
end
|
|
92
188
|
```
|
|
93
189
|
|
|
94
|
-
|
|
190
|
+
true means presence, false means no validations applied.
|
|
191
|
+
|
|
192
|
+
The user in this example is only valid if exists an avatar, 2 videos, and 5..10 mp3s.
|
|
193
|
+
|
|
194
|
+
### Form Input
|
|
195
|
+
|
|
196
|
+
There is a standard rails form input:
|
|
197
|
+
|
|
198
|
+
```ruby
|
|
199
|
+
= form_for @user do |f|
|
|
200
|
+
= f.asset_box_input :pictures
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
A SimpleForm input:
|
|
204
|
+
|
|
205
|
+
```ruby
|
|
206
|
+
= simple_form_for @user do |f|
|
|
207
|
+
= f.input :pictures, :as => :asset_box
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
and a Formtastic input:
|
|
211
|
+
|
|
212
|
+
```ruby
|
|
213
|
+
= semantic_form_for @user do |f|
|
|
214
|
+
= f.input :pictures, :as => :asset_box
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
The `:as => :asset_box` will work interchangeably with SimpleForm or Formtastic, as long as only one of these gems is present in your application.
|
|
218
|
+
|
|
219
|
+
If you use both SimpleForm and Formtastic, you will need to call asset_box_input differently:
|
|
220
|
+
|
|
221
|
+
```ruby
|
|
222
|
+
= simple_form_for @user do |f|
|
|
223
|
+
= f.input :pictures, :as => :asset_box_simple_form
|
|
224
|
+
|
|
225
|
+
= semantic_form_for @user do |f|
|
|
226
|
+
= f.input :pictures, :as => :asset_box_formtastic
|
|
227
|
+
```
|
|
228
|
+
|
|
95
229
|
|
|
96
230
|
### Uploading & Attaching
|
|
97
231
|
|
|
98
|
-
Use the custom
|
|
232
|
+
Use the custom form input for uploading (direct to S3) and attaching assets to the `pictures` box.
|
|
99
233
|
|
|
100
234
|
```ruby
|
|
101
235
|
= f.input :pictures, :as => :asset_box, :uploader => true
|
|
102
|
-
|
|
103
|
-
= f.input :
|
|
236
|
+
|
|
237
|
+
= f.input :pictures, :as => :asset_box, :limit => 2, :file_types => [:jpg, :gif, :png]
|
|
238
|
+
|
|
239
|
+
= f.input :pictures, :as => :asset_box, :dialog => true, :dialog_url => '/admin/effective_assets' # Use the attach dialog
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
You may also upload secure (AWS: 'authenticated-read') assets with the same uploader
|
|
243
|
+
|
|
244
|
+
```ruby
|
|
245
|
+
= f.input :pictures, :as => :asset_box, :aws_acl => 'authenticated-read'
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
There is also a mechanism for collecting additional information from the upload form which will be set in the `asset.extra` field.
|
|
249
|
+
|
|
250
|
+
```ruby
|
|
251
|
+
= semantic_form_for Product.new do |f|
|
|
252
|
+
= f.input :photos, :as => :asset_box
|
|
253
|
+
= f.semantic_fields_for :photos do |pf|
|
|
254
|
+
= pf.input :field1, :as => :string
|
|
255
|
+
= pf.input :field2, :as => :boolean
|
|
104
256
|
```
|
|
105
257
|
|
|
258
|
+
Here the semantic_fields_for will create some inputs with name
|
|
259
|
+
|
|
260
|
+
```ruby
|
|
261
|
+
product[photos][field1]
|
|
262
|
+
product[photos][field2]
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
Any additional field like this will be passed to the Asset and populate the `extra` Hash attribute
|
|
266
|
+
|
|
106
267
|
Note: Passing :limit => 2 will have no effect on a singular asset_box, which by definition has a limit of 1.
|
|
107
268
|
|
|
108
|
-
We use the
|
|
269
|
+
We use the jQuery-File-Upload gem for direct-to-s3 uploading. The process is as follows:
|
|
109
270
|
|
|
110
|
-
- User sees the form and clicks Browse. Selects 1 or more files, then clicks Start Uploading
|
|
111
|
-
- The
|
|
112
|
-
- The file is uploaded directly to its 'final' resting place
|
|
113
|
-
- A
|
|
114
|
-
- An
|
|
115
|
-
- The DelayedJob task should be running and will handle any image resizing as defined by the AssetUploader
|
|
271
|
+
- User sees the form and clicks Browse. Selects 1 or more files, then clicks Start Uploading.
|
|
272
|
+
- The server makes a post to the S3UploadsController#create action to initialize an asset, and get a unique ID
|
|
273
|
+
- The file is uploaded directly to its 'final' resting place on S3 via Javascript uploader at `assets/:id/:filename`
|
|
274
|
+
- A PUT is then made back to the S3UploadsController#update which updates the `Effective::Asset` object and sets up a task in `DelayedJob` to process the asset (for image resizing)
|
|
275
|
+
- An `Effective::Attachment` is created, which joins the `Effective::Asset` to the parent Object (`User` in our example) in the appropriate position.
|
|
276
|
+
- The `DelayedJob` task should be running and will handle any image resizing as defined by the `AssetUploader`.
|
|
116
277
|
- The asset will appear in the form, and the user may click&drag the asset around to set the position.
|
|
117
278
|
|
|
118
|
-
### Authorization
|
|
119
279
|
|
|
120
|
-
|
|
280
|
+
### Strong Parameters
|
|
121
281
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
The authorization method can be defined as:
|
|
282
|
+
Make your controller aware of the acts_as_asset_box passed parameters:
|
|
125
283
|
|
|
126
284
|
```ruby
|
|
127
|
-
|
|
128
|
-
|
|
285
|
+
def permitted_params
|
|
286
|
+
params.require(:base_object).permit(EffectiveAssets.permitted_params)
|
|
129
287
|
end
|
|
130
288
|
```
|
|
131
289
|
|
|
132
|
-
|
|
290
|
+
The permitted parameters are:
|
|
133
291
|
|
|
134
292
|
```ruby
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
293
|
+
:attachments_attributes => [:id, :asset_id, :attachable_type, :attachable_id, :position, :box, :_destroy]
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
|
|
297
|
+
### Image Processing and Resizing
|
|
298
|
+
|
|
299
|
+
CarrierWave and DelayedJob are used by this gem to perform image versioning.
|
|
300
|
+
|
|
301
|
+
This will be moved over to the new ActiveJob API in future versions of this gem, but right now DelayedJob is the only supported background worker.
|
|
302
|
+
|
|
303
|
+
See the installer created at `app/uploaders/asset_uploader.rb` to configure image versions.
|
|
304
|
+
|
|
305
|
+
Use the `process :record_info => :thumb` directive to store image version dimensions and file sizes.
|
|
306
|
+
|
|
307
|
+
When this uploader file is changed, you must reprocess any existing `Effective::Asset` objects to recreate all image versions.
|
|
308
|
+
|
|
309
|
+
This one-liner downloads the original file from AWS S3, creates the image versions locally using imagemagick, then uploads each version to its final resting place back on AWS S3.
|
|
310
|
+
|
|
311
|
+
```ruby
|
|
312
|
+
Effective::Asset.find(123).reprocess!
|
|
313
|
+
=> true
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
This can be done in batch using the built in rake script (see below).
|
|
317
|
+
|
|
318
|
+
### Helpers
|
|
319
|
+
|
|
320
|
+
You can always get the URL directly
|
|
321
|
+
|
|
322
|
+
```ruby
|
|
323
|
+
current_user.avatar.url(:thumb)
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
To display the asset as a link with an image (if its an image, or a mime-type appropriate icon if its not an image):
|
|
327
|
+
|
|
328
|
+
```ruby
|
|
329
|
+
# Asset is the @user.fav_icon
|
|
330
|
+
# version is anything you set up in your uploaders/asset_uploader.rb as versions. :thumb
|
|
331
|
+
# Options are passed through to a call to rails image_tag helper
|
|
332
|
+
effective_asset_image_tag(asset, version = nil, options = {})
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
To display the asset as a link with no image:
|
|
336
|
+
|
|
337
|
+
```ruby
|
|
338
|
+
# Options are passed through to rails link_to helper
|
|
339
|
+
effective_asset_link_to(asset, version = nil, options = {})
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
## Authorization
|
|
343
|
+
|
|
344
|
+
All authorization checks are handled via the config.authorization_method found in the config/initializers/ file.
|
|
345
|
+
|
|
346
|
+
It is intended for flow through to CanCan or Pundit, but that is not required.
|
|
347
|
+
|
|
348
|
+
This method is called by all controller actions with the appropriate action and resource
|
|
349
|
+
|
|
350
|
+
Action will be one of [:index, :show, :new, :create, :edit, :update, :destroy]
|
|
351
|
+
|
|
352
|
+
Resource will the appropriate Effective::Something ActiveRecord object or class
|
|
353
|
+
|
|
354
|
+
The authorization method is defined in the initializer file:
|
|
355
|
+
|
|
356
|
+
```ruby
|
|
357
|
+
# As a Proc (with CanCan)
|
|
358
|
+
config.authorization_method = Proc.new { |controller, action, resource| authorize!(action, resource) }
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
```ruby
|
|
362
|
+
# As a Custom Method
|
|
363
|
+
config.authorization_method = :my_authorization_method
|
|
138
364
|
```
|
|
139
365
|
|
|
140
366
|
and then in your application_controller.rb:
|
|
141
367
|
|
|
142
368
|
```ruby
|
|
143
|
-
def
|
|
144
|
-
|
|
369
|
+
def my_authorization_method(action, resource)
|
|
370
|
+
current_user.is?(:admin) || EffectivePunditPolicy.new(current_user, resource).send('#{action}?')
|
|
145
371
|
end
|
|
146
372
|
```
|
|
147
373
|
|
|
148
|
-
|
|
149
|
-
The resource will generally be the @asset, but in the case of :manage, it is Effective::Asset class.
|
|
374
|
+
or disabled entirely:
|
|
150
375
|
|
|
151
|
-
|
|
376
|
+
```ruby
|
|
377
|
+
config.authorization_method = false
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
If the method or proc returns false (user is not authorized) an Effective::AccessDenied exception will be raised
|
|
152
381
|
|
|
153
|
-
You can rescue from this exception by adding the following to your application_controller.rb
|
|
382
|
+
You can rescue from this exception by adding the following to your application_controller.rb:
|
|
154
383
|
|
|
155
384
|
```ruby
|
|
156
|
-
rescue_from
|
|
385
|
+
rescue_from Effective::AccessDenied do |exception|
|
|
157
386
|
respond_to do |format|
|
|
158
387
|
format.html { render 'static_pages/access_denied', :status => 403 }
|
|
159
388
|
format.any { render :text => 'Access Denied', :status => 403 }
|
|
@@ -161,50 +390,76 @@ rescue_from ActiveResource::UnauthorizedAccess do |exception|
|
|
|
161
390
|
end
|
|
162
391
|
```
|
|
163
392
|
|
|
164
|
-
###
|
|
393
|
+
### Permissions
|
|
394
|
+
|
|
395
|
+
To allow user uploads, using Cancan:
|
|
165
396
|
|
|
166
|
-
|
|
167
|
-
|
|
397
|
+
```ruby
|
|
398
|
+
can [:create, :update, :destroy], Effective::Asset, :user_id => user.id
|
|
399
|
+
```
|
|
168
400
|
|
|
169
|
-
Some additional processing goes on to record final image dimensions and file sizes.
|
|
170
401
|
|
|
402
|
+
## Rake Tasks
|
|
171
403
|
|
|
172
|
-
|
|
404
|
+
Use the following rake tasks to aid in batch processing a large number of (generally image) files.
|
|
173
405
|
|
|
174
|
-
|
|
406
|
+
### Reprocess
|
|
407
|
+
|
|
408
|
+
If the `app/uploaders/asset_uploader.rb` file is changed, run the following rake task to reprocess all `Effective::Asset` objects and thereby recreate all image versions
|
|
175
409
|
|
|
176
410
|
```ruby
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
411
|
+
rake effective_assets:reprocess # All assets
|
|
412
|
+
rake effective_assets:reprocess[200] # reprocess #200 and up
|
|
413
|
+
rake effective_assets:reprocess[1,200] # reprocess #1..#200
|
|
180
414
|
```
|
|
181
415
|
|
|
182
|
-
|
|
416
|
+
This command enqueues a `.reprocess!` job for each `Effective::Asset` on the `DelayedJob` queue.
|
|
417
|
+
|
|
418
|
+
If a `DelayedJob` worker process is already running, the reprocessing will begin immediately, otherwise start one with
|
|
183
419
|
|
|
184
420
|
```ruby
|
|
185
|
-
|
|
186
|
-
# version is anything you set up in your uploaders/asset_uploader.rb as versions. :thumb
|
|
187
|
-
# Options are passed through to a call to rails image_tag helper
|
|
188
|
-
effective_asset_image_tag(asset, version = nil, options = {})
|
|
421
|
+
rake jobs:work
|
|
189
422
|
```
|
|
190
423
|
|
|
191
|
-
|
|
424
|
+
### Check
|
|
425
|
+
|
|
426
|
+
Checks every `Effective::Asset` and all its versions for a working URL (200 http status code).
|
|
427
|
+
|
|
428
|
+
Any non-200 http responses are logged as an error.
|
|
429
|
+
|
|
430
|
+
This is a sanity-check task, that makes sure every url for every asset and version is going to work.
|
|
431
|
+
|
|
432
|
+
This is just single-threaded one process.
|
|
433
|
+
|
|
434
|
+
If you need to check a large number of urls, use multiple rake tasks and pass in ID ranges. Sorry.
|
|
192
435
|
|
|
193
436
|
```ruby
|
|
194
|
-
#
|
|
195
|
-
|
|
437
|
+
rake effective_assets:check # check that every version of every Effective::Asset is a valid http 200 OK url
|
|
438
|
+
rake effective_assets:check[200] # check #200 and up
|
|
439
|
+
rake effective_assets:check[1,200] # check #1..#200
|
|
440
|
+
rake effective:assets:check[1,200,:thumb] # check #1..#200 only :thumb versions
|
|
196
441
|
```
|
|
197
442
|
|
|
198
|
-
###
|
|
443
|
+
### Clear
|
|
444
|
+
|
|
445
|
+
Deletes all effective_assets related jobs on the DelayedJob queue.
|
|
199
446
|
|
|
200
|
-
|
|
447
|
+
```ruby
|
|
448
|
+
rake effective_assets:clear
|
|
449
|
+
```
|
|
201
450
|
|
|
451
|
+
or to clear all jobs, even non-effective_assets related jobs, use DelayedJob's rake task:
|
|
452
|
+
|
|
453
|
+
```ruby
|
|
454
|
+
rake jobs:clear
|
|
455
|
+
```
|
|
202
456
|
|
|
203
457
|
## License
|
|
204
458
|
|
|
205
|
-
MIT License. Copyright Code and Effect Inc.
|
|
459
|
+
MIT License. Copyright [Code and Effect Inc.](http://www.codeandeffect.com/)
|
|
460
|
+
|
|
461
|
+
Code and Effect is the product arm of [AgileStyle](http://www.agilestyle.com/), an Edmonton-based shop that specializes in building custom web applications with Ruby on Rails.
|
|
206
462
|
|
|
207
|
-
You are not granted rights or licenses to the trademarks of Code and Effect
|
|
208
463
|
|
|
209
464
|
## Credits
|
|
210
465
|
|
|
@@ -214,15 +469,29 @@ CarrierWave (https://github.com/carrierwaveuploader/carrierwave)
|
|
|
214
469
|
|
|
215
470
|
DelayedJob (https://github.com/collectiveidea/delayed_job)
|
|
216
471
|
|
|
217
|
-
|
|
472
|
+
jQuery-File-Upload (https://github.com/blueimp/jQuery-File-Upload)
|
|
473
|
+
|
|
218
474
|
|
|
475
|
+
## Testing
|
|
219
476
|
|
|
220
|
-
|
|
477
|
+
Testing uses the Combustion gem, for easier Rails Engine Testing.
|
|
221
478
|
|
|
222
|
-
|
|
479
|
+
https://github.com/pat/combustion
|
|
223
480
|
|
|
224
|
-
|
|
481
|
+
You will need a valid initializer in spec/internal/config/initializers/effective_assets.rb
|
|
482
|
+
|
|
483
|
+
Run tests by
|
|
225
484
|
|
|
226
485
|
```ruby
|
|
227
|
-
|
|
486
|
+
bundle exec guard
|
|
228
487
|
```
|
|
488
|
+
|
|
489
|
+
## Contributing
|
|
490
|
+
|
|
491
|
+
1. Fork it
|
|
492
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
|
493
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
|
494
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
|
495
|
+
5. Bonus points for test coverage
|
|
496
|
+
6. Create new Pull Request
|
|
497
|
+
|