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!



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow