• Inspiración
  • Tutoriales
  • Bootcamp

Planer

  • Inspiración
  • Tutoriales
  • Bootcamp

Ruby On Rails 35

¿Por qué Twitter fue hecho en Ruby on Rails?

Hace un tiempo junto a mi socio Diego tuvimos la oportunidad de conocer a uno de los creadores de Twitter, al mismísimo Evan Henshaw-Plath

En1mes junto a Evan

Estando con Evan Henshaw-Plath en las oficinas de Bombacamp , le pedimos que nos diera una pequeña entrevista. De toda la conversación salió una pregunta bien interesante que me gustaría compartir con ustedes.

¿Por qué Twitter fue hecho en Ruby on Rails?

y aquí la respuesta

En resumen:

“La razón por la que Twitter fue creado con Ruby on Rails es porque con Rails se puede construir prototipos en un sólo día, incluso redes sociales. Empezamos a usar ruby on rails para poder trabajar más rápido y de forma más liviana y no estar tan atado con la estructura de Java”

.- Evan Henshaw-Plath

¿Quieres aprender a programar en ruby on rails?

Nosotros podemos enseñarte En 1 Mes

Share
April 15, 2016 Frameworks, Inspiración, RubyRuby on Rails, Twitter

Construyendo una landing page en Ruby on Rails desde cero.

Este tutorial te enseñará a crear una landing page desde cero en rails, ojo que no se hablará de la parte de html o diseño, ahí puedes ocupar un template o hacerla a tu antojo, este tutorial te explica específicamente como crear el formulario de registro y si continúas con las segunda parte, te enseñará a publicar tu aplicación.

Si aún no tienes instalado Ruby on Rails lo puedes con esta guía paso a paso: InstalarRails.com/

Pase 0: Setup

Vamos a construir una aplicación de rails desde cero, para esto primero debes entrar al terminal y escribir lo siguiente: (signo $> simboliza que estamos en el bash, no hay que tipearlo)

$> rails new superLanding

Dentro del proyecto vamos a hacer un scaffold para guardar los leads, recordar que el nombre de los modelos (o recursos) va en singular

$> rails generate scaffold lead name:string email:string

Finalmente para tener el setup inicial nos falta migrar la base de datos

$> rake db:migrate

Paso 1: Página de inicio

Dentro de un scaffold se generan al menos 7 métodos acorde a la estructura REST, pero nosotros no necesitamos todo eso, de hecho sólo nos interesan 2 métodos, el formulario para que los usuarios se registren (en la misma página va estar todo el landing page) y el método para guardar los datos del formulario.

De todos los métodos generados por el scaffold el que tiene más sentido ocupar es el de new, pues ese muestra un formulario para crear datos, y con eso la parte más complicada de nuestra aplicación ya estaría lista.

Para cambar la página de inicio vamos al archivo config/routes.rb y agregamos:

root 'leads#new'

Paso 2: Redirección después de enviar el formulario

Pero todavía nos falta corregir algo, al hacer click en el botón del formulario se carga el método create, por lo tanto tenemos que revisar el método create de Leads Controller y vemos que después de guardar este nos redirige a @lead que es el equivalente a Leads#show

Lo que tenemos que hacer es redirigirlo a la página donde estábamos antes,o sea cambiar.

redirect_to @lead

por

redirect_to new_lead_path

además podemos cambiar el mensaje por uno a nuestro gusto.

Paso 3: Mostrando el mensaje de “Te has registrado”

Para esto tenemos que agregar a la vista leads/new la noticia flash. lo lógico es agregarla al principio del archivo pero eso depende del diseño del sitio.

<p id="notice"><%= notice %></p>

Paso 4: Bloqueando acceso a la lista de todos los leads.

Dentro del archivo routes, vamos a cambiar la línea que dice resource leads por:

resources :leads, only: [:new, :create]

Con eso evitamos que el usuario tenga acceso a ver o borrar leads.

Paso 5: Recuperando los leads

Finalmente si queremos recuperar un listado de todos los emails lo podemos hacer ocupando la gema activeadmin o en rails console ocupando:

Lead.all.collect{|user| [user.name, user.email]}

Si te interesa publicar de forma fácil tu aplicación en heroku, puedes hacerlo con este tutorial. Si quieres aprender más de manera presencial como crear aplicaciones web de alto nivel puedes tomar uno de nuestros talleres o además puedes ver la opción de Desafío Latam en donde podrás convertirte en un desarrollador Full-Stack.

Share
February 11, 2016 Ruby, TutorialesLanding Page, ruby, Ruby on Rails, Tutoriales

Login con facebook en rails 4.1 y 4.2

Login con Facebook

En este tutorial voy a explicar como crear un sistema de log in con Facebook ocupando devise.

El concepto es el siguiente, el botón de login de Facebook no pertenece a tu sistema, si no que pertenece al sistema Facebook. Cuando este valida exitosamente al usuario que ingresa un sitio lo redirige a una página que le fue designada, esta redirección recibe el nombre de callback.

Gracias a la gema omniauth y omniauth-facebook podemos manejar de forma sencilla el callback y la autenticación a través de un hash el cual procesaremos y guardaremos en el modelo. Ya teniendo la información en el modelo, basta con un query para determinar si el usuario está registrado o no.

Para hacerlo más interesante, vamos a hacer que el sistema permita ambos accesos simultáneamente, o sea por Email o por Facebook.

Paso 1: Hacer una cuenta de Facebook Developer

Para construir una app con Facebook lo primero que debemos hacer es crearnos una cuenta en developers.facebook.com

Luego debemos ir My APPs, seleccionar la opción www, decir que nuestra app no es la versión de prueba de otra app y marcar una categoría. Luego Facebook nos ofrecerá la opción de seguir un quick start, pero por ahora la saltaremos.

Una vez creada la aplicación vamos a la sección settings, añadimos una plataforma del tipo website y en el dice Site URL ponemos localhost:3000 (después necesitaremos definir otra app en FB para la versión de producción).

Paso 2: Instalando la gema dotenv.

Ahora dentro de nuestra aplicación Rails vamos a instalar la gema .dotenv dentro del grupo de desarrollo y test, esta la ocuparemos para poner nuestras accesos de Facebook sin exponerlos a todo el mundo cuando publiquemos o compartamos nuestro proyecto.

group :development, :test do
 gem 'dotenv-rails'
end

El uso de la gema es bastante sencillo, se encuentra detallado en: https://github.com/bkeepers/dotenv pero principalmente consiste en crear en la raíz del proyecto un archivo llamado .env y dentro poner nuestras claves de la siguiente forma:

FB_APP_ID=AppIdEntregadaPorFacebook
FB_SECRET_KEY=ClaveEntregadaPorFacebook

Las claves no se agregan como string, o sea NO hay que poner las comillas de los strings, ej:

FB_APP_ID=AFCE00424CDEFA

luego el archivo .env lo agregamos al gitignore, de esta forma nos aseguramos de no commitearlo por casualidad.

Para hacer eso abrimos el archivo .gitignore y ponememos dentro del archivo.

/.env

Tip: Para que las personas con las que colaboras en el proyecto sepan que son necesarias estas claves, es bueno especificarlo en un archivo readme del proyecto.

Paso 3: Agregar la gema devise y omniauth.

En este caso yo ocuparé el modelo User, pero es perfectamente posible ocupar otro. Si no sabes como instalar Devise puedes ocupar el tutorial oficial.

gem 'devise'
gem 'omniauth'
gem 'omniauth-facebook'

y luego en el terminal dentro de la carpeta del proyecto:

bundle install

Paso 3.1: Instalar la gema devise

rails generate devise:install

Paso 3.2: Crear un modelo de usuario con devise

rails generate devise User

