# ERuby

eRuby (embedded ruby, ou ruby embarcado) é um sistema de templates que incorpora ruby em um documento de texto. Ele é frequentemente usado para embutir código ruby em documentos HTML, semelhante ao ASP, JSP e PHP. O sistema de template eRuby combina código em ruby e texto simples para fornecer controle de fluxo e substituição de variáveis, facilitando a manutenção.
A módulo de visão em rails é responsável por apresentar a resposta ou saída em um navegador. Em sua forma mais simples, uma visão pode ser um pedaço de código HTML que tem algum conteúdo estático. Para a maioria das aplicações, apenas ter conteúdo estático pode não ser suficiente. Muitas aplicações em rails exigem que conteúdo dinamicamente criado pelo controlador (método de ação) seja exibido na visão. Isto é possível usando eRuby para gerar templates que podem conter conteúdo dinâmico. Embedded ruby permite que o código de ruby seja incorporado em um documento de visão. Este código é substituído com os valores corretos resultantes da execução do código em tempo de execução. Mas, por ter a capacidade de incorporar código em um documento de visão, corremos o risco de ofuscar a clara separação presente no quadro MVC. Assim, é de responsabilidade do desenvolvedor se certificar de que há uma separação clara de responsabilidade entre os módulos de modelo, visão e controlador na aplicação.

## Utilização

O eRuby permite que o código de Ruby seja incorporado dentro de um par de delimitadores <% e %> . Estes blocos de código embarcado são então avaliados no local e substituídos pelo resultado de sua avaliação. Além de criar páginas da web, eRuby também pode ser utilizado para criar documentos XML, RSS feeds e outras formas de arquivos de texto estruturados. O eRuby gera arquivos estáticos dinamicamente baseados em templates. Estas funcionalidades de eRuby podem ser encontrado na biblioteca ERB.
Diferentes tipos de marcadores utilizados nos templates de ERB são:
* Tags de expressão
* Tags de execução
* Tags de comentário

### Tags de expressão

<%= %>: Indica que a tag inclui uma expressão. Essas tags começam com uma tag delimitadora de abertura seguida pelo símbolo de igual e termina com uma tag que delimita o final. Durante o processamento do template, este pedaço de código é substituído com o resultado do código. Se o resultado avaliado não for uma string, ele é convertido em uma sequência de caracteres antes de ser renderizado. Por exemplo:
O texto resultante se parece com: O valor de x é: 500

### Tags de execução

<% %>: Código entre essas tags é chamado de scriptlet. O código de uma tag é executado e o resultado é substituído no lugar do scriptlet. Tais tags devem ter uma tag <% end %> quando necessário para indicar o final de um bloco funcional. Por exemplo:
No exemplo acima, o texto do item é impresso quatro vezes. O scriplet não produz o texto por si mesmo, ele só faz com que o texto entre ele seja executado várias vezes. O resultado do código acima é:
* item
* item
* item
* item

### Tags de comentário

<%# %> : O conteúdo de tags de comentário não é renderizado no resultado. Tais marcas começam com um tag delimitador seguido por um símbolo de hash e terminam com um tag delimitador de final. Exemplo de uma tag de comentário é mostrado abaixo:
Este é o mesmo como um comentário em Ruby. Todo código em ruby que vem após o # é ignorado e não gera nada.

### Outras tags

Outras coisas comuns em eRuby são também comuns em Ruby, como a substituição de strings em, que é semelhante em linguagens como Perl ou PHP.
Quebras de linha em eRuby podem ser suprimida pela adição de um hífen no início da tag delimitadora de final. Por exemplo:
Na saída do código acima, o valor de nome é impresso duas vezes na mesma linha.

## Implementações

Existem várias implementações de eRuby, por exemplo:
* ERB
* erubis
* ember

### erb

