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

Lines changed: 1 addition & 0 deletions
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

Lines changed: 2 additions & 2 deletions
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

Lines changed: 3 additions & 0 deletions
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

Lines changed: 3 additions & 1 deletion
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

Lines changed: 3 additions & 2 deletions
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

Lines changed: 5 additions & 1 deletion
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

Lines changed: 1 addition & 0 deletions
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

Lines changed: 14 additions & 0 deletions
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy