<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="en-US">
  <title>theAdmin.org - Home</title>
  <id>tag:theadmin.org,2009:mephisto/</id>
  <generator uri="http://mephistoblog.com" version="0.8.0">Mephisto Drax</generator>
  
  <link href="http://theadmin.org/" rel="alternate" type="text/html" />
  <updated>2009-06-25T04:03:39Z</updated>
  <geo:lat>45.49106</geo:lat><geo:long>-122.803594</geo:long><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nc-sa/2.0/" /><logo>http://www.feedburner.com/fb/images/pub/fb_pwrd.gif</logo><link rel="self" href="http://feeds.feedburner.com/theAdmin" type="application/atom+xml" /><feedburner:emailServiceId>theAdmin</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2FtheAdmin" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FtheAdmin" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2FtheAdmin" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/theAdmin" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FtheAdmin" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FtheAdmin" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FtheAdmin" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry xml:base="http://theadmin.org/">
    <author>
      <name>edavis</name>
    </author>
    <id>tag:theadmin.org,2009-06-25:13597</id>
    <published>2009-06-25T04:02:00Z</published>
    <updated>2009-06-25T04:03:39Z</updated>
    <category term="business" />
    <category term="git" />
    <category term="open source" />
    <category term="open source bridge" />
    <category term="osb09" />
    <category term="osbridge" />
    <category term="ruby" />
    <link href="http://feedproxy.google.com/~r/theAdmin/~3/vGDlVBNvNxU/open-source-bridge-2009" rel="alternate" type="text/html" />
    <title>Open Source Bridge 2009</title>
<content type="html">
            &lt;p&gt;I attended &lt;a href="http://opensourcebridge.org"&gt;Open Source Bridge&lt;/a&gt; was last week, and have to say it was the best conference I've been to (I've only been to half a dozen).  The variety of content kept the conference interesting and it was nice for me to finally meet others in the Portland tech community.  I took a bunch of notes during the sessions and wanted to summarize them here.&lt;/p&gt;

&lt;h2&gt;Wednesday, June 17th&lt;/h2&gt;

&lt;h3&gt;Welcome Session&lt;/h3&gt;

&lt;p&gt;The welcome session started with some statistics that I thought were interesting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;About 400 people attending&lt;/li&gt;
&lt;li&gt;25% people are presenting&lt;/li&gt;
&lt;li&gt;33% speakers are female&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;How to earn an open source living without taking investors or selling your soul&lt;/h3&gt;

&lt;p&gt;&lt;a href="http://opensourcery.com/"&gt;Brian Jamison&lt;/a&gt; from OpenSourcery talked about running a business that generates revenue from Open Source.  He had a lot of good ideas, some of which I'm going to try out in &lt;a href="http://www.littlestreamsoftware.com"&gt;Little Stream Software&lt;/a&gt;.  My favorite idea was something we should all do more often:&lt;/p&gt;

&lt;blockquote&gt;
    &lt;p&gt;"Say *No*, a lot&lt;/p&gt;
    
    &lt;ul&gt;
    &lt;li&gt;Specific customer&lt;/li&gt;
    &lt;li&gt;Sweat equity&lt;/li&gt;
    &lt;li&gt;Microsoft projects&lt;/li&gt;
    &lt;li&gt;Scope creep&lt;/li&gt;
    &lt;li&gt;Lowering price - you've lost if the customer asks"&lt;/li&gt;
    &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h3&gt;Open Source tools for freelancers&lt;/h3&gt;

&lt;p&gt;&lt;a href="http://www.christiekoehler.com/"&gt;Christie Koehler&lt;/a&gt;, a Portland freelance developer, went over several open source tools she used.  She mentioned a small Python utility called &lt;a href="http://bitbucket.org/trevor/timebook/wiki/Home"&gt;timebook&lt;/a&gt;.  It's a command line program that you can use to keep a running timer for tasks.  I'm going to try it out for a few days to see if it can replace my paper timelog I keep.&lt;/p&gt;

&lt;h3&gt;How to build a successful open source software consulting company&lt;/h3&gt;

&lt;p&gt;&lt;a href="http://jazkarta.com/"&gt;Nate Aune&lt;/a&gt; from Jazkarta talked about starting an Open Source Consulting company.  I already consider &lt;a href="http://www.littlestreamsoftware.com"&gt;Little Stream Software&lt;/a&gt; an OS Consulting company, based on the work I do for Redmine but I did pick up few ideas on how to generate other streams of revenue (without selling my soul):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Custom development&lt;/li&gt;
&lt;li&gt;Training&lt;/li&gt;
&lt;li&gt;Support&lt;/li&gt;
&lt;li&gt;Hosting&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Information Security for the Open Source Business&lt;/h3&gt;

&lt;p&gt;&lt;a href="http://www.k2dd.com/"&gt;Kevin Kenan&lt;/a&gt; gave a  session on Information Security.  Sadly, it was targeted at larger businesses than so many of the ideas weren't useful to me.  A good idea I did get was that products should give their customers a guide showing how to configure the product securely along with the tools needed to test those security precautions.&lt;/p&gt;

&lt;h3&gt;Cluster Analysis - how to have fun in n dimensions&lt;/h3&gt;

&lt;p&gt;In &lt;a href="http://sitr.us/"&gt;Jesse Hallett&lt;/a&gt;'s talk, showed how to do some Statistical analysis (Cluster analysis) to visually group data.  It was a very interesting talk, though above my current math knowledge.  He did have pretty animations though.&lt;/p&gt;

&lt;h3&gt;How to Work with the Government for fun and profit&lt;/h3&gt;

&lt;p&gt;I made a change at the last minute and decided to go to &lt;a href="http://www.bryantsblog.com/"&gt;Deborah Bryant&lt;/a&gt;'s session on how smaller businesses can win Government projects.  I haven't had a lot of chances to work with larger organizations so I wanted to know how feasible it is to work with the local government.&lt;/p&gt;

&lt;h2&gt;Thursday, June 18th&lt;/h2&gt;

&lt;h3&gt;Thursday Keynotes&lt;/h3&gt;

&lt;p&gt;The opening keynote for Thursday included a talk by the Portland Mayor, Sam Adams.  He mentioned that Portland has a lot of funds for digital improvements but there isn't enough people trying to help.  This might be a good opportunity for local tech businesses to pick up some work.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://aboutus.org/WardCunningham"&gt;Ward Cunningham&lt;/a&gt; gave the next keynote about Innovations in Teamwork.  One of his suggestion was that we try to work together more often, because that will lead to more insights and solutions than we have now.  Based on that advise, I'm going to try to attend more local user groups.&lt;/p&gt;

&lt;h3&gt;Unit test your database&lt;/h3&gt;

&lt;p&gt;&lt;a href="http://www.justatheory.com/"&gt;David Wheeler&lt;/a&gt; from PostgreSQL Experts Inc gave a talk about unit testing the PostgreSQL database.  Even though Ruby on Rails doesn't use all of the features for each database, this talk had a few points that are great for writing unit tests against non-database code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Test Driven Development is not for finding bugs, it for your own sanity and checking code consistently&lt;/li&gt;
&lt;li&gt;If testing an interface is hard, then the function might need to be refactored.  Hard to test means hard to use.&lt;/li&gt;
&lt;li&gt;Tests are about as fast as your code but even then... they are much faster than debugging.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;RubySpec: What does my Ruby do?&lt;/h3&gt;

&lt;p&gt;&lt;a href="http://blog.brightredglow.com/"&gt;Brian Ford&lt;/a&gt; from Engine Yard gave a talk about RubySpec.  I'm really excited about this project because he talked about some very easy ways to get involved and contribute.  RubySpec is being used by many of the major Ruby implementations in order compare their implementation against the standard Ruby (MRI).&lt;/p&gt;

&lt;h3&gt;Configuration Management Panel&lt;/h3&gt;

&lt;p&gt;I went to this panel looking for a system that would help me automate server setup for myself and my customers.  I was looking for something that was easy to use and that would make doing system upgrades simple.  After hearing everyone speak, I'm going to take a look at puppet and automateit for my needs.  The &lt;a href="http://osbridge.blip.tv/file/2278426/"&gt;recording of this session&lt;/a&gt; just came online at blip.tv, I'd recommend watching it just to see the panel make offhand remarks at the other projects.&lt;/p&gt;

&lt;h3&gt;Bootstrapping Your Open Source Business&lt;/h3&gt;

&lt;p&gt;The GitHubbers never fail to entertain.  Some notable quotes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Taking VC money is like marring a girl"&lt;/li&gt;
&lt;li&gt;"I'm the CRO.  Chief Revenue Officer"&lt;/li&gt;
&lt;li&gt;"100,000 users on Twitter is the best integration test ever"&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Git vs bzr smackdown&lt;/h3&gt;

&lt;p&gt;&lt;a href="http://www.chesnok.com/daily/"&gt;Selena Deckelmann&lt;/a&gt; and &lt;a href="http://emmajane.net/"&gt;EmmaJane Hogbin&lt;/a&gt; paired on a session comparing git to bzr.  bzr was my first exposure to a distributed version control system but git was the first one I really understood.  From what Emma and the audience were saying, bzr is easier to learn and is good if you work with Windows.  They also put up two sites to continue the battle: bzrvsgit.com gitvsbzr.com&lt;/p&gt;

&lt;h2&gt;Friday, June 19th&lt;/h2&gt;

&lt;p&gt;Friday was the unconference day.  I didn't take many notes but I think Friday was still my favorite day just from the networking and discussions that came up.  I'm going to have to attend more unconferences in Portland.&lt;/p&gt;

&lt;p&gt;That's my write up of &lt;a href="http://opensourcebridge.org"&gt;Open Source Bridge&lt;/a&gt;.  I really enjoyed myself and would highly recommend attending next years conference.  If anyone wants some more details about the notes I took, &lt;a href="http://www.littlestreamsoftware.com/contact.html"&gt;email me&lt;/a&gt; me and I'd be happy to send you a copy.&lt;/p&gt;

