ホーム DoRuby 【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
記事を共有
モバイルバージョンを終了