SlideShare una empresa de Scribd logo
1 de 24
Ruby On Rails Workshop - 21/10/2009
Table of Contents
De que se trata la aplicación.......................................................................................................................1
Creando la aplicación Rails........................................................................................................................1
Ejecutando la aplicación............................................................................................................................4
Utilizando el Scaffold................................................................................................................................6
Migrando la base de datos..........................................................................................................................8
Agregando validaciones...........................................................................................................................10
Agregando relaciones entre los modelos..................................................................................................12
Utilizando Nested Routes.........................................................................................................................14
Jugando con la consola............................................................................................................................14
Utilizando View Helpers..........................................................................................................................15
Agregando AJAX.....................................................................................................................................16
Utilizando RJS templates.........................................................................................................................20
Creando un custom helper........................................................................................................................21




De que se trata la aplicación
Para el workshop se eligió crear una aplicación de bloging. Se eligió este tipo de aplicación por ser algo
sencillo, de solo un par de modelos y pocas vistas. Además, ultimamente, en la mayoria de los nuevos
frameworks web se utiliza un ejemplo similar para crear la primera aplicación de ejemplo, algo asi
como el nuevo “Hello world”. La idea es hacer algo sencillo donde se puedan aplicar varios de los
conceptos básicos de rails como es scaffold, generators, helpers, custom helpers, templates, ajax,
validations, relationships, etc.
Basicamente el usuario final va a poder crear posts, editarlos y borrarlos asi como también se podrán
agregar comentarios a los posts.

Creando la aplicación Rails
File/new Project
Elegir
Categories : Ruby
Projects: Ruby on Rails application
Presionar “Next”.
Elegir las siguientes opciones:
Project Name: blog
Ruby Platform: Ruby 1.8.6
Presionar Next
Seleccionar:
Specify Database Information Directory
Database Adapter: sqlite3
Presionar Next
Seleccionar:
Rails Version: 2.3.4
Presionar Finish
Observar la ventana de output:




Ejecutando la aplicación
Abrir la vista “Projects”, darle botón derecho sobre la aplicación “blog” y elegir “run”
Observar la página de inicio de la aplicación:
Utilizando el Scaffold
Nuevamente abrir la vista “Projects”, presionar botón derecho y elegir la opción “Generate” .
Cargar las siguientes opciones:
Generator: scaffold
Model Name: post
Attribute Pairs:
       title:string body:text
Presionar “OK”
Observar la ventana de output de “Rails Generator”




También observar la migration creada, haciendo click directamente en el link que nos muestra la
ventana del output de “Rails Generator” o bien abrir el archivo desde la vista “Projects”.
Migrando la base de datos
En el punto anterior se creó una migration pero aún no se modificó nada en la base de datos. Asi que
para esto se debe migrar a la última versión. Esto se hace haciendo botón derecho sobre la aplicación
en la vista “Projects” y elegir “Migrate Database” y luego “To current version”.
Observar el output de este comando.




En el navegador dirigirse a :
Agregando validaciones
Para validar que los Post que se crean sean “validos” se deberia de validar que el usuario especifique un
“title” y un “body” para el post.
Para eso se abre el modelo “post” dentro de la vista “Projects”.




y dentro de la clase escribir el texto:
validates
y presionar la convinación de teclas “CTRL+SPACE” para activar el autocomplete:
Se puede observar no solo las opciones de validaciones sinó también la ayuda y documentación de la
API de rails.
Seleccionar “validates_prescense_of” y especificar los campos “body” y “title”:
validates_presence_of :title, :body




Ahora probar de crear un post sin escribir alguno de los atributos anteriormente mencionados. Y
verificar el siguiente error:
Agregando relaciones entre los modelos
Por ahora solo existe el modelo “post”. Pero se puede agregar a la aplicación de blog la posibilidad de
escribir comentarios para cada post.
Para eso se va a crear el modelo “comment”. Ir a la vista “Projects” botón derecho sobre la aplicación,
“Generate” y en “Generator” elegir “model”. Presionar “OK”.
Luego migrar la base para que cree la tabla “comments”, botón derecho sobre la aplicación, elegir
“Migrate Database” y luego “to current version”.
Los “post” van a estar relacionados con los comments en la relación 1 a N.
Es decir “un post tiene muchos comments”.
Es decir, en inglés, “post has many comments”.
Es decir en Rails, se especifica dentro del modelo “post” con un “has_many :comments”.
Abrir el modelo post y escribir:
has_many :comments




y en el modelo “comments” escribir:
belongs_to :post
Utilizando Nested Routes
Para poder referenciar a los comentarios en forma de Recursos pertenencientes a Posts deberiamos
hacerlo a travez de una URL como la siguiente:
http://localhost:3000/posts/1/comments
Y para referirnos a un comentario en particular deberiamos hacerlo a travez de una URL como la
siguietne:
http://localhost:3000/posts/1/comments/1
Para esto debemos modificar las rutas. Las rutas están definidas en el archivo route.rb ubicado en la
carpeta config. O dentro de la vista “Projects” ir al proyecto y en “Configuration” abrir el archivo
“routes.rb” y agregarle a la definición de la ruta de post, lo siguiente:
map.resources :posts, :has_many => :comments




Jugando con la consola
Para ver los modelos en rails y jugar un poco con los modelos recién creados se puede abrir la consola
de rails y manipular los modelos directamente en la consola.
Para esto presionamos botón derecho sobre el proyecto y elegir “Rails console”.




