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.html,Utils::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
=-)
我是 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.html,Utils::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
=-)