Workshop: Ruby on Rails y las Redes Sociales - tech
Transcripción
Workshop: Ruby on Rails y las Redes Sociales - tech
Workshop: Ruby on Rails y las Redes Sociales Leopoldo Flores [[email protected]] Workshop: Ruby on Rails y las Redes Sociales Este documento le guiará paso a paso en el desarrollo de las actividades del presente Workshop para alcanzar el objetivo planteado. Objetivo Hacer uso del Framework Ruby on Rails para la creación de una Red Social (aplicación web) donde los usuarios podrán publicar mensajes. Además, esta red social explotará algunos de los servicios que ofrecen otras redes sociales muy conocidas tales como Facebook, Google, Twitter, etc. 1. Preparación del ambiente de trabajo La equipo que tú tienes ya tiene instalado Ruby 1.8.7 y Rails 3.0.7, por lo cual la ejecución de los siguientes pasos no será necesario. Tarea 1. Instalar Ruby 1.8.7-p352 Pasos detallados 1) Descargar el instalador de: http://rubyforge.org/frs/download.php/75107/rubyinstaller-1.8.7p352.exe 2) Ejecutar el instalador y seguir las instrucciones. 3) Adicionar C:\Ruby187\bin a la variable de entorno PATH 4) Para la verificación ejecutar desde un consola: ruby -v El comando ejecutado debe mostrar la versión de Ruby. 2. Actualizar Rubygems 1) Ejecutar desde consola: gem update --system 3. Instalar Rails 3.0.7 1) La versión a utilizar será Rails 3.0.7. Para instalar ejecutar desde consola: gem install rails –v 3.0.7 2) Para verificar listar las gemas instaladas ejecutar: gem list 2) Para verificar la instalación ejecutar: gem list rails ó rails -v El comando ejecutado debe mostrar la versión de Rails. 2. Crear una aplicación básica de RoR: nuestra Red Social Todos los siguientes comandos se ejecutaran desde una ventada de línea de comandos: Tarea 1. Crear la aplicación básica Pasos detallados 1) Abrir una consola de DOS. 2) Ejecutar: rails new social_network 3) Una nueva carpeta “social_network” será creada con todos los archivos necesarios autogenerados por rails. 2. Instalar prerequisitos 1) Ingresar a la nueva carpeta: cd social_network 3. Iniciar la aplicación 1) Ejecutar: rails server 2) Ejecutar: bundle install Workshop: Ruby on Rails y las Redes Sociales Leopoldo Flores [[email protected]] 2) Iniciar un browser y cargar nuestra aplicación: http://localhost:3000 3) Detener el servidor rails, en la misma consola presionar: CTRL + C 3. Configurando la Base de Datos El equipo que tú tienes ya tiene configurado SQLite3, por lo cual no es necesario ejecutar los siguientes pasos: Tarea 1. Instalar SQLite3 Pasos detallados 1) Descargar el DLL de SQLite3 de: http://www.sqlite.org/sqlite-dll-win32x86-3070900.zip 2) Crear carpeta: C:\sqlite3 y copiar el DLL descargado a dicha carpeta 3) Adicionar C:\sqlite3 a la variable de entorno PATH 2. Configurar Rails y SQLite3 1) Por defecto Rails ya viene configurado para trabajar con SQLite3. En el caso de nuestra aplicación, dicha configuración se encuentra en: config/database.yml 4. El clásico “Hello world!” Ahora vamos a crear algunas páginas en nuestra aplicación. Tarea 1. Crear el controlador HOME Pasos detallados 1) Iniciar servidor: rails server 2) Ejecutar: rails generate controller home index personal 3) Explorar rutas generadas, ejecutar: rake routes 4) Cargar en el explorador: http://localhost:3000/home/index 2. Colocar home#index como la pagina principal 1) Borrar el archivo: public/index.html 2) Editar app/views/home/index.html.erb y reemplazar todo el contenido por: <h1>Hello World!</h1> 3) Editar config/routes.rb y reemplazar: # root :to => "welcome#index" por root :to => "home#index" 4) Cargar en el explorador: http://localhost:3000 5. Adicionando Autenticación a nuestra Red Social Considerando que home#index es una página de acceso general y que home#personal es de acceso restringido, realizamos lo siguiente: Tarea 1. Instalar la gema DEVISE Pasos detallados 1) Detener el servidor con: CTRL + C 2) Adicionar en el archivo Gemfile: gem ‘devise’ 3) Ejecutar: bundle install Workshop: Ruby on Rails y las Redes Sociales Leopoldo Flores [[email protected]] 2. Crear el modelo USER a través de DEVISE 1) Ejecutar: rails generate devise:install 2) Tomar nota de los “flash messages”: notice y alert 3) Ejecutar: rails generate devise User 4) Generar tablas con: rake db:migrate 5) Explorar rutas generadas, ejecutar: rake routes 6) Editar app/controllers/home_controller.rb y adicionar (después de la definición de la clase): before_filter :authenticate_user!, :except => :index 7) Iniciar servidor: rails server 8) Cargar en el browser http://localhost:3000/home/index y http://localhost:3000/home/personal y ver la diferencia 9) Revisar los links y paginas que han sido generados con DEVISE 6. Layouts: un forma de “factorizar” contenido Para una mejor organización, vamos crearnos un “menú” en el cual vamos a incluir links generales que van a estar disponibles en todas las páginas de nuestra aplicación. Tarea 1. Crear el “menú” Pasos detallados 1) Editar app/views/layouts/application.html.erb y adicionar todos los siguientes links antes de <%= yield %> 2) Adicionar link Home: <%= link_to “Home”, root_path %> 3) Adicionar link Personal Stuff: <%= link_to “Personal Stuff”, home_personal_path %> 4) Adicionar links Sign In y Sign Out: <% if user_signed_in? %> Welcome <%= current_user.email %>! | %> <%= link_to “Sign Out”, destroy_user_session_path, :method => :delete <% else %> <%= link_to “Sign In”, new_user_session_path %> <% end %> 5) Adicionar los “flash messages”: <p class="notice"><%= notice %></p> <p class="alert"><%= alert %></p> 6) Ahora crear un nuevo usuario en nuestra aplicación 7) Inspeccionar los datos creados, ejecutar: rails console 7. Modelos, Controladores y Vistas: creando el modelo Posts Considerando que en una red social es usual publicar mensajes, compartir pensamientos y otros, vamos a implementar el modelo Post que representa a los mensajes compartidos por los usuarios registrados. Workshop: Ruby on Rails y las Redes Sociales Leopoldo Flores [[email protected]] Tarea 1. Crear el modelo Post usando SCAFFOLDING Pasos detallados 1) Detener el servidor con: CTRL + C 2) Ejecutar: rails generate scaffold Post message:text user:references 3) Ejecutar: rake db:migrate 4) Editar app/models/user.rb y adicionar has_many :posts antes de finalizar la clase 5) Editar app/models/post.rb y verificar que contenga belongs_to :user 6) Iniciar servidor: rails server 7) Revisar las vistas generadas para el modelo Post 2. Colocar “posts#index” como página principal 1) Eliminar el link “Personal Stuff” de app/views/layouts/application.html.erb 2) Editar config/routes.rb y reemplazar root :to => "home#index" por root :to => "posts#index" 3) Cargar en el browser: http://localhost:3000 3. Aplicar autenticación a las vistas del modelo Posts 1) Editar app/controllers/posts_controller.rb y adicionar después de la definición de la clase: before_filter :authenticate_user!, :except => :index 8. Mejorando el diseño de nuestra Red Social Ahora vamos a mejorar el diseño de nuestra aplicación a través de hojas de estilo (css) y modificaciones a las vistas principalmente. Para ganar tiempo, se compartió una carpeta donde se tienen todos los archivos a utilizar en las siguientes tareas. Tarea 1. Crear un formulario personalizado para la publicación de Posts. Pasos detallados 1) Copiar_post_form.html.erb a la carpeta app/views/posts 2) Tomar nota de: a. Se adicionan tablas para una mejor organización b. Se modifica el tamaño de área para publicar mensajes c. La información del usuario se la envía en un campo oculto 2. Modificar el despliegue de Posts en la página principal 1) Reemplazar app/views/posts/index.html.erb por el archivo que se encuentra en la carpeta compartida 3. Modificar el layout principal 1) Reemplazar app/views/layouts/application.html.erb por el archivo que se encuentra en la carpeta compartida 4. Copiar imágenes y hojas de estilo 1) Copiar todas las imágenes a la carpeta public/images 5. Arreglar inconsistencias debido los cambios 1) Adicionar @post = Post.new en el archivo app/controllers/posts_controller.rb dentro del método index después de @posts = Post.all 2) Copiar los archivos *.css a la carpeta public/stylesheets Workshop: Ruby on Rails y las Redes Sociales Leopoldo Flores [[email protected]] Tambien reemplazar: @posts = Post.all Por: @posts = Post.order('created_at DESC').all 2) En el mismo archivo, en el método create adicionar como primera línea: params[:post][:user] = current_user También reemplazar: format.html { redirect_to(@post, :notice => 'Post was successfully created.') } Por: format.html { redirect_to(root_path, :notice => 'Post was successfully created.') } 3) Tomar nota de la línea if user_signed_in? en app/views/posts/index.html.erb 9. Integrando con Facebook: autenticación Es hora de expandir nuestra y explotar Facebook para la proceso autenticación. Para algunas de las siguientes tareas también se tienen compartidos algunos archivos. Tarea 1. Instalar la gema OMNIAUTH y OMNIAUTHFACEBOOK Pasos detallados 1) Detener el servidor con: CTRL + C 2) Editar Gemfile y adicionar: gem ‘omniauth’ gem ‘omniauth-facebook’ 3) Ejecutar: bundle install 2. Crear API ID y el SECRET KEY para comunicarnos con Facebook mediante el protocolo OAUTH 1) En otro browser iniciar sesión en: http://developers.facebook.com 2) Hacer click en Aplicaciones 3) Hacer click en + Crear nueva aplicación 4) Proporcionar nombre de la aplicación: Ej. My Social Network 5) Seleccionar checkbox de términos de uso y click en Aceptar 6) Llenar el captcha y click en Aceptar 7) Hacer click en Sitio Web y llenar URL con http://localhost:3000 8) Click en Guardar cambios 9) Tomar nota del API ID y el SECRET KEY 3. Configurar OMNIAUTH para nuestra aplicación 1) Copiar el archivo compartido omniauth.rb a la carpeta config/initializers y proporcionar en la línea del proveedor de Facebook el API ID y el SECRET KEY creados en paso previo 2) Editar app/views/layouts/application.html.erb y adicionar un link a Facebook auth: <%= link_to “Sign In with Facebook”, “/auth/facebook” %> 3) Editar config/routes.rb y adicionar el Facebook callback: match "auth/facebook/callback", :to => "posts#index" 4) Iniciar servidor: rails server Workshop: Ruby on Rails y las Redes Sociales Leopoldo Flores [[email protected]] 5) Cargar: http://localhost:3000 6) Probar el link ‘Sign In con Facebook’. Acá podríamos tener un problema relacionado a SSL. Para ello adicionar lo siguiente: http.verify_mode = OpenSSL::SSL::VERIFY_NONE en la línea 31 en el archivo C:\Ruby187\lib\ruby\gems\1.8\gems\faraday0.7.5\lib\faraday\adapter\net_http.rb 10. Autenticación con otros proveedores: Twitter, Google y OpenId Ahora vamos a implementar la autenticación explotando el servicio de Twitter, Google y OpenId Tarea Pasos detallados 1. Instalar las gemas OMNIAUTHTWITTER y OMNIAUTHOPENDID 1) Detener el servidor con: CTRL + C 2. Configurar OMNIAUTH 1) En el archivo config/initializers/omniauth.rb proporcionar información apropiada respecto a los nuevos proveedores. En nuestro caso des-comentar todas las líneas comentadas. 2) Editar Gemfile y adicionar: gem 'omniauth-twitter' gem 'omniauth-openid' 3) Ejecutar: bundle install 2) Editar config/routes.rb y adicionar callbacks para los nuevos proveedores, para ello reemplazar: match "auth/facebook/callback", :to => "posts#index" Por: match "auth/:provider/callback", :to => "posts#index" 3) Editar app/views/layouts/application.html.erb y adicionar un link a Facebook auth: <%= link_to “Sign In with Twitter”, “/auth/twitter” %> <%= link_to “Sign In with Google”, “/auth/google” %> <%= link_to “Sign In with OpenId”, “/auth/open_id” %> 4) Iniciar servidor: rails server 5) Cargar: http://localhost:3000 6) Probar los nuevos links. 11. Asegurando la autenticación Ahora que podemos comunicarnos con Facebook, Twitter, Google y otros, es hora de integrar dicha funcionalidad con DEVISE para la autenticación en nuestra aplicación. Para algunas de las siguientes tareas, también se tienen archivos compartidos Tarea 1. Crear un nuevo controlador para el manejo del login y Pasos detallados 1) Detener el servidor con: CTRL + C 2) Ejecutar: rails generate controller SocialNetwork login logout Workshop: Ruby on Rails y las Redes Sociales Leopoldo Flores [[email protected]] logout con Facebook, Twitter y otros 3) Editar config/routes.rb y adicionar callbacks para los nuevos proveedores, para ello reemplazar: match "auth/facebook/callback", :to => "posts#index" Por: match "auth/:provider/callback", :to => "social_network#login" 4) Reemplazar app/controllers/social_network_controller.rb por el archivo del mismo nombre de nuestra carpeta compartida 5) Editar el archivo compartido user_model_method.rb y copiar el todo contenido a la clase del archivo app/models/user.rb 6) Analizar/revisar el código adicionado a ambos archivos 2. Probar el nuevo controlador creado 1) Iniciar servidor: rails server 2) Iniciar consola de rails: rails console 3) Cargar: http://localhost:3000 4) Probar los todos los links de autenticación. 12. Extrayendo información de Facebook Todo lo que se hará de ahora en adelante es específico a Facebook. Ya que para el caso de otros proveedores el código a crear podría necesitar variaciones. Tarea 1. Alterar el modelo USER Pasos detallados 1) Detener el servidor con: CTRL + C 2) Ejecutar: rails generate migration add_other_info_to_users name:string provider:string userproviderid:string 3) Ejecutar: rake db:migrate 4) En el modelo User modificar el código para recolectar información adicional del usuario de Facebook (name, proveedor e id de FB); para ello, des-comentar todo el código comentado de la línea 17 a la línea 28, 5) En el modelo User adicionar :name, :provider, :userproviderid en la línea de attr_accessible 6) En los siguientes archivos cambiar el uso del email del usuario por el nombre (name): app/views/layouts/application.html.erb app/views/posts/_post_form.html.erb 7) Iniciar servidor: rails server 8) Iniciar consola de rails y borrar los últimos usuarios registrados a través de otros proveedores (Facebook, etc.) y los post que ellos crearon: rails console User.last.destroy Post.last.destroy 9) En la aplicación ‘loggearse’ a través de Facebook y luego crear un post 10) Verificar los nuevos datos del usuario en rails console y la información del usuario desplegada en el UI. Workshop: Ruby on Rails y las Redes Sociales Leopoldo Flores [[email protected]] 13. Mejorando el UI de nuestra aplicación Las siguientes tareas son para mejor el UI de nuestra red, mostraremos el avatar de los usuarios de Facebook y el icono de la red social a la cual pertenecen todos los usuarios. Tarea 1. Mostrar el avatar de usuarios de Facebook Pasos detallados 1) Aplicar el siguiente URL para mostrar el avatar de usuarios de Facebook: Usar este código en app/views/layouts/application.html.erb después de la línea <% if user_signed_in? %>: <% if current_user.provider.nil? %> <img class="menu-icon" align="center" src="/images/tech-zone.png"> <% else %> <img class="menu-icon" align="center" src="/images/<%= current_user.provider %>.png"> <% end %> Usar este código en app/views/posts/_post_form.html.erb antes de la línea <%= post.user.name %> says: <br/>: <% if post.user.provider.nil? %> <img class="menu-icon" align="center" src="/images/tech-zone.png"> <% else %> <img class="menu-icon" align="center" src="/images/<%= post.user.provider %>.png"> <% end %> 2. Identificar la red social del usuario 2) Para identificar la Red Social al cual pertenece el usuario desplegaremos el icono del la misma al lado del nombre de cada usuario. Para ello usamos el siguiente código: En app/views/layouts/posts/_post_form.html.erb copiar en lugar de la línea <img src="/images/user.png" class="normal-avatar"/>: <% if current_user.provider == 'facebook' %> <img src="https://graph.facebook.com/<%= current_user.userproviderid %>/picture?type=large" class="normal-avatar"/> <% else %> <img src="/images/user.png" class="normal-avatar"/> <% end %> Usar este código en app/views/posts/index.html.erb en lugar de la línea <img src="/images/user.png" class="small-avatar"/>: <% if post.user.provider == 'facebook' %> <img src="https://graph.facebook.com/<%= post.user.userproviderid %>/picture" class="small-avatar"/> <% else %> <img src="/images/user.png" class="small-avatar"/> <% end %> 3. Festejar 3) Felicidades! Lograste crear una aplicación en Ruby on Rails que se integra fácilmente con Facebook, Twitter, Google y aplicaciones OpenId. 14. (Opcional) Publicando nuestra aplicación Workshop: Ruby on Rails y las Redes Sociales Leopoldo Flores [[email protected]] Ahora que nuestra aplicación se encuentra funcional, nos queda publicarla en la Web. Para ello seguimos los siguientes pasos: Tarea 1. Crear cuenta en Heroku Pasos detallados 1) Cargar en el browser: http://www.heroku.com 2) Hacer click en Sign Up 3) Introducir email y hacer click en Sign Up 4) Ingresar en la cuenta de correo usado en el anterior paso y seguir las instrucciones (hacer click en el link del mail de Heroku) 5) Introducir password y confirmar el password 6) Click en Save y listo! 2. Crear cuenta en Github 1) Cargar en el browser: http://github.com/ 2) Click en Sign up and Pricing 3) Click en Create a free account 4) Introducir username, email, y password 5) Click en Create account y listo! 3. Configurar SSH Keys 1) Iniciar Git bash. El equipo que tienes ya tiene instalado este programa. 2) Ejecutar la siguiente línea usando el email con el que se creó la cuenta de github: ssh-keygen –t rsa –C “[email protected]” 3) Presionar Enter (aceptando el valor por defecto del archivo del key) 4) Introducir passphrase (un nombre cualquiera como password) 5) Repetir el passphrase del paso anterior 6) En el browser, en la cuenta de GITHUB hacer Click Account Settings > Click SSH Public Keys > Click Add another public key 7) Copiar el contenido de ~/.ssh/id_rsa.pub al campo Key del formulario 8) Click en Add Key 9) En el Git Bash, ejecutar: ssh –T [email protected] 10) Recibirás un mensaje de éxito 11) Si es que has tenido problemas, todos los pasos de configuración de SSH Keys se encuentran detallados en: http://help.github.com/win-set-upgit/ 4. Subir nuestra aplicación al Cloud de Heroku 1) En el mismo Git bash, ingresar a la carpeta de nuestra aplicación: social_network 2) Editar el archivo config/initializers/omniauth.rb y actualizar los APP IDs y los SECRETE KEYs de Facebook y Twitter (Si es necesario, ejecutar las tareas del paso 16. Creando API ID y SECRETE KEY en Twitter) 3) Instalar la gema de Heroku: gem install heroku 4) Crear repositorio git, ejecutar: git init 5) Adicionar nuevos archivos a repositorio, ejecutar: git add . 6) Prepara los archives para subir, ejecutar: git commit –m “Uploading my first files to the repo” 7) Crear una aplicación de Heroku: heroku create 8) Introducir credenciales de Heroku (email y password con el que se creó la cuenta) 9) Como resultado obtendremos el URL de nuestra nueva aplicación Workshop: Ruby on Rails y las Redes Sociales Leopoldo Flores [[email protected]] creada. 10) Al ser la primera vez en subir código a Heroku, debemos subir los SSH KEYs a Heroku ejecutando lo siguiente: heroku keys:add 11) Subir todos los archives al repositorio: git push heroku master 12) Introducir el passphrase que se utilizó al crear los SSH KEYs 13) Generar la base de datos de nuestra aplicación en el Cloud de Heroku, ejecutar: heroku rake db:migrate 14) Cambiar el nombre de nuestra aplicación que Heroku auto-generó en el paso 29 a 31. Para ello ejecutar: heroku rename tech-zone Donde tech-zone es el nuevo nombre (como ejemplo) y el nuevo URL será: http://tech-zone.heroku.com 15) Felicidades! Tu aplicación ya está en el Cloud de Heroku. Ahora puedes probarla desde: http://nombre-de-tu-aplicacion.heroku.com 15. (Opcional) Creando API ID y SECRETE KEY en Twitter Este paso asume que ya tienes creada una cuenta en Twitter. Lo que vamos a realizar es crear una Aplicación en Twitter la cual tendrá asociada un API Id y un SECRET KEY para poder integrarlo con Ruby on Rails Tarea 1. Crear una aplicación en Twitter Pasos detallados 1) Iniciar sesión en: http://www.twitter.com 2) Click en Developers (en la parte inferior) 3) Click en Create App 4) Re-introducir email y contraseña 5) Introducir Name, Description, Web Site URL, Callback URL El Web Site URL es el nombre del servidor donde se publicara la aplicación web. Usaremos como ejemplo: http://tech-zone-lab.org Considerando este URL, el callback URL es: http://tech-zonelab.org/auth/twitter/callback 6) Aceptar los términos y condiciones de uso 7) Llenar el 'captcha' 8) Hacer click en Create your Twitter application 9) Tomar nota del API ID (Consumer key) y del SECRET KEY (Consumer secret)