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!



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow