Ruby on Rails
Rails Engine - модульные рельсы
Поиск…
Вступление
Краткий обзор двигателей 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 .
Да, теперь мы можем уничтожить задачи!