在Rails 3中扩展模块

时间:2011-12-12 12:58:35

标签: ruby-on-rails-3 module

我想定义一个函数available_translations,它列出了我为我的应用程序进入I18n模块的翻译。

我尝试将以下内容放入文件lib/i18n.rb,但是当我尝试从rails控制台使用它时它不起作用:

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

控制台:

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
...

除了解决我的具体问题之外,我很高兴知道Ruby on Rails中的整个模块是如何工作的,因为它仍然让我感到困惑,所以我非常感谢链接到文档或源代码非常

2 个答案:

答案 0 :(得分:2)

其中任何一个都可以解决您的问题:

  • 将代码移至config / initializers / i18n.rb或
  • 需要来自config / application.rb或
  • 的文件
  • 以其他方式命名您的课程(触发自动加载)

lib / i18n.rb中的代码不会被自动加载加载,因为I18n名称已经加载,所以要么自己加载它,要么更改类名(和文件名),以便新名称将触发自动加载行为。

答案 1 :(得分:0)

BTW,I18n.available_locales()方法在rails中显示。