2015-11-09 41 views
1

我是Ruby on Rails的新手,我在Rails自動加載機制上打破了僵局。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,但我沒有任何想法如何正確地引用該引用。

請在我的腦袋崩潰之前幫助我! = - )

+0

可以刪除[標籤:自動加載]和[tag:ruby-on-rails]這個問題的標籤,它並沒有真正涉及到。你的問題只是普通的ruby **不斷查找**。 (儘管當然沒有自動加載,你必須使用'require') –

+0

根據http://guides.rubyonrails.org/autoloading_and_reloading_constants.html,Ruby常量查找和Rails自動加載是完全不同的,所以我更喜歡他們留下來。 = - ) – StragaSevera

回答

0

好吧,我琢磨出來。

app/some_name路徑從模塊/類查找中「咀嚼」,因此Rails不希望在app/some_name/some_class.rb中找到,它只是期望找到SomeClass

我重組了文件ierarchy,所以現在它是:應用程序/模塊/ utils的/ my_markdown.rb,它正確地自動加載從my_markdown.rb = Utils::MyMarkdown - )

1

嘗試:

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

就是放雙冒號在Utils::Markdown前面。它基本上意味着「查看根名稱空間」,而不是「查看我當前所在的名稱空間」。

+0

沒有。 ':: Utils :: Markdown.render data' =>'ActionView :: Template :: Error:未初始化的常量Utils'。 – StragaSevera

+0

「我明白問題在於從輔助模塊引用實用程序」 - 事實證明,這不是問題。我剛剛檢查過,如果你把這兩個文件中的所有代碼放到/app/helpers/posts_helper.rb中,它就可以工作。所以,問題在於Rails不能自動加載它。不知道爲什麼,對不起! –

+0

好吧,無論如何,謝謝你= - ) – StragaSevera

0

markdown.rb中,僅將Markdown定義爲頂級類(即不在任何名稱空間中)。

+1

Rails應該自動自動加載:「應用程序和引擎中應用程序的所有子目錄,例如應用程序/控制器,它們不需要是默認應用程序,任何自定義目錄自動歸入autoload_paths「。 (來自http://guides.rubyonrails.org/autoloading_and_reloading_constants.html#autoload-paths) –

+0

@ joshua.paling感謝您的評論。更新了我的答案。 – Aetherus

+0

它的工作原理,謝謝。但我不想用這樣的實用程序類和方法污染全局命名空間,我想保持整潔。有沒有辦法實現這種用例? – StragaSevera