Rails ActiveSuppport:Concern and Private Methods

justingordon picture justingordon · Feb 18, 2013 · Viewed 12.8k times · Source

This is a great idea about concern in rails: http://37signals.com/svn/posts/3372-put-chubby-models-on-a-diet-with-concerns

And it's also a good idea to make very small methods that are not part of a public API. Without using concerns, those become private methods in a ruby class.

Does it makes sense to create private methods inside of a Rails ActiveSupport::Concern module? If so, does private work both for regular instance methods and class methods in the concern definition?

Answer

jibiel picture jibiel · Nov 17, 2015

Does it makes sense to create private methods inside of a Rails ActiveSupport::Concern module?

Considering that concerns are smart modules that will eventually be included in other classes — yes, it does. It's just a portable code, extractable behavior and I'd like to consider it as part of my controller (or model, etc.) as I'm writing it. So basically you just declare methods private or protected as you normally would.

Maybe the post you linked have been updated since 2013, but DHH does exactly that in the one of the examples there:

module Dropboxed
  extend ActiveSupport::Concern

  included do
    before_create :generate_dropbox_key
  end

  def rekey_dropbox
    generate_dropbox_key
    save!
  end

  private # <- Let's list some privates

  def generate_dropbox_key
    self.dropbox_key = SignalId::Token.unique(24) do |key| 
      self.class.find_by_dropbox_key(key)
    end
  end
end

As to private class methods, I agree with @Hugo and never used them myself, but here's how you can achieve this:

module Dropboxed
  extend ActiveSupport::Concern

  included do
    private_class_method :method_name
  end

  module ClassMethods
    def method_name
    end
  end
end