Creación de un proyecto en Rails - moiseserg/rubyWebDev GitHub Wiki

Una introducción más completa: Getting Started with Rails

Para mostrar lo anterior supongamos que se desea generar un sistema para una empresa maquiladora, para dicha empresa es necesario tener datos de los empleados y las tareas que realizará cada empleado.

Lo primero que se debe hacer es crear el proyecto empresa, para ello se usará la instrucción

rails new empresa

Para lo que el sistema generará la siguiente salida:

create  
      create  README.md
      create  Rakefile
      create  config.ru
      create  .gitignore
      create  Gemfile
      ...
      remove  config/initializers/cors.rb
      remove  config/initializers/new_framework_defaults_5_1.rb
         run  bundle install
The dependency tzinfo-data (>= 0) will be unused by any of the platforms Bundler is installing for. Bundler is installing for ruby but the dependency is only for x86-mingw32, x86-mswin32, x64-mingw32, java. To add those platforms to the bundle, run `bundle lock --add-platform x86-mingw32 x86-mswin32 x64-mingw32 java`.
Fetching gem metadata from https://rubygems.org/.........
Fetching gem metadata from https://rubygems.org/.
Resolving dependencies.....
Using rake 12.3.0
Using concurrent-ruby 1.0.5
Fetching i18n 0.9.3
Installing i18n 0.9.3
...
Fetching uglifier 4.1.4
Installing uglifier 4.1.4
Fetching web-console 3.5.1
Installing web-console 3.5.1
Bundle complete! 16 Gemfile dependencies, 70 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.
         run  bundle exec spring binstub --all
* bin/rake: spring inserted
* bin/rails: spring inserted   

y de forma automática ejecutará la instrucción bundle install que instala las gemas (bibliotecas) que se cargan por default al proyecto.

Si cambia las bibliotecas para su proyecto debe ejecutar bundle install para hacer las instalaciones/modificaciones necesarias.

bundle install 

Se puede apreciar la estructura del proyecto usando un navegador de archivos, se tendrán las siguientes carpetas y archivos que se muestran en la figura:

estructura

Entre las carpetas que se instalan, se listan las de uso más común:

Carpeta Descripción
app/ Esta carpeta contiene el núcleo de la aplicación incluye los modelos, vistas, controladores y los helpers.
app/assets Contiene las hojas de estilo en cascada (CSS), archivos JavaScript y las imágenes que se deseen cargar al proyecto de manera local.
bin/ Archivos binarios ejecutables
config/ Archivos de configuración
db/ Archivos para la base de datos
lib/ Módulos de librerias
log/ Archivos de registro
public/ Páginas de errores y páginas que se cargarán de manera pública.
test/ Esta carpeta guarda los archivos para pruebas usando comunmente rspec o cucumber
tmp/ Archivos temporales
vendor/ Código de plugins y algunas gemas de terceros.
README.md Descripción breve de la aplicación para que aparezca en el git
Rakefile Archivo usado para el comando rake
Gemfile Archivo de configuración de las gemas que se usarán en el proyecto.
.gitignore Patrones de archivos que no se subirán al servidor git – por ejemplo archivos temporales que generan los editores de texto cuando se están modificando los archivos.

Lanzamiento del servicio Web

Para poder lanzar la aplicación se ejecuta el siguiente comando:

rails server

Aquí un ejemplo de la salida generada por el comando:

$ rails server
=> Booting Puma
=> Rails 5.1.4 application starting in development 
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.11.2 (ruby 2.5.0-p0), codename: Love Song
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:3000
Use Ctrl-C to stop
Started GET "/" for 127.0.0.1 at 2018-01-23 10:59:48 -0600
Processing by Rails::WelcomeController#index as HTML
  Rendering /home/emmanuel/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/railties-5.1.4/lib/rails/templates/rails/welcome/index.html.erb
  Rendered /home/emmanuel/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/railties-5.1.4/lib/rails/templates/rails/welcome/index.html.erb (13.1ms)
Completed 200 OK in 266ms (Views: 39.4ms)

La salida obtenida es la siguiente usando la url y puerto indicados por la orden rails server:

empresa server

Configuración de la base de datos

Para configurar el acceso a BD, abrir el archivo config/database.yml, si está configurado el proyecto usando SQLite, podrá ver algo como lo siguiente:

# SQLite version 3.x
#   gem install sqlite3
#
#   Ensure the SQLite 3 gem is defined in your Gemfile
#   gem 'sqlite3'
#
default: &default
  adapter: sqlite3
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  timeout: 5000

