$ cd dev/ruby/rortutorials/
Creamos el proyecto con el siguiente comando:
$ rails new MiPrimerApp
luego ingresamos al directorio raiz del proyecto.
$ cd MiPrimerApp
E iniciamos el servidor web con el siguiente comando:
$ rails server
ó también podemos escribir
$ rails s
De esta forma cargamos la aplicación para verla en el navegador, generalmente por defecto en el puerto 3000 de localhost (localhost:3000)
Ctrl+C para apagar el server.
Si ingresamos "localhost:3000" (sin las comillas) en la barra de direcciones del navegador visualizaremos la aplicación.
Ahora vamos a crear un controlador que se va a llamar "Welcome" y que va a tener un método que se llamará "index":
rails generate controller welcome index
output:
Running via Spring preloader in process 7717
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
Ahora si ingresamos a http://localhost:3000/welcome/index
Veremos una nueva página con el siguiente contenido:
Welcome#index
Find me in app/views/welcome/index.html.erb
Ahora vamos a editar el archivo index.html.erb que se encuentra en app/views/welcome/ y reemplazaremos todo su contenido por la siguiente línea:
<h2>Hello World</h2>
Si en el navegador vamos nuevamente a http://localhost:3000/welcome/index veremos que cambio el contenido de la página por "Hello World".
El nombre de modelo debe ser el singular del nombre de la tabla. Por ejemplo si un modelo se llama Article, el nombre de la tabla va a ser Articles en plural. Se recomienda escribir estos nombre en inglés por que rails puede obtener el plural o el singular de palabras en inglés.
$ rails generate model Article title body:text visits_count:integer
En el campo title será un string, cuando no especificas el tipo de dato, rails asume que el tipo de dato del campo será un string.
output:
Running via Spring preloader in process 11964
invoke active_record
create db/migrate/20160221035559_create_articles.rb
create app/models/article.rb
invoke test_unit
create test/models/article_test.rb
create test/fixtures/articles.yml
Finalizado el proceso, este genero automáticamente varios archivos, por ejemplo podemos encontrar el archivo db/migrate/20160221035559_create_articles.rb donde este tendrá el siguiente contenido:
class CreateArticles < ActiveRecord::Migration
def change
create_table :articles do |t|
t.string :title
t.text :body
t.integer :visits_count
t.timestamps null: false
end
end
end
También podemos encontrar el modelo Article que se encuentra en app/models y su contenido es el siguiente:
class Article < ActiveRecord::Base
end
Migration
Migration se utiliza para crear el esquema de la base de datos (tablas, campos, etc) sin necesidad de escribir sql. Para realizar una migración ingresamos el siguiente comando:
$ rake db:migrate
output:
== 20160221035559 CreateArticles: migrating ===================================
-- create_table(:articles)
-> 0.0016s
== 20160221035559 CreateArticles: migrated (0.0017s) ==========================
Rollback
Si queremos volver a la version anterior del migration existe un método que se llama rollback, que hace lo opuesto a lo que hace el método change. Para hacer rollback ejecutamos el siguiente comando:
$ rake db:rollback
output:
== 20160221035559 CreateArticles: reverting ===================================
-- drop_table(:articles)
-> 0.0004s
== 20160221035559 CreateArticles: reverted (0.0199s) ==========================
La consola de rails permite utilizar métodos de rails y de la aplicación. Para abrir la consola ejecutar:
$ rails console
Running via Spring preloader in process 12182
Loading development environment (Rails 4.2.5)
irb(main):001:0> Article.all
Article Load (0.7ms) SELECT "articles".* FROM "articles"
=> #<ActiveRecord::Relation []>
irb(main):002:0> Article.find(1)
Article Load (0.2ms) SELECT "articles".* FROM "articles" WHERE "articles"."id" = ? LIMIT 1 [["id", 1]]
ActiveRecord::RecordNotFound: Couldn't find Article with 'id'=1
Vamos a crear un controlador manualmente. En la carpeta app/controllers creamos un archivo llamado "articles_controller.rb". Si trabajamos con sublime text podemos escribir "cl" y aparecer un dropdown autocompletar, seleccionamos la segunda opción, Create controller class (Crear una clase controlador). Luego modificamos el código:
class ArticlesController < ApplicationController
#GET /articles
def index
@articles = Article.all
end
end
Creamos el método index y dentro de él se invoca el método all del modelo Article, este retorna un objeto que se asigna a la variable @articles que es una variable de clase y nos permitirá pasar los datos a la vista. Podemos ver que ArticlesController hereda de ApplicationController que se encuentra en app/controller/application_controller.rb.
La variable @articles será accesible tanto en la vista como en el controlador. Las variables que no comienzan con el "@" sólo son accesibles dentro del controlador.
Una vez creado el método index debemos crear su respectiva vista. En app/views creamos la carpeta articles y dentro de esta carpeta creamos la vista "index.html.erb" con el siguiente contenido:
<%= @articles.inspect %>
inspect es un método de ruby para inspeccionar un objeto.
En la terminal ejecutamos rails console.
$ rails console
> Article.all
output:
Article Load (0.9ms) SELECT "articles".* FROM "articles"
=> #<ActiveRecord::Relation []>
La tabla no tiene registros así que crearemos el primer artículo ingresando lo siguiente:
> Article.create(title:"Primer articulo", body: "Bienvenidos a mi blog", "visits_count": 0)
output:
(0.1ms) begin transaction
SQL (0.3ms) INSERT INTO "articles" ("title", "body", "visits_count", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?) [["title", "Primer articulo"], ["body", "Bienvenidos a mi blog"], ["visits_count", 0], ["created_at", "2016-02-21 18:48:57.128831"], ["updated_at", "2016-02-21 18:48:57.128831"]]
(157.9ms) commit transaction
=> #<Article id: 1, title: "Primer articulo", body: "Bienvenidos a mi blog", visits_count: 0, created_at: "2016-02-21 18:48:57", updated_at: "2016-02-21 18:48:57">
Ahora si visitamos la página http://localhost:3000/articles veremos lo siguiente:
#<ActiveRecord::Relation [#<Article id: 1, title: "Primer articulo", body: "Bienvenidos a mi blog", visits_count: 0, created_at: "2016-02-21 18:48:57", updated_at: "2016-02-21 18:48:57">]>
1.- Crear un proyecto:
$ rails new mi_proyecto
2.- Ubicarse en el directorio recien creado
$ cd mi_proyecto
3.- Crear una tabla persona
$ rails g scaffold persona nombre:string direccion:string telefono:string fechadeEntrada:date
output:
Running via Spring preloader in process 8241
invoke active_record
create db/migrate/20160220200743_create_personas.rb
create app/models/persona.rb
invoke test_unit
create test/models/persona_test.rb
create test/fixtures/personas.yml
invoke resource_route
route resources :personas
invoke scaffold_controller
create app/controllers/personas_controller.rb
invoke erb
create app/views/personas
create app/views/personas/index.html.erb
create app/views/personas/edit.html.erb
create app/views/personas/show.html.erb
create app/views/personas/new.html.erb
create app/views/personas/_form.html.erb
invoke test_unit
create test/controllers/personas_controller_test.rb
invoke helper
create app/helpers/personas_helper.rb
invoke test_unit
invoke jbuilder
create app/views/personas/index.json.jbuilder
create app/views/personas/show.json.jbuilder
invoke assets
invoke coffee
create app/assets/javascripts/personas.coffee
invoke scss
create app/assets/stylesheets/personas.scss
invoke scss
create app/assets/stylesheets/scaffolds.scss
4.- Migrar
$ rake db:migrate
output:
== 20160220200743 CreatePersonas: migrating ===================================
-- create_table(:personas)
-> 0.0009s
== 20160220200743 CreatePersonas: migrated (0.0010s) ==========================
5.- Desde la terminal ejecutar el servidor web.
$ rails s
6.- Desde el navegador ingresar a http://localhost:3000/personas