mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Merge pull request #20967 from lxsameer/record_not_found
Extra caller details added to ActiveRecord::RecordNotFound
This commit is contained in:
commit
efd2410b39
5 changed files with 35 additions and 5 deletions
|
@ -1,3 +1,19 @@
|
|||
* ActiveRecord::RecordNotFound modified to store model name, primary_key and
|
||||
id of the caller model. It allows the catcher of this exception to make
|
||||
a better decision to what to do with it. For example consider this simple
|
||||
example:
|
||||
|
||||
class SomeAbstractController < ActionController::Base
|
||||
rescue_from ActiveRecord::RecordNotFound, with: :redirect_to_404
|
||||
|
||||
private def redirect_to_404(e)
|
||||
return redirect_to(posts_url) if e.model == 'Post'
|
||||
raise
|
||||
end
|
||||
end
|
||||
|
||||
*Sameer Rahmani*
|
||||
|
||||
* Deprecate the keys for association `restrict_dependent_destroy` errors in favor
|
||||
of new key names.
|
||||
|
||||
|
|
|
@ -162,11 +162,13 @@ module ActiveRecord
|
|||
}
|
||||
record = statement.execute([id], self, connection).first
|
||||
unless record
|
||||
raise RecordNotFound, "Couldn't find #{name} with '#{primary_key}'=#{id}"
|
||||
raise RecordNotFound.new("Couldn't find #{name} with '#{primary_key}'=#{id}",
|
||||
name, primary_key, id)
|
||||
end
|
||||
record
|
||||
rescue RangeError
|
||||
raise RecordNotFound, "Couldn't find #{name} with an out of range value for '#{primary_key}'"
|
||||
raise RecordNotFound.new("Couldn't find #{name} with an out of range value for '#{primary_key}'",
|
||||
name, primary_key)
|
||||
end
|
||||
|
||||
def find_by(*args) # :nodoc:
|
||||
|
@ -199,7 +201,7 @@ module ActiveRecord
|
|||
end
|
||||
|
||||
def find_by!(*args) # :nodoc:
|
||||
find_by(*args) or raise RecordNotFound.new("Couldn't find #{name}")
|
||||
find_by(*args) or raise RecordNotFound.new("Couldn't find #{name}", name)
|
||||
end
|
||||
|
||||
def initialize_generated_modules # :nodoc:
|
||||
|
|
|
@ -47,6 +47,15 @@ module ActiveRecord
|
|||
|
||||
# Raised when Active Record cannot find record by given id or set of ids.
|
||||
class RecordNotFound < ActiveRecordError
|
||||
attr_reader :model, :primary_key, :id
|
||||
|
||||
def initialize(message = nil, model = nil, primary_key = nil, id = nil)
|
||||
@primary_key = primary_key
|
||||
@model = model
|
||||
@id = id
|
||||
|
||||
super(message)
|
||||
end
|
||||
end
|
||||
|
||||
# Raised by ActiveRecord::Base.save! and ActiveRecord::Base.create! methods when record cannot be
|
||||
|
|
|
@ -561,7 +561,9 @@ module ActiveRecord
|
|||
end
|
||||
|
||||
def raise_nested_attributes_record_not_found!(association_name, record_id)
|
||||
raise RecordNotFound, "Couldn't find #{self.class._reflect_on_association(association_name).klass.name} with ID=#{record_id} for #{self.class.name} with ID=#{id}"
|
||||
model = self.class._reflect_on_association(association_name).klass.name
|
||||
raise RecordNotFound.new("Couldn't find #{model} with ID=#{record_id} for #{self.class.name} with ID=#{id}",
|
||||
model, 'id', record_id)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -85,7 +85,8 @@ module ActiveRecord
|
|||
def find_by!(arg, *args)
|
||||
where(arg, *args).take!
|
||||
rescue RangeError
|
||||
raise RecordNotFound, "Couldn't find #{@klass.name} with an out of range value"
|
||||
raise RecordNotFound.new("Couldn't find #{@klass.name} with an out of range value",
|
||||
@klass.name)
|
||||
end
|
||||
|
||||
# Gives a record (or N records if a parameter is supplied) without any implied
|
||||
|
|
Loading…
Reference in a new issue