auxiliary_rails_resourceable 0.1.1 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0cccc3798217d2f3f64d9250d46a5797ca20e4d7aba351d36d6c9ae938d0ce22
4
- data.tar.gz: f014a530c24a038df4b312336c81e3beb5e510eebc6dc6449d43c6cc2080ea46
3
+ metadata.gz: d8d19ba11faccf09d47f2df8c55b249c48a6ce291a09ed45ecc9d36de834dbfd
4
+ data.tar.gz: 33e6e59fde4636de8d9d395b208ed749873b052492c72df960990e8e334c56eb
5
5
  SHA512:
6
- metadata.gz: 312ac5eaea723c5ddce906ebe9e50d0a8cbd7572b007f4798ec2178d5fc831ab39e6acbff4d85fd0a616b6574c6c03b593e2e8371cf635492a26992eceb2aab2
7
- data.tar.gz: 76ad31ecd517a89bab159b0c1e672cf9ff2fc3e08669399f4074808624de8519904d4de54ca5c66d18e53d5e15df2b7944c7ad9b8cb129e7b80658788c139f20
6
+ metadata.gz: c76b62f038c4198b68d95e455c2ec1c12f0b745db8c2a3d843ea1b3e2626fba5ef42bfe392810c439198493e04c517f0174095875e6610233eb16736309ef2a7
7
+ data.tar.gz: 0aefc87965e91522e19b67eab0f1bff779093dfc4aedbd9b322a6d53d5ef203d45fa4bba06b8ebd212c8c14d0ccfb4ef10f22057868f7336dbd7eb1888136a73
data/.rubocop.yml CHANGED
@@ -40,3 +40,8 @@ Style/IfUnlessModifier:
40
40
 
41
41
  Style/EmptyMethod:
42
42
  EnforcedStyle: expanded
43
+
44
+ Style/Documentation:
45
+ Exclude:
46
+ - lib/auxiliary_rails/view_helpers/human_name_helper.rb
47
+ - lib/auxiliary_rails_resourceable/railtie.rb
data/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.1.3] - 2022-08-17
4
+
5
+ - Set minimal version for gem dependencies
6
+
7
+ ## [0.1.2] - 2022-08-17
8
+
9
+ - Added `human_name` and `human_name_plural` helpers
10
+ - Share views between modules via `resourceable` directory
11
+ - Respond format.json instead of redirects
12
+
3
13
  ## [0.1.1] - 2022-08-27
4
14
 
5
15
  ## [0.1.0] - 2022-08-20
data/Gemfile.lock CHANGED
@@ -1,164 +1,188 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- auxiliary_rails_resourceable (0.1.1)
5
- pagy
6
- pundit
4
+ auxiliary_rails_resourceable (0.1.3)
5
+ pagy (>= 6.0.4)
6
+ pundit (>= 2.2)
7
7
  rails (>= 5.2)
8
- ransack
8
+ ransack (>= 3.0.0)
9
9
 
10
10
  GEM
11
11
  remote: https://rubygems.org/
12
12
  specs:
13
- actioncable (7.0.3.1)
14
- actionpack (= 7.0.3.1)
15
- activesupport (= 7.0.3.1)
13
+ actioncable (7.2.0)
14
+ actionpack (= 7.2.0)
15
+ activesupport (= 7.2.0)
16
16
  nio4r (~> 2.0)
17
17
  websocket-driver (>= 0.6.1)