&lt;p&gt;Eric.&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=vGDlVBNvNxU:aQUSQcHfWXM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=vGDlVBNvNxU:aQUSQcHfWXM:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?i=vGDlVBNvNxU:aQUSQcHfWXM:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=vGDlVBNvNxU:aQUSQcHfWXM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?i=vGDlVBNvNxU:aQUSQcHfWXM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=vGDlVBNvNxU:aQUSQcHfWXM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?i=vGDlVBNvNxU:aQUSQcHfWXM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/theAdmin/~4/vGDlVBNvNxU" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://theadmin.org/articles/2009/6/25/open-source-bridge-2009</feedburner:origLink></entry>
  <entry xml:base="http://theadmin.org/">
    <author>
      <name>edavis</name>
    </author>
    <id>tag:theadmin.org,2009-06-04:11787</id>
    <published>2009-06-04T04:54:00Z</published>
    <updated>2009-06-04T04:55:13Z</updated>
    <category term="haml" />
    <category term="ruby" />
    <category term="sinatra" />
    <link href="http://feedproxy.google.com/~r/theAdmin/~3/35aWU2BwL5w/on-safari-a-web-app-to-check-safaribooksonline-com" rel="alternate" type="text/html" />
    <title>On Safari - A web app to check SafariBooksOnline.com</title>
<content type="html">
            &lt;p&gt;&lt;a href="http://theadmin.org/assets/2009/6/4/onsafari_index.png"&gt;
   
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Earlier today I launched my very first Sinatra app, &lt;a href="http://onsafari.theadmin.org"&gt;OnSafari&lt;/a&gt;.  &lt;a href="http://onsafari.theadmin.org"&gt;OnSafari&lt;/a&gt; is a tool to check if &lt;strong&gt;a book is available&lt;/strong&gt; on &lt;a href="http://my.safaribooksonline.com"&gt;Safari Books&lt;/a&gt;.  I'm been a member of &lt;a href="http://my.safaribooksonline.com"&gt;Safari Books&lt;/a&gt; for several years now and I'm constantly wondering if a book I'm looking at at a bookstore is on Safari or not.  OnSafari will let me enter the book's ISBN number and will search Safari Books' website for the book.&lt;/p&gt;

&lt;h3&gt;Technology&lt;/h3&gt;

&lt;p&gt;My main goal with building &lt;a href="http://onsafari.theadmin.org"&gt;OnSafari&lt;/a&gt; was to learn a few new technologies that I haven't had the opportunity to use yet.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://www.sinatrarb.com"&gt;Sinatra&lt;/a&gt; - Sinatra is a micro Ruby framework for building websites.  It was very easy to pick up and learn how it works thanks to the documentation in the Sinatra Book.  I'm definitely going to be using Sinatra again.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://haml.hamptoncatlin.com"&gt;HAML&lt;/a&gt; - HAML is a templating language that uses white space to generate a HTML document.  I didn't like the idea when I first heard about it but after using it for OnSafari, I'm starting to warm up to it.  The templates are a lot easier to read but I did run into some unhelpful parsing errors.  I think I'll give HAML another try on a future side project, but I'm not ready to recommend it for a customer project yet.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://haml.hamptoncatlin.com/docs/rdoc/classes/Sass.html"&gt;SASS&lt;/a&gt; - SASS is part of the HAML project and does basically the same thing but instead builds CSS files.  I started to use SASS for the basic design.  Once I integrated the final design though, I ended up dropping SASS in favor of vanilla CSS.  Like HAML, I'd like try SASS out on a side project before I recommend it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://nokogiri.rubyforge.org/nokogiri"&gt;nokogiri&lt;/a&gt; - nokogiri is a HTML and XML parser.  Since &lt;a href="http://my.safaribooksonline.com"&gt;Safari Books&lt;/a&gt; doesn't have an API, I had to page scrape to "search" for books.  I've already used &lt;a href="http://wiki.github.com/why/hpricot"&gt;Hpricot&lt;/a&gt; so I decided to give nokogiri a try.  I had no problems with it, even when parsing &lt;a href="http://my.safaribooksonline.com"&gt;Safari Books'&lt;/a&gt; JavaScript laden pages.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://heroku.com"&gt;Heroku&lt;/a&gt; - Heroku is a hosting environment for Ruby Web application.  I decided to try and host &lt;a href="http://onsafari.theadmin.org"&gt;OnSafari&lt;/a&gt; on Heroku since they have been marketing themselves as the "Instant Ruby Platform".  They really aren't joking, I was able to setup and deploy OnSafari in 15 minutes.  That included making some code changes to accommodate their (lack of a) file system.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="http://theadmin.org/assets/2009/6/4/onsafari_success.png"&gt;
   
&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Summary&lt;/h3&gt;

&lt;p&gt;Overall, I'm very happy with the results of &lt;a href="http://onsafari.theadmin.org"&gt;OnSafari&lt;/a&gt;.  I learned a lot and was able to successfully build a site I've been wanting for awhile.  I think my biggest surprise was how easy it is to host on &lt;a href="http://heroku.com"&gt;Heroku&lt;/a&gt;.  I'm now considering moving several other applications to their service, so I don't have to administer their servers anymore.&lt;/p&gt;

&lt;p&gt;If you have a &lt;a href="http://my.safaribooksonline.com"&gt;Safari Books&lt;/a&gt; account, I'd appreciate it if you would give &lt;a href="http://onsafari.theadmin.org"&gt;OnSafari&lt;/a&gt; a try.&lt;/p&gt;

&lt;p&gt;Eric&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=35aWU2BwL5w:JD_1er7Z-bs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=35aWU2BwL5w:JD_1er7Z-bs:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?i=35aWU2BwL5w:JD_1er7Z-bs:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=35aWU2BwL5w:JD_1er7Z-bs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?i=35aWU2BwL5w:JD_1er7Z-bs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=35aWU2BwL5w:JD_1er7Z-bs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?i=35aWU2BwL5w:JD_1er7Z-bs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/theAdmin/~4/35aWU2BwL5w" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://theadmin.org/articles/2009/6/4/on-safari-a-web-app-to-check-safaribooksonline-com</feedburner:origLink></entry>
  <entry xml:base="http://theadmin.org/">
    <author>
      <name>edavis</name>
    </author>
    <id>tag:theadmin.org,2009-05-04:8661</id>
    <published>2009-05-04T17:02:00Z</published>
    <updated>2009-06-04T04:56:04Z</updated>
    <category term="railsbridge" />
    <category term="ruby" />
    <category term="ruby on rails" />
    <link href="http://feedproxy.google.com/~r/theAdmin/~3/7vM2xPzgJrI/a-positive-change-for-the-rails-community-railsbridge-com" rel="alternate" type="text/html" />
    <title>A Positive Change for the Rails Community - RailsBridge.org</title>
<content type="html">
            &lt;p&gt;As any community grows, it will encounter challenges.  Depending on how the members respond, the community will grow, shrink, or even be wiped out completely.  Last week the Ruby on Rails community was presented with a challenge during a regional conference.  Without getting into the details, the community mishandled the challenge and hurt many members of the community.  Instead of complaining about the incident, I decided to team up with some other people in order to try and improve the community.&lt;/p&gt;

&lt;h2&gt;&lt;a href="http://railsbridge.org/"&gt;RailsBridge.org&lt;/a&gt; is born&lt;/h2&gt;

&lt;p&gt;After talking with &lt;a href="http://afreshcup.com"&gt;Mike Gunderloy&lt;/a&gt; and a few other Rails community members, we started up &lt;a href="http://railsbridge.org/"&gt;RailsBridge&lt;/a&gt;.  The website explains the purpose of the project perfectly:&lt;/p&gt;

&lt;blockquote&gt;
    &lt;p&gt;&lt;strong&gt;The RailsBridge Mission:&lt;/strong&gt; To create an inclusive and friendly Ruby on Rails community.&lt;/p&gt;
    
    &lt;p&gt;&lt;strong&gt;The RailsBridge Guidelines:&lt;/strong&gt;&lt;/p&gt;
    
    &lt;ul&gt;
    &lt;li&gt;First, do no harm. Then, help where you can.&lt;/li&gt;
    &lt;li&gt;Bridge the gap from aspiring developer to contributing community member, through mentoring, teaching, and writing.&lt;/li&gt;
    &lt;li&gt;Reach out to individuals and groups who are underrepresented in the community.&lt;/li&gt;
    &lt;li&gt;Collaborate with other groups with similar goals.&lt;/li&gt;
    &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;The website has some more information about the project's goals, but my goal is to make the community more welcoming to new members.  To do this, I'm going to be helping out with project &lt;a href="http://www.sterlingrosedesign.com"&gt;Dana Jones&lt;/a&gt; is starting, Creating Courseware for Newcomers to Rails.  If you would like to help make some positive change in the Ruby on Rails community, sign up for the &lt;a href="http://groups.google.com/group/railsbridge"&gt;group&lt;/a&gt; and let your voice be heard.&lt;/p&gt;

&lt;p&gt;Eric&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=7vM2xPzgJrI:tLJvOq--phc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=7vM2xPzgJrI:tLJvOq--phc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?i=7vM2xPzgJrI:tLJvOq--phc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=7vM2xPzgJrI:tLJvOq--phc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?i=7vM2xPzgJrI:tLJvOq--phc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=7vM2xPzgJrI:tLJvOq--phc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?i=7vM2xPzgJrI:tLJvOq--phc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/theAdmin/~4/7vM2xPzgJrI" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://theadmin.org/articles/2009/5/4/a-positive-change-for-the-rails-community-railsbridge-com</feedburner:origLink></entry>
  <entry xml:base="http://theadmin.org/">
    <author>
      <name>edavis</name>
    </author>
    <id>tag:theadmin.org,2009-05-01:8520</id>
    <published>2009-05-01T00:15:00Z</published>
    <updated>2009-05-01T00:16:19Z</updated>
    <category term="blog" />
    <category term="redmine" />
    <link href="http://feedproxy.google.com/~r/theAdmin/~3/Z9EG4yuArD8/redmineblog-com-the-official-redmine-blog" rel="alternate" type="text/html" />
    <title>Redmineblog.com - The Official Redmine blog</title>
<content type="html">
            &lt;p&gt;I'm happy to announce the launch of one of my Redmine side projects, the &lt;a href="http://RedmineBlog.com"&gt;RedmineBlog.com&lt;/a&gt;.  It will be the official blog for Redmine and will be another place the community can meet and topics discussed.  From the About page:&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;We will be writing about various components of Redmine and it's community including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://RedmineBlog.com/community"&gt;Community news&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://RedmineBlog.com/code"&gt;Detailed feature reviews&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://RedmineBlog.com/plugins"&gt;Plugin reviews&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://RedmineBlog.com/community"&gt;Community interviews&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We will try to make our content general enough to be used by anyone who currently runs Redmine or is evaluating Redmine, but we are targeting a few specific types of users to start:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Seasoned Redmine users who are looking for regular updates and upcoming news&lt;/li&gt;
&lt;li&gt;New users who need detailed information on a specific topic&lt;/li&gt;
&lt;li&gt;Ruby on Rails developers who are wanting to get into Redmine development&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;p&gt;If you are interested in Redmine, I'd appreciate it if you would post any comments you have and subscribe to the &lt;a href="http://feeds2.feedburner.com/RedmineBlog"&gt;RSS&lt;/a&gt; feed.  Thanks.&lt;/p&gt;

&lt;p&gt;Eric&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=Z9EG4yuArD8:rh7CRRFfE4Y:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=Z9EG4yuArD8:rh7CRRFfE4Y:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?i=Z9EG4yuArD8:rh7CRRFfE4Y:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=Z9EG4yuArD8:rh7CRRFfE4Y:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?i=Z9EG4yuArD8:rh7CRRFfE4Y:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=Z9EG4yuArD8:rh7CRRFfE4Y:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?i=Z9EG4yuArD8:rh7CRRFfE4Y:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/theAdmin/~4/Z9EG4yuArD8" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://theadmin.org/articles/2009/5/1/redmineblog-com-the-official-redmine-blog</feedburner:origLink></entry>
  <entry xml:base="http://theadmin.org/">
    <author>
      <name>edavis</name>
    </author>
    <id>tag:theadmin.org,2009-04-27:8415</id>
    <published>2009-04-27T23:07:00Z</published>
    <updated>2009-04-27T23:09:17Z</updated>
    <category term="open source" />
    <category term="plugin" />
    <category term="redmine" />
    <category term="redmine plugins" />
    <category term="ruby on rails" />
    <link href="http://feedproxy.google.com/~r/theAdmin/~3/8FI0N4EwIlk/redmine-budget-plugin-v0-2-0-released-finally" rel="alternate" type="text/html" />
    <title>Redmine Budget plugin v0.2.0 released (finally)</title>
<content type="html">
            &lt;p&gt;&lt;a href="http://theadmin.org/assets/2008/9/10/budget_plugin-budget_screen.png" class="float-right"&gt;
  
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I've just uploaded a new release of the &lt;a href="https://projects.littlestreamsoftware.com/projects/redmine-budget"&gt;Redmine Budget plugin&lt;/a&gt;.  The Budget plugin is a plugin for &lt;a href="http://www.redmine.org"&gt;Redmine&lt;/a&gt; to manage the set of deliverables for each project, automatically calculating key performance indicators.  This is a long awaited release that will fix many of the outstanding bugs and incompatibilities that have cropped up.&lt;/p&gt;

&lt;h3&gt;Download&lt;/h3&gt;

&lt;p&gt;The plugin can be download from the &lt;a href="https://projects.littlestreamsoftware.com/projects/redmine-budget/files"&gt;Little Stream Software project&lt;/a&gt; or from &lt;a href="http://github.com/edavis10/redmine-budget-plugin/tree/master"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Changes&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/1498"&gt;Feature #1498: Show the Deliverable description in a third row on the deliverable list&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/1708"&gt;Feature #1708: Default a Deliverable's total budget to 0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/1840"&gt;Feature #1840: Add Internationalization support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/1999"&gt;Feature #1999: There should be a link to expand all Deliverable panes on the main page.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/2040"&gt;Feature #2040: Hungarian translation for Budget 0.1.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/2157"&gt;Feature #2157: Lithuanian translation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/2403"&gt;Feature #2403: Add a total budget column to the list of deliverables&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/2404"&gt;Feature #2404: Rename the "Budget" column in the Deliverable list to be Labor Budget&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/2405"&gt;Feature #2405: In the header, make the Total Budget be bold (label and amount)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/1700"&gt;Bug #1700: Rename settings partial&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/1703"&gt;Bug #1703: Auto calculator causes JavaScript errors and breaks if FireBug isn't installed&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/1839"&gt;Bug #1839: Bug in migration script&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/1910"&gt;Bug #1910: Unable to view budget in projects&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/1959"&gt;Bug #1959: Small typo in app/views/deliverables/_deliverable.html.erb&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/2301"&gt;Bug #2301: NoMethodError in DeliverablesController&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can see more details on the &lt;a href="https://projects.littlestreamsoftware.com/projects/redmine-budget/changelog"&gt;Changelog&lt;/a&gt; and &lt;a href="https://projects.littlestreamsoftware.com/projects/redmine-budget/roadmap"&gt;Roadmap&lt;/a&gt; pages.&lt;/p&gt;

&lt;h3&gt;Help&lt;/h3&gt;

&lt;p&gt;If you need help, my &lt;a href="https://projects.littlestreamsoftware.com/projects/redmine-budget"&gt;Redmine bug tracker&lt;/a&gt; is open to the public and you are welcome to ask for help there.&lt;/p&gt;

&lt;p&gt;If you are currently working on a Redmine plugin and need help or have an idea for a plugin you would like developed, please &lt;a href="http://www.littlestreamsoftware.com/contact/email"&gt;contact me&lt;/a&gt;.  My company, &lt;a href="http://www.littlestreamsoftware.com"&gt;Little Stream Software&lt;/a&gt;, specializes in the development of custom Redmine features and Redmine plugins.&lt;/p&gt;

&lt;p&gt;Eric&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=8FI0N4EwIlk:AH64UusMhCw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=8FI0N4EwIlk:AH64UusMhCw:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?i=8FI0N4EwIlk:AH64UusMhCw:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=8FI0N4EwIlk:AH64UusMhCw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?i=8FI0N4EwIlk:AH64UusMhCw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=8FI0N4EwIlk:AH64UusMhCw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?i=8FI0N4EwIlk:AH64UusMhCw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/theAdmin/~4/8FI0N4EwIlk" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://theadmin.org/articles/2009/4/27/redmine-budget-plugin-v0-2-0-released-finally</feedburner:origLink></entry>
  <entry xml:base="http://theadmin.org/">
    <author>
      <name>edavis</name>
    </author>
    <id>tag:theadmin.org,2009-04-24:8271</id>
    <published>2009-04-24T22:24:00Z</published>
    <updated>2009-04-24T22:25:56Z</updated>
    <category term="open source" />
    <category term="redmine" />
    <category term="redmine plugins" />
    <link href="http://feedproxy.google.com/~r/theAdmin/~3/dL8NpyMsX2k/redmine-rate-plugin-released" rel="alternate" type="text/html" />
    <title>Redmine Rate plugin released</title>
<content type="html">
            &lt;p&gt;I've got a new Redmine plugin I'm Open Sourcing, &lt;em&gt;the Redmine Rate plugin&lt;/em&gt;.  This plugin will store billable rates for Users and will relate the amount of time worked to a specific amount.  This was extracted out of the Budget plugin, once it was discovered that tracking historic rates was needed.  Now if someone's billable rate changes, the plugin will adapt to that change without affecting past transactions.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://theadmin.org/assets/2009/4/24/users_rate_history.png" class="float-right"&gt;
  
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Features&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Track rates for a user based on
&lt;ul&gt;
&lt;li&gt;Date Rate came into effect and&lt;/li&gt;
&lt;li&gt;the Project&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Store historic rate amounts&lt;/li&gt;
&lt;li&gt;Lock rates to preserve historic calculations&lt;/li&gt;
&lt;li&gt;Rate.for API for other plugins&lt;/li&gt;
&lt;li&gt;Integration with the Billing plugin&lt;/li&gt;
&lt;li&gt;Integration with the Budget plugin&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Getting the plugin&lt;/h2&gt;

&lt;p&gt;A copy of the plugin can be downloaded from &lt;a href="https://projects.littlestreamsoftware.com/projects/redmine-rate/files"&gt;Little Stream Software&lt;/a&gt; or from &lt;a href="http://github.com/edavis10/redmine_rate/tree/master"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Installation and Setup&lt;/h2&gt;

&lt;p&gt;This plugin will convert existing data in the Budget or Billing plugins. To prevent data loss, I recommend you read the README that is included with the release.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://theadmin.org/assets/2009/4/24/project_members_rate.png" class="float-right"&gt;
  
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Usage&lt;/h2&gt;

&lt;p&gt;There are a couple of ways to use this plugin:&lt;/p&gt;

&lt;h2&gt;Enter new rate for a project&lt;/h2&gt;

&lt;p&gt;There are two ways to set rates for a Member of a Project.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Browse to the Project Settings page&lt;/li&gt;
&lt;li&gt;Select the Members tab&lt;/li&gt;
&lt;li&gt;Enter the rate for the Member and click the set Rate&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Alternatively, Rates can be set in the User Administration panel&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Browse to the Administration panel&lt;/li&gt;
&lt;li&gt;Select Users&lt;/li&gt;
&lt;li&gt;Select the specific user to add a rate for&lt;/li&gt;
&lt;li&gt;Select the Membership tab and enter a rate for each project&lt;/li&gt;
&lt;li&gt;Or, select the Rate History and enter a new rate in the form&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;Enter default rate for a user&lt;/h3&gt;

&lt;p&gt;A default rate is a user's Rate that doesn't correspond to a specific project.  It can be set in the User Administration panel:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Browse to the Administration panel&lt;/li&gt;
&lt;li&gt;Select Users&lt;/li&gt;
&lt;li&gt;Select the specific user to add a rate for&lt;/li&gt;
&lt;li&gt;Select the Rate History and enter a new rate in the form, keep the Project field set to Default Rate.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;Lock a Rate&lt;/h3&gt;

&lt;p&gt;Currently this feature is only available through the Rate API.  A Rate will become locked once a valid TimeEntry is assigned to the Rate.  This is used to make sure historical amounts are not changed.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://theadmin.org/assets/2009/4/24/user_rate_per_project.png" class="float-right"&gt;
  
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;License&lt;/h2&gt;

&lt;p&gt;This plugin is licensed under the GNU GPL v2.&lt;/p&gt;

&lt;h2&gt;Project help&lt;/h2&gt;

&lt;p&gt;If you need help you can &lt;a href="http://www.littlestreamsoftware.com/contact/email"&gt;contact me&lt;/a&gt; or create an issue in the &lt;a href="https://projects.littlestreamsoftware.com/projects/redmine-rate"&gt;Bug Tracker&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Thanks&lt;/h2&gt;

&lt;p&gt;I would like to thank &lt;a href="http://www.shaneandpeter.com"&gt;Shane and Peter, Inc&lt;/a&gt; for sponsoring this plugin.  If you find it useful, send your appreciation his way.&lt;/p&gt;

&lt;p&gt;If you are currently working on a Redmine plugin and need help or have an idea for a plugin you would like developed, please &lt;a href="http://www.littlestreamsoftware.com/contact/email"&gt;contact me&lt;/a&gt;.  My company, &lt;a href="http://www.littlestreamsoftware.com"&gt;Little Stream Software&lt;/a&gt;, specializes in the development of custom Redmine features and Redmine plugins.&lt;/p&gt;

&lt;p&gt;Eric&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=dL8NpyMsX2k:tR5yH9uCZis:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=dL8NpyMsX2k:tR5yH9uCZis:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?i=dL8NpyMsX2k:tR5yH9uCZis:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=dL8NpyMsX2k:tR5yH9uCZis:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?i=dL8NpyMsX2k:tR5yH9uCZis:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=dL8NpyMsX2k:tR5yH9uCZis:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?i=dL8NpyMsX2k:tR5yH9uCZis:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/theAdmin/~4/dL8NpyMsX2k" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://theadmin.org/articles/2009/4/24/redmine-rate-plugin-released</feedburner:origLink></entry>
  <entry xml:base="http://theadmin.org/">
    <author>
      <name>edavis</name>
    </author>
    <id>tag:theadmin.org,2009-04-13:7888</id>
    <published>2009-04-13T18:15:00Z</published>
    <updated>2009-04-24T15:38:37Z</updated>
    <category term="plugins" />
    <category term="redmine" />
    <category term="ruby" />
    <category term="ruby on rails" />
    <link href="http://feedproxy.google.com/~r/theAdmin/~3/zDnyrw_ua5w/how-to-modify-core-redmine-classes-from-a-plugin" rel="alternate" type="text/html" />
    <title>How to modify core Redmine classes from a plugin</title>
<content type="html">
            &lt;p&gt;I've been writing Redmine plugins since 2007 and one thing that stumped me was how to add new methods to &lt;a href="http://www.redmine.org"&gt;Redmine&lt;/a&gt;'s core classes and have them working in development.  The standard &lt;a href="http://www.rubyonrails.org"&gt;Ruby on Rails&lt;/a&gt; way of including a module into the class works great except in development mode.  Thanks to &lt;a href="http://www.redmine.org/boards/3/topics/4070#message-4797"&gt;Thomas Löber&lt;/a&gt;, I found a way to overcome this error by making Ruby on Rails reload specific plugin classes.&lt;/p&gt;

&lt;h3&gt;Patching the core for fun and profit&lt;/h3&gt;

&lt;p&gt;I'm going to create a quick plugin that shows an example.  Lets say you have a method called &lt;code&gt;moo&lt;/code&gt; that you want to add to the Issue class.  The standard Ruby on Rails plugin way would be to create a module and call &lt;code&gt;Issue.send(:include)&lt;/code&gt;.&lt;/p&gt;

