Skip to content

Commit 301a335

Browse files
committed
refactor: Small internal changes
1 parent 56bed21 commit 301a335

File tree

3 files changed

+36
-58
lines changed

3 files changed

+36
-58
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: 20 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,10 @@
55
module AdministrateRansack
66
module Searchable
77
def scoped_resource
8-
options = respond_to?(:ransack_options) ? ransack_options : {}
9-
begin
10-
@ransack_results = super.ransack(params[:q], **options)
11-
rescue ArgumentError => e
12-
handle_ransack_argument_error(e)
13-
set_flash_message_as_ransack_argument_error(e)
14-
@ransack_results = reset_ransack_result_on_error(super).ransack({}, **options)
15-
end
16-
@ransack_results.result(distinct: true)
8+
options = respond_to?(:ransack_options, true) ? ransack_options : {}
9+
distinct = respond_to?(:ransack_result_distinct, true) ? ransack_result_distinct : true
10+
@ransack_results = prepare_search(resource_collection: super, query_params: params[:q], options: options)
11+
@ransack_results.result(distinct: distinct)
1712
end
1813

1914
# ref => https://github.com/thoughtbot/administrate/blob/v0.18.0/app/helpers/administrate/application_helper.rb#L72-L78
@@ -33,29 +28,27 @@ def prepended(base)
3328

3429
private
3530

36-
def set_flash_message_as_ransack_argument_error(error)
37-
if error.message.eql?("Invalid sorting parameter provided")
38-
flash.now[:alert] = I18n.t(
39-
:invalid_sorting_parameter_provided,
40-
scope: [:administrate_ransack, :errors],
41-
default: error.message
42-
)
43-
elsif error.message.start_with?("Invalid search term ")
44-
flash.now[:alert] = I18n.t(
45-
:invalid_search_term,
46-
search_term: error.message.split(' ')[3..].join(' '),
47-
scope: [:administrate_ransack, :errors],
48-
default: error.message
49-
)
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
5039
end
5140
end
5241

53-
def handle_ransack_argument_error(error)
54-
super if defined?(super)
42+
def ransack_invalid_search_error(error)
43+
if respond_to?(:invalid_search_callback, true)
44+
invalid_search_callback(error)
45+
else
46+
invalid_search_flash_message(error, severity: :alert)
47+
end
5548
end
5649

57-
def reset_ransack_result_on_error(super_scoped_resource)
58-
super_scoped_resource.none
50+
def invalid_search_flash_message(error, severity:)
51+
flash.now[severity] = I18n.t('administrate_ransack.errors.invalid_search', default: error.message)
5952
end
6053
end
6154
end

spec/controllers/admin/posts_controller_spec.rb

Lines changed: 13 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -8,44 +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-
context "when you want to handle the error manualy" do
13-
controller do
14-
def handle_ransack_argument_error(error)
15-
raise error
16-
end
17-
end
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" }
1814

19-
it "raises an exception with an invalid parameter" do
20-
expect {
21-
get :index, params: { "q[title2_cont]" => "test" }
22-
}.to raise_exception(ArgumentError, 'Invalid search term title2_cont')
23-
end
15+
expect(assigns(:ransack_results)).to be_instance_of Ransack::Search
16+
expect(flash[:alert]).to eq 'Invalid search term title2_cont'
2417
end
18+
end
2519

26-
context "when you want to reset the ransack result and display a flash message on error" do
27-
it "resets the ransack result and displays a flash message" do
28-
get :index, params: { "q[title2_cont]" => "test" }
29-
30-
expect(assigns(:ransack_results)).to be_instance_of Ransack::Search
31-
expect(assigns(:ransack_results).result).to be_empty
32-
expect(flash[:alert]).to eq 'Invalid search term title2_cont'
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}"
3324
end
3425
end
3526

36-
context "when you want to not reset the ransack result on error" do
37-
controller do
38-
def reset_ransack_result_on_error(super_scoped_resource)
39-
super_scoped_resource
40-
end
41-
end
42-
43-
it "does not reset the ransack result" do
27+
it "executes the callback method" do
28+
expect {
4429
get :index, params: { "q[title2_cont]" => "test" }
45-
46-
expect(assigns(:ransack_results)).to be_instance_of Ransack::Search
47-
expect(assigns(:ransack_results).result).to_not be_empty
48-
end
30+
}.to raise_exception("Some error: Invalid search term title2_cont")
4931
end
5032
end
5133
end

0 commit comments

Comments
 (0)