Ruby on Rails
Rails Engine - Modular Rails
Ricerca…
introduzione
Panoramica rapida dei motori Rails
I motori sono piccole applicazioni Rails che possono essere utilizzate per aggiungere funzionalità all'applicazione che li ospita. La classe che definisce un'applicazione Ruby on Rails è Rails::Application
che in realtà eredita gran parte del suo comportamento da Rails::Engine
, la classe che definisce un motore. Possiamo dire che un'applicazione Rails regolare è semplicemente un motore con più funzionalità.
Sintassi
- plugin per rails new my_module --mountable
Crea un'app modulare
# Iniziare
Innanzitutto, creiamo una nuova applicazione Ruby on Rails:
rails new ModularTodo
Il prossimo passo è generare un motore!
cd ModularTodo && rails plugin new todo --mountable
Creeremo anche una cartella 'motori' per immagazzinare i motori (anche se ne abbiamo uno solo!).
mkdir engines && mv todo ./engines
I motori, proprio come le gemme, sono dotati di un file gemspec. Mettiamo alcuni valori reali per evitare gli avvertimenti.
#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
Ora dobbiamo aggiungere il motore Todo all'applicazione madre Gemfile.
#ModularTodo/Gemfile
#Other gems
gem 'todo', path: 'engines/todo'
Eseguiamo l' bundle install
. Dovresti vedere quanto segue nella lista delle gemme:
Using todo 0.0.1 from source at engines/todo
Ottimo, il nostro motore Todo è stato caricato correttamente! Prima di iniziare la codifica, abbiamo un'ultima cosa da fare: montare il motore Todo. Possiamo farlo nel file routes.rb nell'app padre.
Rails.application.routes.draw do
mount Todo::Engine => "/", as: 'todo'
end
Lo stiamo montando su /
ma potremmo renderlo accessibile anche in /todo
. Dato che abbiamo un solo modulo, /
sta bene.
Ora puoi avviare il tuo server e controllarlo nel tuo browser. Dovresti vedere la vista Rails di default perché non abbiamo ancora definito alcun controller / vista. Facciamolo adesso!
Costruire la lista di cose da fare
Stiamo andando a impalcare un modello chiamato Task
all'interno del modulo Todo ma per migrare correttamente il database dall'applicazione madre, abbiamo bisogno di aggiungere un piccolo inizializzatore al file 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
È così, ora quando eseguiamo le migrazioni dall'applicazione principale, verranno caricate anche le migrazioni nel motore di Todo.
Creiamo il modello Task
. Il comando scaffold
deve essere eseguito dalla cartella del motore.
cd engines/todo && rails g scaffold Task title:string content:text
Esegui le migrazioni dalla cartella principale:
rake db:migrate
Ora, abbiamo solo bisogno di definire la root route all'interno del motore Todo:
#ModularTodo/engines/todo/config/routes.rb
Todo::Engine.routes.draw do
resources :tasks
root 'tasks#index'
end
Puoi giocarci, creare compiti, cancellarli ... Oh aspetta, l'eliminazione non funziona! Perché?! Bene, sembra che JQuery non sia caricato, quindi aggiungiamolo al file application.js
all'interno del motore!
// ModularTodo/engines/todo/app/assets/javascripts/todo/application.js
//= require jquery
//= require jquery_ujs
//= require_tree .
Sì, ora possiamo distruggere i compiti!