slides with notes from ruby conf 2014 on using simple techniques to create slimer, clearer models,...
DESCRIPTION
Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails. Looks better at http://www.slideshare.net/justingordon/rails-conf-2014concernsdecoratorspresentersserviceobjectshelpershelpmedecideapril222014 blog: http://www.railsonmaui.com Code samples: https://github.com/justin808/fat-code-refactoring-techniquesTRANSCRIPT
![Page 1: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/1.jpg)
R A I L S O N M A U I
1
![Page 2: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/2.jpg)
Concerns, Decorators, Presenters, Service Objects, Helpers, Help me Decide!
RailsConf 2014 Chicago
April 22, 2014 !
Justin Gordon @railsonmaui
Rails Consultant www.railsonmaui.com
2
![Page 3: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/3.jpg)
3
ControllerModel &
![Page 4: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/4.jpg)
Avoid the Ball of Mud
May seem fun… !
Guaranteed: the perpetrator is
not doing the cleanup!
4
• Show Redmine, • AccountsController, lost_password action • UserModel, big class, 762 Lines
![Page 5: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/5.jpg)
5
Sandi Rules method > 5 lines class > 100 lines 😱
![Page 6: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/6.jpg)
6
How do we organize the mess?
![Page 7: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/7.jpg)
Organizational Conventions Matter
7
Department Store
What if the clothing store was organized by color? What if a clothing store was organized by size?
![Page 8: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/8.jpg)
Organizational Conventions Matter
8
Thrift Store
What if no organization?
![Page 9: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/9.jpg)
Like Fashion… Coding Style ➜ Personal Preference
9
• Coding is like writing! • Tons of disagreement in the Rails community over names, patterns, etc. • But let’s agree on a few things..
![Page 10: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/10.jpg)
And Our Style is…
10
Prefer the Rails default framework (Models, Model Concerns, Controllers, Controller Concerns) Know Rails really well! Assume team members also know rails!
![Page 11: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/11.jpg)
DHH QuoteJG: "This is starting to boil down to utilize the framework capabilities and move beyond only when necessary.”
DHH: "Which is really just an extension of KISS (Keep It Simple, Stupid). When you use the framework code for what it’s intended, you’re not cutting against the grain. You don’t need to write as much code. It’s clearer to everyone because it’s the same approach everyone else is taking."
11
![Page 12: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/12.jpg)
Microposts Example
12
Micropost Model
User Model
Micropost Controller
User Controller
1
N
![Page 13: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/13.jpg)
Refactoring Examples in Pull Requests
• https://github.com/justin808/fat-code-refactoring-techniques/pulls
• Based on Michael Hartl’s “Rails Tutorial” MicroBlog example application
13
• Github PRs are the most AMAZING place to discuss code! • Clean up the Microblog code a little, demonstrating: Concerns, Decorators, and Presenters. • Refactor Micropost Create Action (fat controller method)
![Page 14: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/14.jpg)
Objectives
Patterns & Techniques
14
DRY
Methods < 5 Lines
Classes < 100 lines
One Instance Variable in View
Easy to Test
ConcernsDraper
Decorators
Validation Classes
Presenters
Split-up Controllers
ClarityEasy to Change
Guidelines
Move Logic to Models
Easy to Find
Where we’re going with this talk…The first technique is Concerns.
![Page 15: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/15.jpg)
• Huge model file with even larger spec file.
• Break up the model/spec using Rails concerns. Try to break it up by domain, but any logical split will help.
15
Scenario
If you will have multiple concerns for only one model, group the concerns inside of a module.
![Page 16: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/16.jpg)
Scenario
• You’ve got duplicated code in two models, different database tables.
• Tease out a concern that applies to both models. Since your
models extend ActiveRecord::Base, using regular
inheritance is problematic. Instead, use a concern.
16
![Page 17: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/17.jpg)
Rails Concerns
17
Big Model
class macros (has_many, validates, etc.)
instance methods
class methods
![Page 18: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/18.jpg)
Rails Concerns
18
Big Model
some-domain class macros
some-domain instance methods
some-domain class methods
other class macros
other instance methods
other class methods
Domain Concern
some-domain class macrossome-domain instance methodssome-domain class methods
Mix-ins on models and controllers. Mention controllers as well as models.
![Page 19: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/19.jpg)
Concerns: How
• Discover set of related code for a problem domain
• Create a module with extends ActiveSupport::Concern
• Move code into the Concern
• Break out tests into corresponding test file for the Concern
19
Simple, safe, easy “refactoring” You could use Ruby’s “include”, “included”, and “extend”… But, not as simple
![Page 20: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/20.jpg)
DHH on Domain vs. Technical Refactoring
"I’ve not yet found a case where the scope of the current file/class couldn’t be brought under control by using a domain-driven extraction approach."
"In a sea of 60 methods, there will always be domain-based groupings, rather than technical groupings. Never seen that not be the case."
20
"There’s not going to be one solution to all big files. My preferred default is “break up using DOMAIN concerns (not technical ones)”, unless there’s a “missing object” screaming to be liberated."
![Page 21: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/21.jpg)
Concerns: Example
• Break out Emailable Concern out of User model
• Captures domain logic of lower case emails on user model
• Benefits: Smaller model, smaller spec
21
![Page 22: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/22.jpg)
Objectives
Patterns & Techniques
22
DRY
Methods < 5 Lines
Classes < 100 lines
One Instance Variable in View
Easy to Test
ConcernsDraper
Decorators
Validation Classes
Presenters
Split-up Controllers
ClarityEasy to Change
Guidelines
Move Logic to Models
Easy to Find
Where we’re going with this talk…
![Page 23: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/23.jpg)
Scenario
• Model file creating detailed validation messages with HTML tags and URL links.
• Move the message creation code into a Draper Decorator for the model. These decorators work great for model based presentation code.
23
![Page 24: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/24.jpg)
Draper Decorators
24
Mode and Model-
Concerns
Presentation Code (views,
helpers)
![Page 25: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/25.jpg)
Draper Decorators
25
Mode and Model-
Concerns
Presentation Code (views,
helpers)
Draper Decorators
![Page 26: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/26.jpg)
Draper Decorators: What?
• Popular gem that facilitates model decorators
• Very simple, easy to use
26
![Page 27: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/27.jpg)
Draper Decorators: Why?• Removing presentation code from your model or model-
concerns
• Consolidating some helper, view, controller methods by models
• Presentation code relating to one model, but multiple controllers/views
• Consolidation of flash messages related to a given model
27
![Page 28: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/28.jpg)
Draper Decorators: Why• Decorators are the ideal place to:
• format complex data for user display
• define commonly-used representations of an object, like a name method that combines first_name and last_name attributes
• mark up attributes with a little semantic HTML, like turning a url field into a hyperlink
28
![Page 29: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/29.jpg)
Draper Decorators: Alternatives
• View Helpers
• PORO, getting a handle to the controller or view
29
![Page 30: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/30.jpg)
Example
Several views have code that format the micropost.created_at: !
Posted <%= time_ago_in_words(micropost.created_at) %> ago.
30
![Page 31: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/31.jpg)
Scenario• You have duplicated rendering code in several files.
• Remedy:
1. If rendering code, use a partial.
2. If ruby code, use either a view helper or create a static method on a utility class. View helpers have access other helpers. Utility classes require extra work to call view context methods.
31
![Page 32: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/32.jpg)
Objectives
Patterns & Techniques
32
DRY
Methods < 5 Lines
Classes < 100 lines
One Instance Variable in View
Easy to Test
ConcernsDraper
Decorators
Validation Classes
Presenters
Split-up Controllers
ClarityEasy to Change
Guidelines
Move Logic to Models
Easy to Find
!
![Page 33: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/33.jpg)
Scenario
• You are setting too many instance variables in the controller action. You also have local variables being assigned in the view.
• Presenter pattern: Create a PORO that wraps up the values and logic going from the controller to the view.
33
![Page 34: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/34.jpg)
Scenario
• Fragment caching in your view, but some extra queries still run
• Use the Presenter pattern, with memoization in the instance methods.
• @foobar ||= calculate_foobar
34
Problem is the queries are invoked before the cache block.
![Page 35: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/35.jpg)
Presenters
35
Presenter Object Wrapping Data Needed by View
Smaller Controller Action Creating Only the Presenter Instance
Big Controller Action Setting Many Instance
Variables
View with ONE Instance Variable
View with MANY Instance Variables
beforeafter
![Page 36: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/36.jpg)
Scenario• Problem: A controller file is huge with many actions and many more
private methods.
• Solution:
1. Split up the controller into multiple files by having your routing file map to different controllers.
2. Put any common functionality in a controller concern, similar to how you would do it for a model. An alternative is having an inheritance hierarchy of controllers. Mix-ins are more flexible.
36
![Page 37: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/37.jpg)
Scenario• Problem:
• Your Presenter class needs to access the view context, but it’s PORO.
• Solution:
1. Use this include in your PORO: “include Draper::ViewHelpers”.
2. Pass the controller instance into the constructor of the Presenter (include required helpers in controller), or set the view context in the view file.
3. Pass the view context into the methods that need it on the Presenter.
37
![Page 38: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/38.jpg)
Objectives
Patterns & Techniques
38
DRY
Methods < 5 Lines
Classes < 100 lines
One Instance Variable in View
Easy to Test
ConcernsDraper
Decorators
Validation Classes
Presenters
Split-up Controllers
ClarityEasy to Change
Guidelines
Move Logic to Models
Easy to Find
!
![Page 39: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/39.jpg)
39
If a minor posts profane words: !
1. The post shall not be valid. 2. A counter will track how many times the
minor tried to use profanity. 3. The minor's parents shall be notified. 4. A special flash alert will alert the minor to
profanity usage.
Business Case
Original Idea is to show refactoring to Service Objects!
![Page 40: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/40.jpg)
–David Heinemeier Hansson
“I've yet to see a compelling "make action a service object" example in the wild. Maybe they exist somewhere, though. Then again,
maybe unicorns are real too.”
40
https://gist.github.com/dhh/10022098
Service Objects?
![Page 41: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/41.jpg)
Service Objects Example
41
Big Micropost Create Action on Controller
MicropostCreationService
ControllerResponse Flash, Flash-now, status code
Tiny Micropost Create Action on
Controller
https://github.com/justin808/fat-code-refactoring-techniques/pull/6
beforeafter
Created class ControllerResponse to package up the return message from the “ServiceObject” to the controller. Too much overlap with Controller!
![Page 42: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/42.jpg)
A Bit Humbling…DHH: "Sorry to keep shooting the patterns down, but this is exactly what I mean when I say that most code does not need patterns, it just needs to be rewritten better."
JG: "I think it's a pattern either way. The pattern you presented is to use validators rather than a separate object."
DHH: Right, which Rails already has built in, and the code is easier to follow with less work.
42
![Page 43: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/43.jpg)
Single Purpose Controller• Controller with only one action
• https://github.com/justin808/fat-code-refactoring-techniques/pull/7
43
Big Micropost Create Action on
Controller
Micropost Controller Just for Create
Rest of the Micropost Controller
Left too much biz logic in controller
![Page 44: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/44.jpg)
DHH on Controllers“It’s [controller] intended to process the incoming request, fetch the model, and direct the user to a view or another action. If you’re yanking logic of that nature out of the controller, you’re
making an anemic controller. Shoving this into a service object is imo the lazy approach that doesn’t deliver any benefits in terms of simpler code. It imo is the sweep-it-under-the-rug approach.
44
![Page 45: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/45.jpg)
DHH on the work of a Controller
"I’ve yet to see compelling controller code that couldn’t be slimmed down by simply writing it better, spinning off another controller, or moving domain logic to the model. Here’s another example of a code ping pong I did off a convoluted action in RedMine: https://gist.github.com/dhh/10023987”
45
![Page 46: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/46.jpg)
Plain Rails
46
Big Micropost Create Action on Controller
Micropost Model
User ModelSmall Micropost Create Action on
Controllerbefore
after
MicropostController interacts with both models. No extra classes. Move validation code and checks out of controller to model Move creation of flash message to decorator Move validation code to validation class
![Page 47: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/47.jpg)
Scenario• Excessive model logic in complicated controller method.
• Either:
• Move model logic out of controller and into the models, utilizing Rails features such as validation.
• Create a non-AR based model to handle an interaction between two models (aka “Service Object”)
47
![Page 48: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/48.jpg)
POR (Plain Old Rails)• Use Rails Models, Validation, and Controller for their proper
jobs
• KISS (Keep It Simple Stupid)
• Don’t Invent Patterns That Don’t Need to be Invented
• Know the why of the Rails way
• Know the Rails way before deviating
48
![Page 49: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/49.jpg)
Refactoring Steps
• Move validation code and checks out of controller to model
• Move creation of flash message to decorator
• Move validation code to validation class
49
![Page 50: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/50.jpg)
References
• Rails Guides: http://guides.rubyonrails.org/
• Patterns to Refactor Fat ActiveRecord Models: http://blog.codeclimate.com/blog/2012/10/17/7-ways-to-decompose-fat-activerecord-models/
• DHH’s Example of 2 Controllers with Concerns: https://gist.github.com/dhh/10022098
50
![Page 51: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/51.jpg)
Thanks!Special thanks to those that helped review my code samples to this talk: @dhh, @jeg2, @gylaz, @jodosha, @dreamr, @thatrubylove, @therealadam, @robzolkos, Thoughtbot’s Learn program forum and Ruby Rogues Parley Forum
51
Rails on Maui HQ, aka Sugar Ranch Maui
![Page 52: Slides with notes from Ruby Conf 2014 on using simple techniques to create slimer, clearer models, controllers, and views in Ruby on Rails](https://reader034.vdocuments.net/reader034/viewer/2022052523/555a447cd8b42ae1398b5073/html5/thumbnails/52.jpg)
Thanks!• More details at my blog:
http://www.railsonmaui.com
• Feel free to contact me regarding your projects
• http://airpair.me/railsonmaui
52