Cómo integrar ActiveAdmin en aplicaciones Rails con MongoDB

El uso de bases no relacionales está extendido gracias a la versatilidad que estas ofrecen, siempre dependiendo de los requerimientos y características de nuestras aplicaciones. Una de las bases no relacionales más usada es MongoDB.

ActiveAdmin tal vez sea la gema más utilizada, entre los desarrolladores de Ruby on Rails, para administrar de una forma fácil, y de rápido desarrollo, la data de las entidades de nuestras aplicaciones.

Para el desarrollo del demo del presente artículo se ha usado:

  • RVM para manejar las versiones de Ruby
  • Ruby 2.5.1
  • Rails 5.2.0

1. Creación de la applicación

La aplicación rails5-mongodb se creará excluyendo active recordporque no se usará una base relacional, y señalando que no se haga la instalación de las gemas mediante elbundle

rails new rails5-mongodb --skip-active-record --skip-bundle

Agregar los archivos .ruby-version .ruby-gemset para indicar la versión de ruby y el conjunto de gemas de la aplicación respectivamente.

.ruby-version

2.5.1

.ruby-gemset

mongodb-active-admin 

Agregar en el archivo Gemfile la gema mongoid que es un framework ODM (Object Document Mapper) para Mongo en Ruby. Esto es el equivalente a usar Active Record

gem 'mongoid'

Ingresar a la carpeta (folder o directorio) que contine el proyecto recién creado y correr el instalador de gemas mediante bundle:

gem install bundler
bundle install

Y por último, generar el archivo de configuración donde se indica la conexión a la base de mongoDB.

rails generate mongoid:config

Este último comando agrega el archivo config/mongoid.yml Por defecto la base se creará con el nombre rails5_mondodb_development

development:
# Configure available database clients. (required)
clients:
# Defines the default client. (required)
default:
# Defines the name of the default database that Mongoid can connect to.
# (required).
database: rails5_mongodb_development
# Provides the hosts the default client can connect to. Must be an array
# of host:port pairs. (required)
hosts:
- localhost:27017
options:
# Change the default write concern. (default = { w: 1 })
# write:
# w: 1

Se debe tomar en cuenta que no se necesita crear la base con el comando rails db:create ya que esta se crea con el primer insert a la base.

Ahora ya se puede subir el servidor con rails s

2. Generación de la entidad Book mediante scaffold

Usamos la facilidad que tiene el framework para crear la estructura mediante scaffold:

rails generate scaffold book title:string pages:integer author:string

Es importante notar, que si estamos acostumbrados a usar las convenciones de ActiveRecord, no se necesita “mapear” la clase con los atributos de la base. Pero cuando usamos MongoDb si se necesita mapear. El scaffold lo hace por nosotros, así, el archivo app/models/book.rm será generado de la siguiente forma

class Book
include Mongoid::Document
field :title, type: String
field :pages, type: Integer
field :author, type: String
end

Se conserva toda la funcionalidad y ventajas de la consola de Rails. Crearé mi primer libro usándola:

Book.create(title: 'Ruby on Rails', pages: 121, author: 'Ruby Master')

Y nuestro índice de libros, en la ruta localocalhost:3000/books se verá así:

3. Agregar Active Admin

La gema principal que se agregará es activeadmin-mongoid” y después de varios intentos de que funcione y buscar las gemas correctas y agregar algunas como “kaminari-mongoid” para manejar la paginación, el conjunto de gemas específicas para esta funcionalidad de ActiveAdmin son:

gem 'mongoid'#, git: 'https://github.com/mongodb/mongoid.git'
#hack
gem 'ransack', github: 'activerecord-hackery/ransack'
gem 'ransack-mongoid', github: 'activerecord-hackery/ransack-mongoid'
gem 'activeadmin-mongoid', '0.7.0'
gem 'devise'
gem 'kaminari-mongoid'

También fue necesario actualizar la gema “web-console”:

gem 'web-console', '3.5.1'

Y el archivo definitivo Gemfile quedó así:

source 'https://rubygems.org'
# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '5.2.0'
# Use SCSS for stylesheets
gem 'sass-rails', '~> 5.0'
# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 1.3.0'
# Use CoffeeScript for .coffee assets and views
# gem 'coffee-rails', '~> 4.1.0'
# See https://github.com/rails/execjs#readme for more supported runtimes
# gem 'therubyracer', platforms: :ruby
# Use jquery as the JavaScript library
gem 'jquery-rails'
# Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks
gem 'turbolinks'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 2.0'
# bundle exec rake doc:rails generates the API under doc/api.
gem 'sdoc', '>= 0.4.0', group: :doc
# Use ActiveModel has_secure_password
# gem 'bcrypt', '~> 3.1.7'
# Use Unicorn as the app server
# gem 'unicorn'
# Use Capistrano for deployment
# gem 'capistrano-rails', group: :development
#mongoDB
# gem 'mongoid', '~> 6.2.0'
gem 'mongoid'#, git: 'https://github.com/mongodb/mongoid.git'
#hack
gem 'ransack', github: 'activerecord-hackery/ransack'
gem 'ransack-mongoid', github: 'activerecord-hackery/ransack-mongoid'
gem 'activeadmin-mongoid', '0.7.0'
gem 'devise'
gem 'kaminari-mongoid'
group :development, :test do
# Call 'byebug' anywhere in the code to stop execution and get a debugger console
gem 'byebug'
end
group :development do
# Access an IRB console on exception pages or by using <%= console %> in views
gem 'web-console', '3.5.1'
# Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
gem 'spring'
end

El siguiente paso es actualizar el conjunto de gemas e instalar devise y active_admin.

bundle install
rails g devise:install
rails g active_admin:install

En el incializador de devise “initializers/devise.rb” se necesita agregar el ORM de mongoid:

require 'devise/orm/mongoid'

4. Agregar los usuarios administrador

Los procesos anteriores agregaron un archivo de semilla para crear el primer usuario administrador db/seed.rb

# This file should contain all the record creation needed to seed the database with its default values.
# The data can then be loaded with the rake db:seed (or created alongside the db with db:setup).
#
# Examples:
#
# cities = City.create([{ name: 'Chicago' }, { name: 'Copenhagen' }])
# Mayor.create(name: 'Emanuel', city: cities.first)
AdminUser.create!(email: 'admin@example.com', password: 'password', password_confirmation: 'password') if Rails.env.development?

y lo usaremos así:

rails db:seed

5. Probando los usuarios adminstradores

Para probar esto, debemos acceder a la ruta

http://localhost:3000/admin/

El email es “admin@example.com” y la clave “password”

Esto nos lleva al dashboar de la administración:

Pero al acceder a la pestaña de usuarios adminstradores se presenta un error debido a que los filtros para current_sign_in_at, sign_in_count, y created_at aún no están totalmente definidos. Esto sería una buena contribución para mejorar la gema active-admin-mongoid.

Esto, se soluciona por ahora, eliminando esos filtros en el archivo app/admin/admin_users.rb

ActiveAdmin.register AdminUser do
permit_params :email, :password, :password_confirmation
 index do
selectable_column
id_column
column :email
column :current_sign_in_at
column :sign_in_count
column :created_at
actions
end
  filter :email
# filter :current_sign_in_at
# filter :sign_in_count
# filter :created_at
  form do |f|
f.inputs do
f.input :email
f.input :password
f.input :password_confirmation
end
f.actions
end
end

Y ahora si, se tiene acceso a los usuarios adminstradores:

6. Agregar la entidad Book para adminstrala

Agregamos la entidad Book a la administración mediante

rails generate active_admin:resource Book

Esto último crea el archivo app/admin/books.rb. En este archivo debemos agregar los permit_params:

ActiveAdmin.register Book do
  permit_params :title, :pages, :author
end

Y ahora si, está completo nuestro demo sobre el uso de ActiveAdmin en una aplicación Rails con MongoDb.

El código completo lo puedes encontrar en nuesto repositorio.

Si te gustó este artículo, por favor aplaude las veces que quieras, y para ver historias similares acerca de tecnología, mira nuestras publicaciones y escribe en los comentarios cualquier duda que tengas o si quieres que escribamos de algo en particular.

Milber

Mail: milber@alturasoluciones.com
LinkedIn: https://www.linkedin.com/in/milberchamputiz/

Links relacionados: