volt taller

51
CREA TU PRIMERA APLICACIÓN WEB CON VOLT!! / José Añasco @merongivian

Upload: jose-anasco

Post on 13-Apr-2017

162 views

Category:

Engineering


1 download

TRANSCRIPT

Page 1: Volt taller

CREA TU PRIMERAAPLICACIÓN WEB

CON VOLT!! / José Añasco @merongivian

Page 2: Volt taller

DESARROLLO BACK END

Page 3: Volt taller

SOLUCIÓN: RAILS

Page 4: Volt taller

POR QUE?Convenciones sobre configuracionesDesarrollo interactivoScaffoldingActive RecordMVC

Page 5: Volt taller

DESARROLLO FRONT END

Page 6: Volt taller

SOLUCIÓN: ...

etc...

Page 7: Volt taller
Page 8: Volt taller

POR QUE?Single Page Applications

Page 9: Volt taller

PROBLEMA: (FRONT-END +BACK-END)

Duplicación de lógicaDistintos LenguajesComplejidad

Page 10: Volt taller

SOLUCIÓN:Único lenguaje: necesariamente javascriptÚnico framework

?

Page 11: Volt taller

CONOCE A VOLT

Page 12: Volt taller

VOLTRuby web framework (servidor y cliente)Compila ruby a javascript (Opal)Actualización de datos en DOM (programación reactiva)

Page 13: Volt taller

CONCEPTOS VOLT

Page 14: Volt taller

MVC VS MVVM

Page 15: Volt taller

MVC VS MVVM

Page 16: Volt taller

COLECCIONESstore, page, params, Operaciones en DB

Variables underscore

...

# Railsrails > User.new name: "juan"# Voltvolt > store.users.create name: "jose"

volt > juan = store.users.create(name: "juan", estado_civil: "soltero").valuevolt > juan._estado_civil= > "soltero"

Page 17: Volt taller

Manejo de Éxito/Error con promises

volt > juan = store.users.first=> Promise..volt > juan.value=> User...

store.users.where(name: 'juan').first.then do # exitoend.fail do # falloend

Page 18: Volt taller

BINDINGSBinding Each

Bindings de Atributos

Bindings de Eventos

{{ _items.each do |item| }} <p>{{ item }}</p>{{ end }}

<input type="text" value="{{ _name }}"> .

<button e-click="alert">Alert Me</button>

Page 19: Volt taller

WORKSHOPVamos a crear un Chat

...Pero primero copiemos el repositorio

Page 20: Volt taller
Page 21: Volt taller

LEVANTAR APLICACIÓNComandos consola

Instalar gemas

$ bundle install

Crear usuario en consola

$ bundle exec volt consolevolt > jose = { name: "jose", email: "[email protected]", password: "password" }=> {:name=>"jose", :email=>"[email protected]", :password=>"password"}volt > store.users << jose=> Promise ...volt > store.users.all

Correr Aplicación e ingresar al url localhost:3000

$ bundle exec volt server

Page 22: Volt taller

....Si la app tarda en arrancar usar flag NO_FORKING

$ NO_FORKING=true bundle exec volt server

Page 23: Volt taller

Volt incluye autenticación y boostrap por defecto

y Documentación usuarios componentes

Page 24: Volt taller

CHATFEATURES:

Mensajes entre múltiples usuariosValidar longitud mínima de mensajesMúltiples Chats

Page 25: Volt taller

FEATURE 0: MENSAJES

Page 26: Volt taller

MODELO MESSAGECrear modelo con generador

$ bundle exec volt generate model message

Añadir campo body y atar mensajes a usuarios por medio depermisos

class Message < Volt::Model own_by_user

field :body, Stringend

Page 27: Volt taller

VISTA CHATCrear ruta en archivo route.rb

client '/chat', action: 'chat'

Crear vista chat.html dentro la carpeta main de vistas (cargadospor medio de )tags

<:Title> Chat

<:Body> <h1>Chat</h1>

Añadir link en main.html

<:Body> <div class="container"> <div class="header"> <ul class="nav nav-pills pull-right"> . <:nav href="/chat">Chat<!--:nav--> </ul> </div> </div>

Page 28: Volt taller

Añadir acción chat en controlador main

module Main class MainController < Volt::ModelController .. def chat # codigo end .. endend

Page 29: Volt taller

Link para página nueva activada en menú de navegador

Page 30: Volt taller

FORMULARIO DE MENSAJESCrear formulario con en chat.htmlbindings de eventos

