Sha256: 342b1f88c631c603f03989aefdac9216cfab203064d23388aad9dbcbe7c230bb
Contents?: true
Size: 1.85 KB
Versions: 1
Compression:
Stored size: 1.85 KB
Contents
module PageParts module ActiveRecordExtension extend ActiveSupport::Concern included do class_attribute :page_parts_definitions, :instance_writer => false self.page_parts_definitions = { :keys => [] } has_many :page_parts, :as => :partable, :dependent => :destroy, :autosave => true accepts_nested_attributes_for :page_parts, :reject_if => :all_blank, :allow_destroy => true end module ClassMethods ## PageParts # Enable page parts in your model: # # page_parts :main, :left, :sidebar # def page_parts(*args) options = args.extract_options! self.page_parts_definitions[:keys] += args.map(&:to_s) args.each do |attr_name| define_method(attr_name) do page_part(attr_name).try(:content) end define_method("#{attr_name}=") do |value| record = page_part(attr_name) record.content = value end end end end module InstanceMethods # Find page part by key or build new record def find_or_build_page_part(attr_name) key = normalize_page_part_key(attr_name) self.page_parts.where(:key => key).first || self.page_parts.build(:key => key) end # Save page parts records into one hash def page_part(attr_name) key = normalize_page_part_key(attr_name) @page_part ||= {} @page_part[key] ||= find_or_build_page_part(key) end protected def normalize_page_part_key(value) key = value.to_s.downcase.strip unless self.page_parts_definitions[:keys].include?(key) raise NoMethodError, "Page part #{key} not registered" end key end end end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
page_parts-0.0.1 | lib/page_parts/active_record_extension.rb |