53 lines
1.5 KiB
Ruby
53 lines
1.5 KiB
Ruby
module Locomotive
|
|
module Extensions
|
|
module ContentType
|
|
module ItemTemplate
|
|
|
|
extend ActiveSupport::Concern
|
|
|
|
included do
|
|
field :raw_item_template
|
|
field :serialized_item_template, :type => Binary
|
|
|
|
before_validation :serialize_item_template
|
|
|
|
validate :item_template_must_be_valid
|
|
end
|
|
|
|
module InstanceMethods
|
|
|
|
def item_template
|
|
@item_template ||= Marshal.load(read_attribute(:serialized_item_template).to_s) rescue nil
|
|
end
|
|
|
|
protected
|
|
|
|
def serialize_item_template
|
|
if self.new_record? || self.raw_item_template_changed?
|
|
@item_parsing_errors = []
|
|
|
|
begin
|
|
self._parse_and_serialize_item_template
|
|
rescue ::Liquid::SyntaxError => error
|
|
@item_parsing_errors << I18n.t(:liquid_syntax, :error => error.to_s, :scope => [:errors, :messages])
|
|
end
|
|
end
|
|
end
|
|
|
|
def _parse_and_serialize_item_template
|
|
item_template = ::Liquid::Template.parse(self.raw_item_template, {})
|
|
self.serialized_item_template = BSON::Binary.new(Marshal.dump(item_template))
|
|
end
|
|
|
|
def item_template_must_be_valid
|
|
@item_parsing_errors.try(:each) do |msg|
|
|
%w(item_template raw_item_template).each { |field| self.errors.add field.to_sym, msg }
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
end
|
|
end
|
|
end |