&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;15&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="c"&gt;# lib/my_moo_patch.rb&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;module&lt;/span&gt; &lt;span class="cl"&gt;MyMooPatch&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="pc"&gt;self&lt;/span&gt;.included(base)&lt;tt&gt;
&lt;/tt&gt;    base.send(&lt;span class="sy"&gt;:include&lt;/span&gt;, &lt;span class="co"&gt;InstanceMethods&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;module&lt;/span&gt; &lt;span class="cl"&gt;InstanceMethods&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;moo&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      logger.info &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;moo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;    &lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;# init.rb&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;require &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;my_moo_patch&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="co"&gt;Issue&lt;/span&gt;.send(&lt;span class="sy"&gt;:include&lt;/span&gt;, &lt;span class="co"&gt;MyMooPatch&lt;/span&gt;)&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;This is a pretty standard case and would be used anytime your plugin needs to relate to the core classes.  To illustrate this example and some errors that are caused, I added a call to &lt;code&gt;@issue.moo&lt;/code&gt; on the Issue show page.  Typically you would use the &lt;a href="http://www.redmine.org/wiki/redmine/Hooks"&gt;Redmine Hooks&lt;/a&gt; to have Redmine run your plugin's code.&lt;/p&gt;

&lt;h3&gt;Running the code&lt;/h3&gt;

&lt;p&gt;Running in the production environment, everything works fine:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Processing IssuesController#show (for 127.0.0.1 at 2009-04-13 09:57:41) [GET]
  Parameters: {&amp;quot;action&amp;quot;=&amp;gt;&amp;quot;show&amp;quot;, &amp;quot;id&amp;quot;=&amp;gt;&amp;quot;1765&amp;quot;, &amp;quot;controller&amp;quot;=&amp;gt;&amp;quot;issues&amp;quot;}
moo
Rendering template within layouts/base
Rendering issues/show.rhtml
Completed in 1037ms (View: 873, DB: 31) | 200 OK [http://localhost/issues/1765]


Processing IssuesController#show (for 127.0.0.1 at 2009-04-13 09:57:44) [GET]
  Parameters: {&amp;quot;action&amp;quot;=&amp;gt;&amp;quot;show&amp;quot;, &amp;quot;id&amp;quot;=&amp;gt;&amp;quot;1765&amp;quot;, &amp;quot;controller&amp;quot;=&amp;gt;&amp;quot;issues&amp;quot;}
moo
Rendering template within layouts/base
Rendering issues/show.rhtml
Completed in 257ms (View: 173, DB: 17) | 200 OK [http://localhost/issues/1765]&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;But in development, the first request will work but the second request will now throw an exception:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# First request
Processing IssuesController#show (for 127.0.0.1 at 2009-04-13 09:59:32) [GET]
  Parameters: {&amp;quot;action&amp;quot;=&amp;gt;&amp;quot;show&amp;quot;, &amp;quot;id&amp;quot;=&amp;gt;&amp;quot;1765&amp;quot;, &amp;quot;controller&amp;quot;=&amp;gt;&amp;quot;issues&amp;quot;}
moo
Rendering template within layouts/base
Rendering issues/show.rhtml
Completed in 1285ms (View: 990, DB: 24) | 200 OK [http://localhost/issues/1765]

# Second request
Processing IssuesController#show (for 127.0.0.1 at 2009-04-13 09:59:36) [GET]
  Parameters: {&amp;quot;action&amp;quot;=&amp;gt;&amp;quot;show&amp;quot;, &amp;quot;id&amp;quot;=&amp;gt;&amp;quot;1765&amp;quot;, &amp;quot;controller&amp;quot;=&amp;gt;&amp;quot;issues&amp;quot;}

NoMethodError (undefined method `moo' for #&amp;lt;Issue:0xb4ab3d94&amp;gt;):
    /vendor/rails/activerecord/lib/active_record/attribute_methods.rb:260:in `method_missing'
    /app/controllers/issues_controller.rb:98:in `show'
    &amp;lt;&amp;lt;snip&amp;gt;&amp;gt;

Rendering /home/edavis/dev/redmine/redmine-core/vendor/rails/actionpack/lib/action_controller/templates/rescues/layout.erb (internal_server_error)&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Debugging the error&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;NoMethodError&lt;/code&gt; is a standard error thrown by Ruby when a class doesn't have a method defined.  But we defined &lt;code&gt;Issue#moo&lt;/code&gt; in our plugin, so why is it not found?  Lets take a look at what's happening in the Ruby debugger:&lt;/p&gt;

&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;15&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;18&lt;tt&gt;
&lt;/tt&gt;19&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="c"&gt;# First request&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt; &lt;span class="co"&gt;MyMooPatch&lt;/span&gt;.object_id&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; &lt;span class="i"&gt;-621509448&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt; &lt;span class="iv"&gt;@issue&lt;/span&gt;.class.object_id&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; &lt;span class="i"&gt;-621657688&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt; pp &lt;span class="iv"&gt;@issue&lt;/span&gt;.class.included_modules&lt;tt&gt;
&lt;/tt&gt;[&lt;span class="co"&gt;MyMooPatch&lt;/span&gt;::&lt;span class="co"&gt;InstanceMethods&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt; &lt;span class="co"&gt;MyMooPatch&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt; &lt;span class="co"&gt;Redmine&lt;/span&gt;::&lt;span class="co"&gt;Acts&lt;/span&gt;::&lt;span class="co"&gt;ActivityProvider&lt;/span&gt;::&lt;span class="co"&gt;InstanceMethods&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt; &lt;span class="co"&gt;Redmine&lt;/span&gt;::&lt;span class="co"&gt;Acts&lt;/span&gt;::&lt;span class="co"&gt;Event&lt;/span&gt;::&lt;span class="co"&gt;InstanceMethods&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt; &lt;span class="co"&gt;Redmine&lt;/span&gt;::&lt;span class="co"&gt;Acts&lt;/span&gt;::&lt;span class="co"&gt;Searchable&lt;/span&gt;::&lt;span class="co"&gt;InstanceMethods&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt; &lt;span class="co"&gt;Redmine&lt;/span&gt;::&lt;span class="co"&gt;Acts&lt;/span&gt;::&lt;span class="co"&gt;Watchable&lt;/span&gt;::&lt;span class="co"&gt;InstanceMethods&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt; &lt;span class="co"&gt;Redmine&lt;/span&gt;::&lt;span class="co"&gt;Acts&lt;/span&gt;::&lt;span class="co"&gt;Customizable&lt;/span&gt;::&lt;span class="co"&gt;InstanceMethods&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt; &lt;span class="co"&gt;Redmine&lt;/span&gt;::&lt;span class="co"&gt;Acts&lt;/span&gt;::&lt;span class="co"&gt;Attachable&lt;/span&gt;::&lt;span class="co"&gt;InstanceMethods&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt; &lt;span class="co"&gt;Redmine&lt;/span&gt;::&lt;span class="co"&gt;I18n&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt; &lt;span class="co"&gt;Kernel&lt;/span&gt;]&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; &lt;span class="pc"&gt;nil&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt; &lt;span class="iv"&gt;@issue&lt;/span&gt;.class.included_modules.include?(&lt;span class="co"&gt;MyMooPatch&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; &lt;span class="pc"&gt;true&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;Nothing out of the ordinary here.  &lt;code&gt;Issue&lt;/code&gt; has MyMooPatch included and the request processes successfully.&lt;/p&gt;

&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;15&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="c"&gt;# Second request&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt; &lt;span class="co"&gt;MyMooPatch&lt;/span&gt;.object_id&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; &lt;span class="i"&gt;-621509448&lt;/span&gt;               &lt;span class="c"&gt;# Same id as above&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt; &lt;span class="iv"&gt;@issue&lt;/span&gt;.class.object_id&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; &lt;span class="i"&gt;-630808728&lt;/span&gt;               &lt;span class="c"&gt;# Different id from above.&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt; pp &lt;span class="iv"&gt;@issue&lt;/span&gt;.class.included_modules&lt;tt&gt;
&lt;/tt&gt;[&lt;span class="co"&gt;Redmine&lt;/span&gt;::&lt;span class="co"&gt;Acts&lt;/span&gt;::&lt;span class="co"&gt;ActivityProvider&lt;/span&gt;::&lt;span class="co"&gt;InstanceMethods&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt; &lt;span class="co"&gt;Redmine&lt;/span&gt;::&lt;span class="co"&gt;Acts&lt;/span&gt;::&lt;span class="co"&gt;Event&lt;/span&gt;::&lt;span class="co"&gt;InstanceMethods&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt; &lt;span class="co"&gt;Redmine&lt;/span&gt;::&lt;span class="co"&gt;Acts&lt;/span&gt;::&lt;span class="co"&gt;Searchable&lt;/span&gt;::&lt;span class="co"&gt;InstanceMethods&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt; &lt;span class="co"&gt;Redmine&lt;/span&gt;::&lt;span class="co"&gt;Acts&lt;/span&gt;::&lt;span class="co"&gt;Watchable&lt;/span&gt;::&lt;span class="co"&gt;InstanceMethods&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt; &lt;span class="co"&gt;Redmine&lt;/span&gt;::&lt;span class="co"&gt;Acts&lt;/span&gt;::&lt;span class="co"&gt;Customizable&lt;/span&gt;::&lt;span class="co"&gt;InstanceMethods&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt; &lt;span class="co"&gt;Redmine&lt;/span&gt;::&lt;span class="co"&gt;Acts&lt;/span&gt;::&lt;span class="co"&gt;Attachable&lt;/span&gt;::&lt;span class="co"&gt;InstanceMethods&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt; &lt;span class="co"&gt;Redmine&lt;/span&gt;::&lt;span class="co"&gt;I18n&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt; &lt;span class="co"&gt;Kernel&lt;/span&gt;]&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; &lt;span class="pc"&gt;nil&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt; &lt;span class="iv"&gt;@issue&lt;/span&gt;.class.included_modules.include?(&lt;span class="co"&gt;MyMooPatch&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; &lt;span class="pc"&gt;false&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;But on the second request we notice something wrong.  &lt;code&gt;Issue&lt;/code&gt; no longer has MyMooPatch included and it also has a different class id from the last request.  This means that something created a new &lt;code&gt;Issue&lt;/code&gt; class object that is used instead of the original one.  In development mode, Ruby on Rails reloads classes after each request so on the second request the &lt;code&gt;Issue&lt;/code&gt; class was reloaded but our patch wasn't applied.&lt;/p&gt;

&lt;h3&gt;Wrapping our monkey-patch in a callback&lt;/h3&gt;

&lt;p&gt;Fortunately, Ruby on Rails provides a callback method we can use to add our module back, after a class is reloaded.  It's called &lt;code&gt;Dispatcher.to_prepare&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
    &lt;p&gt;Add a preparation callback. Preparation callbacks are run before every
    request in development mode, and before the first request in production
    mode. (From: rails/actionpack/lib/action_controller/dispatcher.rb)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So we will need to change the way out module is included in Issue.  Instead of just using the straight &lt;code&gt;send&lt;/code&gt;, we need to wrap it in the &lt;code&gt;Dispatcher.to_prepare&lt;/code&gt; method:&lt;/p&gt;

&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;require &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;dispatcher&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;require &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;my_moo_patch&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="co"&gt;Dispatcher&lt;/span&gt;.to_prepare &lt;span class="r"&gt;do&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="co"&gt;Issue&lt;/span&gt;.send(&lt;span class="sy"&gt;:include&lt;/span&gt;, &lt;span class="co"&gt;MyMooPatch&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;Now if we restart the Ruby on Rails server in development mode, all the requests should be successful.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Processing IssuesController#show (for 127.0.0.1 at 2009-04-13 10:42:58) [GET]
  Parameters: {&amp;quot;action&amp;quot;=&amp;gt;&amp;quot;show&amp;quot;, &amp;quot;id&amp;quot;=&amp;gt;&amp;quot;1765&amp;quot;, &amp;quot;controller&amp;quot;=&amp;gt;&amp;quot;issues&amp;quot;}
moo
Rendering template within layouts/base
Rendering issues/show.rhtml
Completed in 1382ms (View: 1056, DB: 26) | 200 OK [http://localhost/issues/1765]


Processing IssuesController#show (for 127.0.0.1 at 2009-04-13 10:43:21) [GET]
  Parameters: {&amp;quot;action&amp;quot;=&amp;gt;&amp;quot;show&amp;quot;, &amp;quot;id&amp;quot;=&amp;gt;&amp;quot;1765&amp;quot;, &amp;quot;controller&amp;quot;=&amp;gt;&amp;quot;issues&amp;quot;}
moo
Rendering template within layouts/base
Rendering issues/show.rhtml
Completed in 1266ms (View: 951, DB: 26) | 200 OK [http://localhost/issues/1765]


Processing IssuesController#show (for 127.0.0.1 at 2009-04-13 10:43:25) [GET]
  Parameters: {&amp;quot;action&amp;quot;=&amp;gt;&amp;quot;show&amp;quot;, &amp;quot;id&amp;quot;=&amp;gt;&amp;quot;1765&amp;quot;, &amp;quot;controller&amp;quot;=&amp;gt;&amp;quot;issues&amp;quot;}
moo
Rendering template within layouts/base
Rendering issues/show.rhtml
Completed in 1210ms (View: 901, DB: 25) | 200 OK [http://localhost/issues/1765]&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Success, our Issue is now mooing!&lt;/p&gt;

&lt;h3&gt;Summary&lt;/h3&gt;

&lt;p&gt;So if you write a &lt;a href="http://www.rubyonrails.org"&gt;Ruby on Rails&lt;/a&gt; or &lt;a href="http://www.redmine.org"&gt;Redmine&lt;/a&gt; plugin that needs to patch the core, you should wrap your patches in &lt;code&gt;Dispatcher.to_prepare&lt;/code&gt; so that they will work in development mode.  I'll be converting all my plugins to use this pattern soon.  If you would like to develop a patch for one yourself, &lt;a href="http://github.com/edavis10"&gt;fork one of my plugins on GitHub&lt;/a&gt; and sent me a pull request.&lt;/p&gt;

&lt;p&gt;Eric&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=zDnyrw_ua5w:6_Sj7gCkog8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=zDnyrw_ua5w:6_Sj7gCkog8:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?i=zDnyrw_ua5w:6_Sj7gCkog8:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=zDnyrw_ua5w:6_Sj7gCkog8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?i=zDnyrw_ua5w:6_Sj7gCkog8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=zDnyrw_ua5w:6_Sj7gCkog8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?i=zDnyrw_ua5w:6_Sj7gCkog8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/theAdmin/~4/zDnyrw_ua5w" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://theadmin.org/articles/2009/4/13/how-to-modify-core-redmine-classes-from-a-plugin</feedburner:origLink></entry>
  <entry xml:base="http://theadmin.org/">
    <author>
      <name>edavis</name>
    </author>
    <id>tag:theadmin.org,2009-03-31:7425</id>
    <published>2009-03-31T20:22:00Z</published>
    <updated>2009-04-27T22:47:34Z</updated>
    <category term="open source" />
    <category term="plugin" />
    <category term="redmine" />
    <category term="redmine plugins" />
    <category term="ruby on rails" />
    <link href="http://feedproxy.google.com/~r/theAdmin/~3/irMEPoV3T4s/system-notification-plugin-v0-2-0-released" rel="alternate" type="text/html" />
    <title>System Notification plugin v0.2.0 released</title>
<content type="html">
            &lt;p&gt;&lt;a href="http://theadmin.org/assets/2009/3/31/system_notifications_020.png" class="float-right"&gt;
  
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I've just uploaded the latest release of the &lt;a href="https://projects.littlestreamsoftware.com/projects/redmine-notify"&gt;Redmine System Notification plugin&lt;/a&gt;.  This is a plugin that will let Administrators send emails to a list of users to let them know of important events (e.g. downtime, upgrades).  This release includes some new features for composing the notification, translations, and support for the latest stable and development versions of &lt;a href="http://www.redmine.org"&gt;Redmine&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Download&lt;/h3&gt;

&lt;p&gt;The plugin can be download from the &lt;a href="https://projects.littlestreamsoftware.com/projects/redmine-notify/files"&gt;Little Stream Software project&lt;/a&gt; or from &lt;a href="http://github.com/edavis10/redmine-system-notification-plugin/tree/master"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Changes&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/1929"&gt;Feature #1929: Korean translation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/2028"&gt;Feature #2028: Select recipients by Project&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/2033"&gt;Feature #2033: Ignore locked user accounts by default&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/2037"&gt;Feature #2037: Hungarian translation for System Notifications 0.1.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/2131"&gt;Feature #2131: Simplified Chinese language patch to 0.1.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/2155"&gt;Feature #2155: Enlarge the body text-box, and make it a wiki box&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/2313"&gt;Feature #2313: Allow textile to create HTML email&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can see more details on the &lt;a href="https://projects.littlestreamsoftware.com/projects/redmine-notify/changelog"&gt;Changelog&lt;/a&gt; and &lt;a href="https://projects.littlestreamsoftware.com/projects/redmine-notify/roadmap"&gt;Roadmap&lt;/a&gt; pages.&lt;/p&gt;

&lt;h3&gt;Help&lt;/h3&gt;

&lt;p&gt;If you need help, my &lt;a href="https://projects.littlestreamsoftware.com/projects/redmine-notify"&gt;Redmine bug tracker&lt;/a&gt; is open to the public and you are welcome to ask for help there.&lt;/p&gt;

&lt;p&gt;Eric&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=irMEPoV3T4s:UUJYBTJL9G4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=irMEPoV3T4s:UUJYBTJL9G4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?i=irMEPoV3T4s:UUJYBTJL9G4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=irMEPoV3T4s:UUJYBTJL9G4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?i=irMEPoV3T4s:UUJYBTJL9G4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=irMEPoV3T4s:UUJYBTJL9G4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?i=irMEPoV3T4s:UUJYBTJL9G4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/theAdmin/~4/irMEPoV3T4s" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://theadmin.org/articles/2009/3/31/system-notification-plugin-v0-2-0-released</feedburner:origLink></entry>
  <entry xml:base="http://theadmin.org/">
    <author>
      <name>edavis</name>
    </author>
    <id>tag:theadmin.org,2009-03-24:7208</id>
    <published>2009-03-24T18:51:00Z</published>
    <updated>2009-03-24T18:52:40Z</updated>
    <category term="plugin" />
    <category term="redmine" />
    <category term="ruby on rails" />
    <link href="http://feedproxy.google.com/~r/theAdmin/~3/Xgsc48biffI/customer-plugin-v0-2-0-released" rel="alternate" type="text/html" />
    <title>Customer plugin v0.2.0 released</title>
<content type="html">
            &lt;p&gt;&lt;a href="http://theadmin.org/assets/2008/5/22/customer-screenshot.png" class="float-right"&gt;
  
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After a long wait, I've just uploaded a new release of the &lt;a href="http://theadmin.org/articles/2008/5/22/redmine-customer-plugin"&gt;Redmine Customer plugin&lt;/a&gt;.  This is a bug fix and translation release that &lt;em&gt;should&lt;/em&gt; support the released version of Redmine as well as the latest trunk version.&lt;/p&gt;

&lt;h3&gt;Download&lt;/h3&gt;

&lt;p&gt;The plugin can be download from the &lt;a href="https://projects.littlestreamsoftware.com/projects/redmine-customers/files"&gt;Little Stream Software project&lt;/a&gt; or from &lt;a href="http://github.com/edavis10/redmine-customer-plugin/tree/master"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Changes&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/1236"&gt;Feature #1236: Clean up Menu design&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/1627"&gt;Feature #1627: plugin patch: fix tab highlight + title localization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/1628"&gt;Feature #1628: italian localization for plugin + minimal view enhancements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/1828"&gt;Feature #1828: Spanish Translation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/2072"&gt;Feature #2072: Add french translation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/2309"&gt;Feature #2309: German translation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/730"&gt;Bug #730: Cannot assign customer on a subproject&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can see more details on the &lt;a href="https://projects.littlestreamsoftware.com/projects/redmine-customers/changelog"&gt;Changelog&lt;/a&gt; and &lt;a href="https://projects.littlestreamsoftware.com/projects/redmine-customers/roadmap"&gt;Roadmap&lt;/a&gt; pages.&lt;/p&gt;

&lt;h3&gt;What's next&lt;/h3&gt;

&lt;p&gt;The next release should have some new features including the start of a CRM type system.  If you have an idea for one, leave a comment here or open a &lt;a href="https://projects.littlestreamsoftware.com/projects/redmine-customers"&gt;feature request&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Help&lt;/h3&gt;

&lt;p&gt;If you need help, my &lt;a href="https://projects.littlestreamsoftware.com/projects/redmine-customers"&gt;Redmine bug tracker&lt;/a&gt; is open to the public and you are welcome to ask for help there.&lt;/p&gt;

&lt;p&gt;Eric&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=Xgsc48biffI:3QNg_EyMT8M:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=Xgsc48biffI:3QNg_EyMT8M:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?i=Xgsc48biffI:3QNg_EyMT8M:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=Xgsc48biffI:3QNg_EyMT8M:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?i=Xgsc48biffI:3QNg_EyMT8M:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=Xgsc48biffI:3QNg_EyMT8M:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?i=Xgsc48biffI:3QNg_EyMT8M:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/theAdmin/~4/Xgsc48biffI" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://theadmin.org/articles/2009/3/24/customer-plugin-v0-2-0-released</feedburner:origLink></entry>
  <entry xml:base="http://theadmin.org/">
    <author>
      <name>edavis</name>
    </author>
    <id>tag:theadmin.org,2009-03-19:7027</id>
    <published>2009-03-19T04:03:00Z</published>
    <updated>2009-03-19T04:05:17Z</updated>
    <category term="open source" />
    <category term="redmine" />
    <category term="redmine plugins" />
    <link href="http://feedproxy.google.com/~r/theAdmin/~3/X77XQh_urdc/bulk-time-entry-plugin-v0-3-0-released" rel="alternate" type="text/html" />
    <title>Bulk Time Entry plugin v0.3.0 released</title>
<content type="html">
            &lt;p&gt;&lt;a href="http://theadmin.org/assets/2008/11/10/bulk_time_entry.png" class="float-right"&gt;
  
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'm happy to announce that I've just uploaded a new release of the &lt;a href="http://theadmin.org/articles/2008/11/10/redmine-bulk-time-entry-plugin"&gt;Redmine Bulk Time Entry plugin&lt;/a&gt;.  This is a bug fix release that &lt;em&gt;should&lt;/em&gt; support the released version of Redmine as well as the latest trunk version.&lt;/p&gt;

&lt;h3&gt;Download&lt;/h3&gt;

&lt;p&gt;The plugin can be download from the &lt;a href="https://projects.littlestreamsoftware.com/projects/redmine-bte/files"&gt;Little Stream Software project&lt;/a&gt; or from &lt;a href="http://github.com/edavis10/redmine-bulk_time_entry_plugin/tree/master"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Changes&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/2036"&gt;Feature #2036: Hungarian translation for Bulk Time Entry 0.2.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/2065"&gt;Feature #2065: Maximum width on the issues pulldown&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/2041"&gt;Bug #2041: JavaScript error after adding records and clicking Add Another&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/2042"&gt;Bug #2042: Plugin fails with latest Nested Project from Redmine core&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/2097"&gt;Bug #2097: when custom field are present application throw an error&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can see more details on the &lt;a href="https://projects.littlestreamsoftware.com/projects/redmine-bte/changelog"&gt;Changelog&lt;/a&gt; and &lt;a href="https://projects.littlestreamsoftware.com/projects/redmine-bte/roadmap"&gt;Roadmap&lt;/a&gt; pages.&lt;/p&gt;

&lt;h3&gt;What's next&lt;/h3&gt;

&lt;p&gt;The next release should have a couple of new features, including some User Interface updates to make entering time even faster.  If you have an idea for one, leave a comment here or open a &lt;a href="https://projects.littlestreamsoftware.com/projects/redmine-bte"&gt;feature request&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Help&lt;/h3&gt;

&lt;p&gt;If you need help, my &lt;a href="https://projects.littlestreamsoftware.com/projects/redmine-bte"&gt;Redmine bug tracker&lt;/a&gt; is open to the public and you are welcome to ask for help there.&lt;/p&gt;

&lt;p&gt;Eric&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=X77XQh_urdc:wyzZMC-abdU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=X77XQh_urdc:wyzZMC-abdU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?i=X77XQh_urdc:wyzZMC-abdU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=X77XQh_urdc:wyzZMC-abdU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?i=X77XQh_urdc:wyzZMC-abdU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=X77XQh_urdc:wyzZMC-abdU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?i=X77XQh_urdc:wyzZMC-abdU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/theAdmin/~4/X77XQh_urdc" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://theadmin.org/articles/2009/3/19/bulk-time-entry-plugin-v0-3-0-released</feedburner:origLink></entry>
  <entry xml:base="http://theadmin.org/">
    <author>
      <name>edavis</name>
    </author>
    <id>tag:theadmin.org,2009-03-17:6988</id>
    <published>2009-03-17T19:01:00Z</published>
    <updated>2009-03-19T03:58:12Z</updated>
    <category term="open source" />
    <category term="redmine" />
    <category term="redmine plugins" />
    <link href="http://feedproxy.google.com/~r/theAdmin/~3/_zIFqMIERPo/stuff-to-do-plugin-v0-3-0-released" rel="alternate" type="text/html" />
    <title>Stuff To Do plugin v0.3.0 released</title>
<content type="html">
            &lt;p&gt;&lt;a href="http://theadmin.org/assets/2009/1/13/stuff_to_do.png" class="float-right"&gt;
  
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I've just uploaded a new release of the &lt;a href="http://theadmin.org/articles/2009/1/13/redmine-stuff-to-do-plugin-released"&gt;Redmine Stuff To Do plugin&lt;/a&gt;.  This is a bug fix release that &lt;em&gt;should&lt;/em&gt; support the released version of Redmine as well as the latest trunk version.&lt;/p&gt;

&lt;h3&gt;Download&lt;/h3&gt;

&lt;p&gt;The plugin can be download from the &lt;a href="https://projects.littlestreamsoftware.com/projects/redmine-stuff-to-do/files"&gt;Little Stream Software project&lt;/a&gt; or from &lt;a href="http://github.com/edavis10/redmine-stuff-to-do-plugin/tree/master"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Changes&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/2022"&gt;Feature #2022: Czech Translation - Include in next version&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/2026"&gt;Feature #2026: Sort filter options by their default sort:&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/2038"&gt;Feature #2038: Hungarian translation for Stuff To Do Plugin 0.2.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/2078"&gt;Feature #2078: German localization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/2099"&gt;Feature #2099: Russian localization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/2137"&gt;Feature #2137: german language file&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/2142"&gt;Feature #2142: French translation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/2148"&gt;Feature #2148: Danish translation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/2150"&gt;Feature #2150: Turkish Translation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/2156"&gt;Feature #2156: Lithuanian translation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/2180"&gt;Feature #2180: Add HTML-Title to Templates&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/2220"&gt;Feature #2220: Missing italian translation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/2010"&gt;Bug #2010: Absolute paths in 'stuff_to_to.js' cause error&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/2079"&gt;Bug #2079: Error after deleting an issue that was in my to-do&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/2132"&gt;Bug #2132: NoMethodError on Enumerations - Redmine trunk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/2178"&gt;Bug #2178: research compatibility to the Redmine after rev.2514&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can see more details on the &lt;a href="https://projects.littlestreamsoftware.com/projects/redmine-stuff-to-do/changelog"&gt;Changelog&lt;/a&gt; and &lt;a href="https://projects.littlestreamsoftware.com/projects/redmine-stuff-to-do/roadmap"&gt;Roadmap&lt;/a&gt; pages.&lt;/p&gt;

&lt;h3&gt;What's next&lt;/h3&gt;

&lt;p&gt;The next release should have a couple of new features.  If you have an idea for one, leave a comment here or open a &lt;a href="https://projects.littlestreamsoftware.com/projects/redmine-stuff-to-do"&gt;feature request&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Help&lt;/h3&gt;

&lt;p&gt;If you need help, my &lt;a href="https://projects.littlestreamsoftware.com/projects/redmine-stuff-to-do"&gt;Redmine bug tracker&lt;/a&gt; is open to the public and you are welcome to ask for help there.&lt;/p&gt;

&lt;p&gt;Eric&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=_zIFqMIERPo:_TC4FZ9_Dqw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=_zIFqMIERPo:_TC4FZ9_Dqw:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?i=_zIFqMIERPo:_TC4FZ9_Dqw:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=_zIFqMIERPo:_TC4FZ9_Dqw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?i=_zIFqMIERPo:_TC4FZ9_Dqw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=_zIFqMIERPo:_TC4FZ9_Dqw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?i=_zIFqMIERPo:_TC4FZ9_Dqw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/theAdmin/~4/_zIFqMIERPo" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://theadmin.org/articles/2009/3/17/stuff-to-do-plugin-v0-3-0-released</feedburner:origLink></entry>
  <entry xml:base="http://theadmin.org/">
    <author>
      <name>edavis</name>
    </author>
    <id>tag:theadmin.org,2009-03-11:6834</id>
    <published>2009-03-11T03:05:00Z</published>
    <updated>2009-03-19T03:58:21Z</updated>
    <category term="open source" />
    <category term="redmine" />
    <category term="redmine plugins" />
    <link href="http://feedproxy.google.com/~r/theAdmin/~3/aIWXVJr1pGI/redmine-question-plugin-v0-3-0-released" rel="alternate" type="text/html" />
    <title>Redmine Question plugin v0.3.0 released</title>
<content type="html">
            &lt;p&gt;&lt;a href="http://theadmin.org/assets/2009/2/17/question_on_issue.png" class="float-right"&gt;
  
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I've just uploaded a new release of the &lt;a href="http://theadmin.org/articles/2009/2/17/redmine-question-plugin-released"&gt;Redmine Question plugin&lt;/a&gt;.  This is a bug fix release that &lt;em&gt;should&lt;/em&gt; support the released version of Redmine as well as the latest trunk version.&lt;/p&gt;

&lt;h3&gt;Download&lt;/h3&gt;

&lt;p&gt;The plugin can be download from the &lt;a href="https://projects.littlestreamsoftware.com/projects/redmine-questions/files"&gt;Little Stream Software project&lt;/a&gt; or from &lt;a href="http://github.com/edavis10/question_plugin/tree/master"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Changes&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/1982"&gt;Bug #1982: Questions link doesn't show closed issues.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/2030"&gt;Bug #2030: Replying to the Question email isn't picked up by the mail handler&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/2209"&gt;Bug #2209: Question emails gettings an error on the latest Redmine trunk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/2210"&gt;Bug #2210: Error when showing Calendar or Gantt while Questions query active&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/2212"&gt;Bug #2212: Error with PostgreSQL handling of boolean field&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/2232"&gt;Bug #2232: Link "Questions for me" gets path wrong when redmine installed in subdirectory&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can see more details on the &lt;a href="https://projects.littlestreamsoftware.com/projects/redmine-questions/changelog"&gt;Changelog&lt;/a&gt; and &lt;a href="https://projects.littlestreamsoftware.com/projects/redmine-questions/roadmap"&gt;Roadmap&lt;/a&gt; pages.&lt;/p&gt;

&lt;h3&gt;What's next&lt;/h3&gt;

&lt;p&gt;The next release should have a couple of new features.  If you have an idea for one, leave a comment here or open a &lt;a href="https://projects.littlestreamsoftware.com/projects/redmine-questions"&gt;feature request&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Help&lt;/h3&gt;

&lt;p&gt;If you need help, my &lt;a href="https://projects.littlestreamsoftware.com/projects/redmine-questions"&gt;Redmine bug tracker&lt;/a&gt; is open to the public and you are welcome to ask for help there.&lt;/p&gt;

&lt;p&gt;Eric&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=aIWXVJr1pGI:MlQt9psnFKE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=aIWXVJr1pGI:MlQt9psnFKE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?i=aIWXVJr1pGI:MlQt9psnFKE:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=aIWXVJr1pGI:MlQt9psnFKE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?i=aIWXVJr1pGI:MlQt9psnFKE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=aIWXVJr1pGI:MlQt9psnFKE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?i=aIWXVJr1pGI:MlQt9psnFKE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/theAdmin/~4/aIWXVJr1pGI" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://theadmin.org/articles/2009/3/11/redmine-question-plugin-v0-3-0-released</feedburner:origLink></entry>
  <entry xml:base="http://theadmin.org/">
    <author>
      <name>edavis</name>
    </author>
    <id>tag:theadmin.org,2009-03-07:6707</id>
    <published>2009-03-07T00:06:00Z</published>
    <updated>2009-03-07T00:11:46Z</updated>
    <category term="open source" />
    <category term="redmine" />
    <category term="redmine plugins" />
    <link href="http://feedproxy.google.com/~r/theAdmin/~3/aEVrYZHyyKU/redmine-timesheet-plugin-v0-5-0-released" rel="alternate" type="text/html" />
    <title>Redmine Timesheet plugin v0.5.0 released</title>
<content type="html">
            &lt;p&gt;I've just uploaded a new release of the &lt;a href="http://theadmin.org/articles/2008/1/10/redmine-timesheet-plugin"&gt;Redmine Timesheet plugin&lt;/a&gt;.  This release has a couple of new features, a few bug fixes, and several translation updates.&lt;/p&gt;

&lt;h3&gt;Download&lt;/h3&gt;

&lt;p&gt;The plugin can be download from the &lt;a href="https://projects.littlestreamsoftware.com/projects/redmine-timesheet/files"&gt;Little Stream Software project&lt;/a&gt; or from &lt;a href="http://github.com/edavis10/redmine-timesheet-plugin/tree/master"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Changes&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/709"&gt;Feature #709: Use defaults for the date like the updated timelog filter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/1948"&gt;Feature #1948: Sticky filters&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/2090"&gt;Feature #2090: Hide the right click menu if there are no items&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/2134"&gt;Feature #2134: german language file&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/2186"&gt;Feature #2186: Fix Enumeration API change from Redmine r2472&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/2100"&gt;Bug #2100: Hide TimeSheet button from menu for non-permitted users&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/2103"&gt;Bug #2103: Project filter won't work when grouping by user&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://projects.littlestreamsoftware.com/issues/2187"&gt;Bug #2187: Update language files to support the latest Rails 2.2.x format&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can see more details on the &lt;a href="https://projects.littlestreamsoftware.com/projects/redmine-timesheet/changelog"&gt;Changelog&lt;/a&gt; and &lt;a href="https://projects.littlestreamsoftware.com/projects/redmine-timesheet/roadmap"&gt;Roadmap&lt;/a&gt; pages.&lt;/p&gt;

&lt;h3&gt;What's next&lt;/h3&gt;

&lt;p&gt;Michele Franzin has been working on a &lt;a href="http://github.com/michelefranzin/redmine-timesheet-plugin/tree/master"&gt;fork&lt;/a&gt; of the Timesheet plugin that has a really nice calendar view and summary features.  Since these didn't make it into 0.5.0, I'd like to pull them into the &lt;a href="https://projects.littlestreamsoftware.com/versions/show/118"&gt;0.6.0 release&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Help&lt;/h3&gt;

&lt;p&gt;If you need help, my &lt;a href="https://projects.littlestreamsoftware.com/projects/redmine-timesheet"&gt;Redmine bug tracker&lt;/a&gt; is open to the public and you are welcome to ask for help there.&lt;/p&gt;

&lt;p&gt;Eric&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=aEVrYZHyyKU:viLHb7WdB5U:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=aEVrYZHyyKU:viLHb7WdB5U:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?i=aEVrYZHyyKU:viLHb7WdB5U:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=aEVrYZHyyKU:viLHb7WdB5U:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?i=aEVrYZHyyKU:viLHb7WdB5U:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=aEVrYZHyyKU:viLHb7WdB5U:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?i=aEVrYZHyyKU:viLHb7WdB5U:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/theAdmin/~4/aEVrYZHyyKU" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://theadmin.org/articles/2009/3/7/redmine-timesheet-plugin-v0-5-0-released</feedburner:origLink></entry>
  <entry xml:base="http://theadmin.org/">
    <author>
      <name>edavis</name>
    </author>
    <id>tag:theadmin.org,2009-03-04:6645</id>
    <published>2009-03-04T22:22:00Z</published>
    <updated>2009-03-04T22:22:48Z</updated>
    <category term="open source" />
    <category term="redmine" />
    <category term="redmine plugins" />
    <link href="http://feedproxy.google.com/~r/theAdmin/~3/W48d2nc4FSQ/plugin-that-adds-a-link-to-redmines-menu" rel="alternate" type="text/html" />
    <title>Plugin that adds a link to Redmine's menu</title>
<content type="html">
            &lt;p&gt;I had a question emailed to me about Redmine and I thought it would make a useful blog post:&lt;/p&gt;

&lt;blockquote&gt;
    &lt;p&gt;If I wanted to add a link example.com to the top menu how would I do that? &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I've seen this asked several times and most responses are to modify Redmine's source.  While this will work, it will make Redmine upgrades harder.  The best solution is to create a small Redmine plugin and drop it into the &lt;code&gt;vendor/plugins&lt;/code&gt; directory.  Only one Ruby file is needed, plus any language translations.&lt;/p&gt;

&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="c"&gt;# init.rb&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="co"&gt;Redmine&lt;/span&gt;::&lt;span class="co"&gt;Plugin&lt;/span&gt;.register &lt;span class="sy"&gt;:redmine_static_link&lt;/span&gt; &lt;span class="r"&gt;do&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  name &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;Redmine link&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  author &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;Eric Davis of Little Stream Software&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  description &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;Shows a link on the top menu&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  version &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;0.1.0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  menu &lt;span class="sy"&gt;:top_menu&lt;/span&gt;, &lt;span class="sy"&gt;:example_link&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;http://www.example.com&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;You can see that all the &lt;code&gt;init.rb&lt;/code&gt; does is to register a new plugin and add a &lt;code&gt;:top_menu&lt;/code&gt; link to &lt;a href="http://www.example.com"&gt;http://www.example.com&lt;/a&gt;.  Once Redmine is reloaded, you should see the link on the top menu.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;I've uploaded the &lt;a href="http://theadmin.org/assets/2009/3/4/redmine_static_link.tar.gz"&gt;full plugin&lt;/a&gt;, along with English language translations.  Go ahead and &lt;a href="http://theadmin.org/assets/2009/3/4/redmine_static_link.tar.gz"&gt;download it&lt;/a&gt; and change the link url to what you need.&lt;/p&gt;

&lt;p&gt;If you have any other Redmine or Redmine plugin questions that you would like me to write about, please ask them on my &lt;a href="http://littlestreamsoftware.uservoice.com/"&gt;User Voice&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Eric&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=W48d2nc4FSQ:EmNuGSEBybw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=W48d2nc4FSQ:EmNuGSEBybw:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?i=W48d2nc4FSQ:EmNuGSEBybw:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=W48d2nc4FSQ:EmNuGSEBybw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?i=W48d2nc4FSQ:EmNuGSEBybw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/theAdmin?a=W48d2nc4FSQ:EmNuGSEBybw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/theAdmin?i=W48d2nc4FSQ:EmNuGSEBybw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/theAdmin/~4/W48d2nc4FSQ" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://theadmin.org/articles/2009/3/4/plugin-that-adds-a-link-to-redmines-menu</feedburner:origLink></entry>
  <entry xml:base="http://theadmin.org/">
    <author>
      <name>edavis</name>
    </author>
    <id>tag:theadmin.org,2009-02-24:6450</id>
    <published>2009-02-24T05:07:00Z</published>
    <updated>2009-02-24T05:08:19Z</updated>
    <category term="rails" />
    <category term="rspec" />
    <category term="ruby" />
    <category term="testing" />
    <link href="http://feedproxy.google.com/~r/theAdmin/~3/yjGTNdslEHw/use-hash-except-to-easily-test-rails-validations" rel="alternate" type="text/html" />
    <title>Use Hash#except to easily test Rails validations</title>
<content type="html">
            &lt;p&gt;Ruby on Rails provides a large API for web development, including adding new methods to Ruby's base classes.  One method I don't see used that often is &lt;a href="http://api.rubyonrails.org/classes/ActiveSupport/CoreExtensions/Hash/Except.html"&gt;&lt;code&gt;Hash#except&lt;/code&gt;&lt;/a&gt;.  From the Rails API documentation:&lt;/p&gt;

&lt;blockquote&gt;
    &lt;p&gt;Return a hash that includes everything but the given keys. This is useful for limiting a set of parameters to everything but a few known toggles:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;@person.update_attributes(params[:person].except(:admin))
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;A great use I found for it is to help test validation methods on Model objects.  By defining a method that will return all the valid attributes on a model, you can easily exclude the ones you want to test with &lt;code&gt;Hash#except&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I'm using RSpec in this example but the same idea works with &lt;code&gt;Test::Unit&lt;/code&gt; or any other testing framework.  I created a method &lt;code&gt;valid_attributes&lt;/code&gt; that will return the attributes my Model needs to be valid.  In this case my &lt;code&gt;SystemNotification&lt;/code&gt; object needs a body, subject, and some users.&lt;/p&gt;

&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="r"&gt;module&lt;/span&gt; &lt;span class="cl"&gt;SystemNotificationSpecHelper&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;valid_attributes&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    user1 = mock_model(&lt;span class="co"&gt;User&lt;/span&gt;, &lt;span class="sy"&gt;:mail&lt;/span&gt; =&amp;gt; &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;user1@example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;    user2 = mock_model(&lt;span class="co"&gt;User&lt;/span&gt;, &lt;span class="sy"&gt;:mail&lt;/span&gt; =&amp;gt; &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;user2@example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;return&lt;/span&gt; { &lt;tt&gt;
&lt;/tt&gt;      &lt;span class="sy"&gt;:body&lt;/span&gt; =&amp;gt; &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;a body&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt;      &lt;span class="sy"&gt;:subject&lt;/span&gt; =&amp;gt; &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;a subject line&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt;      &lt;span class="sy"&gt;:users&lt;/span&gt; =&amp;gt; [user1, user2]&lt;tt&gt;
&lt;/tt&gt;    }&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;I used mocks for the users because I don't care about them, only that they are present.  So to test if my object is valid, I can easily just pass in &lt;code&gt;valid_attributes&lt;/code&gt; to my new method:&lt;/p&gt;

&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;describe &lt;span class="co"&gt;SystemNotification&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;valid?&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="r"&gt;do&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  include &lt;span class="co"&gt;SystemNotificationSpecHelper&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  it &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;should be valid with the body, subject, and users&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class="r"&gt;do&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    system_notification = &lt;span class="co"&gt;SystemNotification&lt;/span&gt;.new(valid_attributes)&lt;tt&gt;
&lt;/tt&gt;    system_notification.valid?.should be_true&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;Now I want to write some more specs to make sure if a &lt;code&gt;SystemNotification&lt;/code&gt; is invalid if it's missing any of the required attribute.  Since &lt;code&gt;valid_attributes&lt;/code&gt; is a Hash, I can use &lt;code&gt;Hash#except&lt;/code&gt; to remove each attribute individually and make sure the object is invalid for each case.&lt;/p&gt;

&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;15&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;18&lt;tt&gt;
&lt;/tt&gt;19&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;20&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;21&lt;tt&gt;
&lt;/tt&gt;22&lt;tt&gt;
&lt;/tt&gt;23&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;describe &lt;span class="co"&gt;SystemNotification&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;valid?&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="r"&gt;do&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  include &lt;span class="co"&gt;SystemNotificationSpecHelper&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  it &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;should be valid with the body, subject, and users&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class="r"&gt;do&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    system_notification = &lt;span class="co"&gt;SystemNotification&lt;/span&gt;.new(valid_attributes)&lt;tt&gt;
&lt;/tt&gt;    system_notification.valid?.should be_true&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;tt&gt;
&lt;/tt&gt;  it &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;should be invalid without a subject&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class="r"&gt;do&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    system_notification = &lt;span class="co"&gt;SystemNotification&lt;/span&gt;.new(valid_attributes.except(&lt;span class="sy"&gt;:subject&lt;/span&gt;))&lt;tt&gt;
&lt;/tt&gt;    system_notification.valid?.should be_false&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;tt&gt;
&lt;/tt&gt;  it &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;should be invalid without a body&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class="r"&gt;do&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    system_notification = &lt;span class="co"&gt;SystemNotification&lt;/span&gt;.new(valid_attributes.except(&lt;span class="sy"&gt;:body&lt;/span&gt;))&lt;tt&gt;
&lt;/tt&gt;    system_notification.valid?.should be_false&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;tt&gt;
&lt;/tt&gt;  it &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;should be invalid without any users&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class="r"&gt;do&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    system_notification = &lt;span class="co"&gt;SystemNotification&lt;/span&gt;.new(valid_attributes.except(&lt;span class="sy"&gt;:users&lt;/span&gt;))&lt;tt&gt;
&lt;/tt&gt;    system_notification.valid?.should be_false&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;This is just a simple example but you can use &lt;code&gt;Hash#except&lt;/code&gt; in many other places:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;updating attributes like the Rail documentation sample&lt;/li&gt;
&lt;li&gt;copying values from one object to another&lt;/li&gt;
&lt;li&gt;extracting options from a argument&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you'd like some extra practice, refactor my specs to make sure &lt;code&gt;SystemNotification#errors&lt;/code&gt; is populated based on what attribute failed.  You can find the full code on &lt;a href="http://github.com/edavis10/redmine-system-notification-plugin/tree/master"&gt;GitHub&lt;/a&gt;, just send me a pull request when you're done.&lt;/p&gt;

&lt;p&gt;Eric&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/theAdmin?a=D0W3MX24"&gt;&lt;img src="http://feeds.feedburner.com/~f/theAdmin?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/theAdmin?a=vK4qB16p"&gt;&lt;img src="http://feeds.feedburner.com/~f/theAdmin?i=vK4qB16p" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/theAdmin?a=1bBHTyNs"&gt;&lt;img src="http://feeds.feedburner.com/~f/theAdmin?i=1bBHTyNs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/theAdmin?a=pj2KatfO"&gt;&lt;img src="http://feeds.feedburner.com/~f/theAdmin?i=pj2KatfO" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/theAdmin/~4/yjGTNdslEHw" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://theadmin.org/articles/2009/2/24/use-hash-except-to-easily-test-rails-validations</feedburner:origLink></entry>
</feed>
