その他
    ホーム 技術発信 DoRuby 【Rails】liquid-railsを使ってみました。【Liquid】
    【Rails】liquid-railsを使ってみました。【Liquid】
     

    【Rails】liquid-railsを使ってみました。【Liquid】

    この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。


    テンプレートの編集機能をに安全に作れるLiquid。 Rails用に使いやすくなったliquid-railsを使ってみたので紹介します。

    そもそもLiquidとは何かという事はここでは紹介しませんのでお気をつけください。

    使い方

    1.Gemfileに追記してbundle install

    Gemfile

    gem 'liquid'
    gem 'liquid-rails'
    

    一応これだけで拡張子が「.liquid」のテンプレートをLiquidとして読んでくれます。

    2.Liquid内で使用するモデルのメソッドを設定する

    この設定をしないとLiquid内でモデルのメソッドが呼び出せません。
    app/models/product.rb

    has_many :categories
    liquid_methods :name, :price, :categories
    

    3. Liquid内で使いたい変数を設定する

    「liquid_assigns」を使用します。下記の設定でコントローラに記述した「@product」等がLiquid内では「product」として呼び出せます。
    app/helpers/application_helper.rb

    def liquid_assigns
        view_context.assigns.merge(
          params: params,
          hoge: hoge,
          .
          .
          .
    
        ).stringify_keys
    end
    

    4. 「.liquid」の中身の例

    構文の詳細は公式を参照してください。

    {% for product in products %}
        {% if true %}
          <p>{{ product.name }}</p>
        {% endif %}
    {% endfor %}
    

    <p>商品名1</p>
    <p>商品名2</p>
    <p>商品名3</p>
    

    Filterの使用

    Liquid内で変数の加工やタグを作りたい場合があると思います。その場合はフィルターを記述し、読み込みます。liquid-railsでは最初から「javascript_include_tag」等が記述されています。

    app/controllers/concerns/liquid_filter_desuyo.rb

    module LiquidFilterDesuyo
      def controller
        @context.registers[:controller]
      end
    
      def view
        @context.registers[:view]
      end
    
      def page_title(*args)
       I18n.t(controller.controller_name, *args)
      rescue
        nil
      end
    
      def html_escape(string)
        ERB::Util.html_escape(string)
      end
    end
    

    application_controller.rb

    before_action :set_liquid_filter
    def set_liquid_filter
      Liquid::Template.register_filter LiquidFilterDesuyo
    end
    

    Filterの使い方

    構文
    ※引数が無いフィルターは呼び出せません。(たぶん)

    {{ 第一引数 | フィルター名:第二引数, 第三引数,....}}
    

    例:

    <p>{{ product.name | html_escape }}</p>
    
    <p>{{ product.name | html_escape | simple_format }}</p>
    

    メソッドを繋げることもできます。詳しくは公式へ

    実際にエンドユーザにテンプレートを作成してもらう場合にどうするのか?

    1.画面からLiquidテキストを入力してもらいviewと同じディレクトリ構造に保存。

    RAILS_ROOT/liquid_templates/products/show.liquid

    {% for product in products %}
        {% if true %}
          <p>{{ product.name }}</p>
        {% endif %}
    {% endfor %}
    

    2.prepend_view_pathを使用し作ったファイルをテンプレートとして呼び出す。

    application_controller.rb

    before_action :set_view_path
    before_action :set_liquid_filter
    
    def set_view_path
      prepend_view_path Rails.root + 'liquid_templates'
    end
    
    def set_liquid_filter
      Liquid::Template.register_filter LiquidFilterDesuyo
    end