Ahora creamos un Post nuevo desde la consola con la siguiente instrucción:
post1 = Post.create(:title => "desde la consola", :body => "el body desde la consola :P")
este devolverá el post creado seteandole automaticamente el timestampo en los campos “created_at” y
“updated_at”.
E inmediatamente se puede ver el post en la aplicación en el navegador. Eso es porque el server está
levantado usando el entorno de “Development” al igual que la consola. Por eso es que utilizan la misma
base de datos.




Volviendo a la consola, teniamos asignado en la variable “post1” el post recientemente creado, ahora
vamos a agregarle un comentario (también desde la consola).
Creamos un nuevo comentario y lo asignamos a una variable:
c1 = Comment.new
luego le seteamos el “body” a ese comentario.
c1.body = "este es el primer comentario del post"
y luego agregamos ese comentario al post1:
post1.comments << c1




Podemos verificar que cuando creamos el comment con la llamada a “.new” el comentario aún no tenia
asignado ningún id en la tabla. Al agregarlo al post automaticamente se guarda en la tabla el comentario
al mismo tiempo que la variable post_id se asigna con el id del post1. Eso es gracias a las relations que
especificamos anteriormente.



Utilizando View Helpers
Para mostrar los comentarios vamos a mostrarlos dentro de la vista “show” perteneciente a posts.
Para eso abrimos la vista show dentro de “Projects/views/posts/show.html.erb”.
Y agregamos al final del codigo de la vista lo siguiente:
<% content_tag(:div, :id => :comments ) do %>
 <% @post.comments.each do | comment | %>
  <% content_tag(:p) do %>
   <%= label_tag(:comment_body, comment.body) %>,
   <%= content_tag(:i, comment.created_at) %>
  <% end %>
 <% end %>
<% end %>
Se puede observar que se utilizaron algunos view helpers como “content_tag” y “label_tag”.




Generando un html como el siguiente:




Agregando AJAX
Para agregar los comentarios vamos a hacerlo a travez de ajax. Para eso vamos a agregar el formulario
de comments solamente en la vista “show” perteneciente a “posts”.
Primero y principal necesitamos que el template tenga las librerias necesarias para poder utilizar AJAX
en rails (librerias de Prototype y de Scriptaculous). Entonces abrimos el layout de posts
(“Projects/views/layouts/posts.html.erb”) y agregamos la siguiente instrucción en el head:
<%= javascript_include_tag :defaults %>
Ahora, abrir la vista show dentro de “Projects/views/posts/show.html.erb”.
Y agregar el siguiente formulario remoto al final de la vista:
<% remote_form_for([@post, Comment.new]) do |f| %>
 <%= content_tag(:strong, "Send your comment:") %>
 <% content_tag(:p) do %>
  <%= f.text_area :body %>
 <% end %>
 <%= submit_tag 'comment' %>
<% end %>
El formulario remoto está apuntando al controller “comments” que aún no hemos creado:




Asi que generamos el controller haciendo botón derecho sobre la aplicación “Generate”, elegimos en
“generator” elegimos “controller” y en “name” elegimos:
Comments
Y dentro del controller de Comments agregamos la acción “create”
def create
  post = Post.find(params[:post_id])
  @comment = Comment.new(params[:comment])
  post.comments << @comment
end




Si probamos de escribir algún comentario podemos notar un par de cosas.
Al presionar sobre el botón comment no notamos ninguna diferencia, pero si abrimos el log del
servidor (es una de las ventanas de OUTPUT, con el titulo de “Webrick for blog”) podemos ver que el
comentario se creó pero luego el controller lanzó un error al intentar encontrar un template para
renderizar esa acción:
Utilizando RJS templates.
Para crear el template de la acción create, presionamos botón derecho sobre la carpeta “comments”
dentro de “views”, luego “new” y luego “Empty RJS Template”.




Luego en Filename escribir “create” y presionar sobre “Finish”.
y ponerle el siguiente script:
page.insert_html(:bottom, :comments, content_tag(:p) do
   label_tag(:comment_body, @comment.body) + ', ' +
   content_tag(:i, @comment.created_at)
  end
)
page["comment_body"].value = ''




Creando un custom helper
Una de las prácticas de Ruby on Rails es la de DRY. En nuestro anterior ejemplo repetimos
exactamente el mismo codigo en 2 lugares diferentes. Y ya se vió en la parte teorica los beneficios de
tener todo DRY y no tener codigo duplicado.
Asi que para esto vamos a crear un Custom Helper que haga ese trabajo en 1 solo lado.
Para esto abrimos el helper “application_helper.rb” en la vista “Projects” dentro de la aplicación y
dentro de “Helpers” y agregamos el siguiente metodo.
module ApplicationHelper
 def get_comment_html(comment)
  content_tag(:p) do
    label_tag(:comment_body, comment.body) + ', ' +
    content_tag(:i, comment.created_at)
  end
 end
end




Y modificamos los templates “show.html.erb” y “create.rjs” para que queden asi respectivamente:
Ruby on Rails Workshop

Más contenido relacionado

La actualidad más candente

Tutorial de Windows Phone 7.1 Basico
Tutorial de Windows Phone 7.1 BasicoTutorial de Windows Phone 7.1 Basico
Tutorial de Windows Phone 7.1 BasicoCarola Velazquez
 
Creación de extensiones nativas
Creación de extensiones nativasCreación de extensiones nativas
Creación de extensiones nativasAngel Vazquez
 
UDA-Herramientas para contenido estático
UDA-Herramientas para contenido estáticoUDA-Herramientas para contenido estático
UDA-Herramientas para contenido estáticoAnder Martinez
 
Instituto tecnologico superior
Instituto tecnologico superiorInstituto tecnologico superior
Instituto tecnologico superiorFabricio Estrella
 
