Ruby on Rails
Rails Engine - Modular Rails
Sök…
Introduktion
Snabböversikt över Rails-motorer
Motorer är små Rails-applikationer som kan användas för att lägga till funktionaliteter i applikationen som är värd för dem. Klassen som definierar en Ruby on Rails-applikation är Rails::Application
som faktiskt ärver mycket av sitt beteende från Rails::Engine
, klassen som definierar en motor. Vi kan säga att en vanlig Rails-applikation helt enkelt är en motor med fler funktioner.
Syntax
- rails plugin ny my_module - monterbar
Skapa en modulär app
# Komma igång
Låt oss först skapa en ny Ruby on Rails-applikation:
rails new ModularTodo
Nästa steg är att generera en motor!
cd ModularTodo && rails plugin new todo --mountable
Vi kommer också att skapa en "motorer" -mapp för att lagra motorerna (även om vi bara har en!).
mkdir engines && mv todo ./engines
Motorer, precis som ädelstenar, kommer med en gemspec-fil. Låt oss lägga några verkliga värden för att undvika varningar.
#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 måste vi lägga till Todo-motorn i moderapplikationen Gemfile.
#ModularTodo/Gemfile
#Other gems
gem 'todo', path: 'engines/todo'
Låt oss köra bundle install
. Du bör se följande i listan över ädelstenar:
Using todo 0.0.1 from source at engines/todo
Bra, vår Todo-motor laddas korrekt! Innan vi börjar kodningen har vi en sista sak att göra: montera Todo-motorn. Vi kan göra det i routes.rb-filen i överordnade appen.
Rails.application.routes.draw do
mount Todo::Engine => "/", as: 'todo'
end
Vi monterar det på /
men vi kan också göra det tillgängligt på /todo
. Eftersom vi har bara en modul, /
är bra.
Nu kan du starta upp din server och kontrollera den i din webbläsare. Du bör se standardvyn för Rails eftersom vi inte definierade några kontroller / vyer än. Låt oss göra det nu!
Bygga Todo-listan
Vi kommer att stilla en modell med namnet Task
inuti Todo-modulen men för att korrekt migrera databasen från moderprogrammet måste vi lägga till en liten initialisator till filen 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
Det är det, nu när vi kör migreringar från moderapplikationen kommer migreringarna i Todo-motorn också att laddas.
Låt oss skapa Task
. scaffold
måste köras från motormappen.
cd engines/todo && rails g scaffold Task title:string content:text
Kör migreringarna från överordnad mapp:
rake db:migrate
Nu behöver vi bara definiera rotvägen inuti Todo-motorn:
#ModularTodo/engines/todo/config/routes.rb
Todo::Engine.routes.draw do
resources :tasks
root 'tasks#index'
end
Du kan spela med det, skapa uppgifter, ta bort dem ... Åh vänta, borttagningen fungerar inte! Varför?! Det verkar som om JQuery inte är laddad, så låt oss lägga till den i application.js
filen i motorn!
// ModularTodo/engines/todo/app/assets/javascripts/todo/application.js
//= require jquery
//= require jquery_ujs
//= require_tree .
Ja, nu kan vi förstöra uppgifter!