<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>SciWerks.com &#187; select controls</title>
	<atom:link href="http://www.sciwerks.com/blog/category/ruby-on-rails/select-controls/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.sciwerks.com/blog</link>
	<description>Software for scientists, by scientists</description>
	<lastBuildDate>Fri, 24 Oct 2008 01:02:08 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Cascading selects vs. auto_complete</title>
		<link>http://www.sciwerks.com/blog/2006/09/13/cascading-selects-vs-auto_complete/</link>
		<comments>http://www.sciwerks.com/blog/2006/09/13/cascading-selects-vs-auto_complete/#comments</comments>
		<pubDate>Wed, 13 Sep 2006 19:41:03 +0000</pubDate>
		<dc:creator>Kevin Olbrich</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[User Interface]]></category>
		<category><![CDATA[auto_complete]]></category>
		<category><![CDATA[select controls]]></category>

		<guid isPermaLink="false">http://www.sciwerks.com/blog/2006/09/13/cascading-selects-vs-auto_complete/</guid>
		<description><![CDATA[How to use auto_complete controls to avoid using cascading selects]]></description>
			<content:encoded><![CDATA[<p>I have lately come to dislike cascading selects (where the value from one select populates a second select with some values).  These beasties have their purpose in life, but for the most part they are unnecessary evils. </p>
<p>If you have a &#8216;Really Long List&#8217; to select from, then using a cascading select makes a lot of sense (unless you want your users to hate you).  The problem is that they are a pain to code (<a href="http://www.sciwerks.com/blog/2006/07/07/updating-select-controls-with-ajax/">well, not so bad if you use the KRJS plugin </a> ), and they are still a pain to use if you actually know what you are looking for (then you have to remember what &#8216;category&#8217; if falls in).</p>
<p>Lately I have been getting around this little problem using auto-complete boxes.<br />
In Rails you can have an auto_complete box act like a select like this&#8230;</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;">
<ol>
<li class="li1">
<div class="de1"><span class="co1"># model</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1"># id&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; :integer</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1"># name&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;:string</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1"># category_id :integer</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1"># full_name&nbsp; &nbsp;:string</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">class</span> Model &lt; ActiveRecord::Base</div>
</li>
<li class="li1">
<div class="de1">&nbsp; belongs_to :category</div>
</li>
<li class="li1">
<div class="de1">&nbsp; validates_uniqueness_of :full_name</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">def</span> before_save</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">full_name</span> = <span class="st0">&quot;#{self.category.name} &#8211; #{self.name}&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">end</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">end</span> </div>
</li>
</ol>
</div>
</div>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;">
<ol>
<li class="li1">
<div class="de1"><span class="co1"># Controller</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">class</span> ModelController &lt; ActionController::Base</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; auto_complete_for :model, :full_name</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">def</span> action</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> request.<span class="me1">post</span>?</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;@model = Model.<span class="me1">find_by_full_name</span><span class="br0">&#40;</span>params<span class="br0">&#91;</span>:model<span class="br0">&#93;</span><span class="br0">&#91;</span>:full_name<span class="br0">&#93;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;<span class="co1"># do some error handling here if item does not exist&#8230; or you could create a new one </span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">else</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; @model = Model.<span class="me1">new</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">end</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">end</span> </div>
</li>
</ol>
</div>
</div>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;">
<ol>
<li class="li1">
<div class="de1"><span class="co1"># view for &#8216;action&#8217;</span></div>
</li>
<li class="li1">
<div class="de1">&lt;%= start_form_tag :action=&gt;&#8217;action&#8217; %&gt;</div>
</li>
<li class="li1">
<div class="de1">&lt;%= text_field_with_auto_complete &#8216;model&#8217;, &#8216;full_name&#8217; %&gt;</div>
</li>
<li class="li1">
<div class="de1">&lt;%= submit_tag &#8216;Submit&#8217; %&gt;</div>
</li>
<li class="li1">
<div class="de1">&lt;%= end_form_tag %&gt; </div>
</li>
</ol>
</div>
</div>
<p>Now when the user starts typing in the auto_complete field, they will get records that match against both the name and the category of the record.  The enterprising reader could also replace certain characters (like space) with the SQL wildcard &#8216;%&#8217; to get more flexible search results.</p>
<p>A user might be able to just type: &#8216;f mus&#8217; to find &#8216;Ford &#8211; Mustang&#8217;.<br />
(It&#8217;s not well known, but &#8216;f%mus&#8217; will match &#8216;Ford &#8211; Mustang&#8217; using the standard auto_complete box that ships with rails).</p>
<p>This type of entry is really fast and quite intuitive once users get the hang of it.</p>
<p>I find that this system works best when<br />
1. There are a ton of choices<br />
2. The user already has a pretty good idea which choice they want to select, but don&#8217;t really want to spend 15 minutes scrolling to find it.</p>
<p>It&#8217;s not particularly good if the user has no idea what to enter.  In those cases, the standard cascading select may help walk them through the selection process.</p>
<p>Notes: You can avoid using the &#8216;full_name&#8217; column if you properly design your own custom auto_complete_for function</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sciwerks.com/blog/2006/09/13/cascading-selects-vs-auto_complete/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Updating &#8217;select&#8217; controls with AJAX</title>
		<link>http://www.sciwerks.com/blog/2006/07/07/updating-select-controls-with-ajax/</link>
		<comments>http://www.sciwerks.com/blog/2006/07/07/updating-select-controls-with-ajax/#comments</comments>
		<pubDate>Fri, 07 Jul 2006 16:27:27 +0000</pubDate>
		<dc:creator>Kevin Olbrich</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[User Interface]]></category>
		<category><![CDATA[select controls]]></category>

		<guid isPermaLink="false">http://www.sciwerks.com/blog/2006/07/07/updating-select-controls-with-ajax/</guid>
		<description><![CDATA[In web design there are frequently times when a form needs to be able to have the contents of &#8217;select control B&#8217; depend on the contents of &#8217;select control A&#8217; (or some other control type for that matter).  Using conventional web design methods, one would have to define a &#8216;onChange&#8217; javascript event for &#8217;select [...]]]></description>
			<content:encoded><![CDATA[<p>In web design there are frequently times when a form needs to be able to have the contents of &#8217;select control B&#8217; depend on the contents of &#8217;select control A&#8217; (or some other control type for that matter).  Using conventional web design methods, one would have to define a &#8216;onChange&#8217; javascript event for &#8217;select control A&#8217;, which fires off a callback that updates the second select control.</p>
<p>This is cumbersome to code, and it leads to upleasant page refreshes every time the user changes the value of &#8217;select control A&#8217;.</p>
<p>Another way to handle this is by using AJAX methods to update the second control as needed.  This is fairly easy in Rails, and is even easier if you make use of the KRJS plugin (<a href="http://www.agilewebdevelopment.com/plugins/krjs">http://www.agilewebdevelopment.com/plugins/krjs</a>).</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;">
<ol>
<li class="li1">
<div class="de1"><span class="co1"># View</span></div>
</li>
<li class="li1">
<div class="de1">&lt;%= <span class="kw3">select</span> &#8216;model&#8217;,'id&#8217;, Model.<span class="me1">find</span><span class="br0">&#40;</span>:all<span class="br0">&#41;</span>.<span class="me1">map</span> <span class="br0">&#123;</span>|x| <span class="br0">&#91;</span>x.<span class="me1">name</span>, x.<span class="me1">id</span><span class="br0">&#93;</span><span class="br0">&#125;</span> %&gt;</div>
</li>
<li class="li1">
<div class="de1">&lt;div id=&#8217;select-b&#8217;&gt;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &lt;%= <span class="kw3">select</span> &#8216;model&#8217;,'category_id&#8217;, Model.<span class="me1">find</span><span class="br0">&#40;</span>@model.<span class="me1">id</span><span class="br0">&#41;</span>.<span class="me1">categories</span>.<span class="me1">map</span> <span class="br0">&#123;</span>|x| <span class="br0">&#91;</span>x.<span class="me1">name</span>, x.<span class="me1">id</span><span class="br0">&#93;</span><span class="br0">&#125;</span> %&gt;</div>
</li>
<li class="li1">
<div class="de1">&lt;/div&gt; </div>
</li>
</ol>
</div>
</div>
<p>In this example, the second select (&#8217;select-b&#8217;) is normally populated with &#8216;categories&#8217; associated with the initially selected model.  Changing the model would not normally update the second select, so things would be all wrong.</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;">
<ol>
<li class="li1">
<div class="de1"><span class="co1"># Controller</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">def</span> on_model_id_change</div>
</li>
<li class="li1">
<div class="de1">&nbsp; render :update <span class="kw1">do</span> |page|</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; @categories = Model.<span class="me1">find</span><span class="br0">&#40;</span>params<span class="br0">&#91;</span>:dom_value<span class="br0">&#93;</span><span class="br0">&#41;</span>.<span class="me1">categories</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; page.<span class="me1">replace_html</span> &#8217;select-b&#8217;, :inline=&gt;<span class="st0">&quot;&lt;%= select &#8216;model&#8217;,'category_id&#8217;, @categories.map {|o| [o.name, o.id]} %&gt;&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">end</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">end</span> </div>
</li>
</ol>
</div>
</div>
<p>This is probably the easiest way to update a select box using AJAX.  Remember, this only works with the KRJS plugin.</p>
<p>UPDATE:  Of course all of this only works if you have AJAX enabled by adding <%= javascript_include_tag :defaults %> in the <head> of your layout file.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sciwerks.com/blog/2006/07/07/updating-select-controls-with-ajax/feed/</wfw:commentRss>
		<slash:comments>39</slash:comments>
		</item>
	</channel>
</rss>
