Поиск…


Вступление

Краткий обзор двигателей Rails

Двигатели - это небольшие приложения Rails, которые можно использовать для добавления функциональных возможностей в приложение, в котором они размещены. Класс, определяющий приложение Ruby on Rails, - это Rails::Application которое на самом деле наследует много своего поведения от Rails::Engine , класса, определяющего движок. Можно сказать, что регулярное приложение Rails - это просто движок с большим количеством функций.

Синтаксис

  • rails plugin new my_module - доступный

Создание модульного приложения


# Начиная

Во-первых, давайте создадим новое приложение Ruby on Rails:

rails new ModularTodo

Следующий шаг - создать движок!

cd ModularTodo && rails plugin new todo --mountable

Мы также создадим папку «engine» для хранения движков (даже если у нас есть только один!).

mkdir engines && mv todo ./engines

Двигатели, как и драгоценные камни, поставляются с файлом gemspec. Давайте дадим некоторые реальные значения, чтобы избежать предупреждений.

 #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


Теперь нам нужно добавить движок Todo в родительское приложение Gemfile.

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

Давайте запустим bundle install . В списке драгоценных камней вы должны увидеть следующее:

Using todo 0.0.1 from source at engines/todo

Отлично, наш двигатель Todo загружен правильно! Прежде чем мы начнем кодирование, у нас есть одна последняя вещь: смонтировать движок Todo. Мы можем сделать это в файле routes.rb в родительском приложении.

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

Мы монтируем его в / но мы также можем сделать его доступным /todo . Поскольку мы имеем только один модуль, / отлично.

Теперь вы можете запустить свой сервер и проверить его в своем браузере. Вы должны увидеть представление Rails по умолчанию, потому что мы еще не определили какие-либо контроллеры / представления. Давайте сделаем это сейчас!

Создание списка Тодо

Мы собираемся поднять модель под названием Task внутри модуля Todo, но для правильной миграции базы данных из родительского приложения нам нужно добавить небольшой инициализатор в файл 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

Вот и все, теперь, когда мы запускаем миграции из родительского приложения, миграция в движке Todo также будет загружена.


Давайте создадим модель Task . Команда scaffold должна запускаться из папки с двигателем.

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

Запустите миграцию из родительской папки:

rake db:migrate

Теперь нам просто нужно определить корневой путь внутри движка Todo:

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

Вы можете играть с ним, создавать задания, удалять их ... О, подождите, удаление не работает! Зачем?! Ну, похоже, JQuery не загружен, поэтому давайте добавим его в файл application.js внутри движка!

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

Да, теперь мы можем уничтожить задачи!



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow