分享 Action Pack Variants

linjunpop · December 04, 2013 · 2987 hits

https://github.com/rails/rails/commit/2d3a6a0cb8df0360dd588a4d2fb260dd07cc9bcf

.

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:

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:

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.

No Reply at the moment.
You need to Sign in before reply, if you don't have an account, please Sign up first.