Gutentag: Simple Rails Tagging
The last thing the Rails ecosystem needs is another tagging gem. But I went and built one anyway… it’s called Gutentag, and perhaps worth it for the name alone (something I get an inordinate amount of happiness from).
My reasons for building Gutentag are as follows:
A tutorial example
I ran a workshop at RailsConf earlier this year (as a pair to this talk), and wanted a simple example that people could work through to have the experience of building a gem. Almost every Rails app seems to need tags, so I felt this was a great starting point - and a great way to show off how simple it is to write and publish a gem.
You can work through the tutorial yourself if you like - though keep in mind the focus is more on the process of building a gem rather than the implementation of this gem in particular.
A cleaner code example
Many gems aren’t good object-oriented citizens - and this includes most of the ones I’ve written. They’re built with long, complex classes and modules, are structured in ways that Demeter does not like, and aren’t particularly easy to extend cleanly.
I have the beginnings of a talk on how to structure gems (especially those that work with Rails) sensibly - but I’ve not yet had the opportunity to present this at any conferences.
One point that will definitely feature if I ever do get that opportunity: more and more, I like to avoid including modules into ActiveRecord and other parts of Rails - and if you peruse the source you’ll see I’m only adding the absolute minimum to ActiveRecord::Base, plus I’ve pulled out the logic around the tag names collection and resulting persistence into a separate, simple class.
I started with tests, and wrote them in a way that made it clear how I expected the gem to behave - and then wrote the implementation to match. If you’re particularly keen, you can scan through each commit to see how the gem has evolved - I tried to keep them small and focused.
There are a large number of other tagging gems out there - and if you’re using one of those already, there’s no incentive at all to switch. I’ve used acts-as-taggable-on many times without complaints.
But Gutentag certainly works - the README outlines how you can use it - and at least people might smile every time they add it to a Gemfile. But at the end of the day, if it’s just used as an example of a simple gem done well, I’ll consider this a job well done.