Rails 自动加载示例

Rails autoloading example

我是 Rails 上 Ruby 的新手,我在 Rails 自动加载机制上弄坏了脑袋。

我的 /app/helpers/posts_helper.rb 中有这样的代码:

module PostsHelper  
  def markdown_render(data)
    Utils::Markdown.render data
  end
end

我有 /app/utils/markdown.rb 类似的东西:

module Utils
  class Markdown
    class << self
      def render(data)
        # render some dataz
      end
    end
  end
end

根据 http://guides.rubyonrails.org/autoloading_and_reloading_constants.htmlUtils::Markdown 将从 /app/utils/markdown.rb 加载,但我收到:

ActionView::Template::Error:
       uninitialized constant PostsHelper::Utils

我知道问题在于从辅助模块引用 Utils,但我对如何正确进行该引用一无所知。

请在我脑袋崩溃之前帮助我! =-)

尝试:

module PostsHelper  
  def markdown_render(data)
    ::Utils::Markdown.render data
  end
end

也就是在Utils::Markdown前面加一个双冒号。它基本上意味着 "look in the root namespace," 而不是 "look within the namespace I'm currently in".

markdown.rb 中,只需将 Markdown 定义为顶级 class(即不在任何命名空间中)。

好的,我大概明白了。

app/some_name 路径是 "chewed" 从 module/class 找到的,所以 Rails 不要指望在 app/some_name/some_class.rb SomeName::SomeClass,它只是希望找到 SomeClass.

我重组了文件层次结构,现在它是:app/modules/utils/my_markdown.rb,它正确地从 my_markdown.rb 自动加载 Utils::MyMarkdown =-)