18
- actionmailbox (7.0.3.1)
19
- actionpack (= 7.0.3.1)
20
- activejob (= 7.0.3.1)
21
- activerecord (= 7.0.3.1)
22
- activestorage (= 7.0.3.1)
23
- activesupport (= 7.0.3.1)
24
- mail (>= 2.7.1)
25
- net-imap
26
- net-pop
27
- net-smtp
28
- actionmailer (7.0.3.1)
29
- actionpack (= 7.0.3.1)
30
- actionview (= 7.0.3.1)
31
- activejob (= 7.0.3.1)
32
- activesupport (= 7.0.3.1)
33
- mail (~> 2.5, >= 2.5.4)
34
- net-imap
35
- net-pop
36
- net-smtp
37
- rails-dom-testing (~> 2.0)
38
- actionpack (7.0.3.1)
39
- actionview (= 7.0.3.1)
40
- activesupport (= 7.0.3.1)
41
- rack (~> 2.0, >= 2.2.0)
18
+ zeitwerk (~> 2.6)
19
+ actionmailbox (7.2.0)
20
+ actionpack (= 7.2.0)
21
+ activejob (= 7.2.0)
22
+ activerecord (= 7.2.0)
23
+ activestorage (= 7.2.0)
24
+ activesupport (= 7.2.0)
25
+ mail (>= 2.8.0)
26
+ actionmailer (7.2.0)
27
+ actionpack (= 7.2.0)
28
+ actionview (= 7.2.0)
29
+ activejob (= 7.2.0)
30
+ activesupport (= 7.2.0)
31
+ mail (>= 2.8.0)
32
+ rails-dom-testing (~> 2.2)
33
+ actionpack (7.2.0)
34
+ actionview (= 7.2.0)
35
+ activesupport (= 7.2.0)
36
+ nokogiri (>= 1.8.5)
37
+ racc
38
+ rack (>= 2.2.4, < 3.2)
39
+ rack-session (>= 1.0.1)
42
40
  rack-test (>= 0.6.3)
43
- rails-dom-testing (~> 2.0)
44
- rails-html-sanitizer (~> 1.0, >= 1.2.0)
45
- actiontext (7.0.3.1)
46
- actionpack (= 7.0.3.1)
47
- activerecord (= 7.0.3.1)
48
- activestorage (= 7.0.3.1)
49
- activesupport (= 7.0.3.1)
41
+ rails-dom-testing (~> 2.2)
42
+ rails-html-sanitizer (~> 1.6)
43
+ useragent (~> 0.16)
44
+ actiontext (7.2.0)
45
+ actionpack (= 7.2.0)
46
+ activerecord (= 7.2.0)
47
+ activestorage (= 7.2.0)
48
+ activesupport (= 7.2.0)
50
49
  globalid (>= 0.6.0)
51
50
  nokogiri (>= 1.8.5)
52
- actionview (7.0.3.1)
53
- activesupport (= 7.0.3.1)
51
+ actionview (7.2.0)
52
+ activesupport (= 7.2.0)
54
53
  builder (~> 3.1)
55
- erubi (~> 1.4)
56
- rails-dom-testing (~> 2.0)
57
- rails-html-sanitizer (~> 1.1, >= 1.2.0)
58
- activejob (7.0.3.1)
59
- activesupport (= 7.0.3.1)
54
+ erubi (~> 1.11)
55
+ rails-dom-testing (~> 2.2)
56
+ rails-html-sanitizer (~> 1.6)
57
+ activejob (7.2.0)
58
+ activesupport (= 7.2.0)
60
59
  globalid (>= 0.3.6)
61
- activemodel (7.0.3.1)
62
- activesupport (= 7.0.3.1)
63
- activerecord (7.0.3.1)
64
- activemodel (= 7.0.3.1)
65
- activesupport (= 7.0.3.1)
66
- activestorage (7.0.3.1)
67
- actionpack (= 7.0.3.1)
68
- activejob (= 7.0.3.1)
69
- activerecord (= 7.0.3.1)
70
- activesupport (= 7.0.3.1)
60
+ activemodel (7.2.0)
61
+ activesupport (= 7.2.0)
62
+ activerecord (7.2.0)
63
+ activemodel (= 7.2.0)
64
+ activesupport (= 7.2.0)
65
+ timeout (>= 0.4.0)
66
+ activestorage (7.2.0)
67
+ actionpack (= 7.2.0)
68
+ activejob (= 7.2.0)
69
+ activerecord (= 7.2.0)
70
+ activesupport (= 7.2.0)
71
71
  marcel (~> 1.0)
72
- mini_mime (>= 1.1.0)
73
- activesupport (7.0.3.1)
74
- concurrent-ruby (~> 1.0, >= 1.0.2)
72
+ activesupport (7.2.0)
73
+ base64
74
+ bigdecimal
75
+ concurrent-ruby (~> 1.0, >= 1.3.1)
76
+ connection_pool (>= 2.2.5)
77
+ drb
75
78
  i18n (>= 1.6, < 2)
79
+ logger (>= 1.4.2)
76
80
  minitest (>= 5.1)
77
- tzinfo (~> 2.0)
81
+ securerandom (>= 0.3)
82
+ tzinfo (~> 2.0, >= 2.0.5)
78
83
  ast (2.4.2)
