Rails url_for and params missery

Assume you have a params array with the following items:

params[:qry][:name] = ‘jo’
params[:qry][:city] =

You would like to build a new URL with the current params appended. Should be as simple as:

url_for( :action => ‘list’, :params => params.merge( { :sort => key, :page => nil } ) )

Well that’s not the case it results in the following URL:

http://localhost/controller/list?qry=namejocity&sort=created_at

Long live Rails! The frustrating part of it, is that it first converts inner Hashmaps to a string. I don’t have a clue why!

The solution, put the following code in your ApplicationHelper. (Is a nice method to have ;-)

#
# Converts the given HASH array like ‘params’ to a flat
# HASH array that’s compatible with url_for and link_to
#
def flatten_param_hash( params )
  found = true

  while found
    found = false
    new_hash = {}

    params.each do |key,value|
      if value.is_a?( Hash )
        found = true
        value.each do |key2,value2|
          new_hash[ key.to_s + ‘[' + key2.to_s + ']‘ ] = value2
        end
      else
        new_hash[ key.to_s ] = value
      end
    end
    params = new_hash
  end
  params
end

Adjust your code to the following

url_for( :action => ‘list’, :params => flatten_param_hash( params.merge( { :sort => key, :page => nil } ) ) )

And voila the result is now a little bit better:

http://localhost/controller/list?qry[name]=jo&qry[city]=&sort=created_at

2 Comments so far

  1. Ver2ter on January 2nd, 2008

    Thank for this code!
    It’s very usefull!

  2. software developer on August 11th, 2009

    Nice post,
    YOU saved my day
    thanks for the post

Leave a reply