Class: Layout

Inherits:
Record show all
Defined in:
lib/yodel/models/pages/layout.rb

Direct Known Subclasses

FileLayout, PersistentLayout

Constant Summary collapse

MAX_LOCK_ATTEMPTS =

FIXME: is this appropriate? how long does each attempt take?

1000

Constants inherited from AbstractRecord

AbstractRecord::CALLBACKS, AbstractRecord::FIELD_CALLBACKS, AbstractRecord::ORDERS

Instance Attribute Summary

Attributes inherited from Record

#mixins, #model, #model_record, #real_record

Attributes inherited from SiteRecord

#site

Attributes inherited from AbstractRecord

#changed, #errors, #stash, #typecast, #values

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Record

#all_children, #append_to_siblings, #children_and_self, #collection, #content, #create_eigenmodel, #create_mixin_instances, #default_values, #delegate_mixins, #destroy_children, #field_sections, #fields, #first_non_blank_response_to, #first_parent, #first_response_to, #get_binding, #has_eigenmodel?, #initialize, #insert_in_siblings, #inspect_hash, #load_model, #model_name, #parent?, #parents, #perform_reload, #prepare_reload_params, #remove_eigenmodel, #remove_from_siblings, #root?, #run_record_after_create_callbacks, #run_record_after_destroy_callbacks, #run_record_after_save_callbacks, #run_record_after_update_callbacks, #run_record_after_validation_callbacks, #run_record_before_create_callbacks, #run_record_before_destroy_callbacks, #run_record_before_save_callbacks, #run_record_before_update_callbacks, #run_record_before_validation_callbacks, #set_content, #siblings, #to_str, #update_search_keywords, #user_allowed_to?, #user_allowed_to_create?, #user_allowed_to_delete?, #user_allowed_to_update?, #user_allowed_to_view?

Methods inherited from SiteRecord

#default_values, #initialize, #inspect_hash, #perform_reload, #prepare_reload_params, #site_id

Methods included from SiteModel

#load, #scoped, #scoped_for

Methods included from MongoModel

#collection, #load, #scoped

Methods included from AbstractModel

#embed_many, #embed_one, #field, #fields, #many, #modify_field, #one, #remove_field

Methods inherited from MongoRecord

#collection, #default_values, #fields, #id, #increment!, #inspect_hash, #load_from_mongo, #load_mongo_document, #perform_destroy, #perform_reload, #perform_save, #set_id

Methods inherited from AbstractRecord

#changed!, #changed?, #clear_key, #default_values, #destroy, #destroyed?, #eql?, #errors?, #field, #field?, #field_was, #fields, #from_json, #get, #get_meta, #get_raw, #hash, #id, #increment!, inherited, #initialize, #inspect, #inspect_hash, #inspect_value, #method_missing, #new?, #prepare_reload_params, #present?, #reload, #save, #save_without_validation, #search_terms, #set, #set_meta, #set_raw, #to_json, #to_str, #trigger_field_callback, #update, #valid?

Constructor Details

This class inherits a constructor from Record

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class AbstractRecord

Class Method Details

.reload_layouts(site) ⇒ Object

in development, all layout records are destroyed and recreated each refresh, so the database view of the layout structure is consistent with what is on disk. FileLayout objects lazy load the layout from disk as needed. In production, PersistentLayout records store the layout markup in the database.



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/yodel/models/pages/layout.rb', line 9

def self.reload_layouts(site)
  # acquire a lock on the site to prevent multiple reloads colliding
  attempts = 0
  updated = 0

  # sites created in production that are yet to be pushed to won't have
  # any models (including layouts) or any layouts to load
  return if site.model_types['layouts'].nil?
  
  while updated == 0 && attempts < MAX_LOCK_ATTEMPTS
    updated = Site.collection.update(
      {'_id' => site.id, 'layout_lock' => {'$exists' => false}},
      {'$set' => {'layout_lock' => true}},
      safe: true)['n']
    attempts += 1
  end
  
  raise UnableToAcquireLock if attempts == MAX_LOCK_ATTEMPTS
    
  # lock has been acquired, this section is guarded
  site.layouts.all.each(&:destroy)
  Yodel.mime_types.each do |mime_type|
    mime_type_name = mime_type.name.to_s
    mime_type_extensions = mime_type.extensions.join(',')
    site.layout_directories.each do |directory|
      scan_folder(directory, site, mime_type_name, mime_type_extensions, nil)
    end
  end

# release the lock
ensure
  if attempts != 0
    updated = Site.collection.update(
      {'_id' => site.id, 'layout_lock' => {'$exists' => true}},
      {'$unset' => {'layout_lock' => 1}},
      safe: true)['n']
    raise InconsistentLockState if updated != 1
  end
end

.render(name, &block) ⇒ Object



58
59
60
# File 'lib/yodel/models/pages/layout.rb', line 58

def self.render(name, &block)
  define_method("render_#{name}", block)
end

Instance Method Details

#render(page) ⇒ Object



49
50
51
52
53
54
55
56
# File 'lib/yodel/models/pages/layout.rb', line 49

def render(page)
  method = "render_#{Yodel.mime_types[mime_type.to_sym].layout_processor}"
  if respond_to?(method)
    send(method, page)
  else
    render_default(page)
  end
end