79
- builder (3.2.4)
80
- concurrent-ruby (1.1.10)
84
+ base64 (0.2.0)
85
+ bigdecimal (3.1.8)
86
+ builder (3.3.0)
87
+ concurrent-ruby (1.3.4)
88
+ connection_pool (2.4.1)
81
89
  crass (1.0.6)
90
+ date (3.3.4)
82
91
  diff-lcs (1.5.0)
83
- digest (3.1.0)
84
- erubi (1.11.0)
85
- globalid (1.0.0)
86
- activesupport (>= 5.0)
87
- i18n (1.12.0)
92
+ drb (2.2.1)
93
+ erubi (1.13.0)
94
+ globalid (1.2.1)
95
+ activesupport (>= 6.1)
96
+ i18n (1.14.5)
88
97
  concurrent-ruby (~> 1.0)
98
+ io-console (0.7.2)
99
+ irb (1.14.0)
100
+ rdoc (>= 4.0.0)
101
+ reline (>= 0.4.2)
89
102
  json (2.6.2)
90
- loofah (2.18.0)
103
+ logger (1.6.0)
104
+ loofah (2.22.0)
91
105
  crass (~> 1.0.2)
92
- nokogiri (>= 1.5.9)
93
- mail (2.7.1)
106
+ nokogiri (>= 1.12.0)
107
+ mail (2.8.1)
94
108
  mini_mime (>= 0.1.1)
95
- marcel (1.0.2)
96
- method_source (1.0.0)
97
- mini_mime (1.1.2)
98
- mini_portile2 (2.8.0)
99
- minitest (5.16.3)
100
- net-imap (0.2.3)
101
- digest
109
+ net-imap
110
+ net-pop
111
+ net-smtp
112
+ marcel (1.0.4)
113
+ mini_mime (1.1.5)
114
+ mini_portile2 (2.8.7)
115
+ minitest (5.25.1)
116
+ net-imap (0.4.14)
117
+ date
102
118
  net-protocol
103
- strscan
104
- net-pop (0.1.1)
105
- digest
119
+ net-pop (0.1.2)
106
120
  net-protocol
121
+ net-protocol (0.2.2)
107
122
  timeout
108
- net-protocol (0.1.3)
109
- timeout
110
- net-smtp (0.3.1)
111
- digest
123
+ net-smtp (0.5.0)
112
124
  net-protocol
113
- timeout
114
- nio4r (2.5.8)
115
- nokogiri (1.13.8)
116
- mini_portile2 (~> 2.8.0)
125
+ nio4r (2.7.3)
126
+ nokogiri (1.16.7)
127
+ mini_portile2 (~> 2.8.2)
117
128
  racc (~> 1.4)
118
- pagy (5.10.1)
119
- activesupport
129
+ pagy (9.0.5)
120
130
  parallel (1.22.1)
121
131
  parser (3.1.2.1)
122
132
  ast (~> 2.4.1)
123
- pundit (2.2.0)
133
+ psych (5.1.2)
134
+ stringio
135
+ pundit (2.3.2)
124
136
  activesupport (>= 3.0.0)
125
- racc (1.6.0)
126
- rack (2.2.4)
127
- rack-test (2.0.2)
137
+ racc (1.8.1)
138
+ rack (3.1.7)
139
+ rack-session (2.0.0)
140
+ rack (>= 3.0.0)
141
+ rack-test (2.1.0)
128
142
  rack (>= 1.3)
129
- rails (7.0.3.1)
130
- actioncable (= 7.0.3.1)
131
- actionmailbox (= 7.0.3.1)
132
- actionmailer (= 7.0.3.1)
133
- actionpack (= 7.0.3.1)
134
- actiontext (= 7.0.3.1)
135
- actionview (= 7.0.3.1)
136
- activejob (= 7.0.3.1)
137
- activemodel (= 7.0.3.1)
138
- activerecord (= 7.0.3.1)
139
- activestorage (= 7.0.3.1)
140
- activesupport (= 7.0.3.1)
143
+ rackup (2.1.0)
144
+ rack (>= 3)
145
+ webrick (~> 1.8)
146
+ rails (7.2.0)
147
+ actioncable (= 7.2.0)
148
+ actionmailbox (= 7.2.0)
149
+ actionmailer (= 7.2.0)
150
+ actionpack (= 7.2.0)
151
+ actiontext (= 7.2.0)
152
+ actionview (= 7.2.0)
153
+ activejob (= 7.2.0)
154
+ activemodel (= 7.2.0)
155
+ activerecord (= 7.2.0)
156
+ activestorage (= 7.2.0)
157
+ activesupport (= 7.2.0)
141
158
  bundler (>= 1.15.0)
