Skip to content

Commit 10ce78b

Browse files
authored
Merge pull request #40 from blocknotes/handle_invalid_search_terms
Handle invalid search terms
2 parents 21240df + f5943c1 commit 10ce78b

File tree

3 files changed

+43
-4
lines changed

3 files changed

+43
-4
lines changed

config/locales/en.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
en:
22
administrate_ransack:
3+
## Optional error key
4+
# errors:
5+
# invalid_search: Invalid search term!
36
filters:
47
'clear_filters': Clear filters
58
'no': 'No'

lib/administrate_ransack/searchable.rb

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ module Searchable
77
def scoped_resource
88
options = respond_to?(:ransack_options, true) ? ransack_options : {}
99
distinct = respond_to?(:ransack_result_distinct, true) ? ransack_result_distinct : true
10-
@ransack_results = super.ransack(params[:q], **options)
10+
@ransack_results = prepare_search(resource_collection: super, query_params: params[:q], options: options)
1111
@ransack_results.result(distinct: distinct)
1212
end
1313

@@ -25,5 +25,26 @@ def prepended(base)
2525
base.helper_method :sanitized_order_params
2626
end
2727
end
28+
29+
private
30+
31+
def prepare_search(resource_collection:, query_params:, options:)
32+
resource_collection.ransack(query_params, **options)
33+
rescue ArgumentError => e
34+
if defined?(Ransack::InvalidSearchError) && e.is_a?(Ransack::InvalidSearchError) # rubocop:disable Style/GuardClause
35+
ransack_invalid_search_error(e)
36+
resource_collection.ransack({}, **options)
37+
else
38+
raise e
39+
end
40+
end
41+
42+
def ransack_invalid_search_error(error)
43+
if respond_to?(:invalid_search_callback, true)
44+
invalid_search_callback(error)
45+
else
46+
flash.now[:alert] = I18n.t('administrate_ransack.errors.invalid_search', default: error.message)
47+
end
48+
end
2849
end
2950
end

spec/controllers/admin/posts_controller_spec.rb

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,26 @@
88
expect(assigns(:ransack_results)).to be_instance_of Ransack::Search
99
end
1010

11-
context "when ransack_options is defined" do
12-
it "raises an exception with an invalid parameter" do
11+
context "when an invalid search term is provided" do
12+
it "shows an alert message", :aggregate_failures do
13+
get :index, params: { "q[title2_cont]" => "test", "q[category_eq]" => "news" }
14+
15+
expect(assigns(:ransack_results)).to be_instance_of Ransack::Search
16+
expect(flash[:alert]).to eq 'Invalid search term title2_cont'
17+
end
18+
end
19+
20+
context "when an invalid_search_callback method is defined and an invalid search term is provided" do
21+
controller do
22+
def invalid_search_callback(error)
23+
raise "Some error: #{error.message}"
24+
end
25+
end
26+
27+
it "executes the callback method" do
1328
expect {
1429
get :index, params: { "q[title2_cont]" => "test" }
15-
}.to raise_exception(ArgumentError, 'Invalid search term title2_cont')
30+
}.to raise_exception("Some error: Invalid search term title2_cont")
1631
end
1732
end
1833
end

0 commit comments

Comments
 (0)