engine/app/models/extensions/page/parts.rb

59 lines
1.5 KiB
Ruby

module Models
module Extensions
module Page
module Parts
extend ActiveSupport::Concern
included do
embeds_many :parts, :class_name => 'PagePart'
before_validation do |p|
if p.parts.empty?
p.parts << PagePart.build_body_part(p.respond_to?(:body) ? p.body : nil)
end
end
end
module InstanceMethods
def parts_attributes=(attributes)
self.update_parts(attributes.values.map { |attrs| PagePart.new(attrs) })
end
def joined_parts
self.parts.enabled.map(&:template).join('')
end
protected
def update_parts(parts)
performed = []
# add / update
parts.each do |part|
if (existing = self.parts.detect { |p| p.id == part.id || p.slug == part.slug })
existing.attributes = part.attributes.delete_if { |k, v| %w{_id slug}.include?(k) }
else
self.parts << (existing = part)
end
performed << existing unless existing.disabled?
end
# disable missing parts
(self.parts.map(&:slug) - performed.map(&:slug)).each do |slug|
self.parts.detect { |p| p.slug == slug }.disabled = true
end
end
def update_parts!(new_parts)
self.update_parts(new_parts)
self.save
end
end
end
end
end
end