eRuby
Versão estável | 1.0.5 (14 de dezembro de 2004 | )
Escrito em | Ruby |
Sistema operacional | Cross-platform |
Gênero(s) | Sistema de template web |
Licença | GPL and LGPL |
Estado do desenvolvimento | Ativo |
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.[1]
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.[2]
Utilização
[editar | editar código-fonte]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[3]
Tags de expressão
[editar | editar código-fonte]<%= %>: 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:
require 'erb'
x = 500
template = ERB.new("O valor de x é: <%= x %>")
puts template.result(binding)
O texto resultante se parece com: O valor de x é: 500[1]
Tags de execução
[editar | editar código-fonte]<% %>: 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:[4]
<ul>
<% 4.times do %>
<li>item</li>
<% end %>
</ul>
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
[editar | editar código-fonte]<%# %> : 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:[5]
<%# código de ruby %>
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
[editar | editar código-fonte]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:
<%2.times do -%>
<%= @nome %>
<% end -%>
Na saída do código acima, o valor de nome é impresso duas vezes na mesma linha.
Implementações
[editar | editar código-fonte]Existem várias implementações de eRuby, por exemplo:
- ERB
- erubis
- ember
erb
[editar | editar código-fonte]erb é uma implementação de eRuby escrito puramente na linguagem de programação Ruby e incluída na biblioteca padrão do Ruby.[2]
Um template pode ser gerado executando um trecho de código escrito usando o objeto ERB. Um exemplo simples é mostrado a seguir:
require 'erb'
x = 400
template_simples = "O valor de x é: <%= x %>."
renderizador = ERB.new(template_simples)
puts output = renderizador.result(binding)
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:
x = 400
string = "O valor de x é: #{x}"
puts string
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:
require 'erb'
template_simples = "O valor de x é: <%= x %>."
x = 400
renderizador = ERB.new(template_simples)
puts output = renderizador.result(binding)
Isso ainda gera o mesmo resultado: "O valor de x é: 400".
O segundo trecho alterado:
string = "O valor de x é: #{x}"
x = 400
puts string
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:
class ERBExemplo
attr_accessor:variavel1
# usando bind pra acessar variáveis
def render()
renderer.result(binding)
end
def initialize(variable1)
@variavel1 = variavel1
end
# Expose private binding() method.
def get_binding
binding()
end
end
exemplo = ERBExemplo.new(variavel1)
renderer = ERB.new(template)
puts output = renderer.result(exemplo.get_binding)
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
[editar | editar código-fonte]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
renderer = ERB.new(template, 3, '>')
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
[editar | editar código-fonte]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
[editar | editar código-fonte]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.
Referências
[editar | editar código-fonte]- ↑ a b Brown, Gregory (2009). Ruby Best Practices. [S.l.]: O'Reilly. pp. 279–281. ISBN 978-0596523008
- ↑ a b S., Ruby; D., Thomas; Hansson D, Heinemeier. Agile Web Development with Rails. [S.l.: s.n.] ISBN 978-1-934356-54-8
- ↑ Ellis, Stuart (1 de julho de 2016). «An Introduction to ERB Templating». Consultado em 12 de setembro de 2016
- ↑ «ERB»
- ↑ «ERB – Ruby Templating»