fqxp
fqxp

Reputation: 7939

Extend a module in Rails 3

I want to define a function available_translations which lists the translations I have made for my application into the I18n module.

I tried putting the following into the file lib/i18n.rb, but it doesn't work when I try to use it from the rails console:

module I18n
  # Return the translations available for this application.
  def self.available_translations
    languages = []
    Dir.glob(Rails.root.to_s + '/config/locales/*.yml') do |filename|
      if md = filename.match #^.+/(\w+).yml$#
        languages << md[1]
      end
    end
    languages
  end
end

Console:

ruby-1.9.2-p290 :003 > require Rails.root.to_s + '/lib/i18n.rb'
=> false
ruby-1.9.2-p290 :004 > I18n.available_translations
NoMethodError: undefined method `available_translations' for I18n:Module
...

Besides solving my concrete problem, I would be very pleased to learn how this whole module thing in Ruby on Rails works because it still confuses me, so I would appreciate links to the docs or source code very much.

Upvotes: 1

Views: 1485

Answers (2)

Pavel Volzhin
Pavel Volzhin

Reputation: 171

BTW, the I18n.available_locales() method is presented in rails.

Upvotes: 0

clyfe
clyfe

Reputation: 23770

Either of these will solve your problem:

  • move the code to config/initializers/i18n.rb, or
  • require your file from config/application.rb, or
  • name your class otherwise (to trigger autoload)

The code in lib/i18n.rb wil not be loaded by autoload since I18n name will be already loaded, so either you load it yourself or change the class name (and file name) so the new name will trigger autoload behavior.

Upvotes: 2

Related Questions