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

Elixir Embebido (EEx)

Al igual que Ruby tiene ERB y Java JSP, Elixir tiene EEx o Elixir Embebido. Con EEx podemos integrar y evaluar Elixir dentro de las cadenas.

API

La API EEx soporta trabajar con cadenas y archivos directamente. El API se divide en tres componentes principales: evaluación simple, definición de funciones y compilación a AST.

Evaluación

Usando eval_string/3 y eval_file/2 podemos realizar una evaluación simple contra una cadena o contenido de archivos. Esta es la API mas sencilla pero también la más lenta ya que el código es evaluado y no compilado.

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

Definiciones

El más rápido, y preferido, método de utilizar EEx es el de insertar nuestra plantilla en un módulo por lo que este puede ser compilado. Para ello necesitamos nuestra plantilla en tiempo de compilación y las macros function_from_string/5 y function_from_file/5.

Vamos a pasar nuestro saludo a otro archivo y generar una función para nuestra plantilla:

# 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"

Compilación

Por último, EEx nos proporciona una forma directa de generar Elixir AST de una cadena o archivo usando compile_string/2 o compile_file/2. Esta API es utilizada principalmente por las API citadas pero está disponible si desea implementar su propio manejo de Elixir incrustado.

Etiquetas

De forma predeterminada, hay cuatro etiquetas admitidas en EEx:

<% Expresion Elixir - en linea con salida %>
<%= Expresion Elixir - reemplaza con resultado %>
<%% EEx quotation - retorna el contenido en su interior %>
<%# Comentarios - estos son descartados en el código fuente %>

Todas las expresiones que se desean emitir deben utilizan el signo igual (=). Es importante señalar que, si bien otros lenguajes de plantillas tratan cláusulas como if de una manera especial, EEx no lo hace. Sin = nada sera emitido:

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

Motor

Por defecto Elixir utiliza el EEx.SmartEngine que incluye soporte para asignaciones (como @name):

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

Las asignaciones EEx.SmartEngine son útiles porque las asignaciones se pueden cambiar sin necesidad de compilación de plantilla:

¿Interesado en escribir su propio motor? Echa un vistazo a el comportamiento de EEx.Engine para ver lo que se requiere.

¿Encontraste un error o quieres contribuir a la lección? ¡Edita esta lección en GitHub!