1

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

有任何想法吗?

提前致谢。

4

5 回答 5

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 注册自定义标签。IE

Liquid::Template.register_tag('custom_tag', MyCustomTag)
Liquid::Template.register_tag('custom_tag', MyCustomTag2EtcEtc)
于 2011-09-13T19:53:04.027 回答
1

您确定该文件正在加载吗?如果不是,那么 register_tag 永远不会被调用。我会在 register_tag 上方添加一个 puts 语句来调试它,确保文件实际上正在被加载。您可以将 register_tag 移动到初始化程序中

于 2010-11-19T16:09:46.157 回答
1

在 config/application.rb 尝试添加这一行

config.autoload_paths << File.join(config.root, "lib")
于 2011-02-12T00:10:16.717 回答
0

我认为这不是加载问题——我也有。标签正在加载中,可以打印当前注册的标签:

Liquid::Template.tags.inspect
于 2010-11-30T17:32:20.820 回答
0

我相信文件只有在文件名与其包含的类名匹配时才会自动加载。在您声明您的文件名为“liquid_tags.rb”的问题中,但您的类名为 UserControls ...如果您重命名您提交的“user_controls.rb”,它应该开始自动加载。

于 2011-05-08T22:02:12.260 回答