Engines Lightning Talk

Post on 27-Jun-2015

186 views 1 download

Tags:

description

A lightning talk presented to BostonRB in April of 2012

Transcript of Engines Lightning Talk

The Rails Engine That

Could?

Saturday, April 28, 2012

Hi!

dpickett on Twitter

www.launchware.com on the InterTubes

Hiring

Saturday, April 28, 2012

• A Brief History

• A Rails Engine In Rails 3.1

• Implementation Gotchas

• Deployment Gotchas With Heroku

• Conclusions

What I Can Tell You About Rails Engines

Saturday, April 28, 2012

• Components in Rails Beta and Rails 1

• Components removed in Rails 2

Out With The Old...

Saturday, April 28, 2012

...In With the New

• Engines in Rails 3

• Enginex as part of Rails 3.1

Saturday, April 28, 2012

Generating

rails generate plugin thomas --mountable

Saturday, April 28, 2012

Saturday, April 28, 2012

Saturday, April 28, 2012

Manage Dependencies In Your Gemspec

Shift Your Perspective

Saturday, April 28, 2012

Shifting Perspectives

• Think like an API designer

• Favor composition over inheritance

• Obey SOLID principles for more maintainable code

Saturday, April 28, 2012

Maintain Perspective

• Do as you would normally:

• Write migrations

• Seed data

• Run rake tasks

• Run generators

Saturday, April 28, 2012

Gotchas

Saturday, April 28, 2012

Routes

• Routes are loaded where you mount them

• Only one opportunity for placement

• No flexibility to divide up routes for fine tuning priorities

Saturday, April 28, 2012

Namespacing• Namespace Your Engine - it will save you lots of

pain.

• If you must in your consuming application, use ActiveSupport’s require_dependency to override:

require_dependency Thomas::Engine.root.join(“app/models/user”).to_s

class User < ActiveRecord::Base#override the engine here

end

Saturday, April 28, 2012

Routes

• Routes are loaded where you mount them

• Only one opportunity for placement

• No flexibility to divide up routes for fine tuning priorities

Saturday, April 28, 2012

Consumer::Application do Thomas::Routes::UserRoutes.draw(self) #custom routes here Thomas::Routes::ScheduleRoutes.draw(self)end

module Thomas module Routes module UserRoutes def self.draw(map) map.instance_eval do resources :user... end end end endendSaturday, April 28, 2012

Named Routes Helpers

• If you don’t namespace, I found these to be incredibly problematic

• You must include helpers in your application controller and in your request specs/tests

Saturday, April 28, 2012

class ApplicationController < ActionController::Base include Thomas::Engine.routes.url_helpers include ActionDispatch::Routing::PolymorphicRoutesend

You’ll use these two lines a lot.

Apply when you get an undefined *_path or *_url method

Saturday, April 28, 2012

Saturday, April 28, 2012

Devise

• Wiring I18n load paths is deferred until the app comes up, disallowing override ability

Saturday, April 28, 2012

class Thomas::Engine < Rails::Engine config.after_initialize do Rails.application.config.after_initialize do paths = I18n.load_path.delete_if do |p| p =~ /devise\-/ end #put devise’s default locales in its place I18n.load_path = paths + I18n.load_path I18n.reload!

endend

Saturday, April 28, 2012

Inherited ResourcesAnd Responders

Doesn’t WorkDrops Your Responder

Saturday, April 28, 2012

Saturday, April 28, 2012

Wrong Thomas......Go B’s

Saturday, April 28, 2012

class ApplicationController < ActionController::Base def self.engine_inherit_resources inherit_resources self.responder = MobileResponder end endend

Saturday, April 28, 2012

Deploying Private Gems To Heroku

• Bundle with your github credentials in plaintext

• Maintain your own gem server

• Write a rake task to vendor the gem and commit when deploying

• NEW: http://www.gemfury.com/

Saturday, April 28, 2012

Overall, Engines Are Great

• There’s still room for improvement, but they’re awesome once you get going

• They will challenge you as a developer and as a Rails Framework user

Saturday, April 28, 2012

Thanks!

• I’ll post slides @ www.launchware.com

• Chat me up on Twitter: @dpickett

• Chat me up on IRC: dpickett in #boston.rb

• We’re hiring!

Saturday, April 28, 2012