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!



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow