diff --git a/lib/jsonapi/resource.rb b/lib/jsonapi/resource.rb index 2ea5bae0a..da89f4950 100644 --- a/lib/jsonapi/resource.rb +++ b/lib/jsonapi/resource.rb @@ -638,7 +638,9 @@ def is_filter_relationship?(filter) def verify_filter(filter, raw, context = nil) filter_values = [] - filter_values += CSV.parse_line(raw) unless raw.nil? || raw.empty? + if raw.present? + filter_values += raw.is_a?(String) ? CSV.parse_line(raw) : [raw] + end strategy = _allowed_filters.fetch(filter, Hash.new)[:verify] diff --git a/test/controllers/controller_test.rb b/test/controllers/controller_test.rb index 1fcd0d883..1c2e6b66e 100644 --- a/test/controllers/controller_test.rb +++ b/test/controllers/controller_test.rb @@ -103,6 +103,13 @@ def test_index_filter_by_title assert_equal 1, json_response['data'].size end + def test_index_filter_with_hash_values + get :index, {filter: {search: {title: 'New post'}}} + assert_response :success + assert json_response['data'].is_a?(Array) + assert_equal 1, json_response['data'].size + end + def test_index_filter_by_ids get :index, {filter: {ids: '1,2'}} assert_response :success diff --git a/test/fixtures/active_record.rb b/test/fixtures/active_record.rb index c0dad8b0b..8b379c191 100644 --- a/test/fixtures/active_record.rb +++ b/test/fixtures/active_record.rb @@ -945,6 +945,14 @@ def title=(title) records.where('id IN (?)', value) } + filter :search, + verify: ->(values, context) { + values.all?{|v| v.is_a?(Hash) } && values + }, + apply: -> (records, values, _options) { + records.where(title: values.first['title']) + } + def self.updatable_fields(context) super(context) - [:author, :subject] end