Search code examples
ruby-on-railsrubyclassmoduleactivesupport

What is mattr_accessor in a Rails module?


I couldn't really find this in Rails documentation but it seems like 'mattr_accessor' is the Module corollary for 'attr_accessor' (getter & setter) in a normal Ruby class.

Eg. in a class

class User
  attr_accessor :name

  def set_fullname
    @name = "#{self.first_name} #{self.last_name}"
  end
end

Eg. in a module

module Authentication
  mattr_accessor :current_user

  def login
    @current_user = session[:user_id] || nil
  end
end

This helper method is provided by ActiveSupport.


Solution

  • Rails extends Ruby with both mattr_accessor (Module accessor) and cattr_accessor (as well as _reader/_writer versions). As Ruby's attr_accessor generates getter/setter methods for instances, cattr/mattr_accessor provide getter/setter methods at the class or module level. Thus:

    module Config
      mattr_accessor :hostname
      mattr_accessor :admin_email
    end
    

    is short for:

    module Config
      def self.hostname
        @hostname
      end
      def self.hostname=(hostname)
        @hostname = hostname
      end
      def self.admin_email
        @admin_email
      end
      def self.admin_email=(admin_email)
        @admin_email = admin_email
      end
    end
    

    Both versions allow you to access the module-level variables like so:

    >> Config.hostname = "example.com"
    >> Config.admin_email = "[email protected]"
    >> Config.hostname # => "example.com"
    >> Config.admin_email # => "[email protected]"