Programação Web Aula 8 - Rails (Introdução) Departamento de Informática UFPR 7 de Abril de 2014
1 Rails Básico Mágica Princípios Características Criando uma aplicação Levantando o Servidor Examinando o diretório padrão 2 Rails - As partes Controlador Analisando o funcionamento Mudando de uma controller#view para outro Modelos Criando um modelo Desvendando o Mistério: (1) O modelo Desvendando o Mistério: (2) O Controlador Desvendando o Mistério: (4) As variáveis Desvendando o Mistério: (4) As variáveis
MVC MVC = Model-View-Controller Trygave Reensraug, 1978-1979, Smalltalk. Ele observou que em um mesmo arquivo fonte, havia código para: a interação com o usuário (view); acesso e consistência a dados (model); uxo de execução (controller). Isto dicultava manutenção (componentes muito conexos). Solução encontrada: dividir física e logicamente estas três partes. o termo framework MVC refere-se a aplicativos de desenvolvimento que atendem a especicação acima.
Rails Básico Grande parte das ferramentas de desenvolvimento web usa algum MVC. Rails é um destes. Ciclo de interação com o usuário: o usuário interage com o navegador, enviando uma requisição ao servidor. o controlador capta esta requisição, consulta o modelo, e renderiza um novo documento que é enviado de volta.
Mágica Mágica O framework Rails faz muitas coisas automagicamente para o desenvolvedor. Isto ajuda só depois de saber a mágica. Cria classes de controlador; Conecta os métodos do controlador às respectivas views; Provê a interface básica para lidar com o banco de dados; Cria classes e bd para o modelo; utiliza convenções de nome para conectar modelo, controlador e views implicitamente. por exemplo: o controlador pode detectar valores nos dados dos form, colocá-las em variáveis de instância que cam implicitamente disponíveis para o código Ruby. facilita a criação de layouts; contém ambiente(s) de testes;
Princípios Princípios DRY (Don't Repeat Yourself) Cada elemento de informação deve aparecer uma única vez (minimiza memória). Com isto, alteraçõs ao código são altamente localizadas. Convention over Conguration A maior parte da interação entre as partes é implícita, e estabelecida por convenções e não por arquivos de conguração. Exemplo: nome da classe e nome da tabela. Paradigma Agile Development Desenvolvimento rápido ao invés de criação de documentos elaborados que culminam no aplicativo. Abordagem incremental.
Características Características Diferente de muitos outros frameworks, Rails não usa interfaces grácas, mas linhas de comando. Desenvolvido especicamente para desenvolver aplicações Web que usam banco de dados relacional. Bibliograa: Existe MUITO material na Web e em livros; A abordagem é muito parecida, e repletos de mágica. Isto diculta a compreensão do núcleo do framework, pois concentra-se nas beiradas. Nossa abordagem explica o funcionamento do framework.
Criando uma aplicação Criando uma aplicação Para criar uma aplicação, usa-se a linha de comando: Para criar a raiz de uma aplicação rails: > rails new Exemplo skip-bundle; o skip-bundle pede para não executar o programa bundle, responsável por incluir as gemas. Isto criar um diretório com o nome Teste. Atualize as gemas Veja seus subdiretórios e as gemas > cd Teste > bundle install --local > ls -l > less Gemfile
Levantando o Servidor Levantando o Servidor O diretório Teste é a raiz da aplicação que já pode responder a uma requisição Web. A partir da raiz, levantamos o servidor: > rails server Observe que o comando rails foi usado com outro parâmetro (server no lugar de new). Vão aparecer muitos outros ainda. A porta padrão é 3000, mas outra pode ser usada com -p<porta> O servidor foi levantado e como não temos nenhum modelo ou view especicado, a resposta padrão será renderizada.
Examinando o diretório padrão Examinando o diretório padrão Inicialmente vamos nos concentrar somente no diretório app, cujos subdiretórios incluem models, views e controllers. Normalmente, <navegador> localhost:3000 resolve. A litorina é máquina de estudos, e não tem navegador instalado. Tem de abrir navegador em outra máquina do dinf e abrir a url litorina:3000 (com o servidor levantado, claro)
Rails - As partes Os próximos slides mostram a criação de uma aplicação Rails. Baseia-se no livro Agile Web Development with Rails 4 A diferença aqui é vamos nos concetrar em entender como as partes MVC interagem, e não no deslumbramento das facilidades que ele traz. Para as próximas transparências, tenha em mente a gura abaixo:
Controlador Controlador Sua função é receber requisições, interagir com o BD e renderizar as páginas de resposta. Criação de um controlador > rails generate controller Say hello goodbye Este comando cria vários arquivos, dentre os quais destacamos: app/controllers/say_controller.rb app/views/say app/views/say/hello.html.erb config/routes (altera).
Analisando o funcionamento Analisando o funcionamento isto cria a url /say/hello e /say/goodbye. vericar o app/controllers/say_controller.rb. vericar o diretório app/views/say/. vericar o config/routes.rb + comando rake routes (a cola ou mágica que liga controlador à view). controlador é usado para acessar BD (ou informações externas); view é usada para mostrar estas informações. incluir @time = Time.now no controlador hello; <%= @time %> na view hello. A vida de uma variável de instância é de somente uma interação.
Mudando de uma controller#view para outro Mudando de uma controller#view para outro Compare a view say/hello com o arquivo hello.html.erb. O primeiro, só html. O segundo permite incluir comandos ruby com <%= <comando ruby> %>. Alguns comandos ruby são chamados helper methods. Alguns destes são geradores para HTML. Exemplo: <%= link_to "Goodbye", say_goodbye_path %> Existem vários helper methods padrão. Veja alguns em http://api.rubyonrails.org/classes/actionview/ Helpers/UrlHelper.html Conra o mapeamento (e outras formas de chamar - link acima)
Modelos Modelos Sua função é interagir com os dados. Não só buscar no BD, mas também fazer consistências. Para este exemplo, criaremos outra aplicação, e a criação de um modelo é através do comando > rails new depot > cd depot > rails generate scaffold <Tabela> <atributos> Ele também cria as view básicas para visualizar, incluir, excluir e alterar. Ele não cria a tabela, mas sim cria o schema. Para criar a tabela, é necessário executar o comando rake db:migrate.
Criando um modelo Criando um modelo Criar a tabela products, com três atributos: >rails generate scaffold Product title:string description:text \ image_url:string price:decimal xa Este comando cria um monte de arquivos. Iremos abordar somente alguns. Um arquivo importante é criada a migração, ou seja, um schema de criação desta tabela e seus atributos. conra no diretório db/migrate, com um timestamp. O programador pode alterar características dos atributos lá e depois criar a tabela com o comando rake db:migrate. Também pode voltar atrás e desfazer a tabela com rake db:rollback. Ao levantar o servidor, tudo funciona.
Desvendando o Mistério: (1) O modelo Desvendando o Mistério: (1) O modelo Há uma padronização de nomes entre classes e tabelas. O diretório app/models contém o arquivo product.rb. Este arquivo contém a classe Product. Como a migração criou a tabela products, todos os atributos da tabela são mapeados para a classe implicitamente.
Desvendando o Mistério: (2) O Controlador Desvendando o Mistério: (2) O Controlador O controlador deve ler a tabela e mapear os atributos para uma variável de instância, no caso, @products ou @product dependendo da url. Para entender como, rake routes Veja o arquivo app/controllers/products_controller.rb. Por m, observe as urls de cada requisição.
Desvendando o Mistério: (3) As Views Desvendando o Mistério: (3) As Views As view criadas estão no diretório app/views/<controlador>/. Neste caso, app/views/products/? > ls edit.html.erb index.html.erb new.html.erb show.json.jbuilder _form.html.erb index.json.jbuilder show.html.erb Cada uma delas é acessada com url diferente. Conra com rake routes.
Desvendando o Mistério: (4) As variáveis Desvendando o Mistério: (4) As variáveis Primeiro, como as variáveis são usadas para gerar páginas dinâmicas. Considere a página gerada com index. Controller carrega todos os produtos no método index. Neste caso, @products = Product.all. View: a variável products é usada em comandos ruby (entre <%... %>). Já a página gerada com show tem um truque: usa um mesmo método (set_product para aplicar @product = Product.find(params[:id]). Após a denição da classe, tem before_action :set_product, only: [:show, :edit, :update, :destroy]
Desvendando o Mistério: (4) As variáveis Desvendando o Mistério: (4) As variáveis A pergunta que não quer calar: de onde veio o parâmetro id? Em rails, os parâmetros são armazenados na hash params do controlador (não é visível fora do controlador). Independe se veio como POST ou GET. Outro caso é um novo produto: Veja o fonte da página de new. O campo de título: name="product[title]". O botão de criação dispara o método create no controlador. Este, por sua vez usa product_params (um atalho para todos os campos de params). http://guides.rubyonrails.org/action_controller_ overview.html#parameters