Paso 3.3: Generar vistas custom para poder modificarlas y agregar el botón de login

rails generate devise:views

Paso 3.4 generar el scope de los controllers para poder modificar la lógica de devise y agregar los callbacks

rails generate devise:controllers users

Para que Rails entienda que debe ocupar los nuevos controllers generados entonces hay que especificar en el archivo routes.rb, para eso hay que remplazar la línea puesta previamente que dice devise_for :users

devise_for :users, controllers: { 
  registrations: "users/registrations",
  sessions: "users/sessions",
  passwords: "users/passwords"}

En este paso vamos a hacer una cosa más, que es agregar la ruta para manejar el callback producido por facebook cuando te loggeas.

devise_for :users, controllers: {
  registrations: "users/registrations",
  sessions: "users/sessions",
  passwords: "users/passwords",
  omniauth_callbacks: "users/omniauth_callbacks"}

ADVERTENCIA: si copiaste la línea devise_for :users, controllers:{ regis …} sin remplazar la anterior tendrás un error.

Paso 4: Hacemos nuestro modelo User compatible con omniauth.

Para lograr este objetivo debemos agregar la siguiente línea al modelo de usuarios (dentro del archivo models/user.rb) , puede ser justo debajo de la línea anterior de devise

devise :omniauthable, omniauth_providers: [:facebook]

Paso 5:

Tenemos que adaptar el modelo para que sea capaz de almacenar los datos necesarios de Facebook, para eso crearemos una migración, esta migración contendrá al provider (en este caso será Facebook), el user id de Facebook y el nombre con el que el usuario está registrado en Facebook.

Para generar la migración, escribiremos en el bash:

rails g migration AddOmniauthColumnsToUser

y dentro de la migración agregaremos dentro:

def change    
  add_column :users, :provider, :string    
  add_column :users, :uid, :string    
  add_column :users, :name, :string  
end

para correr las migraciones hacemos:

rake db:migrate

Paso 6: Método para buscar los usuarios

Dentro del mismo modelo, o sea dentro del archivo app/models/user.rb necesitamos un método para revisar si el usuario ya ha entrado previamente con Facebook y que nos devuelva el usuario, si no, revisamos si el usuario se registró previamente por email y en el último caso revisamos que no haya estado previamente registrado lo creamos.

def self.find_for_facebook_oauth(auth, signed_in_resource=nil)      
  user = User.where(provider: auth.provider, uid: auth.uid).first       
  # The User was found in our database    
  return user if user    
  # Check if the User is already registered without Facebook      
  user = User.where(email: auth.info.email).first 
  return user if user
  User.create(
    name: auth.extra.raw_info.name,
    provider: auth.provider, uid: auth.uid,
    email: auth.info.email,
    password: Devise.friendly_token[0,20])  
end

Paso 7: Configurar Omniauth

Avamos a agregar dentro del archivo iniatializers/devise.rb el Facebook Api Key y el Facebook Secret Id que agregamos en el paso 1 al archivo .env, para poder referirnos a las variables de entorno lo hacemos a través de env.

config.omniauth :facebook, ENV['FB_APP_ID'], ENV['FB_SECRET_KEY']

Como cualquier archivo dentro de iniatilizers, después de modificarlo hay que reiniciar el servidor.

Paso 8: Crear un método en el controller para buscar al usuario o redirigir

En el controller app/controllers/users/omniauth_callbacks_controller.rb debemos manejar la lógica de la búsqueda y redirección.

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
  include ApplicationHelper
  def facebook
    # Attempt to find the User
    @user = User.find_for_facebook_oauth(
      request.env["omniauth.auth"], 
      current_user
    )
    
    if @user.persisted?
      sign_in_and_redirect @user, 
        :event => :authentication 
      set_flash_message(:notice, 
        :success, 
        :kind => "Facebook") if is_navigational_format?
    else
      redirect_to new_user_registration_url
    end
  end
  def passthru
    render :file => "#{Rails.root}/public/404.html", :status => 404, :layout => false
  end
