
Introdução 🙂
Criar Apps se tornou uma tarefa fácil através do uso de alguns frameworks como o Ionic 2 e o Rails 5 (para a criação da API que vai alimentar o APP). Então nesse tutorial nós vamos criar uma pequena API RAILS 5 e um App Ionic 2 que juntos vão permitir que um usuário tire uma foto e compartilhe com pessoas aleatórias do mundo através do seu mobile.
O que vamos aprender
- Como criar uma API com Rails 5
- Como receber imagens base 64 na sua API
- Como armazenar nossas imagens no cloudinary
- Como subir nossa API para o Heroku
- Como criar um APP com Ionic 2
- Como tirar fotos com seu APP
- Como criar um provider para conversar com uma API no seu APP
- Como usar o Ionic View
- Como juntar tudo isso 🙂
Ingredientes
- Ruby 2.3.1
- Rails 5
- PostgreSQL
- Ionic 2
- Condova (Para usar a câmera do mobile)
- Cloudinary (cloud para imagens e vídeos)
- Heroku (Hospedagem para nosso APP)
- Carrierwave (Gem para fazer uploads de imagens)
- Carrierwave base64 (Para aceitar imagens no formato base64)
- Ionic View (para visualizar nosso APP)
Objetivos
Criar um APP onde você possa tirar uma foto do seu mobile e que ela seja adicionada à página principal com a lista das últimas 21 imagens compartilhadas anonimamente por usuários aleatórios.
Nosso APP final vai ter essa aparência:
Passo a Passo
Rails 5
- Criar o Projeto Rails 5
- Gerar o scaffold
- Instalar o cloudinary
- Subir nosso App para o heroku
Ionic 2
- Criar nosso projeto Ionic 2
- Criar a estrutura do nosso projeto
- Conectar o projeto com a API
- Subir o Projeto para o Ionic View
- Testar nosso APP
Mãos à Obra \o/
Parte 1 – Criando a API
Agora vamos criar nossa API para receber as imagens e depois devolver as 20 últimas fotos para o usuário.
-
-
- Gere o projeto (vamos usar postgreSQL para poder subir no heroku free)
1rails new randomPic --api --database=postgresql - Entre no projeto
1cd randomPic - Inclua as Gems que vamos usar para subir a foto no seu Gemfile:
123gem 'carrierwave'gem 'carrierwave-base64'gem 'cloudinary' - Rode o bundle para instalar as Gems:
1bundle - Configure seu arquivo ‘config/database.yml’ com as credenciais para acessar o seu banco postgreSQL instalado na sua máquina. (Caso você não saiba como instalar o postgreSQL, veja aqui https://www.digitalocean.com/community/tutorials/how-to-setup-ruby-on-rails-with-postgres)
- Agora vamos criar nosso scaffold (ele vai gerar algumas actions a mais além de create e index que vamos usar, mas você pode removê-las)
1rails g scaffold pic photo:string - Vamos criar nosso uploader do carrierwave
1rails generate uploader Photo - Agora precisamos configurar nosso upload para que ele use o cloudinary para subir nossas fotos para a nuvem (porque o heroku não permite guardar fotos na máquina 🙁 ), no seu arquivo ‘app/uploaders/photo_uploader.rb’ substitua o conteúdo por:
1234567class PhotoUploader < CarrierWave::Uploader::Base include Cloudinary::CarrierWave process :convert => 'png'version :standard doprocess :resize_to_fill => [100, 150, :north]endend - Agora vamos criar nossas credenciais no site do cloudinary para podermos usar o serviço deles, primeiro visite: http://cloudinary.com/
https://onebitcode.com/free-online-dating-site-in-usa-without-payment/ - Crie uma conta no cloudinary:
speed dating fort myers florida - Pegue suas credenciais no dashboard na seção Account Details clicando do lado direito em cima no botão Download YML, ele vai baixar um arquivo chamado cloudinary.yml, coloque esse arquivo na pasta ‘config’ do seu projeto:
married dating sites - Agora inclua o nosso uploader no model Pic em ‘app/models/pic’ substituindo o conteúdo por:
123class Pic < ApplicationRecordmount_base64_uploader :photo, PhotoUploaderend - Vamos criar nosso banco de dados
1rake db:create - E agora vamos rodar as migrations parar criar nossa tabela nele:
1rake db:migrate - Vamos alterar nosso controller para que devolva apenas as últimas 20 fotos, no arquivo ‘app/controller/pic_controller.rb’ substitua a linha ‘@pics = Pic.all’ na action index por:
1@pics = Pic.all.limit(20).reverse - No controller PicController remova as actions show, destroy e update e o set_pic. Vamos usar apenas index e create :), no final seu controller deve ficar assim:
123456789101112131415161718192021class PicsController < ApplicationController# GET /picsdef index@pics = Pic.all.limit(20).reverserender json: @picsend# POST /picsdef create@pic = Pic.new(pic_params)if @pic.saverender json: @pic, status: :created, location: @picelserender json: @pic.errors, status: :unprocessable_entityendendprivate# Only allow a trusted parameter "white list" through.def pic_paramsparams.require(:pic).permit(:photo)endend - Agora vamos configurar o CORS (*best free dating sites for plus size women in 2019) para que nosso APP possa receber chamada de outros domínios, primeiro no seu Gemfile adicione:
1gem 'rack-cors - Rode o bundle, para instalar a Gem:
1bundle - Agora no arquivo config/application.rb, substitua o conteúdo por:
1234567891011121314151617181920212223242526272829require_relative 'boot'require "rails"# Pick the frameworks you want:require "active_model/railtie"require "active_job/railtie"require "active_record/railtie"require "action_controller/railtie"require "action_mailer/railtie"require "action_view/railtie"require "action_cable/engine"# require "sprockets/railtie"require "rails/test_unit/railtie"# Require the gems listed in Gemfile, including any gems# you've limited to :test, :development, or :production.Bundler.require(*Rails.groups)module RandomPicclass Application < Rails::Applicationconfig.middleware.insert_before 0, Rack::Cors doallow doorigins '*'resource '*', :headers => :any, :methods => [:get, :post, :options, :create]endendconfig.api_only = trueendend - Por último vamos subir nosso App para o heroku, vamos lá:
a – Visite no seu browser: free dating site for big women onlyb – Crie uma conta caso você não possua.
c – Instale o heroku cli caso você não possua e faça o login (Para aprender a instalar acesse https://devcenter.heroku.com/articles/heroku-cli)
d – Agora precisamos instalar o git no nosso repositório e fazer o commit das nossas mudanças, rode:
1git init
depois rode:
1git add .
depois rode:
1git commit -m 'App v1'
e – Para criar nosso projeto no heroku rode:
1heroku create
f – Finalmente suba seu app rodando:
1git push heroku master
g – Agora rode as migrations do seu projeto:
1heroku run rake db:migrate - \o/ Pronto nossa pequena e simples API está pronta para receber novas fotos e devolver uma lista com as últimas 20.
- Gere o projeto (vamos usar postgreSQL para poder subir no heroku free)
-
Parte 2 – Criando nosso App Ionic
-
- Vamos começar instalando as dependências, para instalar o npm no seu sistema linux rode no console:
1sudo apt-get install npm
Ou caso você esteja no Mac, rode:
1brew install node - Agora para instalar o ionic e o cordova, rode no seu console:
1sudo npm install -g ionic cordova --allow-root - Agora vamos gerar nosso APP, rode no console:
1ionic start randomPicCli blank --v2 --ts - Entre no projeto:
1cd randomPicCli - Inclua a plataforma android no seu projeto (ou ios usando ios ao invés de android):
1ionic platform add android - Agora instale o plugin de acesso a câmera do cordova:
1ionic plugin add cordova-plugin-camera - Agora vamos configurar o nosso home.ts para submeter a foto quando o usuário tirar uma novo foto e também para que ele chame nosso service que vai carregar nossa lista com 20 fotos aleatórias. No seu arquivo ‘src/pages/home.ts’ substitua o conteúdo por: (Leia com calma os comentários no código)
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960import { Component } from '@angular/core';import {Camera} from 'ionic-native';// Carregando nosso service que vai se comunicar com a APIimport {HomeService} from '../../providers/home-service';@Component({selector: 'page-home',templateUrl: 'home.html',providers: [HomeService]})export class HomePage {// Cricando nossa variavel que vai armazenar as fotospublic photos: any;constructor(public homeService: HomeService) {// Chama a listagem de fotos quando a página é carregadathis.loadHome();}// Chama o service para montar a listagem de fotosloadHome(){console.log('hey');this.homeService.load().then(data => {console.log(data);this.photos = data;});}// Chama o service para adicionar uma nova fotoaddPhotoHome(photo){console.log('hey 2');this.homeService.addPhoto(photo).then(data => {this.loadHome();});}doRefresh(refresher){setTimeout(() => {this.loadHome();refresher.complete();}, 2000);}// Abre o serviço de fotos e depois chama o service para passar a foto que tiramos para a APItakePicture(){Camera.getPicture({destinationType: Camera.DestinationType.DATA_URL,targetWidth: 1000,targetHeight: 1000}).then((imageData) => {this.addPhotoHome("data:image/jpeg;base64," + imageData);}, (err) => {console.log(err);});}} - Pronto, agora vamos criar a interface que o usuário vai ver quando acessar nosso APP, no arquivo ‘src/pages/home/home.html’ substitua o conteúdo por:
123<button></button>1 - Agora é hora de criamos nosso provider, no console rode:
1ionic g provider HomeService
- Para permitir que ele se comunique com a nossa API substitua o conteúdo de ‘src/providers/home-services.ts’ pelo código abaixo e depois substitua a frase ‘YOU_API_URL’ pela url para sua API no heroku que criamos anteriormente (ela pode ser encontrada no seu dashboard do heroku na parte de settings do seu APP):
123456789101112131415161718192021222324252627282930313233343536373839import { Injectable } from '@angular/core';import { Http } from '@angular/http';import 'rxjs/add/operator/map';@Injectable()export class HomeService {public data: any;public api_url: string;constructor(public http: Http) {this.api_url = 'YOUR_API_URL';}// Carrega a listagem de Fotosload() {return new Promise(resolve => {this.http.get(this.api_url + '/pics').map(res => res.json()).subscribe(data => {this.data = data;resolve(this.data);});});}// Adiciona novas fotosaddPhoto(photo) {return new Promise(resolve => {this.http.post(this.api_url + '/pics', {'pic': {'photo': photo}}).map(res => res.json()).subscribe(data => {this.data = data.results;resolve(this.data);});});}}
- Vamos fazer o build do nosso App para depois podermos testá-lo no device. No console rode:
1ionic build
- Agora nós já estamos prontos para subir nosso projeto para o Ionic View para testar. O Ionic View é um APP que pode ser instalado no android e no ios e que vai nos ajudar a simular o uso do nosso App.
a – No seu browser visite https://apps.ionic.io/signup e crie uma conta:
b – Agora vamos subir o APP, rode no console:1ionic uploadc – Isso vai abrir um prompt perguntando seu user e password que foi criado no site do Ionic View, depois disso seu APP vai ser criado e vai subir.
d – Agora baixe o APP do Ionic View para seu mobile, http://view.ionic.io/.
e – Se logue no app, você deve ser capaz de ver o app que você acabou de subir na lista.
f – Clique nele para visualizar o que acabamos de fazer. - \o/ Pronto, seu app está pronto e conversando com a API.
- Agora você pode tirar algumas fotos e ver que elas são adicionadas à linha do tempo. Caso você queria mostrar aos seus amigos (sem efetivamente ter que gerar o APP) basta que eles instalem o ionic view e coloquem o id do seu APP que pode ser encontrado em .io-config.json.
CONCLUSÃO
Conseguimos criar nosso APP Ionic 2 + API Rails 5 \o/.
O Ionic é realmente incrível e faz parecer muito simples a criação de um APP mobile.
Caso você queira você pode gerar seu APP para a plataforma android e ios e depois subir na play store ou na loja da apple. Se você quiser saber mais sobre o Ionic de uma olhada na documentação oficial clicando aqui: http://ionic.io/2.No início de 2017 eu vou lançar um mini curso de ionic 2 + Rails 5 ensinando como clonar um APP como o instagram. Caso você goste desta ideia comenta aí em baixo para eu saber e se cadastre na newsletter do Blog para que você seja avisado quando isso acontecer
Como de costume o Código completo da aplicação está no Github, caso você queria clonar o código, clique aqui para ver a parte do Ionic 2 e clique aqui para acessar a parte do Rails 5. Aproveita e me segue lá \o/
Se você ficou com dúvidas ou tem sugestões de posts para o Blog comenta aí em baixo ou me adiciona no Facebook clicando aqui.
Muito Obrigado,
Sua presença aqui é uma honra para mim,
Leonardo Scorza 🙂
- Vamos começar instalando as dependências, para instalar o npm no seu sistema linux rode no console: