Ruby on Rails
Moteur Rails - Rails Modulaires
Recherche…
Introduction
Aperçu rapide des moteurs Rails
Les moteurs sont de petites applications Rails pouvant être utilisées pour ajouter des fonctionnalités à l'application qui les héberge. La classe définissant une application Ruby on Rails est Rails::Application
qui hérite en fait beaucoup de son comportement de Rails::Engine
, la classe définissant un moteur. Nous pouvons dire qu'une application Rails régulière est simplement un moteur avec plus de fonctionnalités.
Syntaxe
- rails plugin nouveau my_module --montable
Créer une application modulaire
# Commencer
D'abord, générons une nouvelle application Ruby on Rails:
rails new ModularTodo
L'étape suivante consiste à générer un moteur!
cd ModularTodo && rails plugin new todo --mountable
Nous allons également créer un dossier "moteurs" pour stocker les moteurs (même si nous en avons juste un!).
mkdir engines && mv todo ./engines
Les moteurs, tout comme les gemmes, sont livrés avec un fichier gemspec. Mettons des valeurs réelles pour éviter les avertissements.
#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
Maintenant, nous devons ajouter le moteur Todo à l'application parent Gemfile.
#ModularTodo/Gemfile
#Other gems
gem 'todo', path: 'engines/todo'
Exécutons l' bundle install
. Vous devriez voir ce qui suit dans la liste des gemmes:
Using todo 0.0.1 from source at engines/todo
Super, notre moteur Todo est chargé correctement! Avant de commencer à coder, nous avons une dernière chose à faire: monter le moteur Todo. Nous pouvons le faire dans le fichier routes.rb de l'application parent.
Rails.application.routes.draw do
mount Todo::Engine => "/", as: 'todo'
end
Nous le montons à /
mais nous pourrions aussi le rendre accessible à /todo
. Comme nous n'avons qu'un seul module, /
c'est bien.
Vous pouvez maintenant lancer votre serveur et le vérifier dans votre navigateur. Vous devriez voir la vue Rails par défaut car nous n'avons pas encore défini de contrôleurs / vues. Faisons ça maintenant!
Construire la liste Todo
Nous allons échafauder un modèle nommé Task
dans le module Todo, mais pour migrer correctement la base de données de l'application parente, nous devons ajouter un petit initialiseur au fichier 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
Ça y est, maintenant que nous effectuons des migrations à partir de l'application parente, les migrations dans le moteur Todo seront également chargées.
Créons le modèle de Task
. La commande d' scaffold
doit être exécutée à partir du dossier du moteur.
cd engines/todo && rails g scaffold Task title:string content:text
Exécutez les migrations à partir du dossier parent:
rake db:migrate
Maintenant, il suffit de définir la route racine dans le moteur Todo:
#ModularTodo/engines/todo/config/routes.rb
Todo::Engine.routes.draw do
resources :tasks
root 'tasks#index'
end
Vous pouvez jouer avec, créer des tâches, les supprimer… Oh, attendez, la suppression ne fonctionne pas! Pourquoi?! Eh bien, il semblerait que JQuery ne soit pas chargé, ajoutons-le donc au fichier application.js
à l'intérieur du moteur!
// ModularTodo/engines/todo/app/assets/javascripts/todo/application.js
//= require jquery
//= require jquery_ujs
//= require_tree .
Oui, maintenant nous pouvons détruire des tâches!