end

Paso 9: Incorporar el SDK de Facebook

La mejor forma de hacerlo es a través de una vista parcial, para eso vamos a crear dentro de la carpeta app/views la carpeta shared y dentro vamos a crear el archivo _facebook_sdk.html.erb

dentro del archivo:

<div id="fb-root"></div>
<script>(function(d, s, id) {
  var js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) return;
  js = d.createElement(s); js.id = id;
  js.src = "//connect.facebook.net/en_US/sdk.js#xfbml=1&appId=<%=ENV['FB_APP_ID']%>&version=v2.0";
  fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>

Tomar en cuenta que para que este script funcione se debe haber hecho el paso 2, o sea instalar la gema dotenv-rails y poner dentro del archivo .env el número de la appID de facebook.

dentro del archivo app/views/layouts/application.rb debemos incorporar la vista que acabamos de crear, para eso ponemos dentro de body, arriba de yield:

<%= render 'shared/facebook_sdk' %>

Paso 10: probar

Lo último que falta es probar, para eso vamos a ir a la página localhost:3000/users/sign_in

#HappyCoding

Share
February 3, 2015 RubyRuby on Rails

EL ASSET PATH DE RAILS

Cuando uno está empezando a programar en Rails el asset path es la primera gran pesadilla, por no saberlo manejar bien uno puede demorar horas en simplemente cargar una imagen o un CSS, este tutorial te ayudará a lidiar con esos problemas de una vez por todas.

Partamos explicando que son los assets, los assets son todas las imágenes, sonidos, tipografías, películas, hojas de estilos y archivos javascript que que insertemos en nuestra página web.

Incorporando imágenes

En una página web normal podemos ingresar imágenes de ruta relativa (dentro de nuestro computador) simplemente usando el tag <img src=”imagen-prueba.png“> pero eso no lo podemos hacer en rails, bueno realmente podemos hacer algo como <img src=”assets/images/imagen-prueba.png”> siempre y cuando tengamos una imagen dentro de la carpeta /assets/images/ pero eso funcionará sólo en el entorno local y fallará en producción. La forma correcta de hacerlo es ocupando img_tag o asset_path, la segunda sirve para todos los tipos de assets así que voy a partir explicando esa.

Para utilizar asset_path, un método de rails, tenemos que utilizar el formato erb, o sea incorporar la zanahoria <%= %> dentro del tag img con el método y el llamado el archivo, o sea quedaría así:

<img src="<%= asset_path 'imagen-prueba.png' %>">

Hay que tener cuidado con un par de cosas, primero, la imagen si tiene que existir dentro de la carpeta /app/assets/images/, pero además debemos tener mucho cuidado con la sintaxis de asset_path, la zanahoria (<%=) debe estar pegada a la primera comilla y el cierre de la zanahoria debe estar pegada a la segunda, esto para evitar dejar espacios vacíos en el nombre del archivo.

Hay una forma mucho más fácil de hacer esto, pero no aplica a los otros assets, y es ocupando el helper image_tag, para incorporar la misma foto sería:

<%= image_tag 'imagen-prueba.png' %>

Obviamente que para que cualquiera de estas soluciones funcione tenemos que estar ocupando la extensión erb, o sea nuestro archivo debe ser .html.erb (por defecto en ruby)

Incorporando CSS

Los archivos CSS son fáciles de incorporar, simplemente debes colocarlo dentro de la carpeta apps/assets/stylesheets, todos los archivos de ahí se cargaran en cada página gracias a que dentro de nuestro layout tenemos por defecto la siguiente línea.

<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %>

Pero esa línea lo que hace no es cargar absolutamente todos los css, sólo carga el archivo app/assets/stylesheets/application.css el cuál además de un par de comentarios contiene:

*
*= require_tree .
*= require_self
*/

require_tree es la línea responsable de cargar recursivamente (directorios y subdirectorios) todos los css dentro de esta carpeta, mientras que require_self carga el css contenido dentro del archivo, si cambias el orden primero se carga el css dentro de application y luego los otros archivos. Por otro lado si fuera necesario establecer un orden de carga este se puede especificar en este mismo archivo a través de la instrucción require y nombrando los css, por ejemplo:

/* …
*= require reset
*= require layout
*= require chrome
*= require_tree .
*/

este cargaría primero el archivo reset, luego layout y luego chrome y luego el resto, si hubiese css dentro de este archivo se ignoraría puesto que no se incluye require_self.

Incorporando javascript

Con respecto a este punto no me voy a extender puesto que funciona exactamente igual que los css, la diferencia es que la línea que los carga dentro del layout es:

<%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>

el archivo cargado es app/assets/javascript/application.js y funciona de la misma forma que application.css

Incorporando imágenes (u otros assets) dentro del CSS y del JS

Los assets incorporados dentro de los archivos css están sujetos a las mismas condiciones que los que ya hemos visto, pero para poder ocupar el método asset_path dentro de estos necesitamos que estos archivos además contengan la extensión .erb.

O sea por ejemplo si tenemos un archivo style.css el cual pone una imagen como background de fondo, entonces debemos nombrarlo style.css.erb y luego dentro de la url(fondo1.png) cambiarlo por

url(<%= asset_path fondo1.png %>)

es muy importante que nos fijemos bien en la sintaxis de nuestro archivo css, si bien CSS es tolerante a fallos debido al principio de graceful degradation la precompilación de archivos CSS no es tan tolerante y un punto y coma sobrante causara problemas a la hora de enviar nuestro proyecto a producción.

Incorporando tipografías locales

Para incorporar tipografías todavía nos falta aprender una cosa más, a manipular que archivos y que carpetas son parte del asset_path, para esto vamos a modificar el archivo /config/application.rb y dentro de la clase vamos a agregar esto.

config.assets.paths << Rails.root.join('app', 'assets', 'fonts')
config.assets.precompile += %w( .svg .eot .woff .ttf)

para Rails 4.2 (y en adelante) se creó un nuevo archivo para manejar los assets en /config/initializers/assets.rb, si estas trabajando en ese archivo agrega los assets al proceso de precompilación ahí siguiendo la nomenclatura comentada del archivo.

Finalmente cuando se modifica el archivo application.rb o un initializers hay que reiniciar el servidor, y con eso ya deberíamos tener acceso a nuestras tipografías.

La carpeta vendor/assets

Algunos sistemas como bower ocupan por defecto una carpeta dentro vendor que no viene agregada al asset pipeline por defecto, debes agregar todas las carpetas que vas a ocupar de la misma forma que agregamos las fonts en el paso anterior.

config.assets.paths << Rails.root.join('vendor', 'assets')

También para hacer más fácil las referencias puedes agregar subcarpetas

config.assets.paths << Rails.root.join('vendor', 'assets', 'stylesheets')
config.assets.paths << Rails.root.join('vendor', 'assets', 'javascript')

Probando la precompilación de assets

para probar que los assets se precompilen correctamente, podemos utilizar la siguiente línea en bash.

RAILS_ENV=Production rake assets:precompile

¿Enviar o no los assets a producción?

En mi experiencia una cosa que siempre causa caos, es agregar los assets a git, no lo hagas, si en algún momento precompilaste para probar que todo esté bajo control acuérdate de limpiar con

rake assets:clean
RAILS_ENV=Production rake assets:clean

y si por algún motivo llega a quedar algún archivo dentro de public/assets bórralos.

¿Tus assets no funcionan en Heroku?

Si tus assets no funcionan en Heroku lo que debes hacer es agregar la gema rails_12factor al gemfile.

#happyCoding

Share
January 26, 2015 Rubyruby, Ruby on Rails, Tutoriales

Borrar un Scaffold en Ruby on Rails

borrar scaffold en ruby on rails

Hay veces en que las cosas no salen bien y hay que hacer rollback en la vida. Por suerte, tenemos el comando rake db:rollback para deshacer migraciones en Rails, Cuando usarlo? bueno, si nos equivocamos en el nombre del scaffold, nos quedó mal hecho o un sin fin de razones más por las que quisieras borrar un Scaffold en Ruby on Rails. En esta infografía te explico como borrar uno y no morir en el intento.

Hay otras formas de borrar un Scaffold, como por ejemplo hacer una nueva migración que destruya la tabla y borrar el scaffold a mano. pero es más trabajo.

Esta es la forma fácil y bonita:

borra-scaffold-rake-db-rollback-en-ruby-on-rails

Share
January 24, 2015 Bases de datos, TutorialesRuby on Rails, scaffold
Page 1 of 712345...»Last »
Tags
mostbetslotticamostbet UZslottica PLkudos casino no deposit bonuskudos casino bonus codeskudos casino free chipkudos casino loginRuby on Railskudos casino sister siteskudos casino free spinskudos casino no deposit bonus codesaviatoraviator KZozwincasinoozwincasino AUemprendimientos digitalesfortunetigerfortunetiger BRTutorialesDiseño20bet plbet20 casinokudos casinoLondonLondon UZ20 betbj88slottica BR20bet casino logowanie20bet kasynoHerramientas20 bet casinohtml5gratogana entrargratogana juegos en vivo20bet logowanieWordpressrubyLanding PageBases de datosplaycroco casinoplay crocogratogana onlineparty poker casino
  • PADANGTOTO
  • PADANGTOTO
  • PADANGTOTO
  • PADANGTOTO
  • PADANGTOTO
  • PADANGTOTO
  • PADANGTOTO
  • PADANGTOTO
  • PADANGTOTO
  • PADANGTOTO
  • PADANGTOTO
  • PADANGTOTO
  • PADANGTOTO
  • PADANGTOTO
  • PADANGTOTO
  • PADANGTOTO
  • PADANGTOTO
  • PADANGTOTO
  • PADANGTOTO
  • PADANGTOTO
  • PADANGTOTO
  • PADANGTOTO
  • Interesado en otros tipos de emprendimiento?

    Quieres aprender a importar y exportar productos a todo el mundo? entra aquí

  • LOMBOKTOTO
  • LOMBOKTOTO
  • LOMBOKTOTO
  • LOMBOKTOTO
  • LOMBOKTOTO
  • LOMBOKTOTO
  • LOMBOKTOTO
  • LOMBOKTOTO
  • LOMBOKTOTO
  • LOMBOKTOTO
  • LOMBOKTOTO
  • LOMBOKTOTO
  • LOMBOKTOTO
  • LOMBOKTOTO
  • No te pierdas ningún artículo.

  • RAMALANTOTO
  • RAMALANTOTO
  • RAMALANTOTO
  • RAMALANTOTO
  • RAMALANTOTO
  • RAMALANTOTO
  • RAMALANTOTO
  • RAMALANTOTO
  • RAMALANTOTO
  • RAMALANTOTO
  • RAMALANTOTO
  • RAMALANTOTO
  • RAMALANTOTO
  • RAMALANTOTO
  • IRAMATOGEL
  • IRAMATOGEL
  • IRAMATOGEL
  • IRAMATOGEL
  • IRAMATOGEL
  • IRAMATOGEL
  • IRAMATOGEL
  • IRAMATOGEL
  • IRAMATOGEL
  • IRAMATOGEL
  • IRAMATOGEL
  • IRAMATOGEL
  • IRAMATOGEL
  • IRAMATOGEL
  • IRAMATOGEL
  • IRAMATOGEL
  • IRAMATOGEL
  • 2025 © UGMSLOT
    Planer theme by Dankov