Back-End

27 jun, 2012

Ruby com sabor de Rails

Publicidade

Em seu livro Ruby on Rails 2.3 Tutorial: Learn Rails by Example, Portable Documents, Michael Hartl explora alguns elementos de Ruby importantes para desenvolvedores Rails. Baseado em exemplos do Capítulo 3, este capítulo explora alguns elementos de Ruby que são importantes para desenvolvedores Rails. Ruby é uma linguagem extensa mas, felizmente, os subsistemas necessários para ser produtivo como um desenvolvedor Rails são relativamente pequenos. Michael Hartl explora alguns elementos de Ruby importantes para desenvolvedores Rails.

Além do mais, esses subsistemas são diferentes das abordagens usuais no aprendizado do Ruby, e isso é importante porque, se você tem como objetivo confeccionar aplicações dinâmicas para a web, eu recomendo aprender Rails antes, absorvendo um pouco de Ruby no processo. Para ser um expert em Rails, você precisa entender Ruby mais profundamente, e esse livro lhe dá uma boa base para desenvolver esse conhecimento. Como assinalado na Seção 1.1.1, após terminar o Tutorial Rails I, eu recomendo ler um livro exclusivamente de Ruby, como por exemplo, Beginning RubyThe Well-Grounded Rubyist, ou The Ruby Way.

Este capítulo cobre muitos aspectos, e não é necessário explorar todos numa primeira leitura. Voltarei a referir-me a ele frequentemente em capítulos seguintes.

4.1 Motivação

Como vimos no último capítulo, é possível desenvolver a estrutura de uma aplicação em Rails, e até mesmo começar a testá-la, com nenhum conhecimento da linguagem Ruby que está na base. Fizemos isso confiando no controller e no test code gerados e também seguindo os exemplos que vimos lá. Contudo, essa situação não pode durar para sempre, e abriremos este capítulo com algumas contribuições ao site, o que nos coloca face a face com nossas limitações em Ruby.

  • 4.1.1 Um title Helper

Quando vimos nosso novo aplicativo da última vez, tínhamos acabado de atualizar nossas páginas basicamente semiestáticas para usar layouts em Rails, visando a eliminar duplicação em nossas visualizações. Veja a listagem 4.1, o layout sample application site.

app/views/layouts/application.html.erb

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">

<head>

<title>Ruby on Rails Tutorial Sample App | <%= @title %></title>

</head>

<body>

<%= yield %>

</body>

</html>

Esse layout funciona bem, mas há uma parte que poderia ser melhorada. Lembremos que a linha título

Ruby on Rails Tutorial Sample App | <%= @title %>

baseia-se na definição de  @title nas ações, tais como

class PagesController < ApplicationController

def home

@title = "Home"

end

.

.

.

Mas, e se não definirmos uma variável @title?  É uma boa convenção usar um base title em todas as páginas, com um título opcional variável se quisermos ser mais específicos. Nós quase conseguimos isso com nosso layout atual, com um porém: se você apagar @title em uma das ações, na ausência da variável @title, o título aparecerá como abaixo:

Ruby on Rails Tutorial Sample App |

Em outras palavras, há um título base adequado, mas há também um caractere | de barra vertical à direita no final do título.

Uma forma comum de lidar com essa situação é definir um helper, que é a função própria para usar em visualizações. Vamos definir um title helper que retorne um título de base “Ruby on Rails Tutorial Sample App”, se nenhuma variável @title estiver definida, e adicionar uma barra vertical seguida da variável título se @title for definida. Veja a listagem 4.2:

app/views/layouts/application.html.erb

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">

<head>

<title>Ruby on Rails Tutorial Sample App | <%= @title %></title>

</head>

<body>

<%= yield %>

</body>

</html>

Listagem 4.2. Definindo um title helper.

app/helpers/application_helper.rb

module ApplicationHelper


# Return a title on a per-page basis.

def title

base_title = "Ruby on Rails Tutorial Sample App"

if @title.nil?

base_title

else

"#{base_title} | #{@title}"

end

end

end

Isso pode parecer bastante simples aos olhos de um programador Rails experiente, mas é cheio de novas idéias Ruby: módulos, comentários, atributos locais variáveis, booleanos, fluxos de controle, interpolação em strings, e valores de retorno. Consideraremos cada uma dessas idéias neste capítulo.

Agora que temos um helper, podemos usá-lo para simplificar nosso layout, substituindo

<title>Ruby on Rails Tutorial Sample App | <%= @title %></title>

por

<title><%= title %></title>

como visto na Listagem 4.3. Note particularmente a mudança da instância variável @title para o título helper method (sem o caracter @). Usando o  Autotest ou spec spec/, você pode verificar que os testes do Capítulo 3 ainda funcionam.

Listagem 4.3.  O layout sample application site.

app/views/layouts/application.html.erb

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">

<head>

<title><%= title %></title>

</head>

<body>

<%= yield %>

</body>

</html>
  • 4.1.2 Cascading Style Sheets

Há um segundo acréscimo ao nosso site que parece simples, mas que adiciona diversos novos conceitos Ruby: inclusão de style sheets em nosso site layout. Embora este seja um livro de desenvolvimento web, e não de web design, utilizaremos style sheets em cascata – cascading style sheets (CSS) -, para dar à aplicação de amostra um mínimo de estilo, e usaremos o framework Blueprint CSS como base para essa finalidade.

Para iniciar, faça o download da última versão Blueprint CSS. (Para simplificar, considero que você vai fazer o download do Blueprint em uma pasta de download, mas use qualquer pasta que lhe for conveniente). Usando tanto o comando line ou uma ferramenta gráfica, copie a pasta blueprint do Blueprint CSS para a pasta  thepublic/stylesheets, um diretório especial onde o Rails tem as style sheets. No meu Mac, os comandos são os abaixo, mas os seus detalhes podem variar:

$cp-r ~/Downloads/joshuaclayton-blueprint-css-016c911/blueprint > public/stylesheets/

Aqui cp é o comando de cópia Unix, e a bandeira –r copia recursivamente (necessário para a cópia de diretórios). (Como brevemente mencionado na Seção 3.2.1, o caracter ~ significa “home directory” em Unix.)

Uma vez que você tenha as folhas de estilo no diretório apropriado, o Rails providencia um helper para incluí-las em nossas páginas usando Embedded Ruby. Veja a listagem 4.4, acrescentando style sheets ao layout sample application.

app/views/layouts/application.html.erb

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">

<head>

<title><%= title %></title>

<%= stylesheet_link_tag 'blueprint/screen', :media => 'screen' %>

<%= stylesheet_link_tag 'blueprint/print', :media => 'print' %>

</head>

<body>

<%= yield %>

</body>

</html>

Vamos nos concentrar nas novas linhas:

<%= stylesheet_link_tag 'blueprint/screen', :media => 'screen' %>

<%= stylesheet_link_tag 'blueprint/print',  :media => 'print' %>

Elas usam o helper interno stylesheet_link_tag do Rails, sobre o qual você pode ler mais detalhes no API do Rails.2 A primeira linha stylesheet_link_tag inclui a folha de estilo blueprint/screen.css para telas, e a segunda inclui blueprint/print.css para impressão (o helper automaticamente acrescenta a extensão .css para os arquivos que não a tenham – para ser breve deixei esse aspecto de lado).

Da mesma forma que com o title helper, para um Programador Rails experiente essas linhas parecem simples, mas há pelo menos quatro novas ideias para o Ruby: processos internos do Rails, processos de chamada sem parênteses, símbolos, e hashes. Neste capítulo também abordaremos essas novas ideias (veremos o HTML produzido por style sheets incluído na Listagem 4.6 da Seção 4.3.4.).

Note que com as novas style sheets o site não parecerá muito diferente, mas já é um começo (Figura 4.1). Continuaremos a construção desses fundamentos no capítulo 5.3.

*

Texto original de Michael Hartl, disponível em http://www.informit.com/articles/article.aspx?p=1653369