Rails ActiveSuppport:Concern and Private Methods

activesupport-concern, ruby, ruby-on-rails, ruby-on-rails-3, ruby-on-rails-4

Solution

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

Problem

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?

Original source

Related problems