Herramientas para el desarrollo de aplicaciones SharePoint
Herramientas para el desarrollo de aplicaciones SharePointHerramientas para el desarrollo de aplicaciones SharePoint
Herramientas para el desarrollo de aplicaciones SharePointgoreorti
 
Investigacion para agregar una imagen a eclipse
Investigacion para agregar una imagen a eclipseInvestigacion para agregar una imagen a eclipse
Investigacion para agregar una imagen a eclipseLucero De La Cruz
 
Primeros pasos con Backbone js, por Xavier Aznar
Primeros pasos con Backbone js, por Xavier AznarPrimeros pasos con Backbone js, por Xavier Aznar
Primeros pasos con Backbone js, por Xavier AznarPablo Aguilera
 
Creando controles para Xamarin.Forms
Creando controles para Xamarin.FormsCreando controles para Xamarin.Forms
Creando controles para Xamarin.FormsJavier Suárez Ruiz
 
Curso Joomla 1.5 Parte 2
Curso Joomla 1.5  Parte 2Curso Joomla 1.5  Parte 2
Curso Joomla 1.5 Parte 2Antonio Durán
 
WSO2 BPS: Desarrollando un proceso de negocio con BPEL
WSO2 BPS: Desarrollando un proceso de negocio con BPELWSO2 BPS: Desarrollando un proceso de negocio con BPEL
WSO2 BPS: Desarrollando un proceso de negocio con BPELIsildurMaC
 

La actualidad más candente (19)

Tutorial de Windows Phone 7.1 Basico
Tutorial de Windows Phone 7.1 BasicoTutorial de Windows Phone 7.1 Basico
Tutorial de Windows Phone 7.1 Basico
 
Doctrine symfony
Doctrine symfonyDoctrine symfony
Doctrine symfony
 
Doctrine symfony
Doctrine symfonyDoctrine symfony
Doctrine symfony
 
Creación de extensiones nativas
Creación de extensiones nativasCreación de extensiones nativas
Creación de extensiones nativas
 
UDA-Herramientas para contenido estático
UDA-Herramientas para contenido estáticoUDA-Herramientas para contenido estático
UDA-Herramientas para contenido estático
 
Manual cms joomla
Manual cms joomlaManual cms joomla
Manual cms joomla
 
Instituto tecnologico superior
Instituto tecnologico superiorInstituto tecnologico superior
Instituto tecnologico superior
 
Herramientas para el desarrollo de aplicaciones SharePoint
Herramientas para el desarrollo de aplicaciones SharePointHerramientas para el desarrollo de aplicaciones SharePoint
Herramientas para el desarrollo de aplicaciones SharePoint
 
Cabde tutorial
Cabde tutorialCabde tutorial
Cabde tutorial
 
Ejercicio basico en asp.net LOZADA ERICK
Ejercicio basico en asp.net LOZADA ERICKEjercicio basico en asp.net LOZADA ERICK
Ejercicio basico en asp.net LOZADA ERICK
 
Tutorial eclipse
Tutorial eclipseTutorial eclipse
Tutorial eclipse
 
Investigacion para agregar una imagen a eclipse
Investigacion para agregar una imagen a eclipseInvestigacion para agregar una imagen a eclipse
Investigacion para agregar una imagen a eclipse
 
Primeros pasos con Backbone js, por Xavier Aznar
Primeros pasos con Backbone js, por Xavier AznarPrimeros pasos con Backbone js, por Xavier Aznar
Primeros pasos con Backbone js, por Xavier Aznar
 
Creando controles para Xamarin.Forms
Creando controles para Xamarin.FormsCreando controles para Xamarin.Forms
Creando controles para Xamarin.Forms
 
Curso Joomla 1.5 Parte 2
Curso Joomla 1.5  Parte 2Curso Joomla 1.5  Parte 2
Curso Joomla 1.5 Parte 2
 
P04
P04P04
P04
 
Mi app-asp-net-mvc2
Mi app-asp-net-mvc2Mi app-asp-net-mvc2
Mi app-asp-net-mvc2
 
Como Crear Un Blog
Como Crear Un BlogComo Crear Un Blog
Como Crear Un Blog
 
WSO2 BPS: Desarrollando un proceso de negocio con BPEL
WSO2 BPS: Desarrollando un proceso de negocio con BPELWSO2 BPS: Desarrollando un proceso de negocio con BPEL
WSO2 BPS: Desarrollando un proceso de negocio con BPEL
 

Destacado

How To Improve Lead Generation With Prospecting
How To Improve Lead Generation With Prospecting How To Improve Lead Generation With Prospecting
How To Improve Lead Generation With Prospecting Brian Carroll
 
Софтуерни инструменти в Амазон, които използвам
Софтуерни инструменти в Амазон, които използвамСофтуерни инструменти в Амазон, които използвам
Софтуерни инструменти в Амазон, които използвамМихаил Великов
 
Tarefa: Traballando cos diferentes tipos de contidos en Drupal
Tarefa: Traballando cos diferentes tipos de contidos en DrupalTarefa: Traballando cos diferentes tipos de contidos en Drupal
Tarefa: Traballando cos diferentes tipos de contidos en DrupalJuan Marcos Filgueira
 
Gurmeet Singh Resume
Gurmeet Singh ResumeGurmeet Singh Resume
Gurmeet Singh ResumeGurmeet Singh
 
Actividades de los animales
Actividades de los animalesActividades de los animales
Actividades de los animalesMaría Nuñez
 
Agile Open 2009 Tdd And Architecture Influences
Agile Open 2009   Tdd And Architecture InfluencesAgile Open 2009   Tdd And Architecture Influences
Agile Open 2009 Tdd And Architecture InfluencesGustavo Andres Brey
 
Metodologías Agiles - APIT - UTN FRBA
Metodologías Agiles - APIT - UTN FRBAMetodologías Agiles - APIT - UTN FRBA
Metodologías Agiles - APIT - UTN FRBAGustavo Andres Brey
 
¿Por qué contratar un equipo de limpieza ?
¿Por qué contratar un equipo de limpieza ?¿Por qué contratar un equipo de limpieza ?
¿Por qué contratar un equipo de limpieza ?LimpiezasExpress
 
Horizontal and vertical integration
Horizontal and vertical integrationHorizontal and vertical integration
Horizontal and vertical integrationromaine wedderburn
 
Styles and genres
Styles and genres Styles and genres
Styles and genres Aaron NAndra
 
Intracranial Calcification in Cone Beam CT & Medical CT
Intracranial Calcification in Cone Beam CT & Medical CTIntracranial Calcification in Cone Beam CT & Medical CT
Intracranial Calcification in Cone Beam CT & Medical CTJudy Oh, D.D.S.
 

Destacado (20)

How To Improve Lead Generation With Prospecting
How To Improve Lead Generation With Prospecting How To Improve Lead Generation With Prospecting
How To Improve Lead Generation With Prospecting
 
Lighting without a bulb - OLED_Massimo_Marrazzo
Lighting without a bulb - OLED_Massimo_MarrazzoLighting without a bulb - OLED_Massimo_Marrazzo
Lighting without a bulb - OLED_Massimo_Marrazzo
 
Helping our community
Helping our communityHelping our community
Helping our community
 
Софтуерни инструменти в Амазон, които използвам
Софтуерни инструменти в Амазон, които използвамСофтуерни инструменти в Амазон, които използвам
Софтуерни инструменти в Амазон, които използвам
 
Tarefa: Traballando cos diferentes tipos de contidos en Drupal
Tarefa: Traballando cos diferentes tipos de contidos en DrupalTarefa: Traballando cos diferentes tipos de contidos en Drupal
Tarefa: Traballando cos diferentes tipos de contidos en Drupal
 
A second a day
A second a dayA second a day
A second a day
 
Gurmeet Singh Resume
Gurmeet Singh ResumeGurmeet Singh Resume
Gurmeet Singh Resume
 
Actividades de los animales
Actividades de los animalesActividades de los animales
Actividades de los animales
 
Agile Open 2009 Tdd And Architecture Influences
Agile Open 2009   Tdd And Architecture InfluencesAgile Open 2009   Tdd And Architecture Influences
Agile Open 2009 Tdd And Architecture Influences
 
Metodologías Agiles - APIT - UTN FRBA
Metodologías Agiles - APIT - UTN FRBAMetodologías Agiles - APIT - UTN FRBA
Metodologías Agiles - APIT - UTN FRBA
 
Unit5 Task2
Unit5 Task2Unit5 Task2
Unit5 Task2
 
Foldable World
Foldable WorldFoldable World
Foldable World
 
Mi mano derecha al frente
Mi mano derecha al frenteMi mano derecha al frente
Mi mano derecha al frente
 
Prospettiva ZeroSei - Perspective from 0 to 6 vanishing points - Slideshare
Prospettiva ZeroSei  - Perspective from 0 to 6 vanishing points - SlideshareProspettiva ZeroSei  - Perspective from 0 to 6 vanishing points - Slideshare
Prospettiva ZeroSei - Perspective from 0 to 6 vanishing points - Slideshare
 
¿Por qué contratar un equipo de limpieza ?
¿Por qué contratar un equipo de limpieza ?¿Por qué contratar un equipo de limpieza ?
¿Por qué contratar un equipo de limpieza ?
 
The Legacy of inBloom
The Legacy of inBloomThe Legacy of inBloom
The Legacy of inBloom
 
Showcasing
ShowcasingShowcasing
Showcasing
 
Horizontal and vertical integration
Horizontal and vertical integrationHorizontal and vertical integration
Horizontal and vertical integration
 
Styles and genres
Styles and genres Styles and genres
Styles and genres
 
Intracranial Calcification in Cone Beam CT & Medical CT
Intracranial Calcification in Cone Beam CT & Medical CTIntracranial Calcification in Cone Beam CT & Medical CT
Intracranial Calcification in Cone Beam CT & Medical CT
 

Similar a Ruby on Rails Workshop

Empezando con Play y reactive mongo (Segundo meetup Scala Perú Dec 2015)
Empezando con Play y reactive mongo (Segundo meetup Scala Perú Dec 2015)Empezando con Play y reactive mongo (Segundo meetup Scala Perú Dec 2015)
Empezando con Play y reactive mongo (Segundo meetup Scala Perú Dec 2015)Marco Antonio Ordoñez Valverde
 
tutorial de eclipse
tutorial de eclipsetutorial de eclipse
tutorial de eclipseTania Tellez
 
Presentacion3 Webquest
Presentacion3 WebquestPresentacion3 Webquest
Presentacion3 Webquestdecroly moodle
 
Consumo de APIs usando el WSO2 API Manager
Consumo de APIs usando el WSO2 API ManagerConsumo de APIs usando el WSO2 API Manager
Consumo de APIs usando el WSO2 API ManagerIsildurMaC
 
Presentacion3 Webquest
Presentacion3 WebquestPresentacion3 Webquest
Presentacion3 Webquestdecroly moodle
 
Guia basica de ruby on rails
Guia basica de ruby on railsGuia basica de ruby on rails
Guia basica de ruby on railsroberthp09
 
Configurando Ambiente de Desarrollo WEB en Eclipse Neón para Desarrolladores
Configurando Ambiente de Desarrollo WEB en Eclipse Neón para DesarrolladoresConfigurando Ambiente de Desarrollo WEB en Eclipse Neón para Desarrolladores
Configurando Ambiente de Desarrollo WEB en Eclipse Neón para DesarrolladoresIvan Luis Jimenez
 
PLC y Electroneumática: Codesys Grafcet
PLC y Electroneumática: Codesys GrafcetPLC y Electroneumática: Codesys Grafcet
PLC y Electroneumática: Codesys GrafcetSANTIAGO PABLO ALBERTO
 
Manual de netbeans_7(2)(2)(2)
Manual de netbeans_7(2)(2)(2)Manual de netbeans_7(2)(2)(2)
Manual de netbeans_7(2)(2)(2)javier_ot99
 
Manual de creación y uso de Web Service SOAP
Manual de creación y uso de Web Service SOAPManual de creación y uso de Web Service SOAP
Manual de creación y uso de Web Service SOAPHéctor Garduño Real
 
UDA-Guia desarrollo web services
UDA-Guia desarrollo web servicesUDA-Guia desarrollo web services
UDA-Guia desarrollo web servicesAnder Martinez
 
Webbrowser de vb 6.0 y vb.net
Webbrowser de vb 6.0 y vb.netWebbrowser de vb 6.0 y vb.net
Webbrowser de vb 6.0 y vb.netadezhiz
 
Web 2.0 ajax con SharePoint
Web 2.0 ajax con SharePointWeb 2.0 ajax con SharePoint
Web 2.0 ajax con SharePointgoreorti
 
Base de datos desde vb 6.0
Base de datos desde vb 6.0Base de datos desde vb 6.0
Base de datos desde vb 6.0WendyMendez30
 
Introduccion a sharepoint framework
Introduccion a sharepoint frameworkIntroduccion a sharepoint framework
Introduccion a sharepoint frameworkLuis Valencia
 
Desarrollo de Aplicaciones con Microsoft Ajax 1.0 y Ajax Control Toolkit
Desarrollo de Aplicaciones con Microsoft Ajax 1.0 y Ajax Control ToolkitDesarrollo de Aplicaciones con Microsoft Ajax 1.0 y Ajax Control Toolkit
Desarrollo de Aplicaciones con Microsoft Ajax 1.0 y Ajax Control Toolkitpabloesp
 
Evolution INTech - Acceso a bases de datos con Minimal APIs de .NET 6.pptx
Evolution INTech - Acceso a bases de datos con Minimal APIs de .NET 6.pptxEvolution INTech - Acceso a bases de datos con Minimal APIs de .NET 6.pptx
Evolution INTech - Acceso a bases de datos con Minimal APIs de .NET 6.pptxLuis775803
 

Similar a Ruby on Rails Workshop (20)

Empezando con Play y reactive mongo (Segundo meetup Scala Perú Dec 2015)
Empezando con Play y reactive mongo (Segundo meetup Scala Perú Dec 2015)Empezando con Play y reactive mongo (Segundo meetup Scala Perú Dec 2015)
Empezando con Play y reactive mongo (Segundo meetup Scala Perú Dec 2015)
 
Consumiendo servicios Restful en Xamarin.Forms
Consumiendo servicios Restful en Xamarin.FormsConsumiendo servicios Restful en Xamarin.Forms
Consumiendo servicios Restful en Xamarin.Forms
 
tutorial de eclipse
tutorial de eclipsetutorial de eclipse
tutorial de eclipse
 
Presentacion3 Webquest
Presentacion3 WebquestPresentacion3 Webquest
Presentacion3 Webquest
 
Consumo de APIs usando el WSO2 API Manager
Consumo de APIs usando el WSO2 API ManagerConsumo de APIs usando el WSO2 API Manager
Consumo de APIs usando el WSO2 API Manager
 
Presentacion3 Webquest
Presentacion3 WebquestPresentacion3 Webquest
Presentacion3 Webquest
 
Guia basica de ruby on rails
Guia basica de ruby on railsGuia basica de ruby on rails
Guia basica de ruby on rails
 
Configurando Ambiente de Desarrollo WEB en Eclipse Neón para Desarrolladores
Configurando Ambiente de Desarrollo WEB en Eclipse Neón para DesarrolladoresConfigurando Ambiente de Desarrollo WEB en Eclipse Neón para Desarrolladores
Configurando Ambiente de Desarrollo WEB en Eclipse Neón para Desarrolladores
 
PLC y Electroneumática: Codesys Grafcet
PLC y Electroneumática: Codesys GrafcetPLC y Electroneumática: Codesys Grafcet
PLC y Electroneumática: Codesys Grafcet
 
Manual de netbeans_7(2)(2)(2)
Manual de netbeans_7(2)(2)(2)Manual de netbeans_7(2)(2)(2)
Manual de netbeans_7(2)(2)(2)
 
Manual de creación y uso de Web Service SOAP
Manual de creación y uso de Web Service SOAPManual de creación y uso de Web Service SOAP
Manual de creación y uso de Web Service SOAP
 
UDA-Guia desarrollo web services
UDA-Guia desarrollo web servicesUDA-Guia desarrollo web services
UDA-Guia desarrollo web services
 
Ebook tutorialspringbootheroku
Ebook tutorialspringbootherokuEbook tutorialspringbootheroku
Ebook tutorialspringbootheroku
 
