Sha256: 384b84a3189f2d418dca1957b430d2a8a3d73f301bb40f3c0bfab5fe9403eac6

Contents?: true

Size: 1.75 KB

Versions: 12

Compression:

Stored size: 1.75 KB

Contents

module Smithy
  class Template < ActiveRecord::Base
    validates_presence_of :name
    validates_uniqueness_of :name, :scope => :template_type
    validates_presence_of :content, :on => :update

    has_many :pages
    has_many :containers, :class_name => "Smithy::TemplateContainer"

    before_save :uncache_liquid_template_if_content_changed
    after_save :load_containers
    after_save :touch_pages

    default_scope -> { order(:name) }
    scope :javascripts, -> { where(:template_type => "javascript") }
    scope :partials, -> { where(:template_type => "include") }
    scope :stylesheets, -> { where(:template_type => "stylesheet") }
    scope :templates, -> { where(:template_type => "template") }

    class << self
      def types
        %w(template include javascript stylesheet)
      end
    end
    validates_inclusion_of :template_type, :in => types # has to be after the class method definition

    def liquid_template
      @liquid_template ||= Rails.cache.fetch("#{self.cache_key}-liquid_template") do
        ::Liquid::Template.parse(self.content)
      end
    end

    private
      def load_containers
        return unless self.template_type == 'template'
        container_names = liquid_template.root.nodelist.select{|n| n.is_a?(::Liquid::Variable) && n.name.match(/^page\.container\.(.*)/) }.map{|n| n.name.match(/^page\.container\.(.*)/)[1] }
        self.containers = container_names.inject([]) do |containers, container_name|
          containers.push Smithy::TemplateContainer.new(:name => container_name, :position => containers.size)
        end
      end

      def touch_pages
        self.pages.each(&:touch)
      end

      def uncache_liquid_template_if_content_changed
        @liquid_template = nil if self.content_changed?
      end
  end
end

Version data entries

12 entries across 12 versions & 1 rubygems

Version Path
smithycms-0.6.2 app/models/smithy/template.rb
smithycms-0.6.1 app/models/smithy/template.rb
smithycms-0.5.2 app/models/smithy/template.rb
smithycms-0.6.0 app/models/smithy/template.rb
smithycms-0.5.1 app/models/smithy/template.rb
smithycms-0.5.0 app/models/smithy/template.rb
smithycms-0.4.5 app/models/smithy/template.rb
smithycms-0.4.4 app/models/smithy/template.rb
smithycms-0.4.3 app/models/smithy/template.rb
smithycms-0.4.2 app/models/smithy/template.rb
smithycms-0.4.1 app/models/smithy/template.rb
smithycms-0.4.0 app/models/smithy/template.rb