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 routes ``` **running tests:** ``` bin/rake test bin/rake test test/models bin/rake test test/models/user_test.rb ``` **running a console:** ``` 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 will generate a new `secrets.yml` file in the `config` folder for new applications. 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 will be accessible via `Rails.application.secrets`. For example, with the following `secrets.yml`: ```yaml development: secret_key_base: 3b7cd727ee24e8444053437c36cc66c3 some_api_key: SOMEKEY ``` `Rails.application.secrets.some_api_key` will return `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 makes 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 Preview email templates in the browser without delivering them. ```ruby class NotifierPreview < ActionMailer::Preview # Accessible from http://localhost:3000/rails/mailers/notifier/welcome def welcome Notifier.welcome(User.first) end end ``` By default, these preview files live in test/mailers/previews. This can be configured using the preview_path option. See [action_mailer/base.rb](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 [active_record/enum.rb](api.rubyonrails.org/v4.1.0/classes/ActiveRecord/Enum.html) for a detailed write up. ### Application message verifier Create a message verifier that can be used to generate and verify signed messages in the application. ```ruby message = Rails.application.message_verifier('salt').generate('my sensible data') Rails.application.message_verifier('salt').verify(message) # => 'my sensible data' ``` ### 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. ### CSRF protection from remote `