Ruby on Rails
Silnik szyn - modułowe szyny
Szukaj…
Wprowadzenie
Szybki przegląd silników Rails
Silniki to małe aplikacje Railsowe, za pomocą których można dodawać funkcje do aplikacji je obsługującej. Klasą definiującą aplikację Ruby on Rails jest Rails::Application
która w rzeczywistości dziedziczy wiele zachowań po Rails::Engine
, klasie definiującej silnik. Można powiedzieć, że zwykła aplikacja Rails to po prostu silnik z większą liczbą funkcji.
Składnia
- plugin railsowy nowy mój_moduł --mountable
Utwórz aplikację modułową
# Pierwsze kroki
Najpierw wygenerujmy nową aplikację Ruby on Rails:
rails new ModularTodo
Następnym krokiem jest wygenerowanie silnika!
cd ModularTodo && rails plugin new todo --mountable
Stworzymy również folder „silniki” do przechowywania silników (nawet jeśli tylko mamy!).
mkdir engines && mv todo ./engines
Silniki, podobnie jak klejnoty, są dostarczane z plikiem gemspec. Podajmy prawdziwe wartości, aby uniknąć ostrzeżeń.
#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
Teraz musimy dodać silnik Todo do nadrzędnej aplikacji Gemfile.
#ModularTodo/Gemfile
#Other gems
gem 'todo', path: 'engines/todo'
bundle install
. Na liście klejnotów powinieneś zobaczyć:
Using todo 0.0.1 from source at engines/todo
Świetnie, nasz silnik Todo jest poprawnie załadowany! Zanim zaczniemy kodować, musimy jeszcze zrobić jedną rzecz: zamontować silnik Todo. Możemy to zrobić w pliku route.rb w aplikacji nadrzędnej.
Rails.application.routes.draw do
mount Todo::Engine => "/", as: 'todo'
end
Montujemy go w /
ale możemy również udostępnić go w /todo
. Ponieważ mamy tylko jeden moduł, /
jest w porządku.
Teraz możesz uruchomić serwer i sprawdzić go w przeglądarce. Powinieneś zobaczyć domyślny widok Railsów, ponieważ nie zdefiniowaliśmy jeszcze żadnych kontrolerów / widoków. Zróbmy to teraz!
Budowanie listy rzeczy do zrobienia
Zamierzamy rusztować model o nazwie Task
w module Todo, ale aby poprawnie przeprowadzić migrację bazy danych z aplikacji nadrzędnej, musimy dodać małą inicjalizację do pliku 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
To wszystko, teraz, gdy uruchamiamy migracje z aplikacji nadrzędnej, migracje w silniku Todo również zostaną załadowane.
Stwórzmy model Task
. Polecenie scaffold
należy uruchomić z folderu silnika.
cd engines/todo && rails g scaffold Task title:string content:text
Uruchom migracje z folderu nadrzędnego:
rake db:migrate
Teraz musimy tylko zdefiniować główną ścieżkę w silniku Todo:
#ModularTodo/engines/todo/config/routes.rb
Todo::Engine.routes.draw do
resources :tasks
root 'tasks#index'
end
Możesz się nim bawić, tworzyć zadania, usuwać je… Och, czekaj, usuwanie nie działa! Dlaczego?! Wygląda na to, że JQuery nie jest załadowany, więc dodajmy go do pliku application.js
w silniku!
// ModularTodo/engines/todo/app/assets/javascripts/todo/application.js
//= require jquery
//= require jquery_ujs
//= require_tree .
Tak, teraz możemy niszczyć zadania!