I learned from my mistake in falling behind when Rails 3 came behind, so I’m trying to get a jump on Rails 4. Skip straight to my summary if you don’t want to watch the 20 minute video right now
ActiveRecord
- Array and hstore support for Postgres
- Model.all is now an ActiveRecord Relation vs loading records immediately, Model.all.to_a now gives you former Model.all behavior
- Model.scoped is deprecated
- Model.none (no idea why anybody would use this)
- Model.not.where() inverts/negates the scope/where clause
- chaining scopes to an active Relation object is possible with an ! at the end of the scope. This option mutates the current Relations object for you, so you don’t have to assign the new chain to a variable
- Model.find_by, Model.find_or_create_by now accepts a hash so that its Model.find_by(name: “Hello), stops dependence on method missing implementation of find_by_xxxx
- Model.find_or_create_by is deprecated but Model.find_by is not
- using an object as an Active Model object is easier, just include a module, used to be a bit more tedious
- in scopes you could pass in another scope as a second argument, now it has to be a callable object (like a lambda) this is to avoid passing in something Dynamic like Time.now by accident
- Model.update_attributes method has been renamed to just Model.update (probably to avoid confusion with update_attribute?)
Controllers
- the placeholder index.html file doesn’t exist anymore, dynamically generated
- turbolinks
- before_filter is renamed to before_action … won’t be deprecated though
- update action responds to PUT or PATCH, PUT might be deprecated
- support for strong parameters is built right in ( checkout Railscast Ep 371), better option that attar_accessible
- means that we don’t need attr_accessible in models but if you want that behavior still, you can use the protected attributes gem
- concerns. Designed to add modules which encapsulates behavior that you want to share among controllers/models. Ryan doesn’t care much for it, will add it in as needed in his apps (see Railscast ep 398)
- ActionController live (will be covered in future ep)
Views
- collections. collection_check_boxes, collections_radio_buttons. Can be used to handle associations or array attributes in forms more easily.
- helpers for html5 input types. date_field vs date_select (for example). Spits out html5 date control or just select input depending on the browser
- support for custom templating with .ruby extension. Probably limited usage for html, but useful for json (more in ep 379)
- cache Digest/Russian doll caching (more in ep 387)
Routes
- concerns, helps remove duplication in routes.
- match method is no longer supported (wtf?) have to change them from that to the right verb i.e get/patch/post
- if you supply constraints to a route its going to turn into a default attribute when you generate the url, so it forces the url to match the constraints. very cool
- new exception page, if its a routing error, you get all the routes in the app listed after it (kinda silly if you ask me)
- you can get all the routes in the app from /rails/info/routes
Other
- ability to specify console config options in application.rb with console block
- config.eager_load is default in production.rb so the entire app is loaded on start instead of autoloading, that helps keep Rails thread safe
- config.threadsafe! has been deprecated (more in ep 365)
- test directory is now structured differently, controllers, models, mailers vs functional, unit directories (big one here)
- Test::Unit now uses minitest under the hood which allows us to use rspec like syntax in Test::Unit
Removed
- Active Resource
- Model Observers
- Page & action Caching
- Disabling cache by default
- all available as gems if needed