分享 Action Pack Variants

linjunpop · 2013年12月04日 · 3001 次阅读

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.

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请 注册新账号