Ruby on Rails
Rails Engine - Modulare Schienen
Suche…
Einführung
Schneller Überblick über Rails-Motoren
Engines sind kleine Rails-Anwendungen, mit denen der Anwendung, die sie hostet, Funktionen hinzugefügt werden. Die Klasse, die eine Ruby on Rails-Anwendung definiert, ist Rails::Application
die ein Großteil ihres Verhaltens von Rails::Engine
erbt, der Klasse, die eine Engine definiert. Wir können sagen, dass eine normale Rails-Anwendung einfach eine Engine mit mehr Funktionen ist.
Syntax
- Schienen Plugin neues my_module --mountable
Erstellen Sie eine modulare App
# Fertig machen
Zunächst generieren wir eine neue Ruby on Rails-Anwendung:
rails new ModularTodo
Der nächste Schritt ist die Erzeugung eines Motors!
cd ModularTodo && rails plugin new todo --mountable
Wir werden auch einen 'engine'-Ordner erstellen, um die Engines zu speichern (selbst wenn wir nur einen haben!).
mkdir engines && mv todo ./engines
Engines werden wie Edelsteine mit einer Gemspec-Datei geliefert. Lassen Sie uns einige reale Werte angeben, um Warnungen zu vermeiden.
#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
Jetzt müssen wir die Todo-Engine zur übergeordneten Anwendung Gemfile hinzufügen.
#ModularTodo/Gemfile
#Other gems
gem 'todo', path: 'engines/todo'
Lassen Sie uns bundle install
ausführen. In der Liste der Edelsteine sollte Folgendes angezeigt werden:
Using todo 0.0.1 from source at engines/todo
Toll, unser Todo-Motor wird richtig geladen! Bevor wir mit dem Programmieren beginnen, müssen wir noch eines tun: die Todo-Engine installieren. Wir können das in der Datei routes.rb in der übergeordneten App tun.
Rails.application.routes.draw do
mount Todo::Engine => "/", as: 'todo'
end
Wir montieren es unter /
aber wir könnten es auch unter /todo
zugänglich machen. Da wir nur ein Modul haben, ist /
in Ordnung.
Jetzt können Sie Ihren Server hochfahren und in Ihrem Browser überprüfen. Sie sollten die Standardansicht von Rails sehen, da wir noch keine Controller / Ansichten definiert haben. Lass uns das jetzt machen!
Erstellen der Todo-Liste
Wir werden ein Modell mit dem Namen Task
im Todo-Modul erstellen, aber um die Datenbank korrekt aus der übergeordneten Anwendung zu migrieren, müssen wir der engine.rb
Datei einen kleinen Initialisierer 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
Das ist es, jetzt, wenn wir Migrationen von der übergeordneten Anwendung ausführen, werden die Migrationen in der Todo-Engine ebenfalls geladen.
Erstellen wir das Task
. Der Befehl scaffold
muss aus dem Engine-Ordner ausgeführt werden.
cd engines/todo && rails g scaffold Task title:string content:text
Führen Sie die Migrationen aus dem übergeordneten Ordner aus:
rake db:migrate
Jetzt müssen wir nur noch die Wurzelroute in der Todo-Engine definieren:
#ModularTodo/engines/todo/config/routes.rb
Todo::Engine.routes.draw do
resources :tasks
root 'tasks#index'
end
Sie können damit spielen, Aufgaben erstellen, löschen… Oh, warten Sie, das Löschen funktioniert nicht! Warum?! Nun, es scheint, als sei JQuery nicht geladen, also fügen wir es der Datei application.js
in der Engine hinzu!
// ModularTodo/engines/todo/app/assets/javascripts/todo/application.js
//= require jquery
//= require jquery_ujs
//= require_tree .
Ja, jetzt können wir Aufgaben zerstören!