<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Wolfmans Howlings: An Admin page for Rails Role Based Authentication</title>
    <link>http://blog.wolfman.com/articles/2006/05/20/role-based-authentication-admin-page</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>A programmers Blog about Ruby, Rails and a few other issues</description>
    <item>
      <title>An Admin page for Rails Role Based Authentication</title>
      <description>&lt;p&gt;This is an example of an admin page for the Rails Recipes book Role Based Authentication, using a 
tree control and checkboxes for HABTM.&lt;/p&gt;

&lt;p&gt;I used the &lt;a href="http://www.silverstripe.com/downloads/tree/"&gt;Silverstripe tree control&lt;/a&gt;
to render two trees, on the left a list of all Roles and what Rights
they have. On the right a tree with all controllers and a checkbox for
each action for each controller, under that a set of checkboxes that
allow you to apply the selected rights to the selected Roles.&lt;/p&gt;

&lt;p&gt;This technique seems a good match where the lists are hierarchical so
it can cut down on the screen real-estate for very large lists.&lt;/p&gt;

&lt;p&gt;Example code...&lt;/p&gt;

&lt;p&gt;In the model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Rights class has_and_belongs_to_many :roles&lt;/li&gt;
&lt;li&gt;The Roles class has_and_belongs_to_many :rights&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I setup the data by creating hashes in the controller which are available to the view...&lt;/p&gt;

&lt;p&gt;In roles_controller.rb...&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;edit&lt;/span&gt;
    &lt;span class="comment"&gt;# roll everything up into a hierarchical tree structure&lt;/span&gt;
    &lt;span class="comment"&gt;# top level is hash of roles&lt;/span&gt;
    &lt;span class="comment"&gt;#   next level is hash of permissions with controller as key and array of actions as value&lt;/span&gt;
    &lt;span class="attribute"&gt;@role_tree&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;{}&lt;/span&gt;
    &lt;span class="ident"&gt;roles&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Role&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;find_all&lt;/span&gt;
    &lt;span class="ident"&gt;roles&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;each&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;r&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
        &lt;span class="ident"&gt;ph&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;{}&lt;/span&gt;
        &lt;span class="ident"&gt;rights&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;r&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;rights&lt;/span&gt;
        &lt;span class="ident"&gt;rights&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;each&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;p&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
            &lt;span class="ident"&gt;ph&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="ident"&gt;p&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;controller&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt; &lt;span class="punct"&gt;||=&lt;/span&gt; &lt;span class="punct"&gt;[]&lt;/span&gt;
            &lt;span class="ident"&gt;ph&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="ident"&gt;p&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;controller&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="ident"&gt;p&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;action&lt;/span&gt;
        &lt;span class="keyword"&gt;end&lt;/span&gt;
        &lt;span class="attribute"&gt;@role_tree&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="ident"&gt;r&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;ph&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;

    &lt;span class="comment"&gt;# creates a tree of controllers with the actions for each controller&lt;/span&gt;
    &lt;span class="comment"&gt;# top level is hash of controllers&lt;/span&gt;
    &lt;span class="comment"&gt;#  next level is an array of actions&lt;/span&gt;
    &lt;span class="attribute"&gt;@rights_tree&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;{}&lt;/span&gt;
    &lt;span class="ident"&gt;rights&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Right&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;find_all&lt;/span&gt;
    &lt;span class="ident"&gt;rights&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;each&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;r&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
        &lt;span class="ident"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;r&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;controller&lt;/span&gt;
        &lt;span class="attribute"&gt;@rights_tree&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="ident"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt; &lt;span class="punct"&gt;||=&lt;/span&gt; &lt;span class="punct"&gt;[]&lt;/span&gt;
        &lt;span class="attribute"&gt;@rights_tree&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="ident"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="ident"&gt;r&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;action&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The view (edit.rhtml) is simple... &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;h1&amp;gt;Role and Rights Editor&amp;lt;/h1&amp;gt;

&amp;lt;table cellspacing="10" cellpadding="20%"&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;th align="left"&amp;gt;Roles&amp;lt;/th&amp;gt;
&amp;lt;th align="left"&amp;gt;Rights&amp;lt;/th&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td valign="top"&amp;gt;&amp;lt;%= render_role_tree(@role_tree) %&amp;gt;&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;&amp;lt;%= start_form_tag :action =&amp;gt; 'edit' %&amp;gt;
   &amp;lt;%= render_rights_tree(@rights_tree) %&amp;gt;
