Morus Walter
2006-Jul-03 07:51 UTC
[Rails] Prototype 1.5.0_rc0 form_serialize issues for select lists
Hi, we have a rails 1.0 application and I did some tests to see if we could upgrade to rails 1.1 One issue I found, is that prototype 1.5.0_rc0, that was installed by rake rails:update:javascripts, changes the way a select list is serialized if an option has an empty value. Consider a form like <%= form_tag :action => ''test_form_post'' %> <% options = { '''' => ''select'', ''1'' => ''one'', ''2'' => ''two'' } %> <%= select_tag("test", options.keys.collect { | key | "<option value=''#{key}''>#{options[key]}</option>" }.join() ) %> <%= submit_tag "send" %> <%= end_form_tag %> which is rendered to <form action="/develop/test_form_post" method="post"> <select id="test" name="test"> <option value=''''>select</option> <option value=''1''>one</option> <option value=''2''>two</option> </select> <input name="commit" type="submit" value="send" /> </form> as expected. The idea is to present the entry ''select'' initially to indicate that the user should select an option. In case he does not, an empty value is returned, which fails in a validates_presence_of validation. This works for normal forms and for remote forms using rails 1.0 / prototype 1.4. In both cases I get a parameter hash {"commit"=>"send", "action"=>"test_form_post", "controller"=>"develop", "test"=>""} Unfortunately rails 1.1 / prototype 1.5.0_rc0 provides {"commit"=>"send", "action"=>"test_form_post", "controller"=>"develop", "test"=>"select"} for a remote form. Instead of the empty value the content of the option is returned. I think this would be ok, if there wasn''t a value attribute at all (in that case form submission would output the content as well). Is this difference between normal form submission and remote forms intentional? It was one of the great features that prototype allows me to switch from forms to remote forms without having to change anything in the handling of the form data. If it is intentional: how should my use case be implemented? I want to have a labelled option entry, that indicates, that the user should make a choice (''select'' is just the label I choose for the test case). But I don''t want to deal with that label in the application. Of course I could use some illegal value like -1 in the app and do some special treatment. But that implies extra code in the contoller or model. regards Morus