rails/rails — pull request #12977 by strzalek (2013-11-21 01:11:33+00:00)
Title: Action Pack Variants

By default, variants in the templates will be picked up if a variant is set and
there's a match. The format will be:

```
app/views/projects/show.html.erb
app/views/projects/show.html+tablet.erb
app/views/projects/show.html+phone.erb
```

If `request.variant = :tablet` is set, we'll automatically be rendering the html+tablet template.

In the controller, we can also tailer to the variants with this syntax:

```ruby
class ProjectsController < ActionController::Base
def show
respond_to do |format|
format.html do |html|
@stars = @project.stars

html.tablet { @notifications = @project.notifications }
html.phone { @chat_heads = @project.chat_heads }
end

format.js
format.atom
end
end
end
```

The variant itself is nil by default, but can be set in before filters, like so:

```ruby
class ApplicationController < ActionController::Base
before_action do
if request.user_agent =~ /iPad/
request.variant = :tablet
end
end
end
```

This is modeled loosely on custom mime types, but it's specifically not intended
to be used together. If you're going to make a custom mime type, you don't need
a variant. Variants are for variations on a single mime types.

/cc @dhh @josevalim