En esta página:
Demo
En la segunda parte o la parte anterior de este tutorial realizamos diferentes tareas para integrar Ruby on Rails a una base de datos.
Instalamos una gema que nos permite conectar el sistema CRUD a la base de datos MySQL. Asimismo, creamos nuestro modelo, una migración para crear la tabla postres en la base de datos test y realizamos otras tareas adicionales.
En esta tercera parte continuaremos con el tutorial Como Crear Un CRUD Con Ruby on Rails 7, vamos con ello.
Partes
Controlador
Ruby on Rails nos permite crear un controlador y al mismo tiempo las vistas HTML que usará ese controlador.
Para crear el controlador con las vistas HTML del CRUD ejecutamos el siguiente comando:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
rails g controller postres index leer crear actualizar create app/controllers/postres_controller.rb route get 'postres/index' get 'postres/leer' get 'postres/crear' get 'postres/actualizar' invoke erb create app/views/postres create app/views/postres/index.html.erb create app/views/postres/leer.html.erb create app/views/postres/crear.html.erb create app/views/postres/actualizar.html.erb invoke test_unit create test/controllers/postres_controller_test.rb invoke helper create app/helpers/postres_helper.rb invoke test_unit |
Luego de ejecutar el comando anterior se ha creado un archivo llamado postres_controller.rb, este archivo se ha creado en crud-rails-7 > app > controllers > postres_controller.rb:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
/crud-rails-7 ├── /app ├── /assets ├── /channels ├── /controllers ├── /concerns ├── application_controller.rb ├── postres_controller.rb // Se ha creado este Archivo ├── /helpers ├── /javascript ├── /jobs ├── /mailers ├── /models ├── /views ├── /bin ├── /config ├── /db ├── /lib ├── /log ├── /public ├── /storage ├── /test ├── /tmp ├── /vendor ├── .gitignore ├── .ruby-version ├── config.ru ├── Gemfile ├── Gemfile.lock ├── package.json ├── Rakefile ├── Gemfile.lock ├── README.md |
Abro el archivo postres_controller.rb y agregamos los métodos Crear, Leer, Actualizar y Eliminar (En el código he colocado comentarios para explicar que hace bloque de código):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 |
class PostresController < ApplicationController @root_url = "/postres/index" layout 'application' add_flash_types :notice # Listar todos los registros de la Base de Datos def index @postres = Postre.all() end # Leer los detalles de un registro def leer @postres = params[:url] @postres = Postre.where(url: @postres) end # Llamamos a la vista con el formulario para crear un registro def crear @postres = Postre.new end # Procesamos la creación de un registro en la base de datos def insertar # Subimos el Archivo al servidor uploaded_file = params[:img] File.open(Rails.root.join('public', 'assets/img', uploaded_file.original_filename), 'wb') do |file| file.write(uploaded_file.read) end @postres = Postre.new(parametros) # Insertamos un registro en la base de datos if @postres.save @postres.update_column(:img, uploaded_file.original_filename) else render :new end # Redireccionamos a la vista principal con mensaje @ini = "/postres/index" flash[:notice] = "Creado Correctamente !" redirect_to @ini end # Llamamos a la vista con el formulario para actualizar un registro def actualizar # Pasamos el 'id' del registro a actualizar (método index) @postres = Postre.find(params[:id]) @postres = Postre.where(id: @postres) end # Procesamos la actualización de un registro en la base de datos def editar # Pasamos el 'id' del registro a actualizar (método editar) @postres = Postre.find(params[:id]) # Actualizamos el Archivo al servidor uploaded_file = params[:img] if params[:img].present? # Eliminamos el archivo (imagen) anterior simg = Postre.where(:id => @postres).pluck(:img) imgeliminar = Rails.root.join('public', 'assets/img', simg.join) File.delete(Rails.root + imgeliminar) # Subimos el nuevo archivo (imagen) File.open(Rails.root.join('public', 'assets/img', uploaded_file.original_filename), 'wb') do |file| file.write(uploaded_file.read) end else # end # Actualizamos un determinado registro en la base de datos if @postres.update(parametros) # Actualizamos la columna 'img' de la base de datos if params[:img].present? @postres.update_column(:img, uploaded_file.original_filename) else # end else render :edit end # Redireccionamos a la vista principal con mensaje @ini = "/postres/index" flash[:notice] = "Actualizado Correctamente !" redirect_to @ini end # Procesamos la eliminación de un registro de la base de datos def eliminar # Eliminamos un determinado registro en la base de datos, pasamos el 'id' del registro a eliminar @postres = Postre.find(params[:id]) # Eliminamos la imagen perteneciente al registro simg = Postre.where(:id => @postres).pluck(:img) imgeliminar = Rails.root.join('public', 'assets/img', simg.join) File.delete(Rails.root + imgeliminar) Postre.where(id: @postres ).destroy_all # Redireccionamos a la vista principal con mensaje @ini = "/postres/index" flash[:notice] = "Eliminado Correctamente !" redirect_to @ini end # Parámetros o campos que insertamos o actualizamos en la base de datos private def parametros params.permit(:nombre, :precio, :stock, :img, :url) end end |
Si observastes bien, al ejecutar el comando para crear el controlador Postres, le indique que se crearan 4 vistas HTML:
1 2 3 4 |
# Comando para crear el controlador 'postres' con sus vistas HTML rails g controller postres index leer crear actualizar |
Las 4 vistas HTML se crearon dentro de una carpeta llamada postres es decir en crud-rails-7 > app > views > postres:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
/crud-rails-7 ├── /app ├── /assets ├── /channels ├── /controllers ├── /helpers ├── /javascript ├── /jobs ├── /mailers ├── /models ├── /views ├── /layouts ├── /postres // Se ha creado este directorio llamado 'postres' con las vistas HTML para el sistema CRUD ├── actualizar.html.rb ├── crear.html.rb ├── index.html.rb ├── leer.html.rb ├── /bin ├── /config ├── /db ├── /lib ├── /log ├── /public ├── /storage ├── /test ├── /tmp ├── /vendor ├── .gitignore ├── .ruby-version ├── config.ru ├── Gemfile ├── Gemfile.lock ├── package.json ├── Rakefile ├── Gemfile.lock ├── README.md |
Para la vista Delete o eliminar, pues no la voy a crear, porque usaré JavaScript para eliminar los registros directamente en el listado principal de todos los registros, esto lo veremos en la parte de las vistas HTML con Bootstrap.
Rutas
Las rutas ya me las ha creado automáticamente Ruby on Rails, luego de crear el controlador con las vistas en el paso anterior, esto es genial.
Una manera de verificar si las rutas se han creado, es dirigiéndonos al archivo routes.rb que se encuentra en config > routes.rb:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
/crud-rails-7 ├── /app ├── /bin ├── /config ├── /environments ├── /initializers ├── /locales ├── application.rb ├── boot.rb ├── cable.yml ├── credentials.yml.enc ├── database.yml // Abre este archivo ├── environment.rb ├── importmap.rb ├── master.key ├── puma.rb ├── routes.rb // En este archivo se han creado las rutas para el sistema CRUD ├── storage.yml ├── /db ├── /lib ├── /log ├── /public ├── /storage ├── /test ├── /tmp ├── /vendor ├── .gitignore ├── .ruby-version ├── config.ru ├── Gemfile ├── Gemfile.lock ├── package.json ├── Rakefile ├── Gemfile.lock ├── README.md |
Si abrimos el archivo routes.rb podemos ver las rutas respectivas del sistema CRUD.
Asimismo agregamos algunas rutas personalizadas para ciertas tareas en el sistema CRUD (en el código explico que hace cada ruta):
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Rails.application.routes.draw do get 'postres/index' => 'postres#index' # Ruta de la vista principal de los registros get 'postres/leer/:url', to: 'postres#leer' # Ruta de la vista leer o ver los detalles de un registro get 'postres/crear' => 'postres#crear' # Ruta de la vista para crear un registro post 'postres/insertar' => 'postres#insertar' # Ruta que procesa la creación de un registro en la base de datos get 'postres/actualizar/:id', to: 'postres#actualizar' # Ruta de la vista para actualizar un registro post 'postres/editar/:id', to: 'postres#editar' # Ruta que procesa la actualización de un registro en la base de datos post 'postres/eliminar/:id', to: 'postres#eliminar' # Ruta para eliminar un registro de la base de datos # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html end |
Hasta este punto ya tenemos creado el controlador Postres y las vistas HTML iniciales. Asimismo configuramos las rutas para el sistema CRUD.
Ten Paciencia, lo que quiero es que entiendas todo el proceso para Crear este Proyecto y no llenarte el capitulo de mucho contenido porque te puedes marear y no tendrás un óptimo aprendizaje.
Nota (s)
- Los pasos y opciones mencionadas en este capitulo del tutorial pueden cambiar, esto no depende de nosotros, si no de los desarrolladores que dan soporte a Ruby on Rails, que suelen cambiar sus opciones de despliegue y configuración en futuras versiones.
- En el siguiente capitulo continuaré con la creación del código del Controlador Postres y otros detalles.
Síguenos en nuestras Redes Sociales para que no te pierdas nuestros próximos contenidos.