Ricerca…


introduzione

Panoramica rapida dei motori Rails

I motori sono piccole applicazioni Rails che possono essere utilizzate per aggiungere funzionalità all'applicazione che li ospita. La classe che definisce un'applicazione Ruby on Rails è Rails::Application che in realtà eredita gran parte del suo comportamento da Rails::Engine , la classe che definisce un motore. Possiamo dire che un'applicazione Rails regolare è semplicemente un motore con più funzionalità.

Sintassi

  • plugin per rails new my_module --mountable

Crea un'app modulare


# Iniziare

Innanzitutto, creiamo una nuova applicazione Ruby on Rails:

rails new ModularTodo

Il prossimo passo è generare un motore!

cd ModularTodo && rails plugin new todo --mountable

Creeremo anche una cartella 'motori' per immagazzinare i motori (anche se ne abbiamo uno solo!).

mkdir engines && mv todo ./engines

I motori, proprio come le gemme, sono dotati di un file gemspec. Mettiamo alcuni valori reali per evitare gli avvertimenti.

 #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


Ora dobbiamo aggiungere il motore Todo all'applicazione madre Gemfile.

#ModularTodo/Gemfile
#Other gems
gem 'todo', path: 'engines/todo'

Eseguiamo l' bundle install . Dovresti vedere quanto segue nella lista delle gemme:

Using todo 0.0.1 from source at engines/todo

Ottimo, il nostro motore Todo è stato caricato correttamente! Prima di iniziare la codifica, abbiamo un'ultima cosa da fare: montare il motore Todo. Possiamo farlo nel file routes.rb nell'app padre.

Rails.application.routes.draw do
  mount Todo::Engine => "/", as: 'todo'
end

Lo stiamo montando su / ma potremmo renderlo accessibile anche in /todo . Dato che abbiamo un solo modulo, / sta bene.

Ora puoi avviare il tuo server e controllarlo nel tuo browser. Dovresti vedere la vista Rails di default perché non abbiamo ancora definito alcun controller / vista. Facciamolo adesso!

Costruire la lista di cose da fare

Stiamo andando a impalcare un modello chiamato Task all'interno del modulo Todo ma per migrare correttamente il database dall'applicazione madre, abbiamo bisogno di aggiungere un piccolo inizializzatore al file 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

È così, ora quando eseguiamo le migrazioni dall'applicazione principale, verranno caricate anche le migrazioni nel motore di Todo.


Creiamo il modello Task . Il comando scaffold deve essere eseguito dalla cartella del motore.

cd engines/todo && rails g scaffold Task title:string content:text

Esegui le migrazioni dalla cartella principale:

rake db:migrate

Ora, abbiamo solo bisogno di definire la root route all'interno del motore Todo:

#ModularTodo/engines/todo/config/routes.rb
Todo::Engine.routes.draw do
  resources :tasks
  root 'tasks#index'
end

Puoi giocarci, creare compiti, cancellarli ... Oh aspetta, l'eliminazione non funziona! Perché?! Bene, sembra che JQuery non sia caricato, quindi aggiungiamolo al file application.js all'interno del motore!

// ModularTodo/engines/todo/app/assets/javascripts/todo/application.js
//= require jquery
//= require jquery_ujs
//= require_tree .

Sì, ora possiamo distruggere i compiti!



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow