未找到带有液体自定义标签的Rails 3

时间:2010-11-19 16:06:30

标签: ruby-on-rails-3 liquid custom-tag

我正在尝试使用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%}'在我的视图中获取标记时,它告诉我找不到标记。

有什么想法吗?

提前致谢。

5 个答案:

答案 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',它应该开始自动加载。