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!



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow