Flash Actionscript XML.send( … ) doesn’t send

Once in a while you require Flash... Well yesterday was such a day :-)
I'm was working on a Flash component that tries to submit data back to the server...
I don't have a lot of flash experience so I still don't know all its quirks.

Well I was trying to submit an XML document the following way:

var xml:XML = new XML()
//... fill xml ...
xml.send( '/my/url' );

Well... it didn't submit! No interaction with the server...
After some searching I discovered this was caching. Always that stupid caching...
So I solved this by adding a timestamp:

xml.send( '/my/url?ts=' + ( new Date() ).getTime() )

Again the timestamp to the rescue...

Convert java libhttpd to the Eclipse platform

I'm trying to switch java libhttpd to the Eclipse Java platform. I've worked with it before, without problems. Now a few years later Eclipse has improved and seems to run smoother!

There seems no reason to stick with JBuilder. Except the company I work for is using JBuilder.

And there another small problem, in JBuilder I had a build.num, which incremented with every compiler, which is a very nice feature.

Well the first impression is Nice, Eclipse warned me about some things in my code. I did some quick cleanup and placed it back into subversion.

Ruby on Rails, ReXML Document serializing / deserializing

I'm storing an XML document into a database field. I'm having a lot of trouble loading and saving the same XML in the database.

Here's a script/console session:

>> xml = REXML::Document.new("")   =>  ...   # strange response!!
>> xml.to_s   => " "   # seems ok!
>> xml.root.attributes['value'] = '<'  
>> xml.to_s => ""  # fine by me, no problem...

>> # now for the scary part ;-)
>> xml2 = REXML::Document.new( xml.to_s )    
>> xml2.to_s  => ""

The HORROR!

ReXML seems to escape items very nicely when setting values.
But it doesn't unescape the values with REXML::Document.new( ... )..

Current Progress:
* I found a method REXML::Document.write( ) which seems to do the same..

Today (24-8-2007) I'm a bit further, It seems it works correctly with the text content of elements:

>> xml = REXML::Document.new("")   =>  ...   # strange response!!
>> xml.to_s   => " "   # seems ok!
>> xml.root.attributes['value'] = '<'  
>> xml.root.text = '>'
>> xml.to_s => ">"  # fine by me, no problem...

>> xml2 = REXML::Document.new( xml.to_s )    
>> xml2.to_s  => ">"

Update 2 (24-8-2007) I found my Windows Ruby on Rails REXML (1.8.4) installation is working perfectly. It seems a bug in the FreeBSD version which is REXML (1.8.6).
I'm trying to submit a bug report to the REXML authors, but the server keeps timing out :(

I found the solution, there's indeed a bug in REXML (1.8.6)

Change the code at line +/- 291 in text.rb: ( /usr/local/lib/ruby/1.8/rexml/text.rb )

#copy = copy.gsub( EREFERENCE, '&' )
copy = copy.gsub( "&", "&" )

To

copy = copy.gsub( EREFERENCE, '&' )
#copy = copy.gsub( "&", "&" )

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