Cómo integrar ActiveAdmin en aplicaciones Rails con MongoDB

Image for post
Image for post

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 porque no se usará una base relacional, y señalando que no se haga la instalación de las gemas mediante el

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

Agregar los archivos 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 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

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 Por defecto la base se creará con el nombre

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 ya que esta se crea con el primer insert a la base.

Ahora ya se puede subir el servidor con

Image for post
Image for post

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
Image for post
Image for post

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 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 loca

Image for post
Image for post

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

# 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”

Image for post
Image for post

Esto nos lleva al dashboar de la administración:

Image for post
Image for post

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.

Image for post
Image for post

Esto, se soluciona por ahora, eliminando esos filtros en el archivo

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:

Image for post
Image for post

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, :authorend

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:

AlturaSoluciones

IT consulting.

Thanks to Gustavo Gonzalez

Milber Champutiz Burbano

Written by

Full Stack Software Developer

AlturaSoluciones

IT consulting. #Agile and #Lean remote software development team specialized in #web, #mobile, #reactjs and #rubyonrails from #Ecuador.

Milber Champutiz Burbano

Written by

Full Stack Software Developer

AlturaSoluciones

IT consulting. #Agile and #Lean remote software development team specialized in #web, #mobile, #reactjs and #rubyonrails from #Ecuador.

Medium is an open platform where 170 million readers come to find insightful and dynamic thinking. Here, expert and undiscovered voices alike dive into the heart of any topic and bring new ideas to the surface. Learn more

Follow the writers, publications, and topics that matter to you, and you’ll see them on your homepage and in your inbox. Explore

If you have a story to tell, knowledge to share, or a perspective to offer — welcome home. It’s easy and free to post your thinking on any topic. Write on Medium

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store