Do you want to pick up from where you left of?
Take me there

Embedded Elixir (EEx)

Sebagaimana Ruby punya ERB dan Java punya JSP, Elixir punya EEx atau Embedded Elixir. Dengan EEx kita bisa memasukkan dan menjalankan Elixir di dalam string.

API

API EEx mendukung pengerjaan dengan string dan file secara langsung. API tersebut dibagi dalam tiga komponen utama: evaluasi sederhana, definisi fungsi, dan kompilasi ke AST.

Evaluasi

Menggunakan eval_string/3 dan eval_file/2 kita dapat melakukan evaluasi sederhana terhadap sebuah string atau isi file. Ini adalah API paling sederhana tetapi yang paling lambat karena code dievaluasi dan bukan dikompilasi.

iex> EEx.eval_string "Hi, <%= name %>", [name: "Sean"]
"Hi, Sean"

Definisi

Metode paling cepat, dan paling disukai, untuk menggunakan EEx adalah memasukkan template ke dalam sebuah modul sehingga dapat dikompilasi. Untuk hal ini kita perlukan template kita pada saat kompilasi, bersama macro function_from_string/5 dan function_from_file/5.

Mari pindahkan ucapan salam di atas ke file terpisah dan hasilkan sebuah fungsi untuk template kita:

# greeting.eex
Hi, <%= name %>

defmodule Example do
  require EEx
  EEx.function_from_file(:def, :greeting, "greeting.eex", [:name])
end

iex> Example.greeting("Sean")
"Hi, Sean"

Kompilasi

Terakhir, EEx memberi kita sebuah cara untuk secara langsung menghasilkan AST Elixir dari sebuah string atau file menggunakan compile_string/2 atau compile_file/2. API ini utamanya digunakan oleh API yang sudah dibahas di awal tetapi juga tersedia jika anda ingin mengimplementasi penanganan sendiri terhadap Elixir yang diembed.

Tag

Secara default ada empat tag yang didukung di EEx:

<% Elixir expression - inline with output %>
<%= Elixir expression - replace with result %>
<%% EEx quotation - returns the contents inside %>
<%# Comments - they are discarded from source %>

Semua ekspresi yang ingin menghasilkan output harus menggunakan tanda sama dengan (=). Adalah penting dicatat bahwa sementara bahasa templating lain memperlakukan hal seperti if secara berbeda, EEx tidak. Tanpa = berikut ini tidak menghasilkan output:

<%= if true do %>
  A truthful statement
<% else %>
  A false statement
<% end %>

Engine

Secara default Elixir menggunakan EEx.SmartEngine, yang menyertakan dukungan untuk assignment (seperti @name):

iex> EEx.eval_string "Hi, <%= @name %>", assigns: [name: "Sean"]
"Hi, Sean"

Assignment di EEx.SmartEngine berguna karena assignment bisa diubah tanpa mengkompilasi template.

Tertarik untuk menulis engine sendiri? Lihatlah perilaku EEx.Engine untuk melihat apa saja yang dibutuhkan.

Caught a mistake or want to contribute to the lesson? Edit this lesson on GitHub!