Method: ActionDispatch::Http::MimeNegotiation#variant=

Defined in:
lib/action_dispatch/http/mime_negotiation.rb

#variant=(variant) ⇒ Object

Sets the variant for the response template.

When determining which template to render, Action View will incorporate all variants from the request. For example, if an ‘ArticlesController#index` action needs to respond to `request.variant = [:ios, :turbo_native]`, it will render the first template file it can find in the following list:

  • ‘app/views/articles/index.html+ios.erb`

  • ‘app/views/articles/index.html+turbo_native.erb`

  • app/views/articles/index.html.erb

Variants add context to the requests that views render appropriately. Variant names are arbitrary, and can communicate anything from the request’s platform (:android, :ios, :linux, :macos, :windows) to its browser (:chrome, :edge, :firefox, :safari), to the type of user (:admin, :guest, :user).

Note: Adding many new variant templates with similarities to existing template files can make maintaining your view code more difficult.

#### Parameters

  • variant - a symbol name or an array of symbol names for variants used to render the response template

#### Examples

class ApplicationController < ActionController::Base
  before_action :determine_variants

  private
    def determine_variants
      variants = []

      # some code to determine the variant(s) to use

      variants << :ios if request.user_agent.include?("iOS")
      variants << :turbo_native if request.user_agent.include?("Turbo Native")

      request.variant = variants
    end
end


137
138
139
140
141
142
143
144
145
# File 'lib/action_dispatch/http/mime_negotiation.rb', line 137

def variant=(variant)
  variant = Array(variant)

  if variant.all?(Symbol)
    @variant = ActiveSupport::ArrayInquirer.new(variant)
  else
    raise ArgumentError, "request.variant must be set to a Symbol or an Array of Symbols."
  end
end