Upgrade to Pro — share decks privately, control downloads, hide ads and more …

The Rails Engine That Could

The Rails Engine That Could

A lightning talk delivered at BostonRB outlining our experiences with developing a Rails engine.

Dan Pickett

April 28, 2012
Tweet

More Decks by Dan Pickett

Other Decks in Technology

Transcript

  1. • 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
  2. • Components in Rails Beta and Rails 1 • Components

    removed in Rails 2 Out With The Old... Saturday, April 28, 2012
  3. ...In With the New • Engines in Rails 3 •

    Enginex as part of Rails 3.1 Saturday, April 28, 2012
  4. Shifting Perspectives • Think like an API designer • Favor

    composition over inheritance • Obey SOLID principles for more maintainable code Saturday, April 28, 2012
  5. Maintain Perspective • Do as you would normally: • Write

    migrations • Seed data • Run rake tasks • Run generators Saturday, April 28, 2012
  6. 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
  7. 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
  8. 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
  9. 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 end end Saturday, April 28, 2012
  10. 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
  11. class ApplicationController < ActionController::Base include Thomas::Engine.routes.url_helpers include ActionDispatch::Routing::PolymorphicRoutes end You’ll

    use these two lines a lot. Apply when you get an undefined *_path or *_url method Saturday, April 28, 2012
  12. Devise • Wiring I18n load paths is deferred until the

    app comes up, disallowing override ability Saturday, April 28, 2012
  13. 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! end end Saturday, April 28, 2012
  14. 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
  15. 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
  16. 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