erb é uma implementação de eRuby escrito puramente na linguagem de programação Ruby e incluída na biblioteca padrão do Ruby.
Um template pode ser gerado executando um trecho de código escrito usando o objeto ERB. Um exemplo simples é mostrado a seguir:
Isso resulta em: "O valor de x é: 400"
O mesmo pode ser feito usando o código abaixo, que não usa um objeto ERB:
Os dois trechos de código acima geram o mesmo resultado. Mas o que acontece quando nós trocamos a linha 2 com a linha 3 no primeiro trecho de código e a linha 1 com a linha 2 no segundo trecho de código? As alterações no primeiro trecho são mostradas abaixo:
Isso ainda gera o mesmo resultado: "O valor de x é: 400".
O segundo trecho alterado:
Diferente do primeiro trecho, o código acima não será executado. Isto é porque a 1ª linha não sabe o valor de x quando ela é executada. Assim, a principal razão para utilizar um objeto ERB é a elaboração de templates antes do tempo, por binding de variáveis e métodos que talvez não existam em um determinado momento. O template é processado apenas quando result é chamado no objeto ERB. A fim de obter acesso a métodos e variáveis de um objeto, ERB usa um objeto de binding. Acesso a variáveis e métodos de um objeto é dado pelo objeto privado binding que existe em cada classe de ruby. É fácil ganhar acesso a métodos e variáveis dentro do método de uma classe. Mas para acessar as variáveis de uma classe diferente, a classe terá de expor é objeto de binding através de um método público. Um exemplo é mostrado abaixo:
Como podemos ver no exemplo acima, estamos expondo o objeto binding da classe ERBExemplo. Além disso, usamos o objeto de binding para acessar variáveis e métodos da classe de dentro de um de seus métodos.

#### Método new em ERB

O método new em um objeto ERB leva mais dois parâmetros. O segundo parâmetro especifica o nível de segurança.
Dando um número no segundo parâmetro (valor máximo = 4) pode-se fazer o template ser executado em outra thread. O valor do número determina o nível de segurança. No máximo, nível de isolamento, a menos que o objecto de binding seja marcado como confiável, ERB não pode usá-lo.
O terceiro parâmetro especifica modificadores opcionais. Estes podem ser usados para controlar a adição de novas linhas para a saída. Por exemplo, para certificar-se de que o ERB não adicione novas linhas depois da tag final,
podemos criar a ERB objeto, como mostrado abaixo
Para fornecer apenas o terceiro parâmetro e ignorar o segundo parâmetro, use 0 como o segundo parâmetro.
ERB possui muitos outros métodos expostos, que podem ser usados para processar um template. Para a lista completa das APIs expostas pelo objeto ERB, consulte a documentação do ERB.
Executar ERB na linha de comando
É comum usar ERB para passar o resultado do template para um arquivo desejado. Para conseguir isso, podemos usar a função de redirecionamento fornecido na linha de comando e redirecionar a saída para um arquivo, em vez de a imprimir na saída padrão. No exemplo acima, a saída é redirecionada para o arquivo minha_visao.html.erb.
Ligação a bibliotecas de terceiros é possível fazendo uso da opção -r e fornecendo o nome da biblioteca. Para lembrar esta funcionalidade, pode-se lembrar que Ruby usa a palavra-chave require, que tem a mesma funcionalidade que a opção -r. O exemplo abaixo usa a biblioteca IPAddr: Como mencionamos sobre os níveis de segurança na seção anterior, pode-se especificar o nível de segurança como um argumento de linha de comando usando a opção -S:

### erubis

erubis é uma implementação de eRuby implementado em Ruby e também em Java. De acordo com a sua home page, ele corre mais rápido que eRuby e ERb e tem várias opções úteis, incluindo tags alternativas que permitem XML válido.

### ember

ember é uma implementação de eRuby em puro Ruby para Linux. Ember permite a depuração de templates em eRuby, melhora a sua composição, e fornece abreviações poderosas de diretivas eRuby.