rectify 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/rectify/{controller.rb → controller_helpers.rb} +1 -1
- data/lib/rectify/form.rb +3 -1
- data/lib/rectify/presenter.rb +3 -1
- data/lib/rectify/version.rb +1 -1
- data/lib/rectify.rb +1 -1
- data/readme.md +145 -109
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d7db41f0a655c68a1cc60f253b0bca46e049be1e
|
4
|
+
data.tar.gz: 18cff71a5e52be32ec14c25df243b3aa1bdb4338
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c014786d12349c161f38d17d5249156fc206e21fa43da1061d4237f72778a17ca2190353eb99d6a004ae39a2a5abbe9a9bbede7c0aaff187aa8fd62c2f3f3f4d
|
7
|
+
data.tar.gz: 16590d5c8313f1570612c1fc7d0308a0e3b848ed8cc8bb20c5afcb9ce073434abec5a68383c70f2e5896b51c77d5d242e62dcbfc583157655b23e79d03dfb1d5
|
data/lib/rectify/form.rb
CHANGED
@@ -7,7 +7,9 @@ module Rectify
|
|
7
7
|
|
8
8
|
def self.from_params(params, additional_params = {})
|
9
9
|
params = params.with_indifferent_access
|
10
|
-
attributes = params
|
10
|
+
attributes = params
|
11
|
+
.fetch(mimicked_model_name, {})
|
12
|
+
.merge(additional_params)
|
11
13
|
|
12
14
|
new(attributes).tap do |f|
|
13
15
|
f.id = params[:id]
|
data/lib/rectify/presenter.rb
CHANGED
data/lib/rectify/version.rb
CHANGED
data/lib/rectify.rb
CHANGED
data/readme.md
CHANGED
@@ -25,15 +25,17 @@ bundle install
|
|
25
25
|
|
26
26
|
Currently, Rectify consists of the following concepts:
|
27
27
|
|
28
|
-
* Form Objects
|
29
|
-
* Commands
|
30
|
-
* Presenters
|
28
|
+
* [Form Objects](#form-objects)
|
29
|
+
* [Commands](#commands)
|
30
|
+
* [Presenters](#presenters)
|
31
31
|
|
32
32
|
You can use these separately or together to improve the structure of your Rails
|
33
33
|
applications.
|
34
34
|
|
35
|
-
The main problem that Rectify tries to solve is where your logic should go.
|
36
|
-
business logic is either placed in the controller or the model and the
|
35
|
+
The main problem that Rectify tries to solve is where your logic should go.
|
36
|
+
Commonly, business logic is either placed in the controller or the model and the
|
37
|
+
views are filled with too much logic. The opinion of Rectify is that these
|
38
|
+
places are incorrect and that your models in particular are doing too much.
|
37
39
|
|
38
40
|
Rectify's opinion is that controllers should just be concerned with HTTP related
|
39
41
|
things and models should just be concerned with data access. The problem then
|
@@ -42,14 +44,16 @@ becomes, how and where do you place validations and other business logic.
|
|
42
44
|
Using Rectify, the Form Objects contain validations and represent the data input
|
43
45
|
of your system. Commands then take a Form Object (as well as other data) and
|
44
46
|
perform a single action which is invoked by a controller. Presenters contain the
|
45
|
-
presentation logic in a way that is easily testable and keeps your views as
|
46
|
-
as possible.
|
47
|
+
presentation logic in a way that is easily testable and keeps your views as
|
48
|
+
clean as possible.
|
47
49
|
|
48
|
-
Here's an example controller that shows details about a user and also allows a
|
50
|
+
Here's an example controller that shows details about a user and also allows a
|
51
|
+
user to register an account. This creates a user, sends some emails, does some
|
52
|
+
special auditing and integrates with a third party system:
|
49
53
|
|
50
54
|
```ruby
|
51
55
|
class UserController < ApplicationController
|
52
|
-
include Rectify::
|
56
|
+
include Rectify::ControllerHelpers
|
53
57
|
|
54
58
|
def show
|
55
59
|
present UserDetailsPresenter.new(:user => current_user)
|
@@ -71,9 +75,10 @@ class UserController < ApplicationController
|
|
71
75
|
end
|
72
76
|
```
|
73
77
|
|
74
|
-
The `RegistrationForm` Form Object encapsulates the relevant data that is
|
75
|
-
action and the `RegisterAccount` Command encapsulates the
|
76
|
-
a new account. The controller is clean and
|
78
|
+
The `RegistrationForm` Form Object encapsulates the relevant data that is
|
79
|
+
required for the action and the `RegisterAccount` Command encapsulates the
|
80
|
+
business logic of registering a new account. The controller is clean and
|
81
|
+
business logic now has a natural home:
|
77
82
|
|
78
83
|
```
|
79
84
|
HTTP => Controller (redirecting, rendering, etc)
|
@@ -88,6 +93,21 @@ and Presenters.
|
|
88
93
|
|
89
94
|
## Form Objects
|
90
95
|
|
96
|
+
The role of the Form Object is to mange the input data for a given action. It
|
97
|
+
validates data and only allows whitelisted attributes (replacing the need for
|
98
|
+
Strong Parameters). This is a departure from "The Rails Way" where the model
|
99
|
+
contains the validations. Form Objects help to reduce the weight of your models
|
100
|
+
for one, but also, in an app of reasonable complexity even simple things like
|
101
|
+
validations become harder because context is important.
|
102
|
+
|
103
|
+
For example, you can add validation for a `User` model but there are different
|
104
|
+
context where the validations change. When a user registers themselves you might
|
105
|
+
have one set of validations, when an admin edits that user you might have
|
106
|
+
another set, maybe even when a user edits themselves you may have a third. In
|
107
|
+
"The Rails Way" you would have to have conditional validation in your model.
|
108
|
+
With Rectify you can have a different Form Object per context and keep things
|
109
|
+
easier to manage.
|
110
|
+
|
91
111
|
Form objects in Rectify are based on [Virtus](https://github.com/solnic/virtus)
|
92
112
|
and make them compatible with Rails form builders, add ActiveModel validations
|
93
113
|
and all allow you to specify a model to mimic.
|
@@ -103,7 +123,8 @@ class UserForm < Rectify::Form
|
|
103
123
|
end
|
104
124
|
```
|
105
125
|
|
106
|
-
You can then set that up in your controller instead of a normal ActiveRecord
|
126
|
+
You can then set that up in your controller instead of a normal ActiveRecord
|
127
|
+
model:
|
107
128
|
|
108
129
|
```ruby
|
109
130
|
class UsersController < ApplicationController
|
@@ -133,13 +154,14 @@ You can use the form object with form builders such as
|
|
133
154
|
|
134
155
|
### Mimicking models
|
135
156
|
|
136
|
-
When the form is generated it uses the name of the form class to infer what
|
137
|
-
it should mimic. In the example above, it will mimic the `User` model
|
138
|
-
the `Form` suffix from the form class name by default.
|
157
|
+
When the form is generated it uses the name of the form class to infer what
|
158
|
+
"model" it should mimic. In the example above, it will mimic the `User` model
|
159
|
+
as it removes the `Form` suffix from the form class name by default.
|
139
160
|
|
140
161
|
The model being mimicked affects two things about the form:
|
141
162
|
|
142
|
-
1. The route path helpers to use as the url to post to, for example:
|
163
|
+
1. The route path helpers to use as the url to post to, for example:
|
164
|
+
`users_path`.
|
143
165
|
2. The parent key in the params hash that the controller receives, for example
|
144
166
|
`user` in this case:
|
145
167
|
|
@@ -178,15 +200,15 @@ You define your attributes for your form object just like you do in
|
|
178
200
|
[Virtus](https://github.com/solnic/virtus).
|
179
201
|
|
180
202
|
By default, Rectify forms include an `id` attribute for you so you don't need to
|
181
|
-
add that. We use this `id` attribute to
|
182
|
-
so your forms will work with form builders. For example, your form
|
183
|
-
`#persisted?` method. Your form object is never persisted so
|
184
|
-
should always return `false`.
|
203
|
+
add that. We use this `id` attribute to fulfill some of the requirements of
|
204
|
+
ActiveModel so your forms will work with form builders. For example, your form
|
205
|
+
object has a `#persisted?` method. Your form object is never persisted so
|
206
|
+
technically this should always return `false`.
|
185
207
|
|
186
208
|
However, you are normally representing something that is persistable. So we use
|
187
209
|
the value of `id` to workout if what this should return. If `id` is a number
|
188
|
-
greater than zero then we assume it is persisted otherwise we assume it isn't.
|
189
|
-
is important as it affects where your form is posted (to the `#create` or
|
210
|
+
greater than zero then we assume it is persisted otherwise we assume it isn't.
|
211
|
+
This is important as it affects where your form is posted (to the `#create` or
|
190
212
|
`#update` action in your controller).
|
191
213
|
|
192
214
|
#### Populating attributes
|
@@ -210,9 +232,9 @@ the data in the request:
|
|
210
232
|
form = UserForm.from_params(params)
|
211
233
|
```
|
212
234
|
|
213
|
-
When populating from params we will populate the built in `id` attribute from
|
214
|
-
root of the params hash and populate the rest of the form attributes from
|
215
|
-
the parent key. For example:
|
235
|
+
When populating from params we will populate the built in `id` attribute from
|
236
|
+
the root of the params hash and populate the rest of the form attributes from
|
237
|
+
within the parent key. For example:
|
216
238
|
|
217
239
|
```ruby
|
218
240
|
params = {
|
@@ -232,7 +254,8 @@ form.last_name # => "Pike"
|
|
232
254
|
|
233
255
|
The other thing to notice is that (thanks to Virtus), attribute values are cast
|
234
256
|
to the correct type. The params hash is actually all string based but when you
|
235
|
-
get values from the form, they are returned as the correct type (see `id`
|
257
|
+
get values from the form, they are returned as the correct type (see `id`
|
258
|
+
above).
|
236
259
|
|
237
260
|
In addition to the params hash, you may want to add additional contextual data.
|
238
261
|
This can be done by supplying a second hash to the `.from_params` method.
|
@@ -265,10 +288,12 @@ form.last_name # => "Pike"
|
|
265
288
|
|
266
289
|
One important thing that is different about Rectify forms is that they are not
|
267
290
|
bound by a model. You can use a model to populate the forms attributes but that
|
268
|
-
is all it will do. It does not keep a reference to the model or interact with
|
269
|
-
|
270
|
-
|
271
|
-
|
291
|
+
is all it will do. It does not keep a reference to the model or interact with
|
292
|
+
it.
|
293
|
+
|
294
|
+
Rectify forms are designed to be lightweight representations of the data you
|
295
|
+
want to collect or show in your forms, not something that is linked to a model.
|
296
|
+
This allows you to create any form that you like which doesn't need to match the
|
272
297
|
representation of the data in the database.
|
273
298
|
|
274
299
|
### Validations
|
@@ -276,14 +301,15 @@ representation of the data in the database.
|
|
276
301
|
Rectify includes `ActiveModel::Validations` for you so you can use all of the
|
277
302
|
Rails validations that you are used to within your models.
|
278
303
|
|
279
|
-
Your Form Object has a `#valid?` method that will validate the attributes of
|
280
|
-
form as well as any (deeply) nested form objects and array attributes that
|
281
|
-
form objects.
|
304
|
+
Your Form Object has a `#valid?` method that will validate the attributes of
|
305
|
+
your form as well as any (deeply) nested form objects and array attributes that
|
306
|
+
contain form objects. There is also an `#invalid?` method that returns the
|
307
|
+
opposite of `#valid?`.
|
282
308
|
|
283
309
|
### Strong Parameters
|
284
310
|
|
285
|
-
Did you notice in the example above that there was no mention of
|
286
|
-
|
311
|
+
Did you notice in the example above that there was no mention of Strong
|
312
|
+
Parameters. That's because with Form Objects you do not need strong parameters.
|
287
313
|
You only specify attributes in your form that are allowed to be accepted. All
|
288
314
|
other data in your params hash is ignored.
|
289
315
|
|
@@ -292,19 +318,27 @@ about how to build a form object.
|
|
292
318
|
|
293
319
|
## Commands
|
294
320
|
|
321
|
+
Commands (also known as Service Objects) are the home of your business logic.
|
322
|
+
They allow you to simplify your models and controllers and allow them to focus
|
323
|
+
on what they are responsible for. A Command should encapsulate a single user
|
324
|
+
task such as registering for a new account or placing an order. You of course
|
325
|
+
don't need to put all code for this task within the Command, you can (and
|
326
|
+
should) create other classes that your Command uses to perform it's work.
|
327
|
+
|
328
|
+
With regard to naming, Rectify suggests using verbs rather than nouns for
|
329
|
+
Command class names, for example `RegisterAccount`, `PlaceOrder` or
|
330
|
+
`GenerateEndOfYearReport`. Notice that we don't suffix commands with `Command`
|
331
|
+
or `Service` or similar.
|
332
|
+
|
295
333
|
Commands in Rectify are based on [Wisper](https://github.com/krisleech/wisper)
|
296
334
|
which allows classes to broadcast events for publish/subscribe capabilities.
|
297
|
-
`Rectify::Command` is a lightweight class that gives an alternate API and adds
|
298
|
-
helper methods to improve Command logic.
|
335
|
+
`Rectify::Command` is a lightweight class that gives an alternate API and adds
|
336
|
+
some helper methods to improve Command logic.
|
299
337
|
|
300
338
|
The reason for using the pub/sub model rather than returning a result means that
|
301
339
|
we can reduce the number of conditionals in our code as the outcome of a Command
|
302
340
|
might be more complex than just success or failure.
|
303
341
|
|
304
|
-
With regard to naming, Rectify suggests using verbs rather than nouns for Command
|
305
|
-
class names, for example `RegisterAccount`, `PlaceOrder` or `GenerateEndOfYearReport`.
|
306
|
-
Notice that we don't suffix commands with `Command` or `Service` or similar.
|
307
|
-
|
308
342
|
Here is an example Command with the structure Rectify suggests (as seen in the
|
309
343
|
overview above):
|
310
344
|
|
@@ -367,9 +401,9 @@ end
|
|
367
401
|
|
368
402
|
When you call the `.call` class method, Rectify will instantiate a new instance
|
369
403
|
of the command and will pass the parameters to it's constructor, it will then
|
370
|
-
call the instance method `#call` on the newly created command object. The
|
371
|
-
method also allows you to supply a block where you can handle the events
|
372
|
-
have been broadcast from the command.
|
404
|
+
call the instance method `#call` on the newly created command object. The
|
405
|
+
`.call` method also allows you to supply a block where you can handle the events
|
406
|
+
that may have been broadcast from the command.
|
373
407
|
|
374
408
|
The events that your Command broadcasts can be anything, Rectify suggests `:ok`
|
375
409
|
for success and `:invalid` if the form data is not valid, but it's totally up to
|
@@ -381,13 +415,13 @@ From here you can choose to implement your Command how you see fit. A
|
|
381
415
|
### Writing Commands
|
382
416
|
|
383
417
|
As your application grows and Commands get more complex we recommend using the
|
384
|
-
structure above. Within the `#call` method you first check that the input data
|
385
|
-
valid. If it is you then perform the various tasks that need to be completed.
|
418
|
+
structure above. Within the `#call` method you first check that the input data
|
419
|
+
is valid. If it is you then perform the various tasks that need to be completed.
|
386
420
|
We recommend using private methods for each step that are well named which makes
|
387
421
|
it very easy for anyone reading the code to workout what it does.
|
388
422
|
|
389
423
|
Feel free to use other classes and objects where appropriate to keep your code
|
390
|
-
well
|
424
|
+
well organized and maintainable.
|
391
425
|
|
392
426
|
### Events
|
393
427
|
|
@@ -420,17 +454,18 @@ controller.
|
|
420
454
|
|
421
455
|
You may occasionally want to expose a value within a handler block to the view.
|
422
456
|
You do this via the `expose` method within the handler block. If you want to
|
423
|
-
use `expose` then you must include the `Rectify::
|
424
|
-
controller. You pass a hash of the variables you wish to expose to the view
|
425
|
-
they will then be available. If you have set a Presenter for the view then
|
426
|
-
`expose` will try to set an attribute on that presenter. If there is no
|
427
|
-
or the Presenter doesn't have a matching attribute then `expose` will
|
428
|
-
instance variable of the same name. See below for more details about
|
457
|
+
use `expose` then you must include the `Rectify::ControllerHelpers` module in
|
458
|
+
your controller. You pass a hash of the variables you wish to expose to the view
|
459
|
+
and they will then be available. If you have set a Presenter for the view then
|
460
|
+
`expose` will try to set an attribute on that presenter. If there is no
|
461
|
+
Presenter or the Presenter doesn't have a matching attribute then `expose` will
|
462
|
+
set an instance variable of the same name. See below for more details about
|
463
|
+
Presenters.
|
429
464
|
|
430
465
|
```ruby
|
431
466
|
# within the controller:
|
432
467
|
|
433
|
-
include Rectify::
|
468
|
+
include Rectify::ControllerHelpers
|
434
469
|
|
435
470
|
def create
|
436
471
|
present HomePresenter.new(:name => "Guest")
|
@@ -448,27 +483,27 @@ end
|
|
448
483
|
# => <p>Hello Andy</p>
|
449
484
|
```
|
450
485
|
|
451
|
-
Take a look at [Wisper](https://github.com/krisleech/wisper) for more
|
452
|
-
around how to do publish/subscribe.
|
486
|
+
Take a look at [Wisper](https://github.com/krisleech/wisper) for more
|
487
|
+
information around how to do publish/subscribe.
|
453
488
|
|
454
489
|
## Presenters
|
455
490
|
|
456
|
-
A Presenter is a class that contains the presentational logic for your views.
|
457
|
-
are also known as an "exhibit", "view model", "view object" or just a
|
458
|
-
views are actually templates, but anyway). To avoid confusion
|
459
|
-
classes Presenters.
|
491
|
+
A Presenter is a class that contains the presentational logic for your views.
|
492
|
+
These are also known as an "exhibit", "view model", "view object" or just a
|
493
|
+
"view" (Rails views are actually templates, but anyway). To avoid confusion
|
494
|
+
Rectify calls these classes Presenters.
|
460
495
|
|
461
496
|
It's often the case that you need some logic that is just for the UI. The same
|
462
497
|
question comes up, where should this logic go? You could put it directly in the
|
463
498
|
view, add it to the model or create a helper. Rectify's opinion is that all of
|
464
499
|
these are incorrect. Instead, create a Presenter for the view (or component of
|
465
|
-
the view) and place your logic here. These classes are easily testable and
|
466
|
-
a more object oriented approach to the problem.
|
500
|
+
the view) and place your logic here. These classes are easily testable and
|
501
|
+
provide a more object oriented approach to the problem.
|
467
502
|
|
468
503
|
To create a Presenter just derive off of `Rectify::Presenter`, add attributes as
|
469
|
-
you do for Form Objects using [Virtus](https://github.com/solnic/virtus)
|
470
|
-
declaration. Inside a Presenter you have access to all view helper
|
471
|
-
it's easy to move the presetation logic here:
|
504
|
+
you do for Form Objects using [Virtus](https://github.com/solnic/virtus)
|
505
|
+
`attribute` declaration. Inside a Presenter you have access to all view helper
|
506
|
+
methods so it's easy to move the presetation logic here:
|
472
507
|
|
473
508
|
```ruby
|
474
509
|
class UserDetailsPresenter < Rectify::Presenter
|
@@ -482,9 +517,9 @@ class UserDetailsPresenter < Rectify::Presenter
|
|
482
517
|
end
|
483
518
|
```
|
484
519
|
|
485
|
-
Once you have a Presenter, you typically create it in your controller and make
|
486
|
-
accessible to your views. There are two ways to do that. The first way is to
|
487
|
-
treat it as a normal class:
|
520
|
+
Once you have a Presenter, you typically create it in your controller and make
|
521
|
+
it accessible to your views. There are two ways to do that. The first way is to
|
522
|
+
just treat it as a normal class:
|
488
523
|
|
489
524
|
```ruby
|
490
525
|
class UsersController < ApplicationController
|
@@ -497,20 +532,20 @@ end
|
|
497
532
|
```
|
498
533
|
|
499
534
|
You need to call `#for_controller` and pass it a controller instance which will
|
500
|
-
allow it access to the view helpers. You can then use the Presenter in your
|
501
|
-
as you would expect:
|
535
|
+
allow it access to the view helpers. You can then use the Presenter in your
|
536
|
+
views as you would expect:
|
502
537
|
|
503
538
|
```html
|
504
539
|
<p><%= @presenter.edit_link %></p>
|
505
540
|
```
|
506
541
|
|
507
542
|
The second way is a little cleaner as we have supplied a few helper methods to
|
508
|
-
clean up remove some of the boilerplate. You need to include the
|
509
|
-
module and then use the `present` helper:
|
543
|
+
clean up remove some of the boilerplate. You need to include the
|
544
|
+
`Rectify::ControllerHelpers` module and then use the `present` helper:
|
510
545
|
|
511
546
|
```ruby
|
512
547
|
class UsersController < ApplicationController
|
513
|
-
include Rectify::
|
548
|
+
include Rectify::ControllerHelpers
|
514
549
|
|
515
550
|
def show
|
516
551
|
user = User.find(params[:id])
|
@@ -533,14 +568,14 @@ method above or use the `present` method and add a `for` option with any key:
|
|
533
568
|
|
534
569
|
```ruby
|
535
570
|
class ApplicationController < ActionController::Base
|
536
|
-
include Rectify::
|
571
|
+
include Rectify::ControllerHelpers
|
537
572
|
|
538
573
|
before_action { present LayoutPresenter.new(:user => user), :for => :layout }
|
539
574
|
end
|
540
575
|
```
|
541
576
|
|
542
|
-
To access this Presenter in the view, just pass the Presenter key to the
|
543
|
-
method like so:
|
577
|
+
To access this Presenter in the view, just pass the Presenter key to the
|
578
|
+
`presenter` method like so:
|
544
579
|
|
545
580
|
```html
|
546
581
|
<p><%= presenter(:layout).login_link %></p>
|
@@ -548,12 +583,12 @@ method like so:
|
|
548
583
|
|
549
584
|
### Updating values of a Presenter
|
550
585
|
|
551
|
-
After a presenter has been instantiated you can update it's values
|
552
|
-
their attributes:
|
586
|
+
After a presenter has been instantiated you can update it's values by just
|
587
|
+
setting their attributes:
|
553
588
|
|
554
589
|
```ruby
|
555
590
|
class UsersController < ApplicationController
|
556
|
-
include Rectify::
|
591
|
+
include Rectify::ControllerHelpers
|
557
592
|
|
558
593
|
def show
|
559
594
|
user = User.find(params[:id])
|
@@ -574,15 +609,15 @@ end
|
|
574
609
|
```
|
575
610
|
|
576
611
|
As mentioned above in the Commands section, you can use the `expose` method (if
|
577
|
-
you include `Rectify::
|
578
|
-
action including the Command handler block. If you have set a
|
579
|
-
view then `expose` will try to set an attribute on that
|
580
|
-
no Presenter or the Presenter doesn't have a matching
|
581
|
-
will set an instance variable of the same name:
|
612
|
+
you include `Rectify::ControllerHelpers`). You can use this anywhere in the
|
613
|
+
controller action including the Command handler block. If you have set a
|
614
|
+
Presenter for the view then `expose` will try to set an attribute on that
|
615
|
+
presenter. If there is no Presenter or the Presenter doesn't have a matching
|
616
|
+
attribute then `expose` will set an instance variable of the same name:
|
582
617
|
|
583
618
|
```ruby
|
584
619
|
class UsersController < ApplicationController
|
585
|
-
include Rectify::
|
620
|
+
include Rectify::ControllerHelpers
|
586
621
|
|
587
622
|
def show
|
588
623
|
user = User.find(params[:id])
|
@@ -599,10 +634,10 @@ end
|
|
599
634
|
|
600
635
|
### Decorators
|
601
636
|
|
602
|
-
Another option for containing your UI logic is to use a Decorator. Rectify
|
603
|
-
ship with a built in way to create a decorator but we recommend either
|
604
|
-
[Draper](https://github.com/drapergem/draper) or you can roll your own
|
605
|
-
`SimpleDelegator`:
|
637
|
+
Another option for containing your UI logic is to use a Decorator. Rectify
|
638
|
+
doesn't ship with a built in way to create a decorator but we recommend either
|
639
|
+
using [Draper](https://github.com/drapergem/draper) or you can roll your own
|
640
|
+
using `SimpleDelegator`:
|
606
641
|
|
607
642
|
```ruby
|
608
643
|
class UserDecorator < SimpleDelegator
|
@@ -636,11 +671,12 @@ end
|
|
636
671
|
|
637
672
|
## Where do I put my files?
|
638
673
|
|
639
|
-
The next inevitable question is "Where do I put my Forms, Commands and
|
640
|
-
You could create `forms`, `commands` and `presenters` folders and
|
641
|
-
Rectify suggests grouping your classes by feature rather
|
642
|
-
create a folder called `core` (this can be
|
643
|
-
folder for each broad feature of your
|
674
|
+
The next inevitable question is "Where do I put my Forms, Commands and
|
675
|
+
Presenters?". You could create `forms`, `commands` and `presenters` folders and
|
676
|
+
follow the Rails Way. Rectify suggests grouping your classes by feature rather
|
677
|
+
than by pattern. For example, create a folder called `core` (this can be
|
678
|
+
anything) and within that, create a folder for each broad feature of your
|
679
|
+
application. Something like the following:
|
644
680
|
|
645
681
|
```
|
646
682
|
.
|
@@ -648,7 +684,7 @@ folder for each broad feature of your application. Something like the following:
|
|
648
684
|
├── controllers
|
649
685
|
├── core
|
650
686
|
│ ├── billing
|
651
|
-
│ ├──
|
687
|
+
│ ├── fulfillment
|
652
688
|
│ ├── ordering
|
653
689
|
│ ├── reporting
|
654
690
|
│ └── security
|
@@ -656,8 +692,8 @@ folder for each broad feature of your application. Something like the following:
|
|
656
692
|
└── views
|
657
693
|
```
|
658
694
|
|
659
|
-
Then you would place your classes in the appropriate feature folder. If you
|
660
|
-
this pattern remember to namespace your classes with a matching module:
|
695
|
+
Then you would place your classes in the appropriate feature folder. If you
|
696
|
+
follow this pattern remember to namespace your classes with a matching module:
|
661
697
|
|
662
698
|
```ruby
|
663
699
|
# in app/core/billing/send_invoice.rb
|
@@ -674,23 +710,23 @@ loaded automatically.
|
|
674
710
|
|
675
711
|
## Trade offs
|
676
712
|
|
677
|
-
This style of Rails architecture is not a silver bullet for all projects. If
|
678
|
-
app is pretty much just basic CRUD then you are unlikely to get much
|
679
|
-
this. However, if your app is more than just CRUD then you should
|
680
|
-
improvement in code structure and maintainability.
|
713
|
+
This style of Rails architecture is not a silver bullet for all projects. If
|
714
|
+
your app is pretty much just basic CRUD then you are unlikely to get much
|
715
|
+
benefit from this. However, if your app is more than just CRUD then you should
|
716
|
+
see an improvement in code structure and maintainability.
|
681
717
|
|
682
718
|
The downside to this approach is that there will be many more classes and files
|
683
|
-
to deal with. This can be tricky as the application gets bigger to hold the
|
684
|
-
system in your head. Personally I would prefer that as maintaining it will
|
685
|
-
easier as all code around a specific user task is on one place.
|
719
|
+
to deal with. This can be tricky as the application gets bigger to hold the
|
720
|
+
whole system in your head. Personally I would prefer that as maintaining it will
|
721
|
+
be easier as all code around a specific user task is on one place.
|
686
722
|
|
687
|
-
Before you use these methods in your project, consider the trade off and use
|
688
|
-
strategies where they make sense for you and your project.
|
723
|
+
Before you use these methods in your project, consider the trade off and use
|
724
|
+
these strategies where they make sense for you and your project.
|
689
725
|
|
690
726
|
## What's next?
|
691
727
|
|
692
728
|
We stated above that the models should be responsible for data access. We
|
693
729
|
may introduce a nice way to keep using the power of ActiveRecord but in a way
|
694
730
|
where your models don't end up as a big ball of queries. We're thinking about
|
695
|
-
Query Objects and a nice way to do this and we're also thinking about a nicer
|
696
|
-
to use raw SQL.
|
731
|
+
Query Objects and a nice way to do this and we're also thinking about a nicer
|
732
|
+
way to use raw SQL.
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rectify
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andy Pike
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-02-
|
11
|
+
date: 2016-02-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: virtus
|
@@ -215,7 +215,7 @@ files:
|
|
215
215
|
- LICENSE.txt
|
216
216
|
- lib/rectify.rb
|
217
217
|
- lib/rectify/command.rb
|
218
|
-
- lib/rectify/
|
218
|
+
- lib/rectify/controller_helpers.rb
|
219
219
|
- lib/rectify/form.rb
|
220
220
|
- lib/rectify/presenter.rb
|
221
221
|
- lib/rectify/save_command.rb
|