administrate-field-active_storage 0.3.0 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +51 -19
- data/administrate-field-active_storage.gemspec +1 -1
- data/app/views/fields/active_storage/_form.html.erb +1 -1
- data/app/views/fields/active_storage/_item.html.erb +5 -7
- data/example-project/app/controllers/admin/users_controller.rb +6 -0
- data/example-project/app/controllers/users_controller.rb +4 -4
- data/example-project/app/dashboards/user_dashboard.rb +3 -1
- data/example-project/config/routes.rb +3 -2
- data/lib/administrate/field/active_storage.rb +15 -19
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1ea48021b9c4480f394cc61655e5e0a51c8ee6f9723f97902902642668a9ea88
|
4
|
+
data.tar.gz: b9691a2f4b65e00a559dbd5ec52e73b1bac589e98403a6f135fdcd0f09953bff
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c5409c4400e684e023b287144b7415f51a77d6800df33c17eeb6f805de5381900e1d4947413e3d64939e85fd2009c8ff6ebeecbcde864017fc2c99f11c668650
|
7
|
+
data.tar.gz: cf96c0b3b886a87fbe4774c2b2e3658d56c64375b34eebcb1d2ff3240dafb9ccf0a96debab40b3ce675b7869b6dd5cc6d0cc114f11368bcea27da35f5e8e3c23
|
data/README.md
CHANGED
@@ -63,38 +63,70 @@ I know it is not ideal, if you have a workaround please submit a PR.
|
|
63
63
|
In order to prevent N+1 queries from active storage you have to modify your admin model controller, below an example for a model called `User` and with attached avatars
|
64
64
|
```ruby
|
65
65
|
module Admin
|
66
|
-
class UsersController <
|
66
|
+
class UsersController < ApplicationController
|
67
67
|
def scoped_resource
|
68
68
|
resource_class.with_attached_avatars
|
69
69
|
end
|
70
70
|
end
|
71
71
|
end
|
72
|
-
|
73
72
|
```
|
74
73
|
|
75
74
|
### Removing/Deleting an Attachment
|
76
|
-
In order to allow the user to delete an attachment using the admin dashboard you need to do the following:
|
77
|
-
1. create a controller action with a `delete` route
|
78
|
-
2. point the `Field::ActiveStorage` field to that route
|
79
75
|
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
76
|
+
`Administrate::Field::ActiveStorage` expects the presence of a route
|
77
|
+
DELETE `/<namespace>/<resource>/:id/:attachment_name`, which will receive an optional parameter
|
78
|
+
`attachment_id` in the case of an `ActiveStorage::Attached::Many`. For instance:
|
79
|
+
|
80
|
+
```rb
|
81
|
+
# routes.rb
|
82
|
+
...
|
83
|
+
namespace :admin do
|
84
|
+
...
|
85
|
+
resources :users do
|
86
|
+
delete :avatars, on: :member, action: :destroy_avatar
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
# app/controllers/admin/users_controller.rb
|
91
|
+
module Admin
|
92
|
+
class UsersController < ApplicationController
|
93
|
+
|
94
|
+
# For illustrative purposes only.
|
95
|
+
#
|
96
|
+
# **SECURITY NOTICE**: first verify whether current user is authorized to perform the action.
|
97
|
+
def destroy_avatar
|
98
|
+
avatar = requested_resource.avatars.find(params[:attachment_id])
|
99
|
+
avatar.purge
|
100
|
+
redirect_back(fallback_location: requested_resource)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
87
104
|
```
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
105
|
+
|
106
|
+
This route can be customized with `destroy_url`. The option expects a `proc` receiving 3 arguments:
|
107
|
+
the Administrate `namespace`, the `resource`, and the `attachment`. The proc can return anything
|
108
|
+
accepted by `link_to`:
|
109
|
+
|
110
|
+
```rb
|
111
|
+
# routes.rb
|
112
|
+
delete :custom_user_avatar_destroy, to: 'users#destroy_avatar'
|
113
|
+
|
114
|
+
# user_dashboard.rb
|
115
|
+
class UserDashboard < Administrate::BaseDashboard
|
116
|
+
ATTRIBUTE_TYPES = {
|
117
|
+
avatars: Field::ActiveStorage.with_options(
|
118
|
+
destroy_url: proc do |namespace, resource, attachment|
|
119
|
+
[:custom_user_avatar_destroy, { attachment_id: attachment.id }]
|
120
|
+
end
|
121
|
+
),
|
122
|
+
# ...
|
95
123
|
end
|
124
|
+
# ...
|
125
|
+
end
|
96
126
|
```
|
97
127
|
|
128
|
+
To disable this feature, set `destroy_url` to `nil`.
|
129
|
+
|
98
130
|
## Options
|
99
131
|
|
100
132
|
Various options can be passed to `Administrate::Field::ActiveStorage#with_options`
|
@@ -2,7 +2,7 @@ $:.push File.expand_path("../lib", __FILE__)
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |gem|
|
4
4
|
gem.name = "administrate-field-active_storage"
|
5
|
-
gem.version = "0.3.
|
5
|
+
gem.version = "0.3.1"
|
6
6
|
gem.authors = ["Hamad AlGhanim"]
|
7
7
|
gem.email = ["hamadyalghanim@gmail.com"]
|
8
8
|
gem.homepage = "https://github.com/Dreamersoul/administrate-field-active_storage"
|
@@ -21,7 +21,7 @@ By default, the input is a text field for the image's URL.
|
|
21
21
|
|
22
22
|
<div class="field-unit__field">
|
23
23
|
<% if field.attached? %>
|
24
|
-
<%= render partial: 'fields/active_storage/items', locals: { field: field
|
24
|
+
<%= render partial: 'fields/active_storage/items', locals: { field: field } %>
|
25
25
|
<% end %>
|
26
26
|
|
27
27
|
<div>
|
@@ -24,11 +24,6 @@ controlled via a boolean local variable.
|
|
24
24
|
Maximum size of the ActiveStorage preview.
|
25
25
|
%>
|
26
26
|
|
27
|
-
<%
|
28
|
-
# By default we don't allow attachment removal
|
29
|
-
removable = local_assigns.fetch(:removable, false)
|
30
|
-
%>
|
31
|
-
|
32
27
|
<div>
|
33
28
|
<%= render partial: 'fields/active_storage/preview', locals: local_assigns %>
|
34
29
|
</div>
|
@@ -37,7 +32,10 @@ controlled via a boolean local variable.
|
|
37
32
|
<%= link_to 'Download', field.blob_url(attachment), title: attachment.filename %>
|
38
33
|
</div>
|
39
34
|
|
40
|
-
<% if
|
41
|
-
|
35
|
+
<% if field.destroy_url.present? %>
|
36
|
+
<% destroy_url = field.destroy_url.call(namespace, field.data.record, attachment) %>
|
37
|
+
<div>
|
38
|
+
<%= link_to 'Remove', destroy_url, method: :delete, class: 'remove-attachment-link' %>
|
39
|
+
</div>
|
42
40
|
<hr>
|
43
41
|
<% end %>
|
@@ -17,5 +17,11 @@ module Admin
|
|
17
17
|
|
18
18
|
# See https://administrate-prototype.herokuapp.com/customizing_controller_actions
|
19
19
|
# for more information
|
20
|
+
|
21
|
+
def destroy_avatar
|
22
|
+
avatar = requested_resource.avatars.find(params[:attachment_id])
|
23
|
+
avatar.purge
|
24
|
+
redirect_back(fallback_location: requested_resource)
|
25
|
+
end
|
20
26
|
end
|
21
27
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
class UsersController < ApplicationController
|
2
|
-
def
|
3
|
-
|
4
|
-
|
5
|
-
redirect_back(fallback_location:
|
2
|
+
def destroy_avatar
|
3
|
+
avatar = requested_resource.avatars.find(params[:attachment_id])
|
4
|
+
avatar.purge
|
5
|
+
redirect_back(fallback_location: requested_resource)
|
6
6
|
end
|
7
7
|
end
|
@@ -10,7 +10,9 @@ class UserDashboard < Administrate::BaseDashboard
|
|
10
10
|
ATTRIBUTE_TYPES = {
|
11
11
|
id: Field::Number,
|
12
12
|
name: Field::String,
|
13
|
-
avatars: Field::ActiveStorage.with_options(
|
13
|
+
avatars: Field::ActiveStorage.with_options(
|
14
|
+
show_in_index: true
|
15
|
+
),
|
14
16
|
created_at: Field::DateTime,
|
15
17
|
updated_at: Field::DateTime
|
16
18
|
}.freeze
|
@@ -1,9 +1,10 @@
|
|
1
1
|
Rails.application.routes.draw do
|
2
2
|
namespace :admin do
|
3
|
-
resources :users
|
3
|
+
resources :users do
|
4
|
+
delete :avatar, on: :member, action: :destroy_avatar
|
5
|
+
end
|
4
6
|
|
5
7
|
root to: "users#index"
|
6
8
|
end
|
7
|
-
delete "custom_active_record_remove", to: 'users#remove_avatar'
|
8
9
|
# For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
|
9
10
|
end
|
@@ -7,10 +7,6 @@ module Administrate
|
|
7
7
|
class Engine < ::Rails::Engine
|
8
8
|
end
|
9
9
|
|
10
|
-
def destroyable?
|
11
|
-
options.key?(:destroy_path)
|
12
|
-
end
|
13
|
-
|
14
10
|
def index_display_preview?
|
15
11
|
options.fetch(:index_display_preview, true)
|
16
12
|
end
|
@@ -20,7 +16,7 @@ module Administrate
|
|
20
16
|
end
|
21
17
|
|
22
18
|
def index_display_count?
|
23
|
-
options.fetch(:index_display_count) { attachments.count != 1 }
|
19
|
+
options.fetch(:index_display_count) { attachments.present? && attachments.count != 1 }
|
24
20
|
end
|
25
21
|
|
26
22
|
def show_display_preview?
|
@@ -32,17 +28,22 @@ module Administrate
|
|
32
28
|
end
|
33
29
|
|
34
30
|
def many?
|
35
|
-
|
36
|
-
data.class.name == 'ActiveStorage::Attached::Many'
|
31
|
+
data.is_a? ::ActiveStorage::Attached::Many
|
37
32
|
end
|
38
33
|
|
39
34
|
def direct?
|
40
35
|
options.fetch(:direct_upload, false)
|
41
36
|
end
|
42
37
|
|
43
|
-
|
44
|
-
|
45
|
-
|
38
|
+
def destroy_url
|
39
|
+
options.fetch(:destroy_url) do
|
40
|
+
proc do |namespace, record, attachment|
|
41
|
+
options = [attachment.name, namespace, record]
|
42
|
+
options << { attachment_id: attachment.id } if many?
|
43
|
+
options
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
46
47
|
|
47
48
|
# currently we are using Rails.application.routes.url_helpers
|
48
49
|
# without including the namespace because it runs into an
|
@@ -66,22 +67,17 @@ module Administrate
|
|
66
67
|
Rails.application.routes.url_helpers.rails_blob_path(attachment, disposition: :attachment, only_path: true)
|
67
68
|
end
|
68
69
|
|
69
|
-
def destroy_path(field, attachment)
|
70
|
-
destroy_path_helper = options.fetch(:destroy_path)
|
71
|
-
record_id = field.data.record.id
|
72
|
-
attachment_id = attachment.id
|
73
|
-
Rails.application.routes.url_helpers.send(destroy_path_helper, {:record_id => record_id, :attachment_id => attachment_id})
|
74
|
-
end
|
75
|
-
|
76
70
|
def can_add_attachment?
|
77
|
-
many? || attachments.
|
71
|
+
many? || attachments.blank?
|
78
72
|
end
|
79
73
|
|
80
74
|
def attached?
|
81
75
|
data.present? && data.attached?
|
82
76
|
end
|
83
77
|
|
84
|
-
|
78
|
+
def attachments
|
79
|
+
data.attachments if attached?
|
80
|
+
end
|
85
81
|
end
|
86
82
|
end
|
87
83
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: administrate-field-active_storage
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hamad AlGhanim
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-04-
|
11
|
+
date: 2020-04-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: administrate
|