Hi there,
I just spent a night on the following “problem” and cant’ figure it out
on my own:
I need to have a search function and thought I could do it like this:
- the search page has a form which takes the search criteria (people
only fill in the criteria they want to use for the search) - upon submission of the form, the search criteria goes into
params[:search] (i.e. params[:search][:firstname],
params[:search][:lastname], params[:search][:gender], etc.) - the controller takes the values from params[:search] and should
generate/write the appropriate “conditions” for the search statement
“User.find(:all, conditions => {…})” - But since submitting the search page/form with only some (not all)
fields filled in (or check boxes checked, or radio buttons clicked,
etc.) would generate some “empty” values in the key/value pairs in
“params[:search]”, the generated search statement would be wrong because
for example a condition saying " ‘gender’ => nil/empty " could be added. - So, only key/value pairs which have a value that’s not empty should
generate the “condition” code.
Question 1: Where is the mistake in my code? If I do it like below, I
get the error: “odd number list for Hash” (at line: see the comment in
the code). (Note: in this code I don’t exclude the “empty” values.)
Question 2: How do I exclude key/value pairs with an “empty” value from
generating a “condition” (that would screw my search statement)?
The code until now looks like this:
def search
@searchresults = ‘’
if request.post?
@searchresults = User.find(:all, :conditions => {
# this should render like: ‘firstname’ =>
params[:search][:firstname],
# and no comma for the last: ‘gender’ =>
params[:search][:gender]
i=0 # <= I get the error for this line
params[:search].each do |key, value|
i+=1
if i < params[:search].length
puts “’”+key+"’"+" => params[:search][:"+key+"],"
else
puts “’”+key+"’"+" => params[:search][:"+key+"]"
end
end
})
end
end
I spent so many hours thinking about this that I would be really
thankful for a working solution!
Kind regards,
Tom