Sha256: 745bad10d7a073d40e730a2c49af3ee9822f4a879207f473eabf565bb29ae1bb

Contents?: true

Size: 1.76 KB

Versions: 7

Compression:

Stored size: 1.76 KB

Contents

require "edition"
require_relative 'simple_smart_answer_edition/node'
require_relative 'simple_smart_answer_edition/node/option'

class SimpleSmartAnswerEdition < Edition
  include Mongoid::Document

  field :body, type: String

  embeds_many :nodes, :class_name => "SimpleSmartAnswerEdition::Node"

  accepts_nested_attributes_for :nodes, allow_destroy: true

  GOVSPEAK_FIELDS = [:body]

  def whole_body
    parts = [body]
    unless nodes.nil?
      parts += nodes.map { |node| "#{node.kind}: #{node.title} \n\n #{node.body}" }
    end
    parts.join("\n\n\n")
  end

  def build_clone(target_class=nil)
    new_edition = super(target_class)

    if new_edition.is_a?(SimpleSmartAnswerEdition)
      self.nodes.each {|n| new_edition.nodes << n.clone }
    end

    new_edition
  end


  # Workaround mongoid conflicting mods error
  # See https://jira.mongodb.org/browse/MONGOID-1220
  # Override update_attributes so that nested nodes are updated individually. 
  # This get around the problem of mongoid issuing a query with conflicting modifications 
  # to the same document. 
  alias_method :original_update_attributes, :update_attributes
  
  def update_attributes(attributes)
    if nodes_attrs = attributes.delete(:nodes_attributes)
      nodes_attrs.each do |index, node_attrs|
        if node_id = node_attrs['id']
          node = nodes.find(node_id)
          if destroy_in_attrs?(node_attrs)
            node.destroy
          else
            node.update_attributes(node_attrs)
          end
        else
          nodes << Node.new(node_attrs) unless destroy_in_attrs?(node_attrs)
        end
      end
    end

    original_update_attributes(attributes)
  end

  def initial_node
    self.nodes.first
  end

  def destroy_in_attrs?(attrs)
    attrs.delete('_destroy') == '1'
  end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
govuk_content_models-40.0.0 app/models/simple_smart_answer_edition.rb
govuk_content_models-39.0.0 app/models/simple_smart_answer_edition.rb
govuk_content_models-38.0.0 app/models/simple_smart_answer_edition.rb
govuk_content_models-37.0.0 app/models/simple_smart_answer_edition.rb
govuk_content_models-36.0.0 app/models/simple_smart_answer_edition.rb
govuk_content_models-35.0.1 app/models/simple_smart_answer_edition.rb
govuk_content_models-35.0.0 app/models/simple_smart_answer_edition.rb