Skip to content

Commit 113e1e2

Browse files
authored
Raise Ransack::InvalidSearchError instead of ArgumentError on unknown conditions (#1543)
* Raise Ransack::InvalidSearchError instead of ArgumentError on unknown conditions * Update CHANGELOG
1 parent d395097 commit 113e1e2

File tree

8 files changed

+32
-6
lines changed

8 files changed

+32
-6
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
## Unreleased
44
* Rails 8 compatibility
55
* Drop Rails 6 and 7.0 compatibility
6+
* Raise Ransack::InvalidSearchError instead of ArgumentError on unknown conditions
67

78
## 4.2.1 - 2024-8-11
89

docs/docs/going-further/other-notes.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -263,15 +263,15 @@ end
263263

264264
```ruby
265265
Article.ransack(unknown_attr_eq: 'Ernie')
266-
# ArgumentError (Invalid search term unknown_attr_eq)
266+
# Ransack::InvalidSearchError (Invalid search term unknown_attr_eq)
267267
```
268268

269269
As an alternative to setting a global configuration option, the `.ransack!`
270270
class method also raises an error if passed an unknown condition:
271271

272272
```ruby
273273
Article.ransack!(unknown_attr_eq: 'Ernie')
274-
# ArgumentError: Invalid search term unknown_attr_eq
274+
# Ransack::InvalidSearchError: Invalid search term unknown_attr_eq
275275
```
276276

277277
This is equivalent to the `ignore_unknown_conditions` configuration option,

lib/ransack/invalid_search_error.rb

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
module Ransack
2+
class InvalidSearchError < ArgumentError; end
3+
end

lib/ransack/nodes/condition.rb

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
require 'ransack/invalid_search_error'
2+
13
module Ransack
24
module Nodes
35
class Condition < Node
@@ -38,7 +40,7 @@ def extract_values_for_condition(key, context = nil)
3840
predicate = Predicate.named(name)
3941

4042
unless predicate || Ransack.options[:ignore_unknown_conditions]
41-
raise ArgumentError, "No valid predicate for #{key}"
43+
raise InvalidSearchError, "No valid predicate for #{key}"
4244
end
4345

4446
if context.present?

lib/ransack/search.rb

+3-2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
require 'ransack/nodes/grouping'
88
require 'ransack/context'
99
require 'ransack/naming'
10+
require 'ransack/invalid_search_error'
1011

1112
module Ransack
1213
class Search
@@ -53,7 +54,7 @@ def build(params)
5354
elsif base.attribute_method?(key)
5455
base.send("#{key}=", value)
5556
elsif !Ransack.options[:ignore_unknown_conditions] || !@ignore_unknown_conditions
56-
raise ArgumentError, "Invalid search term #{key}"
57+
raise InvalidSearchError, "Invalid search term #{key}"
5758
end
5859
end
5960
self
@@ -78,7 +79,7 @@ def sorts=(args)
7879
when String
7980
self.sorts = [args]
8081
else
81-
raise ArgumentError,
82+
raise InvalidSearchError,
8283
"Invalid argument (#{args.class}) supplied to sorts="
8384
end
8485
end

spec/ransack/adapters/active_record/base_spec.rb

+5-1
Original file line numberDiff line numberDiff line change
@@ -131,10 +131,14 @@ module ActiveRecord
131131
expect { Person.ransack('') }.to_not raise_error
132132
end
133133

134-
it 'raises exception if ransack! called with unknown condition' do
134+
it 'raises ArgumentError exception if ransack! called with unknown condition' do
135135
expect { Person.ransack!(unknown_attr_eq: 'Ernie') }.to raise_error(ArgumentError)
136136
end
137137

138+
it 'raises InvalidSearchError exception if ransack! called with unknown condition' do
139+
expect { Person.ransack!(unknown_attr_eq: 'Ernie') }.to raise_error(InvalidSearchError)
140+
end
141+
138142
it 'does not modify the parameters' do
139143
params = { name_eq: '' }
140144
expect { Person.ransack(params) }.not_to change { params }

spec/ransack/nodes/condition_spec.rb

+1
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ module Nodes
6464
end
6565

6666
specify { expect { subject }.to raise_error ArgumentError }
67+
specify { expect { subject }.to raise_error InvalidSearchError }
6768
end
6869

6970
context "when ignore_unknown_conditions is true" do

spec/ransack/search_spec.rb

+14
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,7 @@ module Ransack
270270
end
271271

272272
specify { expect { subject }.to raise_error ArgumentError }
273+
specify { expect { subject }.to raise_error InvalidSearchError }
273274
end
274275

275276
context 'when ignore_unknown_conditions configuration option is true' do
@@ -300,6 +301,7 @@ module Ransack
300301

301302
context 'when ignore_unknown_conditions search parameter is false' do
302303
specify { expect { with_ignore_unknown_conditions_false }.to raise_error ArgumentError }
304+
specify { expect { with_ignore_unknown_conditions_false }.to raise_error InvalidSearchError }
303305
end
304306

305307
context 'when ignore_unknown_conditions search parameter is true' do
@@ -614,6 +616,18 @@ def remove_quotes_and_backticks(str)
614616
expect(@s.result.first.id).to eq 1
615617
end
616618

619+
it 'raises ArgumentError when an invalid argument is sent' do
620+
expect do
621+
@s.sorts = 1234
622+
end.to raise_error(ArgumentError, "Invalid argument (Integer) supplied to sorts=")
623+
end
624+
625+
it 'raises InvalidSearchError when an invalid argument is sent' do
626+
expect do
627+
@s.sorts = 1234
628+
end.to raise_error(Ransack::InvalidSearchError, "Invalid argument (Integer) supplied to sorts=")
629+
end
630+
617631
it "PG's sort option", if: ::ActiveRecord::Base.connection.adapter_name == "PostgreSQL" do
618632
default = Ransack.options.clone
619633

0 commit comments

Comments
 (0)