Ruby on rails Rails自动加载示例
我是RubyonRails的新手,在Rails的自动加载机制上我的头都碎了 我的Ruby on rails Rails自动加载示例,ruby-on-rails,ruby,autoload,Ruby On Rails,Ruby,Autoload,我是RubyonRails的新手,在Rails的自动加载机制上我的头都碎了 我的/app/helpers/posts\u helper.rb中有这样的代码: module PostsHelper def markdown_render(data) Utils::Markdown.render data end end 我有/app/utils/markdown.rb和类似的东西: module Utils class Markdown class <<
/app/helpers/posts\u 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
我知道问题在于从helper模块引用util,但我不知道如何正确地进行引用
求求你,在我的头撞坏之前帮帮我!=-) 试试看:
module PostsHelper
def markdown_render(data)
::Utils::Markdown.render data
end
end
也就是说,在Utils::Markdown
前面放一个双冒号。它基本上是指“在根名称空间中查找”,而不是“在我当前所在的名称空间中查找”。在markdown.rb
中,只需将markdown
定义为顶级类(即,不在任何名称空间中)。好的,我大概明白了
app/some\u name路径是从模块/类查找中“咀嚼”出来的,因此Rails不希望在app/some\u name/some\u class.rbSomeName::SomeClass
,它只希望找到SomeClass
我重新构造了文件ierarchy,现在它是:app/modules/utils/my_markdown.rb,并且它正确地从my_markdown.rb自动加载utils::MyMarkdown
)Nope<代码>::Utils::Markdown.render data
=>ActionView::Template::Error:未初始化的常量Utils
“我知道问题在于从帮助器模块引用Utils”-结果证明这不是问题所在。我刚刚检查过,如果您将这两个文件中的所有代码都放在/app/helpers/posts\u helper.rb中,它就可以工作了。所以,问题是Rails没有正确地自动加载它。不知道为什么,抱歉!您可以从这个问题中删除和标记,它实际上与这两者都没有关系。您的问题只是简单的ruby常量查找。(当然,在没有自动加载的情况下,您必须使用require
)根据,Ruby constant lookup和Rails autoloading是完全不同的,因此我更希望它们保持不变Rails应自动自动加载:“应用程序和引擎中应用程序的所有子目录。例如,应用程序/控制器。它们不需要是默认目录,任何自定义目录(如应用程序/工作者)都自动属于自动加载路径。”(from)@joshua.paling感谢您的评论。更新了我的答案,很有效,谢谢。但我不想用这些实用程序类和方法污染全局名称空间,我想保持它整洁。有没有实现这种用例的方法?
module PostsHelper
def markdown_render(data)
::Utils::Markdown.render data
end
end