目次
この記事はアピリッツの技術ブログ「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