Engines

Post on 01-Nov-2014

2 views 1 download

Tags:

description

An intro to rails engines with practice labs.

Transcript of Engines

COWBOYS & ENGINES

Fernand Galiana

Tuesday, September 17, 13

HISTORY

0.14.2 ~ 2005

2.3 ~ 2009 -- Engine support

3.0 ~ 2010 -- Yehuda and crew

Tuesday, September 17, 13

SURPRISE?

> rails c> Rails::Application.ancestors=> [Rails::Application, Rails::Engine,...]

Tuesday, September 17, 13

IMPETUS?

Mini rails apps [MVC|Assets|lib]

Divide conquer

Reusable components

Decoupling

Performance

Tuesday, September 17, 13

ENGINE TYPES

full

mountable

Tuesday, September 17, 13

CREATE!

> rails plugin new engines/blee [opts]

Tuesday, September 17, 13

NOTABLES...

--full

--mountable

-T

-B

-d [mysql|pg|sqlite3|etc...]

-j [jquery|coffeescript]

-dummy_path

Tuesday, September 17, 13

CREATE!

> rails plugin new engines/cowboy \ --mountable -T -B\ --dummy-path=spec/dummy \ -j coffeescript -d mysql

Tuesday, September 17, 13

TEH BROG!

You rock, bro!

Tuesday, September 17, 13

LAB I

git clone https://github.com/derailed/ng_training

git checkout -b lab_1

follow the README!

Tuesday, September 17, 13

ANATOMY

Tuesday, September 17, 13

STRUCTURE

cowboy_engine o app o bin o config o lib o spec

Tuesday, September 17, 13

STRUCTURE

cowboy_engine o app

o assetso controllerso helperso modelso views

o bin o ...

Tuesday, September 17, 13

STRUCTURE

cowboy_engine o app

o controllerso cowboy_engine

o cowboys_controller.rbo ...

o bin o ...

Tuesday, September 17, 13

ENGINE GEMSPEC

Gem::Specification.new do |s| s.name = "pilgrim" s.version = Pilgrim::VERSION s.authors = ["Fernand"] s.email = ["fernand.galiana@gmail.com"] s.homepage = "http://pilgrim" s.summary = "Pilgrim’s engine" s.description = "Pilgrim’s engine"

s.files = Dir["{app,config,db,lib}/**/*", "MIT-LICENSE", "Rakefile", "README.rdoc"]

s.add_dependency 'rails' , '~> 4.0.0' s.add_dependency 'bootstrap-sass' , '~> 2.3.2.2' s.add_dependency 'font-awesome-sass-rails', '~> 3.0.2.2' s.add_development_dependency "mysql2" , '~> 0.3.13' s.add_development_dependency 'rspec-rails' , '~> 2.14.0' end

Tuesday, September 17, 13

THE ENGINE

module Cowboy class Engine < ::Rails::Engine isolate_namespace config.autoload_paths += [File.join( self.root, %w[lib blee] )] endend

Tuesday, September 17, 13

BUSINESS AS USUAL

rails g [model|controller|migration]

custom generators

engine initializers

Tuesday, September 17, 13

GEMFILE

gem ‘cowboy’, path: ‘engines/cowboy’

my_app/Gemfile

Tuesday, September 17, 13

CONVENIENCE

Cowboy::Engine.root

Cowboy::Engine.helpers

Cowboy::Engine.routes.url_helpers

Tuesday, September 17, 13

MIGRATIONS

Tuesday, September 17, 13

MIGRATIONS

> rake cowboy:install:migrations

Tuesday, September 17, 13

MIGRATIONS

rake db:migrate SCOPE=Cowboy

Tuesday, September 17, 13

MONKEYMIGS!

module Cowboy class Engine < ::Rails::Engine isolate_namespace Cowboy initializer :append_migrations do |app| next if app.root.to_s.match self.root.to_s config.paths["db/migrate"].expanded.each do |expanded_path| app.config.paths["db/migrate"] << expanded_path end end endend

Tuesday, September 17, 13

ISOLATED MODELS

table names expects engine_name_table_name

self.table_name = :guns

or

table_name_prefix = “”

Tuesday, September 17, 13

ROUTING

Tuesday, September 17, 13

engines/cowboy/config/routes.rb

ENGINE ROUTES

Cowboy::Engine.routes.draw do resources :guns, only: [:create] resources :belt do resources :ammos endend

Tuesday, September 17, 13

APP ROUTES

Rango::Application.routes.draw do root 'welcome#index'

mount Cowboy::Engine => '/pilgrim', as: :cowboy_ng resources :jenkins do resources :bullets, controller: 'cowboy/bullets' endend

rango/config/routes.rb

Tuesday, September 17, 13

CONTEXT MATTERS!

Cowboy engine contextguns_path => /gunsmain_app.welcome_path => /welcome

Main Application contextcowboy_ng.guns_path => /pilgrims/gunswelcome_path => /welcome

Tuesday, September 17, 13

my_app/controllers/guns_controller.rb

HELPERS

class GunsController < ApplicationController helper Cowboy::BulletsHelper

...end

Tuesday, September 17, 13

ENGINE ASSETS

stylesheet_link_tag cowboy/guns.css

javascript_include_tag cowboy/guns.js

or

*=require cowboy/guns

//=require cowboy/guns

Tuesday, September 17, 13

PARTIALS

render gun => render partial: ‘cowboy/...’, object: gun

render :partial ‘fred’ => render :partial ‘cowboy/fred’

Tuesday, September 17, 13

LOADING ORDER

config.railties_order = [Cowboy::Engine, :main_app, :all]

Tuesday, September 17, 13

TESTING

Tuesday, September 17, 13

TESTING (RSPEC)

spec/dummy

Tuesday, September 17, 13

TESTING (RSPEC)

config.include Dummy::Application.routes.url_helpers

use_route :cowboy

Tuesday, September 17, 13

LAB II

Scenario: Other models in the system need to be commentable. Spin out this functionality as a new ‘social’ engine

Tuesday, September 17, 13

CHEAT

> rails plugin new engines/social -T --mountable \ -j coffeescript -B -d mysql \ --dummy-path=spec/dummy

Tuesday, September 17, 13

LAB III

Scenario: PM wants a reporting admin ui to track comments. In light of this new feature commenting behavior needs to be shared across several engines.

Refactor social engine to depend on the new common engine

Tuesday, September 17, 13

Q&A

Get a rope?

Tuesday, September 17, 13