<?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>Nobody Listens Anyway &#187; checkbox list</title>
	<atom:link href="http://www.justinball.com/tag/checkbox-list/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.justinball.com</link>
	<description>Life is an optimization issue</description>
	<lastBuildDate>Sat, 31 Jul 2010 16:47:23 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0-alpha</generator>
		<item>
		<title>Checkbox list in Ruby on Rails using HABTM</title>
		<link>http://www.justinball.com/2008/07/03/checkbox-list-in-ruby-on-rails-using-habtm/</link>
		<comments>http://www.justinball.com/2008/07/03/checkbox-list-in-ruby-on-rails-using-habtm/#comments</comments>
		<pubDate>Thu, 03 Jul 2008 22:04:26 +0000</pubDate>
		<dc:creator>Justin Ball</dc:creator>
				<category><![CDATA[Ruby On Rails]]></category>
		<category><![CDATA[checkbox list]]></category>
		<category><![CDATA[checkboxes]]></category>
		<category><![CDATA[HABTM]]></category>
		<category><![CDATA[has and belongs to many]]></category>

		<guid isPermaLink="false">http://www.justinball.com/?p=567</guid>
		<description><![CDATA[Checkboxes are one of those things that look easy and should be easy, but they aren't always easy.  I needed a solution that could create a checkbox list of languages that a user speaks.  So I don't forget  here's how to do it:
The migrations are important.  You have to be sure [...]]]></description>
			<content:encoded><![CDATA[<p>Checkboxes are one of those things that look easy and should be easy, but they aren't always easy.  I needed a solution that could create a checkbox list of languages that a user speaks.  So I don't forget  here's how to do it:</p>
<p>The migrations are important.  You have to be sure to exclude the id parameter when you create languages_users or you will get ' Mysql::Error: #23000Duplicate entry' due to the fact that ActiveRecord will try to store a value in the id field that indicates which model created the entry (User.languages << vs Langauges.users).  The other option is the create the id parameter so that the direction is maintained but be sure that it is not created as a primary key.</p>
<pre class="ruby">&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> LanguagesUsers &lt; <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Migration</span>
    <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">up</span>
        create_table <span style="color:#ff3333; font-weight:bold;">:languages_users</span>, <span style="color:#ff3333; font-weight:bold;">:id</span> =&gt; <span style="color:#0000FF; font-weight:bold;">false</span>, <span style="color:#ff3333; font-weight:bold;">:force</span> =&gt; <span style="color:#0000FF; font-weight:bold;">true</span> <span style="color:#9966CC; font-weight:bold;">do</span> |t|
            t.<span style="color:#CC0066; font-weight:bold;">integer</span> <span style="color:#ff3333; font-weight:bold;">:user_id</span>
            t.<span style="color:#CC0066; font-weight:bold;">integer</span> <span style="color:#ff3333; font-weight:bold;">:language_id</span>
            t.<span style="color:#9900CC;">timestamps</span>
        <span style="color:#9966CC; font-weight:bold;">end</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
    <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">down</span>
        drop_table <span style="color:#ff3333; font-weight:bold;">:languages_users</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;</pre>
<pre class="ruby">&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> Languages &lt; <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Migration</span>
&nbsp;
    <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">up</span>
        create_table <span style="color:#996600;">&quot;languages&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:force</span> =&gt; <span style="color:#0000FF; font-weight:bold;">true</span> <span style="color:#9966CC; font-weight:bold;">do</span> |t|
            t.<span style="color:#CC0066; font-weight:bold;">string</span>  <span style="color:#996600;">&quot;name&quot;</span>
            t.<span style="color:#CC0066; font-weight:bold;">string</span>  <span style="color:#996600;">&quot;english_name&quot;</span>
            t.<span style="color:#CC0066; font-weight:bold;">integer</span> <span style="color:#996600;">&quot;is_default&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:default</span> =&gt; <span style="color:#006666;">0</span>
        <span style="color:#9966CC; font-weight:bold;">end</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
    <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">down</span>
        drop_table <span style="color:#996600;">&quot;languages&quot;</span>
        drop_table <span style="color:#996600;">&quot;users_languages&quot;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;</pre>
<pre class="ruby">&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> Users &lt; <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Migration</span>
&nbsp;
    <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">up</span>
        create_table <span style="color:#996600;">&quot;users&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:force</span> =&gt; <span style="color:#0000FF; font-weight:bold;">true</span> <span style="color:#9966CC; font-weight:bold;">do</span> |t|
            t.<span style="color:#CC0066; font-weight:bold;">string</span>  <span style="color:#996600;">&quot;login&quot;</span>
            <span style="color:#008000; font-style:italic;"># other fields excluded for brevity</span>
        <span style="color:#9966CC; font-weight:bold;">end</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
    <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">down</span>
        drop_table <span style="color:#996600;">&quot;users&quot;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;</pre>
<p>Here are my models:<br />
user.rb</p>
<pre class="ruby">&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> User &lt; <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>
    has_and_belongs_to_many <span style="color:#ff3333; font-weight:bold;">:languages</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;</pre>
<p>language.rb:</p>
<pre class="ruby">&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> Language &lt; <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>
  has_and_belongs_to_many <span style="color:#ff3333; font-weight:bold;">:users</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;</pre>
<p>In my user_controller.rb the create and update methods are simple.  This is thanks to the fact that you get a language_ids method on the user object because of the HABTM relationship. </p>
<pre class="ruby">&nbsp;
    <span style="color:#9966CC; font-weight:bold;">def</span> create
        <span style="color:#0066ff; font-weight:bold;">@user</span> = User.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>params<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:user</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
        <span style="color:#0066ff; font-weight:bold;">@user</span>.<span style="color:#9900CC;">save</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
    <span style="color:#9966CC; font-weight:bold;">def</span> update
        params<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:user</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:language_ids</span><span style="color:#006600; font-weight:bold;">&#93;</span> ||= <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
&nbsp;
        <span style="color:#0066ff; font-weight:bold;">@user</span> = User.<span style="color:#9900CC;">find</span><span style="color:#006600; font-weight:bold;">&#40;</span>current_user<span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
        <span style="color:#9966CC; font-weight:bold;">if</span> <span style="color:#0066ff; font-weight:bold;">@user</span>.<span style="color:#9900CC;">update_attributes</span> params<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:user</span><span style="color:#006600; font-weight:bold;">&#93;</span>
            flash<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:notice</span><span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#996600;">&quot;Settings have been saved.&quot;</span>
            redirect_to edit_user_url<span style="color:#006600; font-weight:bold;">&#40;</span>@user<span style="color:#006600; font-weight:bold;">&#41;</span>
        <span style="color:#9966CC; font-weight:bold;">else</span>
            flash.<span style="color:#9900CC;">now</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:error</span><span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#0066ff; font-weight:bold;">@user</span>.<span style="color:#9900CC;">errors</span>
            setup_form_values
            respond_to <span style="color:#9966CC; font-weight:bold;">do</span> |format|
                <span style="color:#CC0066; font-weight:bold;">format</span>.<span style="color:#9900CC;">html</span> <span style="color:#006600; font-weight:bold;">&#123;</span> render <span style="color:#ff3333; font-weight:bold;">:action</span> =&gt; <span style="color:#ff3333; font-weight:bold;">:edit</span><span style="color:#006600; font-weight:bold;">&#125;</span>
            <span style="color:#9966CC; font-weight:bold;">end</span>
        <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
    <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;</pre>
<p>On to the view:</p>
<pre class="ruby">&nbsp;
&lt;ul <span style="color:#9966CC; font-weight:bold;">class</span>=<span style="color:#996600;">&quot;checkbox-list&quot;</span>&gt;
  &lt;% <span style="color:#0066ff; font-weight:bold;">@languages</span>.<span style="color:#9900CC;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> |language| -%&gt;
&lt;li&gt;&lt;%= check_box_tag <span style="color:#996600;">&quot;user[language_ids][]&quot;</span>, language.<span style="color:#9900CC;">id</span>, user_speaks_language?<span style="color:#006600; font-weight:bold;">&#40;</span>language<span style="color:#006600; font-weight:bold;">&#41;</span> -%&gt; &lt;%= language.<span style="color:#9900CC;">english_name</span> -%&gt;&lt;/li&gt;
&nbsp;
  &lt;% <span style="color:#9966CC; font-weight:bold;">end</span> -%&gt;
&lt;/ul&gt;
&nbsp;</pre>
<p>NOTE: I had an error in my original method.  This code:</p>
<pre class="ruby">&nbsp;
&lt;li&gt;&lt;%= f.<span style="color:#9900CC;">check_box</span> <span style="color:#ff3333; font-weight:bold;">:language_ids</span>, <span style="color:#006600; font-weight:bold;">&#123;</span>:checked =&gt; user_speaks_language?<span style="color:#006600; font-weight:bold;">&#40;</span>language<span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#125;</span>, <span style="color:#996600;">&quot;#{language.id}&quot;</span>, <span style="color:#996600;">&quot;&quot;</span>  -%&gt; &lt;%= <span style="color:#996600;">&quot;#{language.english_name}&quot;</span> -%&gt;&lt;/li&gt;
&nbsp;</pre>
<p>should be this:</p>
<pre class="ruby">&nbsp;
&lt;li&gt;&lt;%= check_box_tag <span style="color:#996600;">&quot;user[language_ids][]&quot;</span>, language.<span style="color:#9900CC;">id</span>, user_speaks_language?<span style="color:#006600; font-weight:bold;">&#40;</span>language<span style="color:#006600; font-weight:bold;">&#41;</span> -%&gt; &lt;%= language.<span style="color:#9900CC;">english_name</span> -%&gt;&lt;/li&gt;
&nbsp;</pre>
<p>And we'll need this helper method:</p>
<pre class="ruby">&nbsp;
<span style="color:#9966CC; font-weight:bold;">def</span> user_speaks_language?<span style="color:#006600; font-weight:bold;">&#40;</span>language<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#9966CC; font-weight:bold;">if</span> <span style="color:#0066ff; font-weight:bold;">@user</span> &amp;&amp; !@user.<span style="color:#9900CC;">login</span>.<span style="color:#0000FF; font-weight:bold;">nil</span>? <span style="color:#008000; font-style:italic;"># no sense in testing new users that have no languages</span>
        <span style="color:#0066ff; font-weight:bold;">@user</span>.<span style="color:#9900CC;">languages</span>.<span style="color:#9966CC; font-weight:bold;">include</span>?<span style="color:#006600; font-weight:bold;">&#40;</span>language<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#9966CC; font-weight:bold;">else</span>
        <span style="color:#0000FF; font-weight:bold;">false</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;</pre>
<p>The result is that you will get a list of check boxes that update values in the join table that is part of the has_and_belongs_to_many relationship.  Rails is very cool</p>
]]></content:encoded>
			<wfw:commentRss>http://www.justinball.com/2008/07/03/checkbox-list-in-ruby-on-rails-using-habtm/feed/</wfw:commentRss>
		<slash:comments>25</slash:comments>
		</item>
	</channel>
</rss>