142
- railties (= 7.0.3.1)
143
- rails-dom-testing (2.0.3)
144
- activesupport (>= 4.2.0)
159
+ railties (= 7.2.0)
160
+ rails-dom-testing (2.2.0)
161
+ activesupport (>= 5.0.0)
162
+ minitest
145
163
  nokogiri (>= 1.6)
146
- rails-html-sanitizer (1.4.3)
147
- loofah (~> 2.3)
148
- railties (7.0.3.1)
149
- actionpack (= 7.0.3.1)
150
- activesupport (= 7.0.3.1)
151
- method_source
164
+ rails-html-sanitizer (1.6.0)
165
+ loofah (~> 2.21)
166
+ nokogiri (~> 1.14)
167
+ railties (7.2.0)
168
+ actionpack (= 7.2.0)
169
+ activesupport (= 7.2.0)
170
+ irb (~> 1.13)
171
+ rackup (>= 1.0.0)
152
172
  rake (>= 12.2)
153
- thor (~> 1.0)
154
- zeitwerk (~> 2.5)
173
+ thor (~> 1.0, >= 1.2.2)
174
+ zeitwerk (~> 2.6)
155
175
  rainbow (3.1.1)
156
176
  rake (13.0.6)
157
- ransack (3.2.1)
177
+ ransack (4.2.1)
158
178
  activerecord (>= 6.1.5)
159
179
  activesupport (>= 6.1.5)
160
180
  i18n
181
+ rdoc (6.7.0)
182
+ psych (>= 4.0.0)
161
183
  regexp_parser (2.5.0)
184
+ reline (0.5.9)
185
+ io-console (~> 0.5)
162
186
  rexml (3.2.5)
163
187
  rspec (3.11.0)
164
188
  rspec-core (~> 3.11.0)
@@ -193,16 +217,19 @@ GEM
193
217
  rubocop-rspec (2.12.1)
194
218
  rubocop (~> 1.31)
195
219
  ruby-progressbar (1.11.0)
196
- strscan (3.0.4)
197
- thor (1.2.1)
198
- timeout (0.3.0)
199
- tzinfo (2.0.5)
220
+ securerandom (0.3.1)
221
+ stringio (3.1.1)
222
+ thor (1.3.1)
223
+ timeout (0.4.1)
224
+ tzinfo (2.0.6)
200
225
  concurrent-ruby (~> 1.0)
201
226
  unicode-display_width (2.2.0)
202
- websocket-driver (0.7.5)
227
+ useragent (0.16.10)
228
+ webrick (1.8.1)
229
+ websocket-driver (0.7.6)
203
230
  websocket-extensions (>= 0.1.0)
204
231
  websocket-extensions (0.1.5)
205
- zeitwerk (2.6.0)
232
+ zeitwerk (2.6.17)
206
233
 
207
234
  PLATFORMS
208
235
  ruby
@@ -217,4 +244,4 @@ DEPENDENCIES
217
244
  rubocop-rspec
218
245
 
219
246
  BUNDLED WITH
220
- 2.1.2
247
+ 2.5.17
data/README.md CHANGED
@@ -1,25 +1,51 @@
1
- # AuxiliaryRailsResourceable
1
+ # AuxiliaryRails::Resourceable
2
2
 
