2010-11-19 55 views
1

我試圖創建一個使用Rails 3.一些液體模板一組自定義標籤的我在lib /目錄下增加了一個「liquid_tags.rb」像這樣的內容:Rails 3中液體的自定義標籤找不到

class UserControls < Liquid::Tag            
    def initialize(tag_name) 
    super 
    end 

    def render(context) 
    tag = "<b>TAG</b>" 
    end  
end 

Liquid::Template.register_tag('user_controls', UserControls) 

當我嘗試通過「{%user_controls%}」獲取標籤時,它告訴我找不到標籤。

任何想法?

在此先感謝。

回答

0

你確定該文件正在被加載嗎?如果不是,那麼register_tag永遠不會被調用。我會在register_tag之上的put語句中調試它,確保該文件實際上被加載。您可以將register_tag移動到初始化程序中

+0

我懷疑這可能是一個問題,但我不明白爲什麼lib /目錄中的文件不會被加載。該目錄中還有其他文件正在正常加載。 – Matt 2010-11-19 16:14:51

+0

關於使用rails 3 beta自動加載的lib /目錄有一些變化。我不得不將lib目錄添加到config/application.rb'config.autoload_paths + =%W(#{config.root}/extras)' – 2011-01-17 21:36:19

0

我認爲這不是加載問題 - 我也有。該標籤被加載,可以打印當前的註冊標籤:

Liquid::Template.tags.inspect 
1

上的config/application.rb中嘗試加入這一行

config.autoload_paths << File.join(config.root, "lib") 
0

我相信文件只自動加載該文件的名稱匹配它包含的類的名稱。在這個問題中,你聲明你的文件名爲'liquid_tags.rb',但你的類名爲UserControls ...如果你重命名你的文件'user_controls.rb'它應該開始自動加載。

3

這是正確的,正如marcusmateus所說,Rails不會自動加載lib目錄中的任何內容,即使您已將其添加到autoload_paths中,除非該文件中的類或模塊名稱與文件名相匹配。

要解決這問題,只是把自定義格式的lib目錄中,各自在自己的文件(我試圖用一個模塊來包裝他們所有了,但沒有運氣)

class MyCustomTag < Liquid::Tag 
    def initialize(tag_name, params, tokens) 
     # do something 
    end 

    def render(context) 
     # do something 
    end 
    end 

然後創建一個初始化(在config/initializers中)負責用Liquid註冊自定義標籤。即

Liquid::Template.register_tag('custom_tag', MyCustomTag) 
Liquid::Template.register_tag('custom_tag', MyCustomTag2EtcEtc)