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!



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow