Defect #34615
closed'Search' falsy parameters are not respected
0%
Description
I'd like to implement search feature using REST API, but i noticed that this feature do not respect passed falsy values (booleans nor numbers). The same behavior can be observed on page.
What i mean is that if i pass 'false' or '0' as value, it's treated like truthy value anyway.
For example, logically, this query:
should return results of only wiki pages with word 'issue' (because for other parameters i passed falsy values: '0' or 'false'). But those values are ignored. Even when i pass empty parameter (like '...&messages=&...') it's stil not working properly.
Why is it so big deal?¶
Well, since on page there is dedicated form for searching, it's not a problem, but when i'm using API eg. in Node.js, it's more logical and convinient way to pass all search parameters but with bool values (or eventually empty when use 'null' or 'undefined' JS type).
P.S.: Tested on Redmine version 4.1.1
Files
Updated by Marius BĂLTEANU almost 4 years ago
- Status changed from New to Confirmed
Updated by Marius BĂLTEANU almost 4 years ago
Thanks Jakub for reporting this issue, I was able to confirm the strange behaviour.
Updated by Marius BĂLTEANU almost 4 years ago
I took a look and it seems that some params (for example: all_words
, titles_only
) already supports passing a "falsy" value, but not by passing 0 (titles_only=0
) or false (titles_only=false
), but by passing an empty value (titles_only=
). In a first phase, I think we can extend this behaviour to module params as well.
The change is quite small, but I'll post a patch in the following days after I check the tests.
diff --git a/app/controllers/search_controller.rb b/app/controllers/search_controller.rb
index d6bb2dd94..1a4a12fcc 100644
--- a/app/controllers/search_controller.rb
+++ b/app/controllers/search_controller.rb
@@ -63,7 +63,7 @@ class SearchController < ApplicationController
@object_types = @object_types.select {|o| User.current.allowed_to?("view_#{o}".to_sym, projects_to_search)}
end
- @scope = @object_types.select {|t| params[t]}
+ @scope = @object_types.select {|t| params[t].present?}
@scope = @object_types if @scope.empty?
fetcher = Redmine::Search::Fetcher.new(
(END)
Jakub, please let me know if this cover your needs.
Updated by Marius BĂLTEANU almost 4 years ago
- Assignee set to Marius BĂLTEANU
- Target version set to Candidate for next major release
Updated by Jakub G almost 4 years ago
Marius thanks for review. Would be great if in the future i could pass "0" and/or "false", but for now it's totally OK to pass empty value as well :) I'll just map false and 0 to an empty string in my code and that will do the trick :)
Updated by Marius BĂLTEANU almost 4 years ago
- File 0001-Ignore-from-search-module-params-sent-with-empty-val.patch 0001-Ignore-from-search-module-params-sent-with-empty-val.patch added
- Assignee deleted (
Marius BĂLTEANU)
Here is the patch with a test.
Updated by Go MAEDA almost 4 years ago
- Target version changed from Candidate for next major release to 4.0.8
Setting the target version to 4.0.8.
Updated by Go MAEDA almost 4 years ago
- Status changed from Confirmed to Resolved
- Assignee set to Go MAEDA
- Resolution set to Fixed
Committed the patch. thank you.
Updated by Go MAEDA almost 4 years ago
- Status changed from Resolved to Closed
Committed the patch. Thank you.