3
3
  [![Gem](https://img.shields.io/gem/v/auxiliary_rails_resourceable.svg)](https://rubygems.org/gems/auxiliary_rails_resourceable)
4
4
 
5
+ `Resourceable` module speeds up development by loading your controllers with RESTful (CRUD) actions.
6
+
7
+ It is powered with search ([ransack](https://github.com/activerecord-hackery/ransack)), pagination ([pagy](https://github.com/ddnexus/pagy)) and policies ([pundit](https://github.com/varvet/pundit)).
8
+ All these make your controllers and views much cleaner, so you can just focus on what is important.
9
+
10
+ `Resourceable` aims to be as simple and flexible as possible and suggests customization using regular method overwriting instead of tricky configs or DSLs.
11
+ Of course, it may not cover all possible cases, but if you need something really custom - just write custom code.
12
+
13
+
5
14
  ## Installation
6
15
 
7
- Add this line to your application's `Gemfile`:
16
+ Add one of these lines to your application's `Gemfile`:
8
17
 
9
18
  ```ruby
19
+ # version released to RubyGems (recommended)
10
20
  gem 'auxiliary_rails_resourceable'
11
- ```
12
21
 
13
- And then execute:
14
-
15
- $ bundle install
22
+ # or latest development version from a specific branch of the GitHub repository
23
+ gem 'auxiliary_rails_resourceable',
24
+ git: 'https://github.com/ergoserv/auxiliary_rails_resourceable',
25
+ branch: 'develop'
26
+ # or from a local path (for development and testing purposes)
27
+ gem 'auxiliary_rails_resourceable',
28
+ path: '../auxiliary_rails_resourceable'
29
+ ```
16
30
 
17
- Or install it yourself as:
31
+ Copy `resources.en.yml` to `config/locales/resources.en.yml`.
18
32
 
19
- $ gem install auxiliary_rails_resourceable
33
+ Create shared views in `app/views/resources/` (or `app/views/resourceable/` if your need to share views for modules).
34
+ Recommended structure for views:
35
+ ```
36
+ index.html.erb
37
+ new.html.erb
38
+ show.html.erb
39
+ edit.html.erb
40
+ _form.html.erb
41
+ _list.html.erb
42
+ _search_form.html.erb
43
+ ```
20
44
 
21
45
  ## Usage
22
46
 
47
+ Just define `ResourcesController` and inherit controllers from it for fulfilling them with the all the basic CRUD actions.
48
+
23
49
  ```ruby
24
50
  # app/controllers/resources_controller.rb
25
51
  # @abstract
@@ -27,26 +53,46 @@ class ResourcesController < ApplicationController
27
53
  include AuxiliaryRails::Concerns::Resourceable
28
54
  end
29
55
 
30
- # app/views/resources/
31
- # - index.html.erb
32
- # - new.html.erb
33
- # - show.html.erb
34
- # - edit.html.erb
35
- # - _form.html.erb
36
- # - _list.html.erb
37
- # - _search_form.html.erb
38
-
39
- # /config/locales/resources.en.yml
40
- en:
41
- resources:
42
- create:
43
- notice: "%{resource_name} was successfully created."
44
- update:
45
- notice: "%{resource_name} was successfully updated."
46
- destroy:
47
- notice: "%{resource_name} was successfully destroyed."
56
+ # app/controllers/products_controller.rb
57
+ class ProductsController < ResourcesController
58
+ end
48
59
  ```
49
60
 
61
+ ### Customization
62
+
63
+ `Resourceable` is a very simple and clear module, just read its code and overwrite
64
+ what you need in `ResourcesController` or any of its subclasses, e.g.:
65
+
66
+ ```ruby
67
+ # app/controllers/products_controller.rb
68
+ class ProductsController < ResourcesController
69
+ # Load additional data for views
70
+ def index
71
+ super
72
+ self.collection = collection.includes([:category])
73
+ end
74
+
75
+ protected
76
+
77
+ # Add any additional scopes to the collection scope
78
+ def collection_scope
79
+ policy_scope(Product).active.in_stock
80
+ end
81
+
82
+ # Overwrite Pagy configs using Pagy's methods
83
+ # https://github.com/ddnexus/pagy/blob/master/lib/pagy/backend.rb#L19
84
+ def pagy_get_vars(collection, vars)
85
+ vars[:items] = 250
86
+ super
87
+ end
88
+ end
89
+ ```
90
+
91
+ ## References
92
+
93
+ This gem is heavily inspired by [inherited_resources](https://github.com/activeadmin/inherited_resources) and [activeadmin](https://github.com/activeadmin/activeadmin).
94
+ It even follows the naming for helpers of `inherited_resources`, but much lighter (~250 lines of code only), with an approach of "just overwrite what you need" instead of complex configuration options. And, in simple cases, can be used as a drop-in replacement with no or just a few code changes.
95
+
50
96
  ## Development
51
97
 
52
98
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -27,8 +27,8 @@ Gem::Specification.new do |spec|
27
27
  spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
28
28
  spec.require_paths = ['lib']
29
29
 
30
- spec.add_dependency 'pagy'
31
- spec.add_dependency 'pundit'
30
+ spec.add_dependency 'pagy', '>= 6.0.4'
31
+ spec.add_dependency 'pundit', '>= 2.2'
32
32
  spec.add_dependency 'rails', '>= 5.2'
33
- spec.add_dependency 'ransack'
33
+ spec.add_dependency 'ransack', '>= 3.0.0'
34
34
  end
@@ -0,0 +1,8 @@
1
+ en:
2
+ resources:
3
+ create:
4
+ notice: "%{resource_name} was successfully created."
5
+ update:
6
+ notice: "%{resource_name} was successfully updated."
7
+ destroy:
8
+ notice: "%{resource_name} was successfully destroyed."
@@ -7,18 +7,15 @@ module AuxiliaryRails
7
7
  include Pundit::Authorization
8
8
 
9
9
  included do
10
- before_action only: %i[index new] do
11
- authorize resource_class
12
- end
13
- before_action :resource, only: %i[show edit] do
14
- authorize resource
15
- end
16
-
10
+ before_action :authorize_resource_class, only: %i[index new create]
11
+ before_action :authorize_resource, only: %i[show edit update destroy]
12
+ before_action :set_lookup_context_prefixes
17
13
  after_action :verify_authorized
18
14
  after_action :verify_policy_scoped, only: %i[index]
19
15
 
20
16
  helper_method :collection
21
17
  helper_method :collection_path
18
+ helper_method :form_resource
22
19
  helper_method :resource
23
20
  helper_method :resource_class
24
21
  helper_method :resource_params
@@ -33,12 +30,22 @@ module AuxiliaryRails
33
30
  end
34
31
 
35
32
  def new
36
- self.resource = build_resource
33
+ self.resource =
34
+ if params.key?(resource_name)
35
+ build_resource(resource_params)
36
+ else
37
+ build_resource
38
+ end
37
39
  end
38
40
 
39
41
  def create
40
- if create_resource(resource_params)
41
- redirect_after_create
42
+ self.resource = build_resource(resource_params)
43
+
44
+ if resource.save
45
+ respond_to do |format|
46
+ format.html { redirect_after_create }
47
+ format.json
48
+ end
42
49
  else
43
50
  render :new
44
51
  end
@@ -51,30 +58,50 @@ module AuxiliaryRails
51
58
  end
52
59
 
53
60
  def update
54
- if update_resource(resource_params)
55
- redirect_after_update
61
+ resource.assign_attributes(resource_params)
62
+
63
+ if resource.save
64
+ respond_to do |format|
65
+ format.html { redirect_after_update }
66
+ format.json
67
+ end
56
68
  else
57
69
  render :edit
58
70
  end
59
71
  end
60
72
 
61
73
  def destroy
62
- destroy_resource
74
+ resource.destroy
63
75
 
64
- redirect_after_destroy
76
+ respond_to do |format|
77
+ format.html { redirect_after_destroy }
78
+ format.json
79
+ end
65
80
  end
66
81
 
67
82
  protected
68
83
 
69
84
  # configs
70
85
 
86
+ def authorize_resource(query = nil, policy_class: nil)
87
+ authorize resource, query, policy_class: policy_class
88
+ end
89
+
90
+ def authorize_resource_class(query = nil, policy_class: nil)
91
+ authorize resource_class, query, policy_class: policy_class
92
+ end
93
+
71
94
  def default_sorts
72
95
  %w[name title id].find { |v| v.in?(resource_class.column_names) } || []
73
96
  end
74
97
 
75
98
  # Defines an I18n scope for flash messages
76
99
  #
77
- # Use `controller_name` for scoping as the name of the controller.
100
+ # Possible options to use instead of `:resources`:
101
+ # - `controller_name`
102
+ # - `"#{controller_module_name}/resources"`
103
+ # - `"#{controller_module_name}/#{controller_name}"`
104
+ # - any other manual scope
78
105
  def i18n_scope
79
106
  :resources
80
107
  end
@@ -109,50 +136,28 @@ module AuxiliaryRails
109
136
  resource_class.new(attributes)
110
137
  end
111
138
 
112
- def create_resource(attributes = {})
113
- self.resource = build_resource(attributes)
114
-
115
- authorize resource, :create?
116
-
117
- resource.save
118
- end
119
-
120
139
  def find_resource
121
140
  resource_class.find(id_param)
122
141
  end
123
142
 
124
- def update_resource(attributes = {})
125
- resource.assign_attributes(attributes)
126
-
127
- authorize resource, :update?
128
-
129
- resource.save
130
- end
131
-
132
- def destroy_resource
133
- authorize resource, :destroy?
134
-
135
- resource.destroy
136
- end
137
-
138
143
  # helpers
139
144
 
140
145
  def collection
141
- instance_variable_get("@#{collection_name}") ||
146
+ instance_variable_get(:"@#{collection_name}") ||
142
147
  (self.collection = collection_scope)
143
148
  end
144
149
 
145
150
  def collection=(object)
146
- instance_variable_set("@#{collection_name}", object)
151
+ instance_variable_set(:"@#{collection_name}", object)
147
152
  end
148
153
 
149
154
  def resource
150
- instance_variable_get("@#{resource_name}") ||
155
+ instance_variable_get(:"@#{resource_name}") ||
151
156
  (self.resource = find_resource)
152
157
  end
153
158
 
154
159
  def resource=(object)
155
- instance_variable_set("@#{resource_name}", object)
160
+ instance_variable_set(:"@#{resource_name}", object)
156
161
  end
157
162
 
158
163
  def resource_params
@@ -161,6 +166,14 @@ module AuxiliaryRails
161
166
  .permit(policy(resource_class).permitted_attributes)
162
167
  end
163
168
 
169
+ def form_resource
170
+ if controller_module_name.blank?
171
+ resource
172
+ else
173
+ [controller_module_name.to_sym, resource]
174
+ end
175
+ end
176
+
164
177
  def collection_path
165
178
  public_send(path_method_name(:collection))
166
179
  end
@@ -176,44 +189,57 @@ module AuxiliaryRails
176
189
  # redirects
177
190
 
178
191
  def redirect_after_create
179
- redirect_to resource_path(resource),
180
- notice: t('create.notice',
192
+ if flash[:notice].blank?
193
+ flash[:notice] = t('create.notice',
181
194
  resource_name: resource_class.model_name.human,
182
195
  scope: i18n_scope)
196
+ end
197
+
198
+ redirect_to resource_path(resource)
183
199
  end
184
200
 
185
201
  def redirect_after_update
186
- redirect_to resource_path(resource),
187
- notice: t('update.notice',
202
+ if flash[:notice].blank?
203
+ flash[:notice] = t('update.notice',
188
204
  resource_name: resource_class.model_name.human,
189
205
  scope: i18n_scope)
206
+ end
207
+
208
+ redirect_to resource_path(resource)
190
209
  end
191
210
 
192
211
  def redirect_after_destroy
193
- redirect_to collection_path,
194
- notice: t('destroy.notice',
212
+ if flash[:notice].blank?
213
+ flash[:notice] = t('destroy.notice',
195
214
  resource_name: resource_class.model_name.human,
196
215
  scope: i18n_scope)
216
+ end
217
+
218
+ redirect_to collection_path
197
219
  end
198
220
 
199
221
  # system
200
222
 
201
- def controller_module_parent_name
223
+ def controller_module_name
202
224
  if Rails.version < '6'
203
- return self.class.parent_name
225
+ return self.class.parent_name&.underscore
204
226
  end
205
227
 
206
- self.class.module_parent_name
228
+ self.class.module_parent_name&.underscore
207
229
  end
208
230
 
209
231
  def path_method_name(type, action = nil)
210
232
  [
211
233
  action,
212
- controller_module_parent_name&.underscore,
234
+ controller_module_name,
213
235
  (type.to_sym == :resource ? resource_name : controller_name),
214
236
  'path'
215
237
  ].compact.join('_')
216
238
  end
239
+
240
+ def set_lookup_context_prefixes
241
+ lookup_context.prefixes << 'resourceable'
242
+ end
217
243
  end
218
244
  end
219
245
  end
@@ -0,0 +1,32 @@
1
+ module AuxiliaryRails
2
+ module ViewHelpers
3
+ module HumanNameHelper
4
+ # Human-readable name for a model or a model's attribute
5
+ #
6
+ # @param model [Class, Object] The model class or an instance of the model
7
+ # @param attribute [Symbol, String, nil] The attribute name (optional)
8
+ # @return [String] The human-readable name
9
+ def human_name(model, attribute = nil, count: 1)
10
+ if attribute.nil?
11
+ model.model_name.human(count: count)
12
+ else
13
+ model = model.class unless model.is_a?(Class)
14
+ if count > 1
15
+ model.human_attribute_name(attribute).pluralize(count)
16
+ else
17
+ model.human_attribute_name(attribute)
18
+ end
19
+ end
20
+ end
21
+
22
+ # Human-readable name for a model or a model's attribute plural form
23
+ #
24
+ # @param model [Class, Object] The model class or an instance of the model
25
+ # @param attribute [Symbol, String, nil] The attribute name (optional)
26
+ # @return [String] The human-readable name in plural form
27
+ def human_name_plural(model, attribute = nil, count: 2)
28
+ human_name(model, attribute, count: count)
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,10 @@
1
+ require 'rails/railtie'
2
+ require 'auxiliary_rails/view_helpers/human_name_helper'
3
+
4
+ module AuxiliaryRails
5
+ class Railtie < Rails::Railtie
6
+ initializer 'auxiliary_rails.view_helpers' do
7
+ ActionView::Base.include AuxiliaryRails::ViewHelpers::HumanNameHelper
8
+ end
9
+ end
10
+ end
@@ -1,3 +1,3 @@
1
1
  module AuxiliaryRailsResourceable
2
- VERSION = '0.1.1'.freeze
2
+ VERSION = '0.1.3'.freeze
3
3
  end
@@ -1,4 +1,5 @@
1
1
  require_relative 'auxiliary_rails_resourceable/version'
2
+ require_relative 'auxiliary_rails_resourceable/railtie'
2
3
 
3
4
  require 'pagy'
4
5
  require 'pundit'
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: auxiliary_rails_resourceable
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dmitry Babenko
8
8
  - ErgoServ
9
- autorequire:
9
+ autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2022-08-27 00:00:00.000000000 Z
12
+ date: 2024-08-17 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: pagy
@@ -17,28 +17,28 @@ dependencies:
17
17
  requirements:
18
18
  - - ">="
19
19
  - !ruby/object:Gem::Version
20
- version: '0'
20
+ version: 6.0.4
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
25
  - - ">="
26
26
  - !ruby/object:Gem::Version
27
- version: '0'
27
+ version: 6.0.4
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: pundit
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
32
  - - ">="
33
33
  - !ruby/object:Gem::Version
34
- version: '0'
34
+ version: '2.2'
35
35
  type: :runtime
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
39
  - - ">="
40
40
  - !ruby/object:Gem::Version
41
- version: '0'
41
+ version: '2.2'
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: rails
44
44
  requirement: !ruby/object:Gem::Requirement
@@ -59,15 +59,15 @@ dependencies:
59
59
  requirements:
60
60
  - - ">="
61
61
  - !ruby/object:Gem::Version
62
- version: '0'
62
+ version: 3.0.0
63
63
  type: :runtime
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
67
  - - ">="
68
68
  - !ruby/object:Gem::Version
69
- version: '0'
70
- description:
69
+ version: 3.0.0
70
+ description:
71
71
  email:
72
72
  - dmitry@ergoserv.com
73
73
  - hello@ergoserv.com
@@ -85,8 +85,11 @@ files:
85
85
  - README.md
86
86
  - Rakefile
87
87
  - auxiliary_rails_resourceable.gemspec
88
+ - config/locales/resources.en.yml
88
89
  - lib/auxiliary_rails/concerns/resourceable.rb
90
+ - lib/auxiliary_rails/view_helpers/human_name_helper.rb
89
91
  - lib/auxiliary_rails_resourceable.rb
92
+ - lib/auxiliary_rails_resourceable/railtie.rb
90
93
  - lib/auxiliary_rails_resourceable/version.rb
91
94
  - sig/auxiliary_rails_resourceable.rbs
92
95
  homepage: https://github.com/ergoserv/auxiliary_rails_resourceable
@@ -97,7 +100,7 @@ metadata:
97
100
  source_code_uri: https://github.com/ergoserv/auxiliary_rails_resourceable
98
101
  changelog_uri: https://github.com/ergoserv/auxiliary_rails_resourceable
99
102
  rubygems_mfa_required: 'true'
100
- post_install_message:
103
+ post_install_message:
101
104
  rdoc_options: []
102
105
  require_paths:
103
106
  - lib
@@ -112,8 +115,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
112
115
  - !ruby/object:Gem::Version
113
116
  version: '0'
114
117
  requirements: []
115
- rubygems_version: 3.1.2
116
- signing_key:
118
+ rubygems_version: 3.5.17
119
+ signing_key:
117
120
  specification_version: 4
118
121
  summary: AuxiliaryRails - Resourceable Controller
119
122
  test_files: []