<:Body> ... <form e-submit="send_message"> <label>Message</label> <input type="text" class="form-control" value="{{ page._message_body }}"> </form>

A continuación mostrar todos los mensajes guardados con susrespectivos usuarios

<:Body> form... . . {{ store.messages.reverse.each do |message| }} <div> <strong>{{ message.user.name }} :</strong> <span>{{ message.body }}</span> </div> {{ end }}

Page 31: Volt taller

MÉTODOS DE CONTROLADORImplementar reset_message y usarlo al ejecutar la acción chat

module Main class MainController < Volt::ModelController . def chat reset_message end

private

def reset_message page._message_body = '' end . endend

A continuación implementar send_message

def send_message store.messages.create(body: page._message_body) reset_messageend

Page 32: Volt taller

PERMISO DE ACCESOAnadir para permitir acceso al chat solo a usuarios

logeadosbefore_action

module Main class MainController < Volt::ModelController before_action :require_login, only: :chat . .

Page 33: Volt taller

CHECKPOINT 0

Page 34: Volt taller

mensajes se actualizan automáticamente

Page 35: Volt taller

Mensajes entre múltiples Usuarios

Page 36: Volt taller

MESSAGE TAGCrear tag message con el código que contiene el nombre del

usuario y el mensaje

<:Body> ...<:Message> <div> <strong>{{ attrs.user }} :</strong> <span>{{ attrs.message }}</span> </div>

Usar tag en el bloque each

<:Body> ... {{ current_chat.messages.reverse.each do |message| }} <:message user="{{ message.user.name }}" message="{{ message.body }}" /> {{ end }}

<:Message> ...

Correr tests

Page 37: Volt taller

FEATURE 1: VALIDAR MENSAJES

Page 38: Volt taller

CAPTURA DE ERRORESAñadir validación de longitud para el campo body

class Message < Volt::Model . . validate :body, length: 2end

Crear bloques de éxito y fallo al momento de crear el mensaje

private

def send_message current_chat.messages.create(body: page._message_body) .then { reset_message } .fail do |errors| # manejo de error endend

Page 39: Volt taller

MENSAJES DE ERROREnviar todos los errores a la colección flash

private

def send_message current_chat... ... .fail do |errors| errors.each { |k, v| flash._errors << "#{k}: #{v}" } endend

Page 40: Volt taller

CHECKPOINT 1

Page 41: Volt taller

errores por medio de notificaciones bootstrap

Page 42: Volt taller

FEATURE 2: MÚLTIPLES CHATS

Page 43: Volt taller

MODELO CHAT CON MÚLTIPLES MENSAJESCrear modelo chat

$ bundle exec volt generate model chat

Relacionar con message

class Chat < Volt::Model has_many :messagesend

Relacionar modelo message con chat

class Message < Volt::Model ...

belongs_to :chat

... field :chat_id ...end

Page 44: Volt taller

LISTA DE CHATSListar chats con links que guarden el indice actual en params

<:Body> {{ store.chats.each_with_index do |chat, index| }} <div> {{ chat._name }} | <a e-click="params._index = index">Join chat</a> </div> {{ end }}

Cambiar store por el chat a escoger: current_chat

{{ current_chat.messages.reverse.each do |message| }} <:message user="{{ message.user.name }}" message="{{ message.body }}" />{{ end }}

Page 45: Volt taller

CURRENT CHATEscoger el chat por medio de params._index

module Main class MainController < Volt::ModelController...private...def current_chat current_index = (params._index || 0).to_i store.chats[current_index]end

Guardar el mensaje en el chat escogido

...private...def send_message current_chat.messages.create(body: page._message_body) ......

Page 46: Volt taller

Crear nuevos chats en consola

volt > store.chats.create(name: 'funny chat')... store.chats.create(name: 'cool chat')

Page 47: Volt taller

mensajes filtrados por chat

Page 48: Volt taller

LINKS PARA CHATSRemover links de chat.htmlCrear links con en indexurl_with

<:Title> Home

<:Body> <h1>Home</h1>

{{ store.chats.each_with_index do |chat, index| }} <div class="chat-link"> {{ chat._name }} | <a href="{{ url_with(action: 'chat', index: index) }}">Join chat</a> </div> {{ end }}

Page 49: Volt taller

CHECKPOINT 2

Page 50: Volt taller

QUE FALTA?Soporte para bases de datos SQLhas_many through & polymorphic queries

Page 51: Volt taller

GRACIAS :)