Ruby on Rails
Rails Engine - Modulaire rails
Zoeken…
Invoering
Snel overzicht van Rails-motoren
Motoren zijn kleine Rails-applicaties die kunnen worden gebruikt om functionaliteiten toe te voegen aan de applicatie die ze host. De klasse die een Ruby on Rails-toepassing definieert is Rails::Application
die in feite veel van zijn gedrag Rails::Engine
van Rails::Engine
, de klasse die een motor definieert. We kunnen zeggen dat een reguliere Rails-applicatie gewoon een motor is met meer functies.
Syntaxis
- rails plugin nieuwe my_module - monteerbaar
Maak een modulaire app
# Ermee beginnen
Laten we eerst een nieuwe Ruby on Rails-applicatie genereren:
rails new ModularTodo
De volgende stap is het genereren van een motor!
cd ModularTodo && rails plugin new todo --mountable
We zullen ook een map 'engines' maken om de engines op te slaan (zelfs als we er maar één hebben!).
mkdir engines && mv todo ./engines
Motoren worden, net als edelstenen, geleverd met een gemspec-bestand. Laten we enkele echte waarden zetten om waarschuwingen te voorkomen.
#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
Nu moeten we de Todo-engine toevoegen aan de bovenliggende toepassing Gemfile.
#ModularTodo/Gemfile
#Other gems
gem 'todo', path: 'engines/todo'
Laten we bundle install
. Je zou het volgende in de lijst met edelstenen moeten zien:
Using todo 0.0.1 from source at engines/todo
Geweldig, onze Todo-motor is correct geladen! Voordat we beginnen met coderen, hebben we nog een ding te doen: de Todo-motor monteren. We kunnen dat doen in het bestand routes.rb in de bovenliggende app.
Rails.application.routes.draw do
mount Todo::Engine => "/", as: 'todo'
end
We monteren het op /
maar we kunnen het ook toegankelijk maken op /todo
. Omdat we maar één module hebben, is /
prima.
Nu kunt u uw server opstarten en in uw browser controleren. Je zou de standaard Rails-weergave moeten zien omdat we nog geen controllers / views hebben gedefinieerd. Laten we dat nu doen!
De Todo-lijst samenstellen
We gaan een model met de naam Task
in de Todo-module ondersteunen, maar om de database correct te migreren vanuit de bovenliggende toepassing, moeten we een kleine initialisatie aan het engine.rb
bestand toevoegen.
#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
Dat is alles, nu wanneer we migraties uitvoeren vanuit de bovenliggende toepassing, worden de migraties in de Todo-engine ook geladen.
Laten we het Task
maken. De scaffold
opdracht moet worden uitgevoerd vanuit de engine-map.
cd engines/todo && rails g scaffold Task title:string content:text
Voer de migraties uit vanuit de bovenliggende map:
rake db:migrate
Nu moeten we alleen de hoofdroute in de Todo-engine definiëren:
#ModularTodo/engines/todo/config/routes.rb
Todo::Engine.routes.draw do
resources :tasks
root 'tasks#index'
end
Je kunt ermee spelen, taken maken, ze verwijderen ... Oh wacht, het verwijderen werkt niet! Waarom?! Het lijkt erop dat JQuery niet is geladen, dus laten we het toevoegen aan het bestand application.js
in de engine!
// ModularTodo/engines/todo/app/assets/javascripts/todo/application.js
//= require jquery
//= require jquery_ujs
//= require_tree .
Yay, nu kunnen we taken vernietigen!