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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4347cd2896dcb19ca5f47ac3934c433d81668ac3
4
- data.tar.gz: 377299eed0a96ce220b70e0967ba77fbcbe4512b
3
+ metadata.gz: d7db41f0a655c68a1cc60f253b0bca46e049be1e
4
+ data.tar.gz: 18cff71a5e52be32ec14c25df243b3aa1bdb4338
5
5
  SHA512:
6
- metadata.gz: 0f7a0a7f6d15d47b15283bd123118af5c3d1a4ea6a996eb1e7bd206bbb10bf761b7a3cdfb5fa91df5bc50cab9593b57fa9ea4e7acdfc819a142f0ddff6e9bd54
7
- data.tar.gz: 25af13f81a98dea2be0918b1a1710e5ef8e3df87650ce5cf3811275fe1e75e91e6af07fe5db2da293b21f5ef41a198c3fc52c78703499f82f082d00250afb7ec
6
+ metadata.gz: c014786d12349c161f38d17d5249156fc206e21fa43da1061d4237f72778a17ca2190353eb99d6a004ae39a2a5abbe9a9bbede7c0aaff187aa8fd62c2f3f3f4d
7
+ data.tar.gz: 16590d5c8313f1570612c1fc7d0308a0e3b848ed8cc8bb20c5afcb9ce073434abec5a68383c70f2e5896b51c77d5d242e62dcbfc583157655b23e79d03dfb1d5
@@ -1,5 +1,5 @@
1
1
  module Rectify
2
- module Controller
2
+ module ControllerHelpers
3
3
  def self.included(base_class)
4
4
  base_class.helper_method(:presenter)
5
5
  end
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.fetch(mimicked_model_name, {}).merge(additional_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]
@@ -23,7 +23,9 @@ module Rectify
23
23
  attr_reader :controller
24
24
 
25
25
  def view_context
26
- controller && controller.view_context
26
+ @view_context ||= begin
27
+ controller && controller.view_context
28
+ end
27
29
  end
28
30
  end
29
31
  end
@@ -1,3 +1,3 @@
1
1
  module Rectify
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
data/lib/rectify.rb CHANGED
@@ -9,4 +9,4 @@ require "rectify/form"
9
9
  require "rectify/command"
10
10
  require "rectify/save_command"
11
11
  require "rectify/presenter"
12
- require "rectify/controller"
12
+ require "rectify/controller_helpers"
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. Commonly,
36
- business logic is either placed in the controller or the model and the views are filled with too much logic. The opinion of Rectify is that these places are incorrect and that your models in particular are doing too much.
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 clean
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 user to register an account. This creates a user, sends some emails, does some special auditing and integrates with a third party system:
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::Controller
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 required for the
75
- action and the `RegisterAccount` Command encapsulates the business logic of registering
76
- a new account. The controller is clean and business logic now has a natural home:
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 model:
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 "model"
137
- it should mimic. In the example above, it will mimic the `User` model as it removes
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: `users_path`.
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 fulfil some of the requirements of ActiveModel
182
- so your forms will work with form builders. For example, your form object has a
183
- `#persisted?` method. Your form object is never persisted so technically this
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. This
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 the
214
- root of the params hash and populate the rest of the form attributes from within
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` above).
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 it.
269
- Rectify forms are designed to be lightweight representations of the data you want
270
- to collect or show in your forms, not something that is linked to a model. This
271
- allows you to create any form that you like which doesn't need to match the
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 your
280
- form as well as any (deeply) nested form objects and array attributes that contain
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 strong
286
- parameters. That's because with Form Objects you do not need strong parameters.
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 some
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 `.call`
371
- method also allows you to supply a block where you can handle the events that may
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 is
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 organised and maintainable.
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::Controller` module in your
424
- controller. You pass a hash of the variables you wish to expose to the view and
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 Presenter
427
- or the Presenter doesn't have a matching attribute then `expose` will set an
428
- instance variable of the same name. See below for more details about Presenters.
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::Controller
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 information
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. These
457
- are also known as an "exhibit", "view model", "view object" or just a "view" (Rails
458
- views are actually templates, but anyway). To avoid confusion Rectify calls these
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 provide
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) `attribute`
470
- declaration. Inside a Presenter you have access to all view helper methods so
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 it
486
- accessible to your views. There are two ways to do that. The first way is to just
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 views
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 `Rectify::Controller`
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::Controller
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::Controller
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 `presenter`
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 but just setting
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::Controller
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::Controller`). You can use this anywhere in the controller
578
- action including the Command handler block. If you have set a Presenter for the
579
- view then `expose` will try to set an attribute on that presenter. If there is
580
- no Presenter or the Presenter doesn't have a matching attribute then `expose`
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::Controller
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 doesn't
603
- ship with a built in way to create a decorator but we recommend either using
604
- [Draper](https://github.com/drapergem/draper) or you can roll your own using
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 Presenters?".
640
- You could create `forms`, `commands` and `presenters` folders and follow the Rails Way.
641
- Rectify suggests grouping your classes by feature rather than by pattern. For example,
642
- create a folder called `core` (this can be anything) and within that, create a
643
- folder for each broad feature of your application. Something like the following:
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
- │   ├── fulfilment
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 follow
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 your
678
- app is pretty much just basic CRUD then you are unlikely to get much benefit from
679
- this. However, if your app is more than just CRUD then you should see an
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 whole
684
- system in your head. Personally I would prefer that as maintaining it will be
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 these
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 way
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.1.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-16 00:00:00.000000000 Z
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/controller.rb
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