Tuesday, November 15, 2005

How does Rails scaffolding select HTML input tags?

Recently, a reader saw my fix for SQL Server booleans, and asked me a followup question: why does Rails display a yes/no selection instead of a checkbox? The short answer is look in {RUBY_HOME} /lib/ruby/gems/1.8 /gems/actionpack-1.10.2 /lib/action_view/helpers, but your path may vary depending on whether you are using gem, "edge rails", etc. Anyway, look in the file "active_record_helper.rb" for a method called "all_input_tags", and notice that it calls "default_input_block" if you don't supply an input_block. Now notice that "default_input_block" creates a label and calls "input(record, column.name)" which in turn calls "InstanceTag#to_tag" which finally looks at the datatype and maps boolean to a select tag. Perhaps a wiser Rails explorer can provide us with the rationale for this, but I guess we could add a MixIn for InstanceTag that redefines the to_tag() method, or just do a dirty and unmaintainable hack like changing to_boolean_select_tag(options) to to_check_box_tag(options).

I would advise that you research mixins, or just generate your view and change the select to a checkbox. I'm in a bit of a time crunch at work today, but this will at least get you started.


Blogger Loren said...

I just ran across this myself and after some hunting around, I found your entry about it. I also wonder why a select widget is used instead of a checkbox widget. Did you ever find out?

January 12, 2006 7:33 PM  
Anonymous Anonymous said...

Blank checkbox values aren't submitted with the form, so with a checkbox there isn't an easy way to indicate a value updated from true to false exists. Rails normally gets around this checkbox issue by including a hidden field with the same name after each checkbox (the empty value then 'stands in' for blank checkboxes). This is a bit of a hack, which is probably why scaffolding avoids it.

January 05, 2009 7:05 PM  

Post a Comment

Subscribe to Post Comments [Atom]

<< Home