Antes de comenzar es necesario tener instalado Xcode y Homebrew.
Xcode se puede instalar desde la App Store
Homebrew es un gestor de paquetes para OS X.
En primer lugar, tenemos que descargar e instalar Homebrew con el siguiente comando:
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
Comprobar que no existen conflictos o problemas (Si existen conflictos, será necesario solucionarlos antes de continuar con esta guía):
$ brew doctor
Actualizar y realizar upgrade
$ brew update && brew upgrade
Instalando RVM y Ruby
$ \curl -L https://get.rvm.io | bash -s stable
$ source ~/.profile
$ rvm | head -n 1
$ rvm use ruby --install --default
$ ruby -v
Instalando Rails 4.2.6
$ gem install rails -v 4.2.6
$ rails --version
En la terminal ejecutar el siguiente comando:
$ rails new blog
Cambiamos al directorio de la aplicación
$ cd blog
Podemos ver que el directorio blog tiene una serie de archivos y carpetas generadas automáticamente que componen la estructura de una aplicación Rails.
A continuación veremos un resumen básico de la función de algunos archivos y carpetas que Rails crea por defecto:
Archivo/Carpeta | Proposito |
---|---|
app/ | Contiene los controladores, modelos, vistas, ayudantes (helpers), correos y los activos de la aplicación |
config/ | Configurar las rutas de la aplicación, base de datos y mucho más. |
db/ | Contiene el esquema de base de datos actual, así como las migraciones de bases de datos |
lib/ | Módulos de expansión para la aplicación |
log/ | Archivos de registro de aplicación |
public/ | La única carpeta con archivos que se pueden acceder desde un cliente. Contiene archivos estáticos |
test/ | Pruebas unitarias |
tmp/ | Archivos temporales |
vendor/ | Lugar para el código de terceros |
Cambiamos al directorio de la aplicación
$ cd blog
E ingresamos el siguiente comando:
$ rails server
Para detener el servidor ctrl + c
$ rails generate controller welcome index
Salida de la terminal:
Running via Spring preloader in process 46489
create app/controllers/welcome_controller.rb
route get 'welcome/index'
invoke erb
create app/views/welcome
create app/views/welcome/index.html.erb
invoke test_unit
create test/controllers/welcome_controller_test.rb
invoke helper
create app/helpers/welcome_helper.rb
invoke test_unit
invoke assets
invoke coffee
create app/assets/javascripts/welcome.coffee
invoke scss
create app/assets/stylesheets/welcome.scss
Donde:
welcome corresponde al nombre del controlador index al nombre del método o acción
Se creará un archivo controlador llamado welcome_controller.rb en app/controllers/ y una vista llamada index.html.erb en app/views/welcome/
welcome_controller.rb
class WelcomeController < ApplicationController
def index
end
end
Todos los controladores heredan de ApplicationController.
Todos los nombres de los archivos controladores tienen que terminar con _controller. Al usar la terminal para crear un controlador, Rails se encarga de agregar el _controller al nombre del archivo.
index.html.erb
<h1>Welcome#index</h1>
<p>Find me in app/views/welcome/index.html.erb</p>
Ahora levantamos el servidor web y en el browser visitaremos http://localhost:3000/welcome/index
El navegador nos mostrará la página que corresponde a la vista index.html.erb, método index del controlador WelcomeController
El archivo de rutas se encuentra en config/routes.rb
En este archivo podemos definir las rutas de nuestra aplicación, los verbos permitidos para cada ruta, etc.
Si queremos definir la ruta por defecto o ruta raíz.
Escribiremos:
root 'welcome#index'
Verbos HTTP:
- GET
- POST
- PATCH
- PUT
- DELETE
Cuando definimos una ruta, lo primero que hacemos es especificar el verbo HTTP que va a utilizar y luego el recurso
Ejemplo:
get 'books/get'
post 'books/create'
put 'books/update'
Esto se hace para protejer la aplicación y que a la aplicación sólo se pueda acceder a través de las acciones y verbos que nosotros definimos.
Podemos renombrar las rutas de la siguiente forma:
get 'special', to: 'welcome#index'
El segundo parámetro corresponde a un hash de opciones, la opción "to" nos permite definir que controlador y que acción van a responder a una ruta en especifico en este caso "special".
Si visitamos http://localhost:3000/special verémos la misma página que en http://localhost:3000/welcome/index
ERB es el motor de plantillas que viene en Rails por defecto. Está desarrollado en Ruby y permite crear plantillas combinando texto plano con código Ruby para la sustitución de variables y control de flujo, lo que hace que sean fáciles de escribir y mantener.
<h1>¡Bienvenidos a nuestro blog!</h1>
<% [1,2,3,4].each do |number| %>
<p>Número: <%=number%></p>
<%end%>
Para agregar un archivo css basta con agregarlo a la carpeta app/assets/stylesheets/
Rails automáticamente cargará el archivo en las vistas de la aplicación. Este comportamiento se debe a que en el directorio se encuentra un archivo llamado application.css y este contiene un "require_tree ." que indica que Rails debe incluir en las vistas todos los archivos css que se encuentren en este directorio.
Por convención Rails espera que el nombre del modelo sea el singular del nombre de la tabla. Es decir si nosotros llamamos a nuestro modelo Article, la tabla de la BD se llama Articles. Se recomienda que los nombres de los modelos esten en inglés.
$ rails generate model Article title body:text visits_count:integer
Salida de la terminal:
Running via Spring preloader in process 46623
invoke active_record
create db/migrate/20160725022823_create_articles.rb
create app/models/article.rb
invoke test_unit
create test/models/article_test.rb
create test/fixtures/articles.yml
Editar el archivo Gemfile que se encuentra en la raíz del proyecto y comentar la línea:
gem 'sqlite3'
Agregar la gema mysql2:
#gem 'sqlite3'
gem 'mysql2'
Luego creamos un grupo para el ambiente de test
group :test do
gem 'sqlite3'
end
Guardamos el archivo y en la terminal ejecutamos:
$ bundle install
Abrimos el archivo database.yml que se encuentra en config/
Reemplazamos la configuración de development por lo siguiente:
development:
adapter: mysql2
username: root
password: dev
host: 127.0.0.1
port: 3306
database: blog_facilito
pool: 5
timeout: 5000
Ahora vamos a crear la base de datos desde la terminal utilizando el siguiente comando:
$ rake db:create
Para ejecutar las migraciones en la terminal ejecutamos el siguiente comando:
$ rake db:migrate
Salida de la terminal:
== 20160725022823 CreateArticles: migrating ===================================
-- create_table(:articles)
-> 0.1358s
== 20160725022823 CreateArticles: migrated (0.1359s) ==========================
Para hacer rollback ejecutamos:
$ rake db:rollback
Salida de la terminal:
== 20160725022823 CreateArticles: reverting ===================================
-- drop_table(:articles)
-> 0.1231s
== 20160725022823 CreateArticles: reverted (0.1664s) ==========================
Los layouts se encargan de agrupar las vistas que tienen contenido en común. Todas nuestras vistas van a tener un título, hojas de estilos, javascript, van a tener la declaración del doctype, html, head, body por que es necesario que siempre exista esto en una página web. Entonces en lugar de estar reescribiendo esto vista por vista, se crea un layout y sólo se sustituye la parte que esta referenciada por la palabra yield por el contenido de nuestras vistas. Toda la estructura de nuestra página web debe ir en el layout.
**DRY (Don't repeat yourself) => No repetimos código **
Si nosotros repetimos código y luego tenemos que realizar un cambio este cambio se debe realizar en varias partes, en cambio si nosotros no repetimos código tenemos un software más mantenible ya que sólo debemos realizar el cambio en una sóla parte.
Los layouts debemos crearlos en app/views/layouts
Podemos utilizar el layout por default application.html.erb
Ejemplo:
<!DOCTYPE html>
<html>
<head>
<title>Blog</title>
<link href='https://fonts.googleapis.com/css?family=Roboto:400,700,300' rel='stylesheet' type='text/css'>
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %>
<%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
<%= csrf_meta_tags %>
</head>
<body>
<header>
<nav class="be-red white large-padding">
<ul class="no-list row center-xs middle-xs">
<li class="col-md">
<h1 class="no-margin" id="logo">Blog Facilito</h1>
</li>
<li class="col-md">
<%= link_to "Inicio", root_path %>
</li>
<li class="col-md">
Diseño
</li>
<li class="col-md">
Programación
</li>
<li class="col-md">
Tecnología
</li>
</ul>
</nav>
</header>
<%= yield %>
</body>
</html>
Vamos a abrir el archivo de rutas que se encuentra en config/routes.rb
En este archivo podemos definir un recurso REST de la siguiente forma:
resources :articles
Podemos definir los verbos que no queremos que esten permitidos:
resources :articles, except: [:delete]
O podemos definir los verbos que queremos que esten permitidos de la siguiente forma:
resources :articles, only: [:create, :show]
Cuando definimos un recurso lo que hace internamente la aplicación espera un controlador articles con un método por cada verbo y recurso:
resources :articles
=begin
get "/articles" index
post "/articles" create
delete "/articles/:id" destroy
get "/articles/:id" show
get "/articles/new" new
get "/articles/:id/edit" edit
patch "/articles/:id" update
put "/articles/:id" update
=end
Para crear un CRUD utilizando recursos REST debemos seguir los siguientes pasos:
- Definir un recurso en el archivo routes.rb. Ejemplo: resources :articles
- Crear archivo articles_controller.rb en app/controllers
- Crear la clase y sus métodos index, create, delete, show, new, edit, update
- Crear la carpeta que contendrá las vistas del controlador. Ejemplo: app/views/articles
- Crear las respectivas vistas de cada método: index.html.erb, show.html.erb, etc.
- Darle funcionalidad a cada uno de los métodos utilizando Active Record.
Abrir el archivo Gemfile y al final del archivo agregar lo siguiente:
gem 'devise'
Guardamos el archivo y en la terminal ejecutar:
$ bundle install
$ rails generate devise:install
-
definir root_url
-
En app/views/layouts/application.html.erb agregar flash messages:
<p class="notice"><%= notice %></p>
<p class="alert"><%= alert %></p>
Desde la terminal generar el modelo devise:
$ rails generate devise User
Ejecutar migración:
$ rake db:migrate
Generamos las vistas de devise:
$ rails g devise:views
Abrir el archivo Gemfile y al final del archivo agregar lo siguiente:
gem 'bootstrap-sass', '~> 3.3.6'
gem 'autoprefixer-rails'
Guardamos el archivo y en la terminal ejecutar el comando bundle install:
$ bundle install
Renombrar app/assets/stylesheets/application.css a app/assets/stylesheets/application.css.sass
Abrimos el archivo renombrado e importamos los css:
@import "bootstrap-sprockets"
@import "bootstrap"
Necesitas agregar:
//= require bootstrap-sprockets
En el archivo app/assets/javascripts/application.js:
//= require jquery
//= require jquery_ujs
//= require turbolinks
//= require bootstrap-sprockets
//= require_tree .
# Use SCSS for stylesheets
gem 'bootstrap-sass', '~> 3.3.6'
gem 'autoprefixer-rails'
gem "font-awesome-rails"
gem "will_paginate"
Nota: Siempre que agregues una gema al archivo Gemfile, debes ejecutar el comando bundle install.
Para generar un scaffold utilizaremos la terminal.
Sintaxis: rails generate scaffold {Nombre_modelo} {campo1_modelo campo2_modelo, etc.}
Ejemplo:
$ rails generate scaffold Comment user:references post:references body:text
Luego ejecutamos la migración:
$ rake db:migrate
Para el envío de correo electrónico podemos utilizar la terminal para generar parte del código.
Sintaxis:
rails g mailer {NombreMailer}
Ejemplo:
$ rails g mailer PostMailer