&amp;lt;p&amp;gt;
The checked items above will replace the Rights of the following
Roles:&amp;lt;br&amp;gt;
   &amp;lt;% @role_tree.each_key do |role| %&amp;gt;
    &amp;lt;%= check_box_tag "role", role %&amp;gt; &amp;lt;%= role %&amp;gt;
   &amp;lt;% end %&amp;gt;
&amp;lt;p&amp;gt;
   &amp;lt;%= submit_tag "Allocate to selected Roles" %&amp;gt;
&amp;lt;%= end_form_tag %&amp;gt;
&amp;lt;/td&amp;gt;
&amp;lt;/table&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This part goes in helpers, and creates the html for the two trees this is specific for
the silverstripe tree control...&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;module &lt;/span&gt;&lt;span class="module"&gt;RoleHelper&lt;/span&gt;
    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;render_role_tree&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;tree&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
        &lt;span class="ident"&gt;ret&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
        &lt;span class="ident"&gt;ret&lt;/span&gt; &lt;span class="punct"&gt;+=&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&amp;lt;ul class='tree'&amp;gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;

        &lt;span class="ident"&gt;tree&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;each_key&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;r&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
            &lt;span class="ident"&gt;ret&lt;/span&gt; &lt;span class="punct"&gt;+=&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="ident"&gt;r&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="comment"&gt;# list roles&lt;/span&gt;
            &lt;span class="ident"&gt;h&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;tree&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="ident"&gt;r&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt; &lt;span class="comment"&gt;# get hash of controllers/[actions]&lt;/span&gt;
            &lt;span class="keyword"&gt;unless&lt;/span&gt; &lt;span class="ident"&gt;h&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;empty?&lt;/span&gt;
                &lt;span class="ident"&gt;ret&lt;/span&gt; &lt;span class="punct"&gt;+=&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
                &lt;span class="ident"&gt;h&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;each_key&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;c&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
                    &lt;span class="ident"&gt;ret&lt;/span&gt; &lt;span class="punct"&gt;+=&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="ident"&gt;c&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="comment"&gt;# list controllers&lt;/span&gt;
                    &lt;span class="ident"&gt;a&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;h&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="ident"&gt;c&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt;
                    &lt;span class="keyword"&gt;unless&lt;/span&gt; &lt;span class="ident"&gt;a&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;empty?&lt;/span&gt;
                        &lt;span class="ident"&gt;ret&lt;/span&gt; &lt;span class="punct"&gt;+=&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
                        &lt;span class="ident"&gt;a&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;each&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;an&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
                            &lt;span class="ident"&gt;ret&lt;/span&gt; &lt;span class="punct"&gt;+=&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="ident"&gt;an&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="comment"&gt;# list actions&lt;/span&gt;
                        &lt;span class="keyword"&gt;end&lt;/span&gt;
                        &lt;span class="ident"&gt;ret&lt;/span&gt; &lt;span class="punct"&gt;+=&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
                    &lt;span class="keyword"&gt;end&lt;/span&gt;
                    &lt;span class="ident"&gt;ret&lt;/span&gt; &lt;span class="punct"&gt;+=&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
                &lt;span class="keyword"&gt;end&lt;/span&gt;
                &lt;span class="ident"&gt;ret&lt;/span&gt; &lt;span class="punct"&gt;+=&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
            &lt;span class="keyword"&gt;end&lt;/span&gt;
            &lt;span class="ident"&gt;ret&lt;/span&gt; &lt;span class="punct"&gt;+=&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
        &lt;span class="keyword"&gt;end&lt;/span&gt;
        &lt;span class="ident"&gt;ret&lt;/span&gt; &lt;span class="punct"&gt;+=&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
        &lt;span class="ident"&gt;ret&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;

    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;render_rights_tree&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;tree&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
        &lt;span class="ident"&gt;ret&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
        &lt;span class="ident"&gt;ret&lt;/span&gt; &lt;span class="punct"&gt;+=&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&amp;lt;ul class='tree'&amp;gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;

        &lt;span class="ident"&gt;tree&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;each_key&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;r&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
            &lt;span class="ident"&gt;ret&lt;/span&gt; &lt;span class="punct"&gt;+=&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&amp;lt;li&amp;gt;&amp;lt;a href=&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;#&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class="expr"&gt;#{r}&lt;/span&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="comment"&gt;# list controllers&lt;/span&gt;
            &lt;span class="ident"&gt;aa&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;tree&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="ident"&gt;r&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt; &lt;span class="comment"&gt;# get array of actions&lt;/span&gt;
            &lt;span class="keyword"&gt;unless&lt;/span&gt; &lt;span class="ident"&gt;aa&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;empty?&lt;/span&gt;
                &lt;span class="ident"&gt;ret&lt;/span&gt; &lt;span class="punct"&gt;+=&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
                &lt;span class="ident"&gt;ret&lt;/span&gt; &lt;span class="punct"&gt;+=&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&amp;lt;li&amp;gt;&amp;lt;a href=&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;#&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt; onclick=&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;checkAll('right[&lt;span class="expr"&gt;#{r}&lt;/span&gt;][]'); return false;&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;&amp;gt;Check All&amp;lt;/a&amp;gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
                &lt;span class="ident"&gt;aa&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;each&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;a&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
                    &lt;span class="ident"&gt;ret&lt;/span&gt; &lt;span class="punct"&gt;+=&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&amp;lt;input type=&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;checkbox&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt; name=&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;right[&lt;span class="expr"&gt;#{r}&lt;/span&gt;][]&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt; value=&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;&lt;span class="expr"&gt;#{a}&lt;/span&gt;&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="ident"&gt;a&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="comment"&gt;# list actions&lt;/span&gt;
                &lt;span class="keyword"&gt;end&lt;/span&gt;
                &lt;span class="ident"&gt;ret&lt;/span&gt; &lt;span class="punct"&gt;+=&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
            &lt;span class="keyword"&gt;end&lt;/span&gt;
            &lt;span class="ident"&gt;ret&lt;/span&gt; &lt;span class="punct"&gt;+=&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
        &lt;span class="keyword"&gt;end&lt;/span&gt;
        &lt;span class="ident"&gt;ret&lt;/span&gt; &lt;span class="punct"&gt;+=&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
        &lt;span class="ident"&gt;ret&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;the action handler in the controller for the post basically goes
through all the selected checkboxes and sets the relevant habtms.&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;edit&lt;/span&gt;
    &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;request&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;post?&lt;/span&gt;
        &lt;span class="comment"&gt;#p params&lt;/span&gt;
        &lt;span class="keyword"&gt;unless&lt;/span&gt; &lt;span class="ident"&gt;params&lt;/span&gt;&lt;span class="punct"&gt;['&lt;/span&gt;&lt;span class="string"&gt;role&lt;/span&gt;&lt;span class="punct"&gt;'].&lt;/span&gt;&lt;span class="ident"&gt;nil?&lt;/span&gt;
            &lt;span class="ident"&gt;a_roles&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;params&lt;/span&gt;&lt;span class="punct"&gt;['&lt;/span&gt;&lt;span class="string"&gt;role&lt;/span&gt;&lt;span class="punct"&gt;']&lt;/span&gt;
            &lt;span class="ident"&gt;a_rights&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;params&lt;/span&gt;&lt;span class="punct"&gt;['&lt;/span&gt;&lt;span class="string"&gt;right&lt;/span&gt;&lt;span class="punct"&gt;']&lt;/span&gt;
            &lt;span class="keyword"&gt;unless&lt;/span&gt; &lt;span class="ident"&gt;a_rights&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;nil?&lt;/span&gt;
                &lt;span class="ident"&gt;a_roles&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;each&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;ar&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
                    &lt;span class="ident"&gt;role&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Role&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;find_by_name&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;ar&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
                    &lt;span class="keyword"&gt;unless&lt;/span&gt; &lt;span class="ident"&gt;role&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;nil?&lt;/span&gt;
                        &lt;span class="ident"&gt;role&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;rights&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;clear&lt;/span&gt;
                        &lt;span class="ident"&gt;a_rights&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;each&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;controller&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;aa&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
                            &lt;span class="ident"&gt;aa&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;each&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;action&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
                                &lt;span class="ident"&gt;right&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Right&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;find_by_controller_and_action&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;controller&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;action&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
                                &lt;span class="keyword"&gt;unless&lt;/span&gt; &lt;span class="ident"&gt;right&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;nil?&lt;/span&gt;
                                    &lt;span class="ident"&gt;role&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;rights&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="ident"&gt;right&lt;/span&gt;
                                &lt;span class="keyword"&gt;else&lt;/span&gt;
                                    &lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Right &lt;span class="expr"&gt;#{controller}&lt;/span&gt;/&lt;span class="expr"&gt;#{action}&lt;/span&gt; not found&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
                                &lt;span class="keyword"&gt;end&lt;/span&gt;
                            &lt;span class="punct"&gt;}&lt;/span&gt;
                        &lt;span class="punct"&gt;}&lt;/span&gt;
                    &lt;span class="keyword"&gt;else&lt;/span&gt;
                        &lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Role &lt;span class="expr"&gt;#{ar}&lt;/span&gt; not found&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
                    &lt;span class="keyword"&gt;end&lt;/span&gt;
                &lt;span class="punct"&gt;}&lt;/span&gt;
                &lt;span class="ident"&gt;flash&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="symbol"&gt;:notice&lt;/span&gt;&lt;span class="punct"&gt;]=&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;rights updated&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
            &lt;span class="keyword"&gt;else&lt;/span&gt;
                &lt;span class="ident"&gt;flash&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="symbol"&gt;:warning&lt;/span&gt;&lt;span class="punct"&gt;]=&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;no rights were selected&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
            &lt;span class="keyword"&gt;end&lt;/span&gt;
        &lt;span class="keyword"&gt;else&lt;/span&gt;
            &lt;span class="ident"&gt;flash&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="symbol"&gt;:warning&lt;/span&gt;&lt;span class="punct"&gt;]=&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;You need to select the role to allocate to&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
        &lt;span class="keyword"&gt;end&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Checking and unchecking all the boxes&lt;/h3&gt;

&lt;p&gt;This is done with a little bit of javascript.&lt;/p&gt;

&lt;p&gt;The view code looks like...&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; &amp;amp;lt;a href="#" onclick="checkAll('permissions_&amp;lt;%= controller_id %&amp;gt;[]'); return false;"\&amp;gt;all&amp;amp;lt;/a&amp;gt;
 &amp;amp;lt;a href="#" onclick="uncheckAll('permissions_&amp;lt;%= controller_id %&amp;gt;[]'); return false;"\&amp;gt;none&amp;amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The java script is...&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;function checkAll(name)
{
    boxes = document.getElementsByName(name)
    for (i = 0; i &amp;lt; boxes.length; i++)
        boxes[i].checked = true ;
}

function uncheckAll(name)
{
    boxes = document.getElementsByName(name)
    for (i = 0; i &amp;lt; boxes.length; i++)
        boxes[i].checked = false ;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;p&gt;&lt;/p&gt;

&lt;h3&gt;Automatically adding Rights.&lt;/h3&gt;

&lt;p&gt;Lastly the question of how to get all those Rights into the table? I
liked the approach of the &lt;a href="http://rails-engines.org/user_engine"&gt;UserEngine&lt;/a&gt; so I borrowed it from them
(thanks:), Add this to the app/models/right.rb file, then whenever you
need to get all the new actions and controllers populated call
Right.synchronize_with_controllers from the console, (or create a
button on your admin page to do it). Here is the code...&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;
&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Right&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;ActiveRecord&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Base&lt;/span&gt;
  &lt;span class="ident"&gt;has_and_belongs_to_many&lt;/span&gt; &lt;span class="symbol"&gt;:roles&lt;/span&gt;
  &lt;span class="ident"&gt;validates_presence_of&lt;/span&gt; &lt;span class="symbol"&gt;:controller&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:action&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:name&lt;/span&gt;
  &lt;span class="ident"&gt;validates_uniqueness_of&lt;/span&gt; &lt;span class="symbol"&gt;:name&lt;/span&gt;

  &lt;span class="comment"&gt;# Ensure that the table has one entry for each controller/action pair&lt;/span&gt;
  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;self.synchronize_with_controllers&lt;/span&gt;
    &lt;span class="comment"&gt;# weird hack. otherwise ActiveRecord has no idea about the superclass of any&lt;/span&gt;
    &lt;span class="comment"&gt;# ActionController stuff...&lt;/span&gt;
    &lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="constant"&gt;RAILS_ROOT&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;/app/controllers/application&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;

    &lt;span class="comment"&gt;# Load all the controller files&lt;/span&gt;
    &lt;span class="ident"&gt;controller_files&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Dir&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="constant"&gt;RAILS_ROOT&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;/app/controllers/**/*_controller.rb&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;]&lt;/span&gt;

    &lt;span class="comment"&gt;# we need to load all the controllers...&lt;/span&gt;
    &lt;span class="ident"&gt;controller_files&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;each&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;file_name&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
      &lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="ident"&gt;file_name&lt;/span&gt; &lt;span class="comment"&gt;#if /_controller.rb$/ =~ file_name&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;


    &lt;span class="comment"&gt;# Find the actions in each of the controllers, and add them to the database&lt;/span&gt;
    &lt;span class="ident"&gt;subclasses_of&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;ApplicationController&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;each&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;controller&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
      &lt;span class="ident"&gt;controller&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;public_instance_methods&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;false&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;each&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;action&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
        &lt;span class="keyword"&gt;next&lt;/span&gt; &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;action&lt;/span&gt; &lt;span class="punct"&gt;=~&lt;/span&gt; &lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="regex"&gt;return_to_main|component_update|component&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;
        &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;find_all_by_controller_and_action&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;controller&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;controller_path&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;action&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;empty?&lt;/span&gt;
          &lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:name&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&lt;span class="expr"&gt;#{controller}&lt;/span&gt;.&lt;span class="expr"&gt;#{action}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; &lt;span class="symbol"&gt;:controller&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ident"&gt;controller&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;controller_path&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:action&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ident"&gt;action&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;save!&lt;/span&gt;
          &lt;span class="ident"&gt;logger&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;info&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;added: &lt;span class="expr"&gt;#{controller}&lt;/span&gt; - &lt;span class="expr"&gt;#{controller.controller_path}&lt;/span&gt;, &lt;span class="expr"&gt;#{action}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
        &lt;span class="keyword"&gt;end&lt;/span&gt;
      &lt;span class="keyword"&gt;end&lt;/span&gt;
      &lt;span class="comment"&gt;# The following thanks to Tom Styles &lt;/span&gt;
      &lt;span class="comment"&gt;# Then check to make sure that all the rights for that controller in the database&lt;/span&gt;
      &lt;span class="comment"&gt;# still exist in the controller itself&lt;/span&gt;
      &lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;find&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:all&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:conditions&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;['&lt;/span&gt;&lt;span class="string"&gt;controller = ?&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="ident"&gt;controller&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;controller_path&lt;/span&gt;&lt;span class="punct"&gt;]).&lt;/span&gt;&lt;span class="ident"&gt;each&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;right_to_go&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
        &lt;span class="keyword"&gt;unless&lt;/span&gt; &lt;span class="ident"&gt;controller&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;public_instance_methods&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;false&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;include?&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;right_to_go&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;action&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
          &lt;span class="ident"&gt;right_to_go&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;destroy&lt;/span&gt;
        &lt;span class="keyword"&gt;end&lt;/span&gt;
      &lt;span class="keyword"&gt;end&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      <pubDate>Sat, 20 May 2006 13:19:00 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:f2a07b6bcdd4c725c3d9d3c5478e66fd</guid>
      <author>Jim Morris</author>
      <link>http://blog.wolfman.com/articles/2006/05/20/role-based-authentication-admin-page</link>
      <category>Rails</category>
      <category>ruby</category>
      <category>rails</category>
      <category>RBAC</category>
      <trackback:ping>http://blog.wolfman.com/articles/trackback/2</trackback:ping>
    </item>
    <item>
      <title>"An Admin page for Rails Role Based Authentication" by sgarza</title>
      <description>&lt;p&gt;i have this running on rails 2.1&lt;/p&gt;

&lt;p&gt;the only modifications to work are:&lt;/p&gt;

&lt;p&gt;in roles_controller.rb
change this
roles= Role.find_all
to this
roles= Role.find(:all)&lt;/p&gt;

&lt;p&gt;and this
rights= Right.find_all
to this
rights= Right.find(:all)&lt;/p&gt;</description>
      <pubDate>Tue, 01 Jul 2008 17:11:51 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:ff89c320-3956-484a-a018-46e8d69ac6c4</guid>
      <link>http://blog.wolfman.com/articles/2006/05/20/role-based-authentication-admin-page#comment-222</link>
    </item>
    <item>
      <title>"An Admin page for Rails Role Based Authentication" by wolfmanjm</title>
      <description>&lt;p&gt;Its quite possible as this was written for quite an old version of rails, and has not been tested with any newer versions.&lt;/p&gt;

&lt;p&gt;If someone wants to update it, I'm sure others would appreciate it.&lt;/p&gt;</description>
      <pubDate>Wed, 13 Feb 2008 21:35:05 -0800</pubDate>
      <guid isPermaLink="false">urn:uuid:9578f9fb-0309-4420-97c0-be791c5f9dea</guid>
      <link>http://blog.wolfman.com/articles/2006/05/20/role-based-authentication-admin-page#comment-200</link>
    </item>
    <item>
      <title>"An Admin page for Rails Role Based Authentication" by sw0rdfish</title>
      <description>So I tried doing this, and I realize the post is almost 18 months old or something, I'm just curious.  when I put this in my Rights model, I get the following error.

 Right.synchronize_with_controllers
NoMethodError: undefined method `synchronize_with_controllers' for #

if I create a Right object I get;
 rights = Right.new
= #
 rights.synchronize_with_controllers
NoMethodError: undefined method `find_all_by_controller_and_action' for #

So I posted this in the Role object, added in the appropriate Model references "Right.find_all_by... " and I was able to run it.

Has something changed in Rails?</description>
      <pubDate>Wed, 13 Feb 2008 12:42:10 -0800</pubDate>
      <guid isPermaLink="false">urn:uuid:738e69c8-ddbd-4145-9fc8-6e870853d0a3</guid>
      <link>http://blog.wolfman.com/articles/2006/05/20/role-based-authentication-admin-page#comment-199</link>
    </item>
    <item>
      <title>"An Admin page for Rails Role Based Authentication" by Mythril</title>
      <description>&lt;p&gt;I had all kinds of troubles with loading the modules in order to get subclasses_of to work properly, not sure if this is because Rails was changed in the latest release or because we use subfolders for some controllers. Anyway, in the end I went for another approach, where I just get each controller class by parsing the controller files:&lt;/p&gt;

&lt;pre&gt;

       # Load all the controller files
       controller_files = Dir[RAILS_ROOT +  /app/controllers/**/*_controller.rb"]
       controllers = []
       # we need to load all the controllers...
       controller_files.each do |file_name|
         match = file_name.match(/\/app\/controllers\/(([a-z_]+)\/?[a-z_]+).rb$/)
         name = match[1].camelize
         controllers &amp;#60;&amp;#60; eval(name)
       end

&lt;/pre&gt;

&lt;p&gt;Hopefully this will be helpful for other people.&lt;/p&gt;</description>
      <pubDate>Tue, 27 Feb 2007 01:16:06 -0800</pubDate>
      <guid isPermaLink="false">urn:uuid:f9e821b7-b21a-4a10-a8cf-260404654607</guid>
      <link>http://blog.wolfman.com/articles/2006/05/20/role-based-authentication-admin-page#comment-63</link>
    </item>
    <item>
      <title>"An Admin page for Rails Role Based Authentication" by grace</title>
      <description>&lt;p&gt;For complete numpties I would have liked to know exactly where the view code javascript went ...
Also, to help, other numpties
Type "ruby/script console" in your command prompt at the project root, this will launch irb.  Then enter Right.synchronize_with_controllers to preload controllers into the rights table.&lt;/p&gt;</description>
      <pubDate>Thu, 01 Feb 2007 11:24:52 -0800</pubDate>
      <guid isPermaLink="false">urn:uuid:7032d752-2ddb-4fe2-a841-150202ca809d</guid>
      <link>http://blog.wolfman.com/articles/2006/05/20/role-based-authentication-admin-page#comment-54</link>
    </item>
    <item>
      <title>"An Admin page for Rails Role Based Authentication" by wolfmanjm</title>
      <description>&lt;p&gt;I have to agree its rather ugly, I don't even remember writing it! It must have been a bad day. Tree walking code is usually ugly unless you use recursion, so I guess one day I'll refactor it.&lt;/p&gt;</description>
      <pubDate>Sun, 10 Dec 2006 19:33:19 -0800</pubDate>
      <guid isPermaLink="false">urn:uuid:e5b47f67-eb3d-491b-9f24-65d8a4271cb8</guid>
      <link>http://blog.wolfman.com/articles/2006/05/20/role-based-authentication-admin-page#comment-27</link>
    </item>
    <item>
      <title>"An Admin page for Rails Role Based Authentication" by wanderer</title>
      <description>&lt;p&gt;Umm .... That piece of code sure looks ugly. Linus Torvalds once said in a heated debated regarding indentation "If your code has more than 3 level deep indentations, it's f**ked up." I gotta agree with him on that one. You need to rework your code. Otherwise, it's a helpful piece.&lt;/p&gt;</description>
      <pubDate>Sun, 10 Dec 2006 18:38:56 -0800</pubDate>
      <guid isPermaLink="false">urn:uuid:2faf53b9-4ea4-4580-bbdf-7aaadba3488d</guid>
      <link>http://blog.wolfman.com/articles/2006/05/20/role-based-authentication-admin-page#comment-26</link>
    </item>
    <item>
      <title>"An Admin page for Rails Role Based Authentication" by wolfman</title>
      <description>&lt;p&gt;Excellent thanks, I'll add it to the example.&lt;/p&gt;</description>
      <pubDate>Fri, 15 Sep 2006 21:45:37 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:fc27182f-8b73-44a6-8761-9aac2dc47d66</guid>
      <link>http://blog.wolfman.com/articles/2006/05/20/role-based-authentication-admin-page#comment-17</link>
    </item>
    <item>
      <title>"An Admin page for Rails Role Based Authentication" by Tom Styles</title>
      <description>&lt;p&gt;Great stuff, I've made a slight amendment to the code that automatically populates the Right's table, so that it removes any actions that have been tidied up in the controllers. Here it is, I've chopped off the top and bottom to keep it tidy...&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    # Find the actions in each of the controllers, and add them to the database
    subclasses_of(ApplicationController).each do |controller|
        controller.public_instance_methods(false).each do |action|
            next if action =~ /return_to_main|component_update|component/
            if find_all_by_controller_and_action(controller.controller_path, action).empty?
                self.new(:name =&amp;gt; "#{controller}.#{action}", :controller =&amp;gt; controller.controller_path, :action =&amp;gt; action).save!
                logger.info "added: #{controller} - #{controller.controller_path}, #{action}"
            end
        end
        # Then check to make sure that all the rights for that controller in the database
        # still exist in the controller itself
        self.find(:all, :conditions =&amp;gt; ['controller = ?', controller.controller_path]).each do |right_to_go|
          unless controller.public_instance_methods(false).include?(right_to_go.action)
            right_to_go.destroy
          end
        end
    end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Feel free to include this in the tutorial. I'm now calling this function just before the rights page is displayed so I've always got an upto date set of rights to deal with.&lt;/p&gt;</description>
      <pubDate>Fri, 15 Sep 2006 18:19:28 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:6f6c3493-d68c-4639-b29a-b6807f7aad0a</guid>
      <link>http://blog.wolfman.com/articles/2006/05/20/role-based-authentication-admin-page#comment-39</link>
    </item>
    <item>
      <title>"An Admin page for Rails Role Based Authentication" by Andre</title>
      <description>&lt;p&gt;Awesome.  This is going to save me a bunch of time.  Thanks for putting this together.&lt;/p&gt;</description>
      <pubDate>Sun, 04 Jun 2006 11:33:11 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:</guid>
      <link>http://blog.wolfman.com/articles/2006/05/20/role-based-authentication-admin-page#comment-29</link>
    </item>
  </channel>
</rss>
