Class: ActionView::LookupContext

Inherits:
Object
  • Object
show all
Includes:
Accessors, DetailsCache, ViewPaths
Defined in:
lib/action_view/lookup_context.rb

Overview

Action View Lookup Context

LookupContext is the object responsible to hold all information required to lookup templates, i.e. view paths and details. The LookupContext is also responsible to generate a key, given to view paths, used in the resolver cache lookup. Since this key is generated just once during the request, it speeds up all cache accesses.

Defined Under Namespace

Modules: Accessors, DetailsCache, ViewPaths Classes: DetailsKey

Constant Summary collapse

@@fallbacks =
FallbackFileSystemResolver.instances

Instance Attribute Summary collapse

Attributes included from ViewPaths

#html_fallback_for_js, #view_paths

Attributes included from DetailsCache

#cache

Class Method Summary collapse

Instance Method Summary collapse

Methods included from ViewPaths

#exists?, #find, #find_all, #with_fallbacks

Methods included from DetailsCache

#details_key, #disable_cache

Constructor Details

#initialize(view_paths, details = {}, prefixes = []) ⇒ LookupContext

Returns a new instance of LookupContext.



192
193
194
195
196
197
198
199
200
201
# File 'lib/action_view/lookup_context.rb', line 192

def initialize(view_paths, details = {}, prefixes = [])
  @details, @details_key = {}, nil
  @skip_default_locale = false
  @cache = true
  @prefixes = prefixes
  @rendered_format = nil

  self.view_paths = view_paths
  initialize_details(details)
end

Instance Attribute Details

#prefixesObject

:nodoc:



14
15
16
# File 'lib/action_view/lookup_context.rb', line 14

def prefixes
  @prefixes
end

#rendered_formatObject

:nodoc:



14
15
16
# File 'lib/action_view/lookup_context.rb', line 14

def rendered_format
  @rendered_format
end

Class Method Details

.register_detail(name, options = {}, &block) ⇒ Object



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/action_view/lookup_context.rb', line 22

def self.register_detail(name, options = {}, &block)
  self.registered_details << name
  initialize = registered_details.map { |n| "@details[:#{n}] = details[:#{n}] || default_#{n}" }

  Accessors.send :define_method, :"default_#{name}", &block
  Accessors.module_eval <<-METHOD, __FILE__, __LINE__ + 1
    def #{name}
      @details.fetch(:#{name}, [])
    end

    def #{name}=(value)
      value = value.present? ? Array(value) : default_#{name}
      _set_detail(:#{name}, value) if value != @details[:#{name}]
    end

    remove_possible_method :initialize_details
    def initialize_details(details)
      #{initialize.join("\n")}
    end
  METHOD
end

Instance Method Details

#formats=(values) ⇒ Object

Override formats= to expand [“/”] values and automatically add :html as fallback to :js.



205
206
207
208
209
210
211
212
213
214
# File 'lib/action_view/lookup_context.rb', line 205

def formats=(values)
  if values
    values.concat(default_formats) if values.delete "*/*"
    if values == [:js]
      values << :html
      @html_fallback_for_js = true
    end
  end
  super(values)
end

#localeObject

Override locale to return a symbol instead of array.



223
224
225
# File 'lib/action_view/lookup_context.rb', line 223

def locale
  @details[:locale].first
end

#locale=(value) ⇒ Object

Overload locale= to also set the I18n.locale. If the current I18n.config object responds to original_config, it means that it has a copy of the original I18n configuration and it’s acting as proxy, which we need to skip.



230
231
232
233
234
235
236
237
# File 'lib/action_view/lookup_context.rb', line 230

def locale=(value)
  if value
    config = I18n.config.respond_to?(:original_config) ? I18n.config.original_config : I18n.config
    config.locale = value
  end

  super(@skip_default_locale ? I18n.locale : default_locale)
end

#skip_default_locale!Object

Do not use the default locale on template lookup.



217
218
219
220
# File 'lib/action_view/lookup_context.rb', line 217

def skip_default_locale!
  @skip_default_locale = true
  self.locale = nil
end

#with_layout_formatObject

Uses the first format in the formats array for layout lookup.



240
241
242
243
244
245
246
247
248
249
250
251
252
253
# File 'lib/action_view/lookup_context.rb', line 240

def with_layout_format
  if formats.size == 1
    yield
  else
    old_formats = formats
    _set_detail(:formats, formats[0,1])

    begin
      yield
    ensure
      _set_detail(:formats, old_formats)
    end
  end
end