Modelagem de Recursos
Criado por Myriam Leggieri, @iammyr para Rails Girls Galway. Os guias básicos que foram mergeados e adaptados são Tutorial de Ruby on Rails, o RailsGirls app básico e os tutoriais para criar thumbnails, autenticar usuários, adicionar design, deploy ao OpenShift e adicionar comentários. Traduzido por Elaine Mattos, elainemattos.
O que nós queremos que nossa aplicação faça? Primeiramente, nós gostariamos de
- autenticar users (usuários)
- permitir que users autenticados criem uma nova descrição turística do place (local)
- permitir que user autenticados possam comment (comentar) nestes locais
- permitir que users autenticados rate (classifiquem) os locais que sejam amigáveis ao autismo ou não.
Observe que esses requisitos nos ajudam a identificar quatro recursos diferentes: usuário (users), local (place), comentário (comment), classificação (rate). Agora vamos modelar suas propriedades e suas associações entre si.
Iremos permitir classificações no próximo tutorial.
Tourists/Users Autenticados
Vamos gerar nosso primeiro recurso: usuários e requerer a sua autenticação.
Passo 0: Adicionar a gem devise
Abra a sua Gemfile
e adicione esta linha
e rode
para instalar a gem. Lembre-se de reiniciar o servidor Rails.
Passo 1: Configurar o devise na sua aplicação
Rode o seguinte comando no terminal.
Passo 2: Configurar o Devise
Verifique se você definiu opções de URL padrão nos arquivos dos ambientes. Abra config/environment/development.rb
e adicione esta linha:
antes da palavra end
.
Abra app/views/layouts/application.html.erb
e adicione:
logo acima de
Passo 3: Configurar User model
Usaremos um script de geração de código para criar a User model.
Instrutor(a): Explique qual user model foi gerada. O que são os campos? Observe que a model herda habilidades para interagir com o BD através do ActiveRecord::Base
super-class (ref. MVC).
Passo 4: Crie seu primeiro usuário
Agora que você configurou tudo já pode criar seu primeiro user. Devise criará todo o código e rotas necessárias para criação de contas, log in, log out, etc.
Certifique-se de que seu servidor rails está rodando, abra http://localhost:3000/users/sign_up e crie a sua conta de user (usuário).
Passo 5: Adicione links de sign-up e login
Tudo que precisamos fazer agora é adicionar os links apropriados e notificar sobre o user estar logado no topo direito da barra de navegação.
Para fazer isso, edite app/views/layouts/application.html.erb
adicionando no começo do body:
Finalmente, force o user para redirecionar para a página de login se o usuário não estiver logado. Abra app/controllers/application_controller.rb
e adicione:
após class ApplicationController < ActionController::Base
.
Abra seu navegador e tente logar e deslogar.
Instrutor(a): Fale sobre os helpers user_signed_in?
e current_user
. Por que eles são úteis?
Vamos add-commit-push para o seu repositório no Github! Veja que todas as alterações agora estão no seu perfil no Github? :)
Locais Turísticos
Agora vamos usar a funcionalidade de scaffold do Rails para gerar e configurar tudo que é necessário para listar, adicionar, remover, editar e visualizar nosso segundo recurso: “locais turísticos”.
Observe que a coluna user:references
que é criada para suportar a associação 1-para-muitos com usuários.
O scaffold cria novos arquivos diretório do seu projeto. No entanto, nós definimos uma “estrutura” (modelada) para o nosso recurso “place” e queremos que todas as instâncias futuras desse recurso atinjam essa estrutura e sejam armazenadas em algum lugar, ou seja, em um banco de dados.
Nós já estamos usando um banco de dados (veja gem 'sqlite'
na sua Gemfile). Vamos adicionar a estrutura de “place” como uma tabela para nosso banco de dados com o seguinte.
Então inicie o servidor novamente. Abra http://localhost:3000/places no seu navegador e veja todas as novas funcionalidades que a nossa aplicação web está agora suportando o recurso de “places”. Tudo graças ao que o Ruby on Rails automaticamente gera com generate scaffold
.
Cada nova instância de “place” que será salva no banco de dados, irá automaticamente atribuir um identificador único chamado “chave primária”, sem a necessidade de especificá-lo como um dos campos (junto com imagem, nome etc.)
Instrutor(a): O que é o scaffolding do Rails? O que são as migrations e por que você precisa delas? Observe as páginas que foram criadas para manipular o recurso de “place” e suas convenções de nomeclatura. Olhe os logs do servidor e explique-o como um relatório das seguintes interações (no contexto do padrão MVC):
- o navegador emite uma solicitação para o URL /places.
- Rails roteia /places para o ação de index em Places controller.
- A ação de index requisita a model Place para receber todos os places (Place.all).
- A model Place extraí todos os places do banco de dados.
- A model Place retorna a lista de places para a controlller.
- A controller captura os users na variável
@users
, na qual é passada para a index view. - A view utiliza o Ruby incorporado para renderizar a página como HTML.
- A controller passa o HTML para o navegador.
Observe que a controller criada é RESTful (explique)
Note que a controller herda habilidades (grande número de funcionalidade, como a possibilidade de manipular model objects, filtrar requisições HTTP, e renderizar views como HTML) oriunda da ApplicationController
super-class (ref. MVC).
Abra app/views/places/show.html.erb
e remova a linha que diz:
Essa linha não é necessária pois nós já colocamos o aviso de user no arquivo app/views/layouts/application.html.erb
.
Vamos add-commit-push para o repositório do Github!
Associações de Recursos
Observe que places ainda não estão associados corretamente aos users. Por exemplo, ao criar um novo place, o campo “User” deverá ser preenchido por nós mesmos e, ao visualizar um perfil de user, não haverá lista de places criados por ele e vice-versa. Além disso, ao excluir uma conta de user, todos os places que ele criou não são excluídos automaticamente.
Vamos apropriadamente criar a associação 1-para-muitos entre User e Places.
Passo 1. Adicionar Associação 1-para-muitos
Você precisa ter certeza que o Rails sabe a relação entre o recurso de User e Place.
Como um user pode criar muitos places, precisamos ter certeza de que a user model sabe disso.
Abra app/models/user.rb
e depois da linha
Adicione
O place também tem que saber que ela pertence a um user. Então, abra app/models/place.rb
e depois
adicione a linha
Passo 2: Renderizar as views
Abra app/views/places/_form.html
e depois
adicione a linha
agora, remova
Passo 3: Coloque permissões para editar/deletar
Permita que apenas o criador de place possa editar/deletar um place.
Abra app/views/places/index.html.erb
e substitua
por
É isso aí. Agora veja um user que você inseriu na sua aplicação e você deverá ver o formulário para criar um place e excluir places mais antigos.
Comentários de Place
Assim como nós criamos um recurso “place” e os associamos com users, nós podemos criar um recurso de “comment” e associá-lo com places e seu autor.
Instrutor(a): mostre que o scaffold atualizou os arquivos de rotas do Rails com uma regra para o recurso de Review
##Associação de Recursos
Passo 1. Adicione Associação de 1-para-muitos
Abra app/models/place.rb
e depois da linha
adicione
Abra app/models/comment.rb
e após
adicione a linha
Passo 2: Renderize as views
Abra app/views/comments/_form.html
e substitua
com a linha
então, substitua
com a linha
Abra app/views/places/show.html.erb
e antes últimos links adicione
Em app/controllers/places_controller.rb
adicione para ter a ação de mostrar após a linha
este
Passo 3: Colocar Permissões para editar/deletar
Permita que apenas o criador do comment (comentário) possa editar/deletar um comentário.
Abra app/views/places/show.html.erb
e substitua
com
Recurso de Validação de Campos
No momento, commets, places e users são caracterizados por informações que nunca são validadas por sua retificação. Ainda assim, por exemplo, deve haver um limite na tamanho dos comments no review ou no formato do endereço de e-mail de um usuário.
Então vamos adicionar uma restrição sobre o tamanho do corpo do campo de comentário (vamos usar a palavra ‘validates’)
Abra app/models/comment.rb
e entre ‘class’ e ‘end’:
Ajuste as rotas
Se você tentar abrir http://localhost:3000 ainda mostrará a página “Bem-vindo a bordo”. Vamos fazer ela redirecionar para a página de places.
Abra config/routes.rb
e após a primeira linha adicione
Teste a alteração abrindo o caminho raiz (que é, http://localhost:3000/) no seu navegador.
Instrutor(a): Fale sobre as rotas, e inclua detalhes sobre as rotas e sua relação com arquivos estáticos.
Usuários do Rails 3: Você precisará deletar o index.html da pasta /public/
para que funcione corretamente.
Outros Guias
- Handy cheatsheet for Ruby, Rails, console etc.
- Guia 1: Tutorial de Instalação para Rails Girls
- Guia 2: Tutorial para criação da app Rails Girls
- Guia 3: Como enviar para o GitHub
- Guia 4: Colocando seu app online em…
- Guia 5: Funcionalidades de uma área de comentários para a app Rails Girls
- Guia 6: Adicione design à sua aplicação com HTML e CSS
- Guia 7: Thumbnails em listas de ideas
- Guia 8: Autenticação (para usuários) com Devise
- Guia 9: Adicionando Gravatar para a aplicação
- Guia 10: Melhorando seu design da sua aplicação com HTML e CSS
- Guia 11: Continuous Deployment
- Guia 12: Construindo um aplicativo de votação em Sinatra
- Guia 13: Construa um diário em Ruby on Rails
- Guia 14: Adicione back-end ao seu aplicativo (páginas de administração)
- Guia 15: Acesse explicações adicionais do app Rails Girls