Class: ActiveRecord::DetailedDeleteRestrictionError

Inherits:
ActiveRecordError
  • Object
show all
Defined in:
lib/dependent_restrict/delete_restriction_error.rb

Overview

This error is raised when trying to destroy a parent instance in N:1 or 1:1 associations (has_many, has_one) when there is at least 1 child associated instance. ex: if @project.tasks.size > 0, DeleteRestrictionError will be raised when trying to destroy @project

Instance Method Summary collapse

Constructor Details

#initialize(name, record) ⇒ DetailedDeleteRestrictionError

:nodoc:



6
7
8
9
10
# File 'lib/dependent_restrict/delete_restriction_error.rb', line 6

def initialize(name, record)
  @name = name
  @record = record
  super(basic_message)
end

Instance Method Details

#basic_messageObject



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/dependent_restrict/delete_restriction_error.rb', line 12

def basic_message
  assoc = @record.send(@name)
  count = assoc.respond_to?(:count) ? assoc.count : (assoc ? 1 : 0)
  name = I18n.t(@name.to_s.singularize, {
    :scope => [:activerecord, :models],
    :count => count,
    :default => count == 1 ? @name.to_s.gsub('_', ' ') : @name.to_s.gsub('_', ' ').pluralize
  }).downcase

  if count == 1
    I18n.t('dependent_restrict.basic_message.one', :name => name, :default => "Cannot delete record because dependent #{name} exists")
  else
    I18n.t('dependent_restrict.basic_message.others', :count => count, :name => name, :default => "Cannot delete record because #{count} dependent #{name.pluralize} exist")
  end
end

#detailed_messageObject



28
29
30
31
32
33
34
# File 'lib/dependent_restrict/delete_restriction_error.rb', line 28

def detailed_message
  count = @record.send(@name).count
  examples = @record.send(@name).limit(5).map{|o| "#{o.id}: #{o.to_s}"}
  examples[4] = "...#{I18n.t('dependent_restrict.detailed_message.and_more', :count => count - 4, :default => "and #{count-4} more")}" if count > 5

  basic_message + "\n\n\n#{I18n.t('dependent_restrict.detailed_message.includes', :default => "These include")}:\n#{examples.join("\n")}"
end