Rails engines

32
Rails Engines

description

 

Transcript of Rails engines

Page 1: Rails engines

Rails Engines

Page 2: Rails engines

Hi, I’m Josh

I work here ->

lvlsvn.com

Page 3: Rails engines

We Build Ruby AppsAnd a bunch of other stuff

Page 4: Rails engines

We also do design

Page 5: Rails engines

We also do design

The designers had NOTHING to do with my slides.

Page 6: Rails engines

Here’s the Problem

Even custom applications want to be able to manage their static pages

Think Contact Us, Team Bios, etc.

Wordpress, Drupal even Locomotive are great but heavy weight

Page 7: Rails engines

What we needed

A mini-cms

Uses our existing rails views

No subdomaining, feels like part of the app

Works with our authentication setup

Great for 4 or 5 pages of content

Page 8: Rails engines

OptionsHigh Voltage

https://github.com/thoughtbot/high_voltage

Great for devs, not great for the customer

Locomotive Engine

http://locomotivecms.com/

Awesome but heavyweight, assumes their template style

Page 9: Rails engines

Exstatic

https://github.com/LevelSeven/exstatic

WARNING: Not even close to finished

Works w/ devise

Mounts in another application

Inherits that application’s layouts

Page 10: Rails engines

But how?

Rails Engines

obviously, otherwise this talk wouldn’t make much sense

Page 11: Rails engines

What are Rails Engines?Lesser known feature, started in Rails 3.0

Mini-application that can be added to a larger rails app

Replace plugins

Are a subset of Railties, so you can use railtie stuff (like generators, rake tasks, etc.)

Page 12: Rails engines

Why?

Code reuse

Share functional components

Share business logic

Isolation

Distribution

Open Source part of a private app

Page 13: Rails engines

Creating an Engine2 Ways

Rails 3.1 or greater

> rails plugin new

Rails 3.0

Use enginex by Jose Valim

https://github.com/josevalim/enginex

Page 14: Rails engines

$> rails plugin new depot_engine --dummy-path=spec/dummy --skip-test-unit --mountable --skip-bundle

...

Page 15: Rails engines

--dummy-path=spec/

$>

rails plugin new depot_engine

dummy --skip-test-unit --mountable --skip-bundle

Creates a new Rails Engine with the name DepotEngine

Page 16: Rails engines

--dummy-path=spec/

$>

rails plugin new depot_engine --skip-test-unit --mountable --skip-bundle

Creates a fake rails app in the RSpec path

dummy

Page 17: Rails engines

--dummy-path=spec/

$>

rails plugin new depot_engine

--mountable

Sets the engine to be “mountable” as opposed to “full”

Full - the parent inherits routes from the engine and can directly access it’s components (controllers, models, etc.)

Mountable - the engine’s namespace is isolated and draws its own routes. It mounts at a path:

mount DepotEngine::Engine => “/store”, :as => “store”

dummy--skip-test-unit --skip-bundle

Page 18: Rails engines
Page 19: Rails engines

Setting Up RSpec

Add rspec-rails to development dependencies in gemspec

bundle install

rails g rspec:install

Set rspec as test_framework in engine.rb

lib/engine_name/engine.rb

Page 20: Rails engines

Testing through dummy rails plugin new automatically creates a dummy app

Rails.application is available to test initializers

Rails.application.routes will get you dummy app routes

More in a bit

Page 21: Rails engines

Depot as an Engine

Depot application

github.com/levelseven/depot_engine

Page 22: Rails engines

Migration Pitfalls

You have to use the engine name everywhere

rails g migration add_foo_to_engine_name_table_name

To copy migrations into dummy app cd into dummy and run

rake engine_name:install:migrations

Page 23: Rails engines

Asset Pipeline PitfallsAssets have to be preceeded by engine_name in view helpers

image_tag(‘engine_name/logo.png’)

Copy assets group in Gemfile from normal rails app into Gemfile in engine, then bundle install in dummy app

Page 24: Rails engines

View Hints

You can reference parent via main_app helper

i.e. link_to “Home”, main_app.root_path

Use the parent’s layouts by adding layout “application” to ApplicationController in engine

Page 25: Rails engines

View Hints

In parent app use engine_name.path_helper to link into engine

link_to “Store”, depot_engine.root_path

You can override views by putting them in

app/views/engine_name/controller/view_name

Page 26: Rails engines

Rake Tasks

Rake tasks can be added in lib/tasks

Show up in parent application

Can be run in rails engine via app namespace

Page 27: Rails engines

Other Stuff

Custom Rails Generators

Injecting routes into the parent

Config options

Initializers

etc. etc.

Page 28: Rails engines

Exstatic - Authorization

Uses a config option to call an authentication method

Setup in initializer

spec/controllers/pages_controller_spec.rb

Page 29: Rails engines

Exstatic - Generators

Used for migrations but no longer needed

You can however setup a rails_engine:install to automate setup

Page 30: Rails engines

Exstatic - Dynamic RoutesCan add routes directly into parent app

lib/exstatic/engine.rb

Can also ensure you aren’t overwriting a route that is defined by parent

lib/exstatic/validators/nonexistant_path_validator.rb

Page 32: Rails engines

Gems I “borrowed” from

Devise

https://github.com/plataformatec/devise

High Voltage

https://github.com/thoughtbot/high_voltage