Webbrowser de vb 6.0 y vb.net
Webbrowser de vb 6.0 y vb.netWebbrowser de vb 6.0 y vb.net
Webbrowser de vb 6.0 y vb.net
 
Web 2.0 ajax con SharePoint
Web 2.0 ajax con SharePointWeb 2.0 ajax con SharePoint
Web 2.0 ajax con SharePoint
 
Base de datos desde vb 6.0
Base de datos desde vb 6.0Base de datos desde vb 6.0
Base de datos desde vb 6.0
 
Introduccion a sharepoint framework
Introduccion a sharepoint frameworkIntroduccion a sharepoint framework
Introduccion a sharepoint framework
 
Desarrollo de Aplicaciones con Microsoft Ajax 1.0 y Ajax Control Toolkit
Desarrollo de Aplicaciones con Microsoft Ajax 1.0 y Ajax Control ToolkitDesarrollo de Aplicaciones con Microsoft Ajax 1.0 y Ajax Control Toolkit
Desarrollo de Aplicaciones con Microsoft Ajax 1.0 y Ajax Control Toolkit
 
Evolution INTech - Acceso a bases de datos con Minimal APIs de .NET 6.pptx
Evolution INTech - Acceso a bases de datos con Minimal APIs de .NET 6.pptxEvolution INTech - Acceso a bases de datos con Minimal APIs de .NET 6.pptx
Evolution INTech - Acceso a bases de datos con Minimal APIs de .NET 6.pptx
 
Programacion2
Programacion2Programacion2
Programacion2
 

Más de Gustavo Andres Brey

ArqConf 2018 - No copies el modelo Spotify
ArqConf 2018 - No copies el modelo SpotifyArqConf 2018 - No copies el modelo Spotify
ArqConf 2018 - No copies el modelo SpotifyGustavo Andres Brey
 
Introduccion a Python y Data Science
Introduccion a Python y Data ScienceIntroduccion a Python y Data Science
Introduccion a Python y Data ScienceGustavo Andres Brey
 
Docker como la máxima expresión de Devops - WISIT 2015
Docker como la máxima expresión de Devops - WISIT 2015Docker como la máxima expresión de Devops - WISIT 2015
Docker como la máxima expresión de Devops - WISIT 2015Gustavo Andres Brey
 

Más de Gustavo Andres Brey (8)

ArqConf 2018 - No copies el modelo Spotify
ArqConf 2018 - No copies el modelo SpotifyArqConf 2018 - No copies el modelo Spotify
ArqConf 2018 - No copies el modelo Spotify
 
Introduccion a Python y Data Science
Introduccion a Python y Data ScienceIntroduccion a Python y Data Science
Introduccion a Python y Data Science
 
Architectural Lean Startup
Architectural Lean StartupArchitectural Lean Startup
Architectural Lean Startup
 
Docker como la máxima expresión de Devops - WISIT 2015
Docker como la máxima expresión de Devops - WISIT 2015Docker como la máxima expresión de Devops - WISIT 2015
Docker como la máxima expresión de Devops - WISIT 2015
 
Dibujar, pintar y programar
Dibujar, pintar y programarDibujar, pintar y programar
Dibujar, pintar y programar
 
Caracteristicas de Ruby
Caracteristicas de RubyCaracteristicas de Ruby
Caracteristicas de Ruby
 
Ruby para Java Developers
Ruby para Java DevelopersRuby para Java Developers
Ruby para Java Developers
 
Ruby On Rails Introduction
Ruby On Rails IntroductionRuby On Rails Introduction
Ruby On Rails Introduction
 

Último

International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)GDGSucre
 
Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024GiovanniJavierHidalg
 
Plan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docxPlan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docxpabonheidy28
 
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfPARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfSergioMendoza354770
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfsoporteupcology
 
Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadMiguelAngelVillanuev48
 
KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesFundación YOD YOD
 
tics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxtics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxazmysanros90
 
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxCrear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxNombre Apellidos
 
R1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en minaR1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en minaarkananubis
 
SalmorejoTech 2024 - Spring Boot <3 Testcontainers
SalmorejoTech 2024 - Spring Boot <3 TestcontainersSalmorejoTech 2024 - Spring Boot <3 Testcontainers
SalmorejoTech 2024 - Spring Boot <3 TestcontainersIván López Martín
 
Hernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptxHernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptxJOSEMANUELHERNANDEZH11
 
La era de la educación digital y sus desafios
La era de la educación digital y sus desafiosLa era de la educación digital y sus desafios
La era de la educación digital y sus desafiosFundación YOD YOD
 
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxMedidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxaylincamaho
 
