Vote #81232
完了'Search' falsy parameters are not respected
0%
説明
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.
h2. 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
journals
--------------------------------------------------------------------------------
Thanks Jakub for reporting this issue, I was able to confirm the strange behaviour.
--------------------------------------------------------------------------------
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.
<pre><code class="diff">
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)
</code></pre>
Jakub, please let me know if this cover your needs.
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
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 :)
--------------------------------------------------------------------------------
Here is the patch with a test.
--------------------------------------------------------------------------------
Setting the target version to 4.0.8.
--------------------------------------------------------------------------------
Committed the patch. thank you.
--------------------------------------------------------------------------------
Committed the patch. Thank you.
--------------------------------------------------------------------------------