Ruby on Rails 4.1 Release Notes
===============================
Highlights in Rails 4.1:
* Spring application preloader
* `config/secrets.yml`
* Action Pack variants
* Action Mailer previews
These release notes cover only the major changes. To know about various bug
fixes and changes, please refer to the change logs or check out the
[list of commits](https://github.com/rails/rails/commits/master) in the main
Rails repository on GitHub.
--------------------------------------------------------------------------------
Upgrading to Rails 4.1
----------------------
If you're upgrading an existing application, it's a great idea to have good test
coverage before going in. You should also first upgrade to Rails 4.0 in case you
haven't and make sure your application still runs as expected before attempting
an update to Rails 4.1. A list of things to watch out for when upgrading is
available in the
[Upgrading Ruby on Rails](upgrading_ruby_on_rails.html#upgrading-from-rails-4-0-to-rails-4-1)
guide.
Major Features
--------------
### Spring Application Preloader
Spring is a Rails application preloader. It speeds up development by keeping
your application running in the background so you don't need to boot it every
time you run a test, rake task or migration.
New Rails 4.1 applications will ship with "springified" binstubs. This means
that `bin/rails` and `bin/rake` will automatically take advantage of preloaded
spring environments.
**Running rake tasks:**
```
bin/rake test:models
```
**Running a Rails command:**
```
bin/rails console
```
**Spring introspection:**
```
$ bin/spring status
Spring is running:
1182 spring server | my_app | started 29 mins ago
3656 spring app | my_app | started 23 secs ago | test mode
3746 spring app | my_app | started 10 secs ago | development mode
```
Have a look at the
[Spring README](https://github.com/jonleighton/spring/blob/master/README.md) to
see all available features.
See the [Upgrading Ruby on Rails](upgrading_ruby_on_rails.html#spring)
guide on how to migrate existing applications to use this feature.
### `config/secrets.yml`
Rails 4.1 generates a new `secrets.yml` file in the `config` folder. By default,
this file contains the application's `secret_key_base`, but it could also be
used to store other secrets such as access keys for external APIs.
The secrets added to this file are accessible via `Rails.application.secrets`.
For example, with the following `config/secrets.yml`:
```yaml
development:
secret_key_base: 3b7cd727ee24e8444053437c36cc66c3
some_api_key: SOMEKEY
```
`Rails.application.secrets.some_api_key` returns `SOMEKEY` in the development
environment.
See the [Upgrading Ruby on Rails](upgrading_ruby_on_rails.html#config-secrets-yml)
guide on how to migrate existing applications to use this feature.
### Action Pack Variants
We often want to render different HTML/JSON/XML templates for phones,
tablets, and desktop browsers. Variants make it easy.
The request variant is a specialization of the request format, like `:tablet`,
`:phone`, or `:desktop`.
You can set the variant in a `before_action`:
```ruby
request.variant = :tablet if request.user_agent =~ /iPad/
```
Respond to variants in the action just like you respond to formats:
```ruby
respond_to do |format|
format.html do |html|
html.tablet # renders app/views/projects/show.html+tablet.erb
html.phone { extra_setup; render ... }
end
end
```
Provide separate templates for each format and variant:
```
app/views/projects/show.html.erb
app/views/projects/show.html+tablet.erb
app/views/projects/show.html+phone.erb
```
You can also simplify the variants definition using the inline syntax:
```ruby
respond_to do |format|
format.js { render "trash" }
format.html.phone { redirect_to progress_path }
format.html.none { render "trash" }
end
```
### Action Mailer Previews
Action Mailer previews provide a way to visually see how emails look by visiting
a special URL that renders them.
You implement a preview class whose methods return the mail object you'd like
to check:
```ruby
class NotifierPreview < ActionMailer::Preview
def welcome
Notifier.welcome(User.first)
end
end
```
The preview is available in http://localhost:3000/rails/mailers/notifier/welcome,
and a list of them in http://localhost:3000/rails/mailers.
By default, these preview classes live in test/mailers/previews.
This can be configured using the preview_path option.
See its
[documentation](http://api.rubyonrails.org/v4.1.0/classes/ActionMailer/Base.html)
for a detailed write up.
### Active Record enums
Declare an enum attribute where the values map to integers in the database, but
can be queried by name.
```ruby
class Conversation < ActiveRecord::Base
enum status: [ :active, :archived ]
end
conversation.archived!
conversation.active? # => false
conversation.status # => "archived"
Conversation.archived # => Relation for all archived Conversations
```
See its
[documentation](http://api.rubyonrails.org/v4.1.0/classes/ActiveRecord/Enum.html)
for a detailed write up.
### Application Message Verifier
The application message verifier can be used to generate and verify signed
messages in the application. This can be useful for remember-me tokens and
friends:
```ruby
signed_message = Rails.application.message_verifier('salt').generate('my sensible data')
Rails.application.message_verifier('salt').verify(signed_message)
# => 'my sensible data'
Rails.application.message_verifier('salt').verify(tampered_message)
# raises ActiveSupport::MessageVerifier::InvalidSignature
```
### Module#concerning
A natural, low-ceremony way to separate responsibilities within a class:
```ruby
class Todo < ActiveRecord::Base
concerning :EventTracking do
included do
has_many :events
end
def latest_event
...
end
private
def some_internal_method
...
end
end
end
```
This example is equivalent to defining a `EventTracking` module inline,
extending it with `ActiveSupport::Concern`, then mixing it in to the
`Todo` class.
See its
[documentation](http://api.rubyonrails.org/v4.1.0/classes/Module/Concerning.html)
for a detailed write up and the intended use cases.
### CSRF protection from remote `