Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Angular On Cuba

jgnatch
October 28, 2014

Angular On Cuba

October 23rd - Ruby Conf Argentina 2014 @ The Ruby Fun Day.

This presentation shows how to create a dynamic web application using the ruby microframework called Cuba to create a REST API and AngularJS to build the frontend.

Check out the app and the expamples at this repo:
https://github.com/jgnatch/angular-on-cuba

Follow us at:
Esteban Pastorino
http://twitter.com/kitopastorino
http://github.com/kitop

Ignacio Gutierrez
http://twitter.com/jgnatch
http://github.com/jgnatch

jgnatch

October 28, 2014
Tweet

Other Decks in Technology

Transcript

  1. Antes de empezar • git clone https://github.com/jgnatch/angular-on-cuba • cd angular-on-cuba

    • dep install / bundle install • http://www.getpostman.com/ => Download (Chrome) • redis-server • brew install redis / apt-get install redis-server
  2. API

  3. • cd ejemplos/cuba/api • shotgun • Abrir Postman • Importar

    ejemplos/cuba/api/postman.json INICIAR SERVER
  4. REST ROUTES GET /articles Listar los miembros de la colección.

    POST /articles Crear una nueva entrada en la colección. GET /articles/:id Obtener un miembro de la colección. PUT /articles/:id Actualizar un miembro de la colección. DELETE /articles/:id Eliminar un miembro de la colección.
  5. JSON { "id": 1, "title": "Título", "created_at": "2014-10-24T13:45:06-03:00", "published": false,

    "published_at": null, "author": { "name": "Pepe" }, "comments": [ ... ] } JavaScript Object Notation
  6. Escribir JSON require "json" JSON.dump({ foo: "bar" }) # =>

    "{\"foo\":\"bar\"}" Correr este ejemplo en irb
  7. Escribir JSON EN CUba class App < Cuba def json(object)

    res.headers.merge! "Content-Type" => "application/json" res.write JSON.dump(object) end define do on get do json({ foo: "bar" }) end end end
  8. PARSEAR JSON EN CUBA Tenemos un atajo: rack-parser En app.rb:

    require 'rack/parser' Cuba.use Rack::Parser
  9. rack/parseR POST /articles Content-Type: application/json { title: "Foo", content: "Lorem

    Ipsum" } HTTP Request on post, "articles" do req.params["title"] #=> Foo req["content"] #=> "Lorem Ipsum" end Cuba Ver https://github.com/achiu/rack-parser
  10. Modelo • Title [String] • Body [String] • Tags [Array]

    • published [Boolean] • published_at [Timestamp] • created_at [Timestamp] • updated_at [Timestamp] Abrir este ejemplo en el repo en ejemplos/cuba/api/models/article.rb Article
  11. Modelo a JSON require "ohm/json" class Article … def to_hash

    super.merge title: title, body: body, … end end Abrir este ejemplo en el repo en ejemplos/cuba/api/models/article.rb
  12. class Api < Cuba define do on 'articles' do …

    end end end Abrir este ejemplo en el repo en ejemplos/cuba/api/routes/api.rb Rutas API
  13. on root do # GET /articles on get do json

    Article.all.sort_by(:created_at, order: "DESC") end end Abrir este ejemplo en el repo en ejemplos/cuba/api/routes/api.rb Rutas API
  14. on root do # POST /articles on post do params

    = slice(req.params, :title, :body, :tags, :published) article = Article.create params json article, status: 201 end end Abrir este ejemplo en el repo en ejemplos/cuba/api/routes/api.rb Rutas API
  15. on ":id" do |id| article = Article[id] # GET /articles/:id

    on get, root do json article end end Abrir este ejemplo en el repo en ejemplos/cuba/api/routes/api.rb Rutas API
  16. on ":id" do |id| article = Article[id] # PUT /articles/:id

    on put, root do params = slice(req.params, :title, :body, :tags, :published) article.update params json article end end Abrir este ejemplo en el repo en ejemplos/cuba/api/routes/api.rb Rutas API
  17. on ":id" do |id| article = Article[id] # DELETE /articles/:id

    on delete, root do article.delete res.status = 204 end end Abrir este ejemplo en el repo en ejemplos/cuba/api/routes/api.rb Rutas API
  18. sPA Single Page Applications Todo el HTML, JS, y CSS

    necesario es cargado en el primer page load JS HTML CSS
  19. MVC Model View Controller X View Representación de la data

    Model Data de la aplicación Controller Mediador entre la vista y el modelo
  20. Two way data binding <!doctype html> <html ng-app> <head> <script

    src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0-rc.4/ angular.min.js"></script> </head> <body> <div> <label>Nombre:</label> <input type="text" ng-model="tuNombre" placeholder="Escribir un nombre aqui"> <hr> <h1>Hola {{tuNombre}}!</h1> <hr> <button ng-click="tuNombre = 'Robertito' ">Cambiar mi nombre a Robertito</ button> </div> </body> </html> Abrir este ejemplo en el repo en ejemplos/angular/1-data-binding/index.html
  21. modulos • Las aplicaciones angular se dividen en módulos. •

    Un módulo puede contener el código principal de la aplicación o una librería (directives, factories, etc). • Un módulo puede tener dependencias
  22. modulos angular.module("myApp", []) Definir un módulo: var app = angular.module("myApp")

    Getter: angular.module("myApp").controller("myController", function() { ... }) Para definir un componente en un módulo usar chaining:
  23. dependency injection var app = angular.module('myBlog', []); Aplicación sin ninguna

    dependencia Aplicación con dependencia del módulo para el routing de URL Aplicación con varias dependencias var app = angular.module('myBlog', ['ngRoute']); var app = angular.module('myBlog', ['ngAnimate', 'ui.router', 'ngResource']);
  24. dependency injection var app = angular.module('myBlog', []); Aplicación sin ninguna

    dependencia var app = angular.module('myBlog', ['ngRoute']); Aplicación con dependencia del módulo para el routing de URL var app = angular.module('myBlog', ['ngAnimate', 'ui.router', 'ngResource']); Aplicación con varias dependencias angular .module('myBlog') .controller('AdminArticlesEditController', ['$scope', '$state', '$stateParams', 'Article', function($scope, $state, $stateParams, Article) { ... }]); Controller con dependencias Las dependencias se declaran de la misma manera para controllers, directivas, servicios, etc.
  25. controller function MainCtrl ($scope) { $scope.myName = "Jorgelino"; } angular

    .module('app', []) .controller('MainCtrl', MainCtrl); Con un solo item <div ng-controller="MainCtrl"> <h1>{{myName}}</h1> </div> JS HTML Abrir este ejemplo en el repo en ejemplos/angular/2-controllers/ejemplo-1/index.html
  26. multiples controllers <div ng-controller="MainCtrl as main"> {{ main.title }} <div

    ng-controller="AnotherCtrl as another"> {{ another.title }} <div ng-controller="YetAnotherCtrl as yet"> {{ yet.title }} </div> </div> </div> ControllerAs
  27. HTML nueva sintaxis function MainCtrl () { this.myName = "Jorgelino";

    } angular .module('app', []) .controller('MainCtrl', MainCtrl); ControllerAs <div ng-controller="MainCtrl as main"> <h1>{{main.myName}}</h1> </div> JS
  28. JS controller function MainCtrl(){ this.names = [ "juancho", "Pepe", "Cacho",

    "Josefo" ] var that = this; this.removeName = function (index) { that.names.splice(index, 1) } } Con un varios items y una función <div ng-controller="MainCtrl as main"> <ul> <li ng-repeat="name in main.names"> {{ name }} <a ng-click="main.removeName($index)">Borrar</a> </li> </ul> </div> HTML Abrir este ejemplo en el repo en ejemplos/angular/2-controllers/ejemplo-2/index.html
  29. built in directives Events • ng-click / ng-submit • ng-focus

    / ng-blur • ng-cut / ng-copy / ng-paste Control • ng-repeat • ng-if / ng-switch CSS • ng-class / ng-style • ng-show / ng-hide • ng-class-even / ng-class-odd Forms • form / input / select / textarea • ng-model • ng-selected / ng-checked • ng-required / ng-disabled
  30. built in directives <div ng-controller="IndexCtrl as index"> <ul> <li ng-repeat="article

    in index.articles"> {{ article.title }} </li> </ul> </div> Abrir este ejemplo en el repo en ejemplos/angular/3-directives/ng-repeat/index.html ngRepeat
  31. built in directives <div ng-controller="IndexCtrl as index"> <ul> <li ng-show="article.published"

    ng-repeat="article in index.articles" > {{ article.title }} </li> </ul> </div> Abrir este ejemplo en el repo en ejemplos/angular/3-directives/ng-show/index.html ngShow
  32. built in directives <div ng-controller="IndexCtrl as index"> <h1>Published Articles</h1> <ul>

    <li ng-show="article.published" ng-repeat="article in index.articles"> {{ article.title }} <button href="" ng-click=" article.published = !article.published ">Undo Publish</button> </li> </ul> <h1>Draft Articles</h1> <ul> <li ng-hide="article.published" ng-repeat="article in index.articles"> {{ article.title }} <button ng-click=" article.published = !article.published ">Publish</button> </li> </ul> </div> Abrir este ejemplo en el repo en ejemplos/angular/3-directives/ng-click/index.html ngClick
  33. built in filters <label>Search:</label> <input ng-model="search" placeholder="Search Articles" /> <h1>Published

    Articles</h1> <ul> <li ng-show="article.published" ng-repeat="article in index.articles | filter : search "> {{ article.title }} <button ng-click=" article.published = !article.published ">Undo Publish</button> </li> </ul> Abrir este ejemplo en el repo en ejemplos/angular/4-filters/date/index.html Filter
  34. built in filters <ul> <li ng-show="article.published" ng-repeat="article in index.articles"> {{

    article.title }} <br/> <strong>{{ article.published_at | date:'medium' }}</strong> ... </li> </ul> Abrir este ejemplo en el repo en ejemplos/angular/4-filters/date/index.html Date
  35. built in filters <ul> <li ng-repeat="article in index.articles | limitTo:

    3" ng-show="article.published"> {{ article.title }} <br/> <strong>{{ article.published_at | date:'medium' }}</strong> ... </li> </ul> Abrir este ejemplo en el repo en ejemplos/angular/4-filters/date/index.html limitTo