Ruby on Rails
Motor de rieles - Rieles modulares
Buscar..
Introducción
Visión general rápida de los motores Rails
Los motores son pequeñas aplicaciones de Rails que se pueden usar para agregar funcionalidades a la aplicación que las aloja. La clase que define una aplicación de Ruby on Rails es Rails::Application
que en realidad hereda gran parte de su comportamiento de Rails::Engine
, la clase que define un motor. Podemos decir que una aplicación regular de Rails es simplemente un motor con más funciones.
Sintaxis
- plugin de rieles nuevo my_module --mountable
Crear una aplicación modular
# Empezando
Primero, generemos una nueva aplicación de Ruby on Rails:
rails new ModularTodo
El siguiente paso es generar un motor!
cd ModularTodo && rails plugin new todo --mountable
También crearemos una carpeta de 'motores' para almacenar los motores (¡incluso si solo tenemos uno!).
mkdir engines && mv todo ./engines
Los motores, al igual que las gemas, vienen con un archivo gemspec. Pongamos algunos valores reales para evitar advertencias.
#ModularTodo/engines/todo/todo.gemspec
$:.push File.expand_path("../lib", __FILE__)
#Maintain your gem's version:
require "todo/version"
#Describe your gem and declare its dependencies:
Gem::Specification.new do |s|
s.name = "todo"
s.version = Todo::VERSION
s.authors = ["Thibault Denizet"]
s.email = ["[email protected]"]
s.homepage = "//samurails.com"
s.summary = "Todo Module"
s.description = "Todo Module for Modular Rails article"
s.license = "MIT"
#Moar stuff
#...
end
Ahora necesitamos agregar el motor de Todo a la aplicación principal Gemfile.
#ModularTodo/Gemfile
#Other gems
gem 'todo', path: 'engines/todo'
Vamos a ejecutar bundle install
. Deberías ver lo siguiente en la lista de gemas:
Using todo 0.0.1 from source at engines/todo
Genial, nuestro motor Todo está cargado correctamente! Antes de comenzar la codificación, tenemos una última cosa que hacer: montar el motor Todo. Podemos hacerlo en el archivo route.rb en la aplicación principal.
Rails.application.routes.draw do
mount Todo::Engine => "/", as: 'todo'
end
Lo estamos montando en /
pero también podríamos hacerlo accesible en /todo
. Como solo tenemos un módulo, /
está bien.
Ahora puede encender su servidor y verificarlo en su navegador. Debería ver la vista de Rails predeterminada porque aún no definimos ningún controlador / vista. ¡Vamos a hacer eso ahora!
Construyendo la lista de Todo
Vamos a crear un modelo denominado Task
dentro del módulo Todo, pero para migrar correctamente la base de datos desde la aplicación principal, debemos agregar un inicializador pequeño al archivo engine.rb
.
#ModularTodo/engines/todo/lib/todo/engine.rb
module Todo
class Engine < ::Rails::Engine
isolate_namespace Todo
initializer :append_migrations do |app|
unless app.root.to_s.match(root.to_s)
config.paths["db/migrate"].expanded.each do |p|
app.config.paths["db/migrate"] << p
end
end
end
end
end
Eso es todo, ahora cuando ejecutamos migraciones desde la aplicación principal, las migraciones en el motor de Todo también se cargarán.
Vamos a crear el modelo de Task
. El comando de scaffold
debe ejecutarse desde la carpeta del motor.
cd engines/todo && rails g scaffold Task title:string content:text
Ejecuta las migraciones desde la carpeta padre:
rake db:migrate
Ahora, solo necesitamos definir la ruta raíz dentro del motor de Todo:
#ModularTodo/engines/todo/config/routes.rb
Todo::Engine.routes.draw do
resources :tasks
root 'tasks#index'
end
Puedes jugar con él, crear tareas, eliminarlas ... ¡Oh, espera, la eliminación no funciona! ¡¿Por qué?! Bueno, parece que JQuery no está cargado, ¡así que vamos a agregarlo al archivo application.js
dentro del motor!
// ModularTodo/engines/todo/app/assets/javascripts/todo/application.js
//= require jquery
//= require jquery_ujs
//= require_tree .
Yay, ahora podemos destruir tareas!