Sha256: cd22302efa8c98f4a12404e2d246b3b476bdb3fd8ea70358dedb2a26fb31f61d

Contents?: true

Size: 1.84 KB

Versions: 5

Compression:

Stored size: 1.84 KB

Contents

module Fae
  class StaticPage < ActiveRecord::Base

    include Fae::BaseModelConcern
    include Fae::StaticPageConcern

    validates :title, presence: true

    @singleton_is_setup = false

    def self.instance
      setup_dynamic_singleton
      row = includes(fae_fields.keys).references(fae_fields.keys).find_by_slug(@slug)
      row = create(title: @slug.titleize, slug: @slug) if row.blank?
      row
    end

    def self.fae_fields
      {}
    end

    def fae_display_field
      title
    end

  private

    def self.setup_dynamic_singleton
      return if @singleton_is_setup

      fae_fields.each do |name, value|
        type = value.is_a?(Hash) ? value[:type] : value

        define_association(name, type)
        define_validations(name, type, value[:validates]) if value.is_a?(Hash) && value[:validates].present?
      end

      @singleton_is_setup = true
    end

    def self.define_association(name, type)
      send :has_one, name.to_sym, -> { where(attached_as: name.to_s)}, as: poly_sym(type), class_name: type.to_s, dependent: :destroy
      send :accepts_nested_attributes_for, name, allow_destroy: true
      send :define_method, :"#{name}_content", -> { send(name.to_sym).try(:content) }
    end

    def self.define_validations(name, type, validations)
      unique_method_name = "is_#{self.name.underscore}_#{name.to_s}?".to_sym
      slug = @slug
      validations[:if] = unique_method_name
      type.validates(:content, validations)
      type.send(:define_method, unique_method_name) do
        contentable.slug == slug && attached_as == name.to_s if contentable.present?
      end
    end

    def self.poly_sym(assoc)
      case assoc.name
      when 'Fae::TextField', 'Fae::TextArea'
        return :contentable
      when 'Fae::Image'
        return :imageable
      when 'Fae::File'
        return :fileable
      end
    end

  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
fae-rails-1.3.0 app/models/fae/static_page.rb
fae-rails-1.2.5 app/models/fae/static_page.rb
fae-rails-1.2.4 app/models/fae/static_page.rb
fae-rails-1.2.3 app/models/fae/static_page.rb
fae-rails-1.2.2 app/models/fae/static_page.rb