El gusano informático Morris (1988) - Julio Ardita (1995) - Citizenfour (2014...
El gusano informático Morris (1988) - Julio Ardita (1995) - Citizenfour (2014...El gusano informático Morris (1988) - Julio Ardita (1995) - Citizenfour (2014...
El gusano informático Morris (1988) - Julio Ardita (1995) - Citizenfour (2014...JaquelineJuarez15
 
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...FacuMeza2
 
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6    CREAR UN RECURSO MULTIMEDIAActividad integradora 6    CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA241531640
 
dokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.pptdokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.pptMiguelAtencio10
 
El uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFELEl uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFELmaryfer27m
 
trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdfIsabellaMontaomurill
 

Último (20)

International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)
 
Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024
 
Plan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docxPlan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docx
 
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfPARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdf
 
Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidad
 
KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento Protégeles
 
tics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxtics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptx
 
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxCrear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
 
R1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en minaR1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en mina
 
SalmorejoTech 2024 - Spring Boot <3 Testcontainers
SalmorejoTech 2024 - Spring Boot <3 TestcontainersSalmorejoTech 2024 - Spring Boot <3 Testcontainers
SalmorejoTech 2024 - Spring Boot <3 Testcontainers
 
Hernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptxHernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptx
 
La era de la educación digital y sus desafios
La era de la educación digital y sus desafiosLa era de la educación digital y sus desafios
La era de la educación digital y sus desafios
 
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxMedidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
 
El gusano informático Morris (1988) - Julio Ardita (1995) - Citizenfour (2014...
El gusano informático Morris (1988) - Julio Ardita (1995) - Citizenfour (2014...El gusano informático Morris (1988) - Julio Ardita (1995) - Citizenfour (2014...
El gusano informático Morris (1988) - Julio Ardita (1995) - Citizenfour (2014...
 
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...
 
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6    CREAR UN RECURSO MULTIMEDIAActividad integradora 6    CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
 
dokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.pptdokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.ppt
 
El uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFELEl uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFEL
 
trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdf
 

Ruby on Rails Workshop

  • 1. Ruby On Rails Workshop - 21/10/2009 Table of Contents De que se trata la aplicación.......................................................................................................................1 Creando la aplicación Rails........................................................................................................................1 Ejecutando la aplicación............................................................................................................................4 Utilizando el Scaffold................................................................................................................................6 Migrando la base de datos..........................................................................................................................8 Agregando validaciones...........................................................................................................................10 Agregando relaciones entre los modelos..................................................................................................12 Utilizando Nested Routes.........................................................................................................................14 Jugando con la consola............................................................................................................................14 Utilizando View Helpers..........................................................................................................................15 Agregando AJAX.....................................................................................................................................16 Utilizando RJS templates.........................................................................................................................20 Creando un custom helper........................................................................................................................21 De que se trata la aplicación Para el workshop se eligió crear una aplicación de bloging. Se eligió este tipo de aplicación por ser algo sencillo, de solo un par de modelos y pocas vistas. Además, ultimamente, en la mayoria de los nuevos frameworks web se utiliza un ejemplo similar para crear la primera aplicación de ejemplo, algo asi como el nuevo “Hello world”. La idea es hacer algo sencillo donde se puedan aplicar varios de los conceptos básicos de rails como es scaffold, generators, helpers, custom helpers, templates, ajax, validations, relationships, etc. Basicamente el usuario final va a poder crear posts, editarlos y borrarlos asi como también se podrán agregar comentarios a los posts. Creando la aplicación Rails File/new Project Elegir Categories : Ruby Projects: Ruby on Rails application Presionar “Next”.
  • 2. Elegir las siguientes opciones: Project Name: blog Ruby Platform: Ruby 1.8.6 Presionar Next
  • 3. Seleccionar: Specify Database Information Directory Database Adapter: sqlite3 Presionar Next
  • 5. Observar la ventana de output: Ejecutando la aplicación Abrir la vista “Projects”, darle botón derecho sobre la aplicación “blog” y elegir “run”
  • 6. Observar la página de inicio de la aplicación:
  • 7. Utilizando el Scaffold Nuevamente abrir la vista “Projects”, presionar botón derecho y elegir la opción “Generate” . Cargar las siguientes opciones: Generator: scaffold Model Name: post Attribute Pairs: title:string body:text Presionar “OK”
  • 8. Observar la ventana de output de “Rails Generator” También observar la migration creada, haciendo click directamente en el link que nos muestra la ventana del output de “Rails Generator” o bien abrir el archivo desde la vista “Projects”.
  • 9. Migrando la base de datos En el punto anterior se creó una migration pero aún no se modificó nada en la base de datos. Asi que para esto se debe migrar a la última versión. Esto se hace haciendo botón derecho sobre la aplicación en la vista “Projects” y elegir “Migrate Database” y luego “To current version”.
  • 10. Observar el output de este comando. En el navegador dirigirse a :
  • 11. Agregando validaciones Para validar que los Post que se crean sean “validos” se deberia de validar que el usuario especifique un “title” y un “body” para el post. Para eso se abre el modelo “post” dentro de la vista “Projects”. y dentro de la clase escribir el texto: validates y presionar la convinación de teclas “CTRL+SPACE” para activar el autocomplete:
  • 12. Se puede observar no solo las opciones de validaciones sinó también la ayuda y documentación de la API de rails. Seleccionar “validates_prescense_of” y especificar los campos “body” y “title”: validates_presence_of :title, :body Ahora probar de crear un post sin escribir alguno de los atributos anteriormente mencionados. Y verificar el siguiente error:
  • 13. Agregando relaciones entre los modelos Por ahora solo existe el modelo “post”. Pero se puede agregar a la aplicación de blog la posibilidad de escribir comentarios para cada post. Para eso se va a crear el modelo “comment”. Ir a la vista “Projects” botón derecho sobre la aplicación, “Generate” y en “Generator” elegir “model”. Presionar “OK”.
  • 14. Luego migrar la base para que cree la tabla “comments”, botón derecho sobre la aplicación, elegir “Migrate Database” y luego “to current version”. Los “post” van a estar relacionados con los comments en la relación 1 a N. Es decir “un post tiene muchos comments”. Es decir, en inglés, “post has many comments”. Es decir en Rails, se especifica dentro del modelo “post” con un “has_many :comments”. Abrir el modelo post y escribir: has_many :comments y en el modelo “comments” escribir: belongs_to :post
  • 15. Utilizando Nested Routes Para poder referenciar a los comentarios en forma de Recursos pertenencientes a Posts deberiamos hacerlo a travez de una URL como la siguiente: http://localhost:3000/posts/1/comments Y para referirnos a un comentario en particular deberiamos hacerlo a travez de una URL como la siguietne: http://localhost:3000/posts/1/comments/1 Para esto debemos modificar las rutas. Las rutas están definidas en el archivo route.rb ubicado en la carpeta config. O dentro de la vista “Projects” ir al proyecto y en “Configuration” abrir el archivo “routes.rb” y agregarle a la definición de la ruta de post, lo siguiente: map.resources :posts, :has_many => :comments Jugando con la consola Para ver los modelos en rails y jugar un poco con los modelos recién creados se puede abrir la consola de rails y manipular los modelos directamente en la consola. Para esto presionamos botón derecho sobre el proyecto y elegir “Rails console”. Ahora creamos un Post nuevo desde la consola con la siguiente instrucción: post1 = Post.create(:title => "desde la consola", :body => "el body desde la consola :P") este devolverá el post creado seteandole automaticamente el timestampo en los campos “created_at” y “updated_at”.
  • 16. E inmediatamente se puede ver el post en la aplicación en el navegador. Eso es porque el server está levantado usando el entorno de “Development” al igual que la consola. Por eso es que utilizan la misma base de datos. Volviendo a la consola, teniamos asignado en la variable “post1” el post recientemente creado, ahora vamos a agregarle un comentario (también desde la consola). Creamos un nuevo comentario y lo asignamos a una variable: c1 = Comment.new luego le seteamos el “body” a ese comentario. c1.body = "este es el primer comentario del post" y luego agregamos ese comentario al post1: post1.comments << c1 Podemos verificar que cuando creamos el comment con la llamada a “.new” el comentario aún no tenia asignado ningún id en la tabla. Al agregarlo al post automaticamente se guarda en la tabla el comentario al mismo tiempo que la variable post_id se asigna con el id del post1. Eso es gracias a las relations que especificamos anteriormente. Utilizando View Helpers Para mostrar los comentarios vamos a mostrarlos dentro de la vista “show” perteneciente a posts.
  • 17. Para eso abrimos la vista show dentro de “Projects/views/posts/show.html.erb”. Y agregamos al final del codigo de la vista lo siguiente: <% content_tag(:div, :id => :comments ) do %> <% @post.comments.each do | comment | %> <% content_tag(:p) do %> <%= label_tag(:comment_body, comment.body) %>, <%= content_tag(:i, comment.created_at) %> <% end %> <% end %> <% end %> Se puede observar que se utilizaron algunos view helpers como “content_tag” y “label_tag”. Generando un html como el siguiente: Agregando AJAX Para agregar los comentarios vamos a hacerlo a travez de ajax. Para eso vamos a agregar el formulario de comments solamente en la vista “show” perteneciente a “posts”. Primero y principal necesitamos que el template tenga las librerias necesarias para poder utilizar AJAX en rails (librerias de Prototype y de Scriptaculous). Entonces abrimos el layout de posts (“Projects/views/layouts/posts.html.erb”) y agregamos la siguiente instrucción en el head: <%= javascript_include_tag :defaults %>
  • 18. Ahora, abrir la vista show dentro de “Projects/views/posts/show.html.erb”. Y agregar el siguiente formulario remoto al final de la vista: <% remote_form_for([@post, Comment.new]) do |f| %> <%= content_tag(:strong, "Send your comment:") %> <% content_tag(:p) do %> <%= f.text_area :body %> <% end %> <%= submit_tag 'comment' %> <% end %>
  • 19. El formulario remoto está apuntando al controller “comments” que aún no hemos creado: Asi que generamos el controller haciendo botón derecho sobre la aplicación “Generate”, elegimos en “generator” elegimos “controller” y en “name” elegimos: Comments
  • 20. Y dentro del controller de Comments agregamos la acción “create” def create post = Post.find(params[:post_id]) @comment = Comment.new(params[:comment]) post.comments << @comment end Si probamos de escribir algún comentario podemos notar un par de cosas. Al presionar sobre el botón comment no notamos ninguna diferencia, pero si abrimos el log del servidor (es una de las ventanas de OUTPUT, con el titulo de “Webrick for blog”) podemos ver que el comentario se creó pero luego el controller lanzó un error al intentar encontrar un template para renderizar esa acción:
  • 21. Utilizando RJS templates. Para crear el template de la acción create, presionamos botón derecho sobre la carpeta “comments” dentro de “views”, luego “new” y luego “Empty RJS Template”. Luego en Filename escribir “create” y presionar sobre “Finish”.
  • 22. y ponerle el siguiente script: page.insert_html(:bottom, :comments, content_tag(:p) do label_tag(:comment_body, @comment.body) + ', ' + content_tag(:i, @comment.created_at) end ) page["comment_body"].value = '' Creando un custom helper Una de las prácticas de Ruby on Rails es la de DRY. En nuestro anterior ejemplo repetimos exactamente el mismo codigo en 2 lugares diferentes. Y ya se vió en la parte teorica los beneficios de tener todo DRY y no tener codigo duplicado.
  • 23. Asi que para esto vamos a crear un Custom Helper que haga ese trabajo en 1 solo lado. Para esto abrimos el helper “application_helper.rb” en la vista “Projects” dentro de la aplicación y dentro de “Helpers” y agregamos el siguiente metodo. module ApplicationHelper def get_comment_html(comment) content_tag(:p) do label_tag(:comment_body, comment.body) + ', ' + content_tag(:i, comment.created_at) end end end Y modificamos los templates “show.html.erb” y “create.rjs” para que queden asi respectivamente: