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

Restart Webrick when mangling constants with Merge! (of course!)

Yesterday I've encountered the irritating date problem in Rails. Please remember to restart Webrick when you change the date conversion constants or time conversion constants with the 'merge!' method:

ActiveSupport::CoreExtensions::Date::Conversions::DATE_FORMATS.merge!(
:default => "%d-%m-%Y"
)

On reload it merges the array again... You can never remove the ':default' date with a merge...
*sigh*

This tip can save you a whole lot of time, because reloading doesn't work

ANSI Highlighting With less

My less command of my FreeBSD installation doesn't show the ansi colors embedded in the Rails log file. Well it does shows the codes, but I don't want to see those.

I found a simple solution for this:

export LESS='--RAW-CONTROL-CHARS'

Put the code above in the ~/.bashrc/ file and less will finally show the colors...!

Default Date Format Horrors in Rails

How nice of rails to make it easy to change the default date format that is used when
showing a date from the database.

ActiveSupport::CoreExtensions::Date::Conversions::DATE_FORMATS.merge!(
:default => "%d-%m-%Y"
)

Very easy. Simple writing:

model.date.to_s

outputs the date in my format.

All seems to work well, but a few days later. TODAY!! I found out my application wasn't saving dates anymore.

The cause:

Rails uses the ":default" date definition to format the date when it builds an SQL statement. Well my MySQL version doesn't seem to understand this date format.

For now I stay away from the :default date formatter.
I've changed my custom date_picker field so now it first formats the date with the date format before showing..

Btw. I found a possible solution and a remark that this has been solved for future rails version. You can find this info at, the rails date kit.

Ruby Constants – Note to Self ::

Well after trying to access a ruby class constant for the zillionth time with Class.CONSTNAME.
( Which btw. very nicely gives the error "Undefined Method Class.CONSTNAME"...)
I've decided to write this note on my blog...

Remember:

print Class::InnerClass::CONSTANT
print Class::InnerClass.method_name

* kick * to my own butt..