2010-11-19 56 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)