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!



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow