我正在尝试使用Rails 3为一些液体模板创建一组自定义标签。我在lib /目录中添加了一个'liquid_tags.rb',内容如下:
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 :(得分:3)
这是正确的,正如marcusmateus所说,即使您已将其添加到autoload_paths,Rails也不会自动在lib目录中加载任何内容,除非文件中的类或模块名称与文件名匹配。
要解决这个问题,只需将自定义格式化程序放在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)
答案 1 :(得分:1)
在config / application.rb上尝试添加此行
config.autoload_paths << File.join(config.root, "lib")
答案 2 :(得分:0)
您确定该文件已加载吗?如果不是,则永远不会调用register_tag。我会在register_tag上面输入一个puts语句来调试它,确保文件实际上已被加载。您可以将register_tag移动到初始化程序
答案 3 :(得分:0)
我认为这不是加载问题 - 我也有。正在加载标记,您可以打印当前注册的标记:
Liquid::Template.tags.inspect
答案 4 :(得分:0)
我相信如果文件的名称与其包含的类的名称匹配,则文件仅自动加载。在问题中,您声明您的文件名为'liquid_tags.rb',但您的类名为UserControls ...如果您重命名已归档的'user_controls.rb',它应该开始自动加载。