administrate-field-active_storage 0.3.0 → 0.3.1
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 +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
|