module SimplyMessages::ActionViewExtension::InstanceMethods

Public Instance Methods

messages_block(options = {}) click to toggle source
# File lib/simply_messages/action_view_extension.rb, line 9
def messages_block(options = {})
  # make options[:for] an array
  options[:for] ||= []
  options[:for] = [options[:for]] unless options[:for].is_a?(Array)

  # add model object associated with current controller
  options[:for] << controller.controller_name.split('/').last.gsub(/\_controller$/, '').singularize.to_sym

  # fetch all model objects
  model_objects = options[:for].map do |model_object|
    if model_object.instance_of?(String) or model_object.instance_of?(Symbol)
      instance_variable_get("@#{model_object}")
    else
      model_object
    end
  end.select { |m| m.present? }.uniq

  # messages_block
  messages_block = ''

  # notice/success
  flash_msg = ''
  [:notice, :success].each do |key|
    if flash[key].present?
      flash_msg += content_tag(:p, flash[key])
      messages_block += content_tag(:div, flash_msg.html_safe, :class => key.to_s)
    end
  end

  # alert/error
  flash_msg = ''
  html_class = ''
  [:alert, :error].each do |key|
    if flash[key].present?
      flash_msg += content_tag(:p, flash[key])
      html_class += key.to_s
    end
  end

  # all models errors
  errors = ''
  model_objects.each do |model|
    if model.errors.any?
      errors += content_tag(:p, I18n.translate(
        model.errors.count > 1 ? :other : :one,
        :count => model.errors.count,
        :model => model.class.model_name.human,
        :scope => [:activerecord, :errors, :template, :header]) + ':')

      msg = ''
      model.errors.full_messages.each do |e|
        msg += content_tag(:li, e)
      end
      errors += content_tag(:ul, msg.html_safe)
    end
  end

  if flash_msg.present? or errors.present?
    messages_block += content_tag(:div, flash_msg.html_safe + errors.html_safe, :class => (html_class.presence || 'alert'))
  end

  messages_block.html_safe
end