development:
  <<: *default
  database: db/development.sqlite3

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  <<: *default
  database: db/test.sqlite3

production:
  <<: *default
  database: db/production.sqlite3

Si la configuración es para usar con MySQL, el archivo será como el siguiente:

# MySQL. Versions 5.1.10 and up are supported.
#
# Install the MySQL driver
#   gem install mysql2
#
# Ensure the MySQL gem is defined in your Gemfile
#   gem 'mysql2'
#
# And be sure to use new-style password hashing:
#   http://dev.mysql.com/doc/refman/5.7/en/old-client.html
#
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch(  "RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: password
  socket: /var/run/mysqld/mysqld.sock

development:
  <<: *default
  database: pizzeria_development

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  <<: *default
  database: pizzeria_test

# As with config/secrets.yml, you never want to store sensitive information,
# like your database password, in your source code. If your source code is
# ever seen by anyone, they now have access to your database.
#
# Instead, provide the password as a unix environment variable when you boot
# the app. Read http://guides.rubyonrails.org/configuring.html#configuring-a-database
# for a full rundown on how to provide these environment variables in a
# production deployment.
#
# On Heroku and other platform providers, you may have a full connection URL
# available as an environment variable. For example:
#
#   DATABASE_URL="mysql2://myuser:mypass@localhost/somedatabase"
#
# You can use this database configuration with:
#
#   production:
#     url: <%= ENV['DATABASE_URL'] %>
#
production:
  <<: *default
  database: pizzeria_production
  username: pizzeria
  password: <%= ENV['PIZZERIA_DATABASE_PASSWORD'] %>

En caso de haber seleccionado SQLite o MySQL, las gemas también cambian. El archivo Gemfile de cada aplicación tiene la gema de acuerdo al gestor de BD que se haya seleccionado:

database

Cualquier cambio a las gemas requiere la actualización usando bundle install desde la raíz del proyecto.

Creación de la base de datos con MySQL

Para crear la base de datos y probar la comunicación, deberá usar el comando rake db:create

$ rake db:create
Created database 'empresa_development'
Created database 'empresa_test'
  • La interfaz de phpMyAdmin mostraría la base de datos creada, tal como lo indica el archivo config/database.yml

database

Después de ejecutar la orden explicada anteriormente:

$ rails generate scaffold Empleado nombre:string direccion:text edad:integer  

deberá poder ver los cambios en la tabla generada como empleados

Creación del modelo Empleado

Se puede crear un modelo usando scaffold, esto es un script que genera de manera automática los archivos de modelo, vista y controlador necesarios. En caso de haber instalado rspec genera los archivos para las pruebas CRUD de manera automática.

Si el modelo de empleado tiene los siguientes campos:

Campo Tipo
nombre string - cadena de texto
direccion* text - cadena de texto larga
edad Integer – valor entero

*no se usan acentos ya que los modelos se crean usando el alfabeto inglés.

La línea que permite generar este modelo usando scaffold es la siguiente:

$ rails generate scaffold Empleado nombre:string direccion:text edad:integer  

La ejecución genera la siguiente salida:

$ rails generate scaffold Empleado nombre:string direccion:text edad:integer  
Running via Spring preloader in process 25418
      invoke  active_record
      create    db/migrate/20180123172257_create_empleados.rb
      create    app/models/empleado.rb
      invoke    test_unit
      create      test/models/empleado_test.rb
      create      test/fixtures/empleados.yml
      invoke  resource_route
       route    resources :empleados
      invoke  scaffold_controller
      create    app/controllers/empleados_controller.rb
      invoke    erb
      create      app/views/empleados
      create      app/views/empleados/index.html.erb
      create      app/views/empleados/edit.html.erb
      create      app/views/empleados/show.html.erb
      create      app/views/empleados/new.html.erb
      create      app/views/empleados/_form.html.erb
      invoke    test_unit
      create      test/controllers/empleados_controller_test.rb
      invoke    helper
      create      app/helpers/empleados_helper.rb
      invoke      test_unit
      invoke    jbuilder
      create      app/views/empleados/index.json.jbuilder
      create      app/views/empleados/show.json.jbuilder
      create      app/views/empleados/_empleado.json.jbuilder
      invoke  test_unit
      create    test/system/empleados_test.rb
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/empleados.coffee
      invoke    scss
      create      app/assets/stylesheets/empleados.scss
      invoke  scss
      create    app/assets/stylesheets/scaffolds.scss

Es importante verificar la estructura de archivos que ha sido cambiada:

Anteriormente, parte de los directorios y archivos era la siguiente:

$ tree
.
├── app
│   ├── assets
│   │   ├── javascripts
│   │   │   ├── application.js
│   │   │   ├── cable.js
│   │   │   └── channels
│   │   └── stylesheets
│   │       └── application.css
│   ├── controllers
│   │   ├── application_controller.rb
│   │   └── concerns
│   ├── helpers
│   │   └── application_helper.rb
│   ├── models
│   │   ├── application_record.rb
│   │   └── concerns
│   └── views
│       └── layouts
│           ├── application.html.erb
│           ├── mailer.html.erb
│           └── mailer.text.erb
├── db
│   └── seeds.rb
├── test
│   ├── application_system_test_case.rb
│   ├── controllers
│   ├── fixtures
│   │   └── files
│   ├── helpers
│   ├── integration
│   ├── mailers
│   ├── models
│   ├── system
│   └── test_helper.rb

Se muestran las partes donde se agregaron los archivos usando scaffold:

$ tree
.
├── app
│   ├── assets
│   │   ├── javascripts
│   │   │   ├── application.js
│   │   │   ├── cable.js
│   │   │   ├── channels
│   │   │   └── empleados.coffee
│   │   └── stylesheets
│   │       ├── application.css
│   │       ├── empleados.scss
│   │       └── scaffolds.scss
│   ├── controllers
│   │   ├── application_controller.rb
│   │   ├── concerns
│   │   └── empleados_controller.rb
│   ├── helpers
│   │   ├── application_helper.rb
│   │   └── empleados_helper.rb
│   ├── models
│   │   ├── application_record.rb
│   │   ├── concerns
│   │   └── empleado.rb
│   └── views
│       ├── empleados
│       │   ├── edit.html.erb
│       │   ├── _empleado.json.jbuilder
│       │   ├── _form.html.erb
│       │   ├── index.html.erb
│       │   ├── index.json.jbuilder
│       │   ├── new.html.erb
│       │   ├── show.html.erb
│       │   └── show.json.jbuilder
│       └── layouts
│           ├── application.html.erb
│           ├── mailer.html.erb
│           └── mailer.text.erb
├── db
│   ├── migrate
│   │   └── 20180123172257_create_empleados.rb
│   └── seeds.rb
├── test
│   ├── application_system_test_case.rb
│   ├── controllers
│   │   └── empleados_controller_test.rb
│   ├── fixtures
│   │   ├── empleados.yml
│   │   └── files
│   ├── helpers
│   ├── integration
│   ├── mailers
│   ├── models
│   │   └── empleado_test.rb
│   ├── system
│   │   └── empleados_test.rb
│   └── test_helper.rb

En la siguiente imagen se muestran algunos de los archivos generados. arbol

Después de crearse los archivos, la base de datos debe ser actualizada para poder enseguida hacer conexiones para insertar, consultar ... información acerca del nuevo elemento creado, esto se hace usando:

$ rails db:migrate RAILS_ENV=development

La ejecución genera una salida como la siguiente:

$ rails db:migrate RAILS_ENV=development
== 20180123181704 CreateEmpleados: migrating ==================================
-- create_table(:empleados)
   -> 0.0662s
== 20180123181704 CreateEmpleados: migrated (0.0663s) =========================

El no hacer dicha instrucción genera un mensaje de error como el siguiente cuando se accede a empleados: arbol

CRUD (Create, Read, Update, Destroy)

Puedes ingresar a la página indicada por rails server y se pueden usar las operaciones

  • Crear
  • Leer
  • Actualizar
  • Destruir

sobre la tabla empleados, la página generada es como la siguiente:

arbol

Se aprecia:

  • http://localhost:3000/empleados la ruta con la que se entró a los elementos de la tabla empleados
  • Al inicio (imagen de la izquierda) está vacía la lista de empleados.
  • Enseguida, al hacer clic en New Empleado se pueden insertar los datos de un nuevo empleado según se especificaron los campos: nombre, dirección y edad.
  • Muestra una ventana de tipo Read es decir muestra el dato insertado.
  • Si se regresa a http://localhost:3000/empleados ya aparece el empleado insertado.

En la interfaz de phpMySQL puede verificarse:

  • La estructura de los empleados. arbol

  • y el contenido (opción examinar). arbol

⚠️ **GitHub.com Fallback** ⚠️