1

Rails 3 を使用して、いくつかの Liquid テンプレート用のカスタム タグのセットを作成しようとしています。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 が言うように、ファイル内のクラスまたはモジュール名がファイル名と一致しない限り、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

次に、Liquid にカスタム タグを登録するための初期化子 (config/initializers 内) を作成しました。すなわち

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 に答える