I’ve been spreading things like this all around my code, where I wanted to do something differently in production vs. development mode. Previously, I’d write something like this:
1 if ENV['RAILS_ENV'] == 'production' 2 ... perform magic ... 3 end
While this is pretty simple, it just didn’t feel very DRY. So, I decided to use this as a reason to learn about modules and mixins.
I have a generic plug-in in
vendor/plugins that I put small bits of code like this. You might as well, but if you don’t, you can drop this in a helper.
1 module RailsMode 2 def railsmode(*list) 3 list.map! do |item| 4 item.to_s 5 end 6 7 if block_given? 8 if list.include?(ENV['RAILS_ENV']) 9 yield 10 end 11 else 12 return list.include?(ENV['RAILS_ENV']) 13 end 14 end 15 end
I also put this line in my environment.rb file:
1 include RailsMode
This mixes the module into the current class. Doing this in
environment.rb makes it available everywhere in rails. Putting that line in a specific file would also work, such as a controller, or a helper.
With this, I can now write:
1 if railsmode(:production) 2 ... perform magic ... 3 end
I can also check for multiple modes at once:
1 if railsmode(:production, :development) 2 ... perform magic ... 3 end
And of course, who needs an
if when I can pass in a block:
1 railsmode(:production) do 2 ... perform magic ... 3 end